From 4462592a15abe78aac66fe7edbf7ed409adb27f5 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Thu, 16 Feb 2012 16:09:16 -0600 Subject: [PATCH] Initial import --- AUTHORS | 3 + COPYING | 674 ++ ChangeLog | 130 + Makefile.am | 39 + Makefile.in | 1015 +++ NEWS | 4 + README | 19 + TODO | 10 + aminclude.am | 186 + autogen.sh | 32 + configure.ac | 146 + doxygen-api.cfg | 250 + libcaldav.pc | 14 + libcaldav.pc.in | 14 + m4/.svn/all-wcprops | 17 + m4/.svn/entries | 96 + m4/.svn/prop-base/ax_prog_doxygen.m4.svn-base | 5 + m4/.svn/text-base/acinclude.m4.svn-base | 312 + m4/.svn/text-base/ax_prog_doxygen.m4.svn-base | 533 ++ m4/acinclude.m4 | 312 + m4/ax_prog_doxygen.m4 | 533 ++ rfc4791.pdf | 7663 +++++++++++++++++ src/.svn/all-wcprops | 137 + src/.svn/entries | 776 ++ src/.svn/text-base/Makefile.am.svn-base | 53 + src/.svn/text-base/Makefile.in.svn-base | 649 ++ .../text-base/add-caldav-object.c.svn-base | 131 + .../text-base/add-caldav-object.h.svn-base | 35 + src/.svn/text-base/caldav-utils.c.svn-base | 713 ++ src/.svn/text-base/caldav-utils.h.svn-base | 221 + src/.svn/text-base/caldav.c.svn-base | 745 ++ src/.svn/text-base/caldav.h.svn-base | 343 + .../text-base/delete-caldav-object.c.svn-base | 284 + .../text-base/delete-caldav-object.h.svn-base | 35 + .../text-base/get-caldav-report.c.svn-base | 254 + .../text-base/get-caldav-report.h.svn-base | 43 + .../text-base/get-display-name.c.svn-base | 138 + .../text-base/get-display-name.h.svn-base | 34 + .../text-base/lock-caldav-object.c.svn-base | 292 + .../text-base/lock-caldav-object.h.svn-base | 55 + src/.svn/text-base/md5.c.svn-base | 442 + src/.svn/text-base/md5.h.svn-base | 52 + .../text-base/modify-caldav-object.c.svn-base | 296 + .../text-base/modify-caldav-object.h.svn-base | 34 + .../options-caldav-server.c.svn-base | 135 + .../options-caldav-server.h.svn-base | 43 + src/Makefile.am | 53 + src/Makefile.in | 649 ++ src/add-caldav-object.c | 132 + src/add-caldav-object.h | 35 + src/caldav-utils.c | 729 ++ src/caldav-utils.h | 221 + src/caldav.c | 995 +++ src/caldav.h | 407 + src/delete-caldav-object.c | 533 ++ src/delete-caldav-object.h | 43 + src/get-caldav-report.c | 472 + src/get-caldav-report.h | 59 + src/get-display-name.c | 139 + src/get-display-name.h | 34 + src/get-freebusy-report.c | 140 + src/get-freebusy-report.h | 35 + src/lock-caldav-object.c | 292 + src/lock-caldav-object.h | 55 + src/md5.c | 442 + src/md5.h | 52 + src/modify-caldav-object.c | 555 ++ src/modify-caldav-object.h | 42 + src/options-caldav-server.c | 135 + src/options-caldav-server.h | 43 + test/.svn/all-wcprops | 17 + test/.svn/entries | 105 + test/.svn/text-base/Makefile.am.svn-base | 8 + test/.svn/text-base/Makefile.in.svn-base | 597 ++ test/Makefile.am | 8 + test/Makefile.in | 597 ++ test/ics/.svn/all-wcprops | 35 + test/ics/.svn/entries | 198 + test/ics/.svn/text-base/Makefile.am.svn-base | 13 + test/ics/.svn/text-base/Makefile.in.svn-base | 448 + test/ics/.svn/text-base/add.ics.svn-base | 12 + test/ics/.svn/text-base/delete.ics.svn-base | 12 + test/ics/.svn/text-base/modify.ics.svn-base | 12 + test/ics/Makefile.am | 13 + test/ics/Makefile.in | 448 + test/ics/add.ics | 12 + test/ics/delete.ics | 12 + test/ics/modify.ics | 12 + test/src/.svn/all-wcprops | 23 + test/src/.svn/entries | 130 + test/src/.svn/text-base/Makefile.am.svn-base | 24 + test/src/.svn/text-base/Makefile.in.svn-base | 568 ++ .../src/.svn/text-base/caldav-test.c.svn-base | 383 + test/src/Makefile.am | 24 + test/src/Makefile.in | 568 ++ test/src/caldav-test.c | 383 + test/unittest/.svn/all-wcprops | 23 + test/unittest/.svn/entries | 130 + .../.svn/prop-base/Makefile.am.svn-base | 5 + .../.svn/prop-base/Makefile.in.svn-base | 5 + .../.svn/prop-base/libunit.c.svn-base | 9 + .../.svn/text-base/Makefile.am.svn-base | 22 + .../.svn/text-base/Makefile.in.svn-base | 564 ++ .../.svn/text-base/libunit.c.svn-base | 615 ++ test/unittest/Makefile.am | 22 + test/unittest/Makefile.in | 564 ++ test/unittest/libunit.c | 615 ++ version.sh | 10 + 108 files changed, 31485 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 README create mode 100644 TODO create mode 100644 aminclude.am create mode 100755 autogen.sh create mode 100644 configure.ac create mode 100644 doxygen-api.cfg create mode 100644 libcaldav.pc create mode 100644 libcaldav.pc.in create mode 100644 m4/.svn/all-wcprops create mode 100644 m4/.svn/entries create mode 100644 m4/.svn/prop-base/ax_prog_doxygen.m4.svn-base create mode 100644 m4/.svn/text-base/acinclude.m4.svn-base create mode 100644 m4/.svn/text-base/ax_prog_doxygen.m4.svn-base create mode 100644 m4/acinclude.m4 create mode 100644 m4/ax_prog_doxygen.m4 create mode 100644 rfc4791.pdf create mode 100644 src/.svn/all-wcprops create mode 100644 src/.svn/entries create mode 100644 src/.svn/text-base/Makefile.am.svn-base create mode 100644 src/.svn/text-base/Makefile.in.svn-base create mode 100644 src/.svn/text-base/add-caldav-object.c.svn-base create mode 100644 src/.svn/text-base/add-caldav-object.h.svn-base create mode 100644 src/.svn/text-base/caldav-utils.c.svn-base create mode 100644 src/.svn/text-base/caldav-utils.h.svn-base create mode 100644 src/.svn/text-base/caldav.c.svn-base create mode 100644 src/.svn/text-base/caldav.h.svn-base create mode 100644 src/.svn/text-base/delete-caldav-object.c.svn-base create mode 100644 src/.svn/text-base/delete-caldav-object.h.svn-base create mode 100644 src/.svn/text-base/get-caldav-report.c.svn-base create mode 100644 src/.svn/text-base/get-caldav-report.h.svn-base create mode 100644 src/.svn/text-base/get-display-name.c.svn-base create mode 100644 src/.svn/text-base/get-display-name.h.svn-base create mode 100644 src/.svn/text-base/lock-caldav-object.c.svn-base create mode 100644 src/.svn/text-base/lock-caldav-object.h.svn-base create mode 100644 src/.svn/text-base/md5.c.svn-base create mode 100644 src/.svn/text-base/md5.h.svn-base create mode 100644 src/.svn/text-base/modify-caldav-object.c.svn-base create mode 100644 src/.svn/text-base/modify-caldav-object.h.svn-base create mode 100644 src/.svn/text-base/options-caldav-server.c.svn-base create mode 100644 src/.svn/text-base/options-caldav-server.h.svn-base create mode 100644 src/Makefile.am create mode 100644 src/Makefile.in create mode 100644 src/add-caldav-object.c create mode 100644 src/add-caldav-object.h create mode 100644 src/caldav-utils.c create mode 100644 src/caldav-utils.h create mode 100644 src/caldav.c create mode 100644 src/caldav.h create mode 100644 src/delete-caldav-object.c create mode 100644 src/delete-caldav-object.h create mode 100644 src/get-caldav-report.c create mode 100644 src/get-caldav-report.h create mode 100644 src/get-display-name.c create mode 100644 src/get-display-name.h create mode 100644 src/get-freebusy-report.c create mode 100644 src/get-freebusy-report.h create mode 100644 src/lock-caldav-object.c create mode 100644 src/lock-caldav-object.h create mode 100644 src/md5.c create mode 100644 src/md5.h create mode 100644 src/modify-caldav-object.c create mode 100644 src/modify-caldav-object.h create mode 100644 src/options-caldav-server.c create mode 100644 src/options-caldav-server.h create mode 100644 test/.svn/all-wcprops create mode 100644 test/.svn/entries create mode 100644 test/.svn/text-base/Makefile.am.svn-base create mode 100644 test/.svn/text-base/Makefile.in.svn-base create mode 100644 test/Makefile.am create mode 100644 test/Makefile.in create mode 100644 test/ics/.svn/all-wcprops create mode 100644 test/ics/.svn/entries create mode 100644 test/ics/.svn/text-base/Makefile.am.svn-base create mode 100644 test/ics/.svn/text-base/Makefile.in.svn-base create mode 100644 test/ics/.svn/text-base/add.ics.svn-base create mode 100644 test/ics/.svn/text-base/delete.ics.svn-base create mode 100644 test/ics/.svn/text-base/modify.ics.svn-base create mode 100644 test/ics/Makefile.am create mode 100644 test/ics/Makefile.in create mode 100644 test/ics/add.ics create mode 100644 test/ics/delete.ics create mode 100644 test/ics/modify.ics create mode 100644 test/src/.svn/all-wcprops create mode 100644 test/src/.svn/entries create mode 100644 test/src/.svn/text-base/Makefile.am.svn-base create mode 100644 test/src/.svn/text-base/Makefile.in.svn-base create mode 100644 test/src/.svn/text-base/caldav-test.c.svn-base create mode 100644 test/src/Makefile.am create mode 100644 test/src/Makefile.in create mode 100644 test/src/caldav-test.c create mode 100644 test/unittest/.svn/all-wcprops create mode 100644 test/unittest/.svn/entries create mode 100644 test/unittest/.svn/prop-base/Makefile.am.svn-base create mode 100644 test/unittest/.svn/prop-base/Makefile.in.svn-base create mode 100644 test/unittest/.svn/prop-base/libunit.c.svn-base create mode 100644 test/unittest/.svn/text-base/Makefile.am.svn-base create mode 100644 test/unittest/.svn/text-base/Makefile.in.svn-base create mode 100644 test/unittest/.svn/text-base/libunit.c.svn-base create mode 100644 test/unittest/Makefile.am create mode 100644 test/unittest/Makefile.in create mode 100644 test/unittest/libunit.c create mode 100644 version.sh diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..e76147b --- /dev/null +++ b/AUTHORS @@ -0,0 +1,3 @@ +Michael Rasmussen (mir@datanom.net) +Emmanuel Blindauer (e.blindauer@gmail.com) + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..eafeb9b --- /dev/null +++ b/ChangeLog @@ -0,0 +1,130 @@ +libcaldav (0.6.2) + * Fix bug to be able to handle HTTP HEADER lines split + over multiple lines. Patch provided by Timothy Pearson + +-- Michael Rasmussen Tue, 25 May 2010 22:51:03 +0100 + +libcaldav (0.6.1) + * Fix redirection bug to fully support Zimbra server. Patch + provided by Timothy Pearson + +-- Michael Rasmussen Tue, 25 May 2010 22:51:03 +0100 + +libcaldav (0.6.0) + * Refactored to properly handle URL schema. Also fixes bug 2985320 + * More accurate error message in case of unresolable host or unable + to get a connection. fixes feature request 2985321 + * Added support for FREEBUSY search + * Fix bug 3003201. Solution provided by Dmitry Savenko + +-- Michael Rasmussen Mon, 12 Apr 2010 12:15:03 +0100 + +libcaldav (0.5.2) + * Added a unit like testing framework + * Make the use of locking configurable + * Extend testing framework to test for this + +-- Michael Rasmussen Thu, 8 Apr 2010 12:15:03 +0100 + +libcaldav (0.5.1) + * Honor request 2981083. Implement a response_free function + * Honor request 2981100. Implement a runtime_info creation function + * Fix bug 2981096. A number of memory leaks + * Complete refactoring. Implement basic setup of curl instance in a + function which all other function uses to ease maintainability and + simplicity and to reduce the number of repeated code lines. + +-- Michael Rasmussen Sat, 3 Apr 2010 03:29:03 +0100 + +libcaldav (0.5.0) + * Make library thread-safe. Close bug 2971102. + * Changed test application accordingly. + * Fix a number of memory leaks. + * Fix a number of double frees. + * fix regression introduced in revision 9 which broke locking + in delete and modify. + * Enhanced the error reporting for lock requests. + * Fix some potential memory leaks. + * Fix bug in parsing URL for username and password. + * Fix pedantic behaviour from Google which chokes on URL's + containing // + * Fix bug so that get_etag also is able to handle namespace + prefix for finding etags + +-- Michael Rasmussen Sat, 27 Mar 2010 03:27:03 +0100 + +libcaldav (0.4.2) + * Fix bug so that SSL specific settings are actually used. + Close bug 2971096. + * Fix bug so is-caldav and options are handled correct + * Applied help for new SSL settings to test application + +-- Michael Rasmussen Sat, 27 Mar 2010 03:27:03 +0100 + +libcaldav (0.4.1) + * Fix bug so that SSL specific errors are handled properly. + Close bug 2963143. + * Add option to build script to disable/enable building of + API documentation. Default is disabled. + * More cleaning up of the build system. + * Fix compile time warnings caused by gcc4.4 and minor change in + libcurl API. + * Add option to disable verification of peer's certificate + * Add option to specify custom CA cert file + +-- Michael Rasmussen Sat, 7 Mar 2010 09:06:24 +0100 + +libcaldav (0.4.0) + * Extend test client to be able to use both http and https + * Clean up some build instructions + +-- Michael Rasmussen Sat, 27 Feb 2010 12:06:24 +0100 + +libcaldav (0.3.1) + * Add https support + * make the useragent a configurable string, as some server doesn't like + 'curl' + +-- Emmanuel Blindauer Fri Feb 26 20:49:16 CET 2010 + + +libcaldav (0.3.0) + * This version implements locking if the server supports this. Locking + will be done every time a request for modify or delete is sent to the + server + * 1) In ICalendar all plain text is wrapped inside DTD CDATA elements + * 2) ICalendar does not support collations for text-match in which case + collations has been removed from request - default is i;ascii-casemap anyhow + +-- Michael Rasmussen Thu, 08 Apr 2008 00:06:24 +0100 + +libcaldav (0.2.0) + + * This version is a maintenance release due to important bugs. + * 1) Bugs found in XML which produced incorrect requests corrected + * 2) Added an option to configure to request dynamic or static library + * 3) Build system clean up + * 4) Discovered possible null pointers in error messages which is now + eliminated + * 5) Resolve bug in get_response_header which caused function to + change contents of variable in calling function + * 6) Added extra variable to get_response_header to decide whether returned + string should be all lower or not + 7) Function get_tag can now also handle namespace prefix in tags + 8) Added function caldav_getoptions to have a list of supported options + by the server returned. + * 9) Compatibily tests run against Chandler and Apple's ICalendar + - Chandler: calendar-query not working due to bugs in Chandler's + implementation of calendar-query which is not conforming to RFC4791 + - ICalendar: After adding namespace prefix awareness all test ran as + expected. + * 10) The CLI test application upgraded to use new features. + + -- Michael Rasmussen Thu, 03 Apr 2008 10:10:00 +0100 + +libcaldav (0.1.0) + + * first public release + + -- Michael Rasmussen Tue, 25 Mar 2008 13:20:21 +0100 + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..5d8b061 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,39 @@ +AUTOMAKE_OPTIONS = gnu + +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = src test + +if BUILD_DOC +include aminclude.am + +MOSTLYCLEANFILES = \ + $(DX_CLEANFILES) \ + doc + +doxydir = @DX_DOCDIR@ +dist_man3_MANS = $(doxydir)/man/man3/caldav.h.3 +$(dist_man3_MANS): doxygen-doc + +libcaldav_apidoc_filedir = $(docdir) +libcaldav_apidoc_file_DATA = \ + doc/libcaldav.pdf +endif + +libcaldav_configdir = $(libdir)/pkgconfig +libcaldav_config_DATA = libcaldav.pc + +EXTRA_DIST = \ + README \ + COPYING \ + AUTHORS \ + ChangeLog \ + INSTALL \ + NEWS \ + TODO \ + rfc4791.pdf \ + version.sh \ + $(dx_config) \ + doxygen-api.cfg \ + libcaldav.pc \ + autogen.sh diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..edd977f --- /dev/null +++ b/Makefile.in @@ -0,0 +1,1015 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Automake macro files. + +# Generate automatic documentation using Doxygen. Goals and variables values +# are controlled by the various DX_COND_??? conditionals set by autoconf. +# +# The provided goals are: +# doxygen-doc: Generate all doxygen documentation. +# doxygen-run: Run doxygen, which will generate some of the documentation +# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post +# processing required for the rest of it (PS, PDF, and some MAN). +# doxygen-man: Rename some doxygen generated man pages. +# doxygen-ps: Generate doxygen PostScript documentation. +# doxygen-pdf: Generate doxygen PDF documentation. +# +# Note that by default these are not integrated into the automake goals. If +# doxygen is used to generate man pages, you can achieve this integration by +# setting man3_MANS to the list of man pages generated and then adding the +# dependency: +# +# $(man3_MANS): doxygen-doc +# +# This will cause make to run doxygen and generate all the documentation. +# +# The following variable is intended for use in Makefile.am: +# +# DX_CLEANFILES = everything to clean. +# +# This is usually added to MOSTLYCLEANFILES. + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +DIST_COMMON = README $(am__configure_deps) $(dist_man3_MANS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/aminclude.am $(srcdir)/config.h.in \ + $(srcdir)/libcaldav.pc.in $(top_srcdir)/configure AUTHORS \ + COPYING ChangeLog INSTALL NEWS TODO config.guess config.sub \ + depcomp install-sh ltmain.sh missing +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = libcaldav.pc +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man3dir = $(mandir)/man3 +am__installdirs = "$(DESTDIR)$(man3dir)" \ + "$(DESTDIR)$(libcaldav_apidoc_filedir)" \ + "$(DESTDIR)$(libcaldav_configdir)" +NROFF = nroff +MANS = $(dist_man3_MANS) +DATA = $(libcaldav_apidoc_file_DATA) $(libcaldav_config_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURL_CFLAGS = @CURL_CFLAGS@ +CURL_LIBS = @CURL_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DX_CONFIG = @DX_CONFIG@ +DX_DOCDIR = @DX_DOCDIR@ +DX_DOT = @DX_DOT@ +DX_DOXYGEN = @DX_DOXYGEN@ +DX_DVIPS = @DX_DVIPS@ +DX_EGREP = @DX_EGREP@ +DX_ENV = @DX_ENV@ +DX_FLAG_chi = @DX_FLAG_chi@ +DX_FLAG_chm = @DX_FLAG_chm@ +DX_FLAG_doc = @DX_FLAG_doc@ +DX_FLAG_dot = @DX_FLAG_dot@ +DX_FLAG_html = @DX_FLAG_html@ +DX_FLAG_man = @DX_FLAG_man@ +DX_FLAG_pdf = @DX_FLAG_pdf@ +DX_FLAG_ps = @DX_FLAG_ps@ +DX_FLAG_rtf = @DX_FLAG_rtf@ +DX_FLAG_xml = @DX_FLAG_xml@ +DX_HHC = @DX_HHC@ +DX_LATEX = @DX_LATEX@ +DX_MAKEINDEX = @DX_MAKEINDEX@ +DX_PDFLATEX = @DX_PDFLATEX@ +DX_PERL = @DX_PERL@ +DX_PROJECT = @DX_PROJECT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBVERSION = @LIBVERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = gnu +ACLOCAL_AMFLAGS = -I m4 +SUBDIRS = src test +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_html_TRUE@DX_CLEAN_HTML = @DX_DOCDIR@/html +@BUILD_DOC_TRUE@@DX_COND_chm_TRUE@@DX_COND_doc_TRUE@DX_CLEAN_CHM = @DX_DOCDIR@/chm +@BUILD_DOC_TRUE@@DX_COND_chi_TRUE@@DX_COND_chm_TRUE@@DX_COND_doc_TRUE@DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_man_TRUE@DX_CLEAN_MAN = @DX_DOCDIR@/man +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_rtf_TRUE@DX_CLEAN_RTF = @DX_DOCDIR@/rtf +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_xml_TRUE@DX_CLEAN_XML = @DX_DOCDIR@/xml +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@DX_PS_GOAL = doxygen-ps +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@DX_PDF_GOAL = doxygen-pdf +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_latex_TRUE@DX_CLEAN_LATEX = @DX_DOCDIR@/latex +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@DX_CLEANFILES = \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ @DX_DOCDIR@/@PACKAGE@.tag \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ -r \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ $(DX_CLEAN_HTML) \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ $(DX_CLEAN_CHM) \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ $(DX_CLEAN_CHI) \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ $(DX_CLEAN_MAN) \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ $(DX_CLEAN_RTF) \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ $(DX_CLEAN_XML) \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ $(DX_CLEAN_PS) \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ $(DX_CLEAN_PDF) \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ $(DX_CLEAN_LATEX) + +@BUILD_DOC_TRUE@MOSTLYCLEANFILES = \ +@BUILD_DOC_TRUE@ $(DX_CLEANFILES) \ +@BUILD_DOC_TRUE@ doc + +@BUILD_DOC_TRUE@doxydir = @DX_DOCDIR@ +@BUILD_DOC_TRUE@dist_man3_MANS = $(doxydir)/man/man3/caldav.h.3 +@BUILD_DOC_TRUE@libcaldav_apidoc_filedir = $(docdir) +@BUILD_DOC_TRUE@libcaldav_apidoc_file_DATA = \ +@BUILD_DOC_TRUE@ doc/libcaldav.pdf + +libcaldav_configdir = $(libdir)/pkgconfig +libcaldav_config_DATA = libcaldav.pc +EXTRA_DIST = \ + README \ + COPYING \ + AUTHORS \ + ChangeLog \ + INSTALL \ + NEWS \ + TODO \ + rfc4791.pdf \ + version.sh \ + $(dx_config) \ + doxygen-api.cfg \ + libcaldav.pc \ + autogen.sh + +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/aminclude.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +libcaldav.pc: $(top_builddir)/config.status $(srcdir)/libcaldav.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-man3: $(dist_man3_MANS) + @$(NORMAL_INSTALL) + test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" + @list='$(dist_man3_MANS)'; test -n "$(man3dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ + done; } + +uninstall-man3: + @$(NORMAL_UNINSTALL) + @list='$(dist_man3_MANS)'; test -n "$(man3dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man3dir)" && rm -f $$files; } +install-libcaldav_apidoc_fileDATA: $(libcaldav_apidoc_file_DATA) + @$(NORMAL_INSTALL) + test -z "$(libcaldav_apidoc_filedir)" || $(MKDIR_P) "$(DESTDIR)$(libcaldav_apidoc_filedir)" + @list='$(libcaldav_apidoc_file_DATA)'; test -n "$(libcaldav_apidoc_filedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(libcaldav_apidoc_filedir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(libcaldav_apidoc_filedir)" || exit $$?; \ + done + +uninstall-libcaldav_apidoc_fileDATA: + @$(NORMAL_UNINSTALL) + @list='$(libcaldav_apidoc_file_DATA)'; test -n "$(libcaldav_apidoc_filedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(libcaldav_apidoc_filedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(libcaldav_apidoc_filedir)" && rm -f $$files +install-libcaldav_configDATA: $(libcaldav_config_DATA) + @$(NORMAL_INSTALL) + test -z "$(libcaldav_configdir)" || $(MKDIR_P) "$(DESTDIR)$(libcaldav_configdir)" + @list='$(libcaldav_config_DATA)'; test -n "$(libcaldav_configdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(libcaldav_configdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(libcaldav_configdir)" || exit $$?; \ + done + +uninstall-libcaldav_configDATA: + @$(NORMAL_UNINSTALL) + @list='$(libcaldav_config_DATA)'; test -n "$(libcaldav_configdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(libcaldav_configdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(libcaldav_configdir)" && rm -f $$files + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(MANS) $(DATA) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(libcaldav_apidoc_filedir)" "$(DESTDIR)$(libcaldav_configdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-libcaldav_apidoc_fileDATA \ + install-libcaldav_configDATA install-man + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: install-man3 + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-libcaldav_apidoc_fileDATA \ + uninstall-libcaldav_configDATA uninstall-man + +uninstall-man: uninstall-man3 + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ + dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ + distcheck distclean distclean-generic distclean-hdr \ + distclean-libtool distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-libcaldav_apidoc_fileDATA install-libcaldav_configDATA \ + install-man install-man3 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-libcaldav_apidoc_fileDATA \ + uninstall-libcaldav_configDATA uninstall-man uninstall-man3 + + +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps + +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ cd @DX_DOCDIR@/latex; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_LATEX) refman.tex; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(MAKEINDEX_PATH) refman.idx; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_LATEX) refman.tex; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ countdown=5; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ refman.log > /dev/null 2>&1 \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ && test $$countdown -gt 0; do \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_LATEX) refman.tex; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ countdown=`expr $$countdown - 1`; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ done; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi + +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf + +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ cd @DX_DOCDIR@/latex; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_PDFLATEX) refman.tex; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_MAKEINDEX) refman.idx; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_PDFLATEX) refman.tex; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ countdown=5; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ refman.log > /dev/null 2>&1 \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ && test $$countdown -gt 0; do \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_PDFLATEX) refman.tex; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ countdown=`expr $$countdown - 1`; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ done; \ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ mv refman.pdf ../@PACKAGE@.pdf + +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag + +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ rm -rf @DX_DOCDIR@ +@BUILD_DOC_TRUE@@DX_COND_doc_TRUE@ $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) +@BUILD_DOC_TRUE@$(dist_man3_MANS): doxygen-doc + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..9e272ea --- /dev/null +++ b/NEWS @@ -0,0 +1,4 @@ +2008-03-29 (Michael Rasmussen) + As this is the first public version of the library there is not + so much news appart from the fact, that the library is now publicly + available for download. diff --git a/README b/README new file mode 100644 index 0000000..e024625 --- /dev/null +++ b/README @@ -0,0 +1,19 @@ +libcaldav Version 0.1.0 + +These are the feature so far + - Support for VEVENT + - Add. Add a new event to the collection + - Get. Get one or more events from the collection + - Getall. Get all events from the collection + - Modify. Modify an event + - Delete. Delete an event + - GetCalName. Get the display name from the collection + - IsCalDAV. Test wether a given URL represents a CalDAV collection + +See INSTALL for further information. + +For an overview of the current status and future feature implementation +study the TODO file. + +Happy Hacking +Michael Rasmussen (mir@datanom.net) diff --git a/TODO b/TODO new file mode 100644 index 0000000..34abd6e --- /dev/null +++ b/TODO @@ -0,0 +1,10 @@ +In the nearest future: + + - Searching free/busy information is lacking (VFREEBUSY). + - This will be implemented in the next release. + +Something to come at a later time: + + - Implement ToDo support + - Implement Journal support + diff --git a/aminclude.am b/aminclude.am new file mode 100644 index 0000000..420049e --- /dev/null +++ b/aminclude.am @@ -0,0 +1,186 @@ +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Automake macro files. + +# Generate automatic documentation using Doxygen. Goals and variables values +# are controlled by the various DX_COND_??? conditionals set by autoconf. +# +# The provided goals are: +# doxygen-doc: Generate all doxygen documentation. +# doxygen-run: Run doxygen, which will generate some of the documentation +# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post +# processing required for the rest of it (PS, PDF, and some MAN). +# doxygen-man: Rename some doxygen generated man pages. +# doxygen-ps: Generate doxygen PostScript documentation. +# doxygen-pdf: Generate doxygen PDF documentation. +# +# Note that by default these are not integrated into the automake goals. If +# doxygen is used to generate man pages, you can achieve this integration by +# setting man3_MANS to the list of man pages generated and then adding the +# dependency: +# +# $(man3_MANS): doxygen-doc +# +# This will cause make to run doxygen and generate all the documentation. +# +# The following variable is intended for use in Makefile.am: +# +# DX_CLEANFILES = everything to clean. +# +# This is usually added to MOSTLYCLEANFILES. + +## --------------------------------- ## +## Format-independent Doxygen rules. ## +## --------------------------------- ## + +if DX_COND_doc + +## ------------------------------- ## +## Rules specific for HTML output. ## +## ------------------------------- ## + +if DX_COND_html + +DX_CLEAN_HTML = @DX_DOCDIR@/html + +endif DX_COND_html + +## ------------------------------ ## +## Rules specific for CHM output. ## +## ------------------------------ ## + +if DX_COND_chm + +DX_CLEAN_CHM = @DX_DOCDIR@/chm + +if DX_COND_chi + +DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi + +endif DX_COND_chi + +endif DX_COND_chm + +## ------------------------------ ## +## Rules specific for MAN output. ## +## ------------------------------ ## + +if DX_COND_man + +DX_CLEAN_MAN = @DX_DOCDIR@/man + +endif DX_COND_man + +## ------------------------------ ## +## Rules specific for RTF output. ## +## ------------------------------ ## + +if DX_COND_rtf + +DX_CLEAN_RTF = @DX_DOCDIR@/rtf + +endif DX_COND_rtf + +## ------------------------------ ## +## Rules specific for XML output. ## +## ------------------------------ ## + +if DX_COND_xml + +DX_CLEAN_XML = @DX_DOCDIR@/xml + +endif DX_COND_xml + +## ----------------------------- ## +## Rules specific for PS output. ## +## ----------------------------- ## + +if DX_COND_ps + +DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps + +DX_PS_GOAL = doxygen-ps + +doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps + +@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_LATEX) refman.tex; \ + $(MAKEINDEX_PATH) refman.idx; \ + $(DX_LATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_LATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi + +endif DX_COND_ps + +## ------------------------------ ## +## Rules specific for PDF output. ## +## ------------------------------ ## + +if DX_COND_pdf + +DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf + +DX_PDF_GOAL = doxygen-pdf + +doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf + +@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_PDFLATEX) refman.tex; \ + $(DX_MAKEINDEX) refman.idx; \ + $(DX_PDFLATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_PDFLATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + mv refman.pdf ../@PACKAGE@.pdf + +endif DX_COND_pdf + +## ------------------------------------------------- ## +## Rules specific for LaTeX (shared for PS and PDF). ## +## ------------------------------------------------- ## + +if DX_COND_latex + +DX_CLEAN_LATEX = @DX_DOCDIR@/latex + +endif DX_COND_latex + +.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) + +.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag + +doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) + rm -rf @DX_DOCDIR@ + $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) + +DX_CLEANFILES = \ + @DX_DOCDIR@/@PACKAGE@.tag \ + -r \ + $(DX_CLEAN_HTML) \ + $(DX_CLEAN_CHM) \ + $(DX_CLEAN_CHI) \ + $(DX_CLEAN_MAN) \ + $(DX_CLEAN_RTF) \ + $(DX_CLEAN_XML) \ + $(DX_CLEAN_PS) \ + $(DX_CLEAN_PDF) \ + $(DX_CLEAN_LATEX) + +endif DX_COND_doc diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..f4cb74d --- /dev/null +++ b/autogen.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +echo "Rebuilding build system......" + +autoreconf --version 2>&1 > /dev/null 2>&1 + +if [ $? -eq 0 ]; then + AUTORECONF=autoreconf +else + AUTORECONF= +fi + +error() { + echo "Missing tool: $1" + echo "Cannot proceed until the missing tool is available" + exit 1 +} + +if [ ! -z ${AUTORECONF} ]; then + echo "Using autoreconf to rebuild build system" + autoreconf --force --install --symlink +else + echo "No autoreconf found. Using plain old tools to rebuild build system" + libtoolize --automake --force || error libtoolize + aclocal -I m4|| error aclocal + autoheader --force || error autoheader + automake --add-missing --force-missing --gnu || error automake + autoconf --force || error autoconf +fi +./configure $* + +exit 0 diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..3f7b492 --- /dev/null +++ b/configure.ac @@ -0,0 +1,146 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.61) + +AC_INIT([libcaldav], m4_esyscmd([sh ./version.sh | tr -d '\n']), [mir@datanom.net]) +AC_CONFIG_MACRO_DIR([m4]) + +LIBVERSION=m4_esyscmd([sh ./version.sh LIBTOOL | tr -d '\n']) +AC_SUBST(LIBVERSION) + +AC_CANONICAL_SYSTEM + +# Generate documentation +# API +DX_HTML_FEATURE(OFF) +DX_CHM_FEATURE(OFF) +DX_CHI_FEATURE(OFF) +DX_MAN_FEATURE(ON) +DX_RTF_FEATURE(OFF) +DX_XML_FEATURE(OFF) +DX_PDF_FEATURE(ON) +DX_PS_FEATURE(OFF) +DX_INIT_DOXYGEN(libcaldav, doxygen-api.cfg, doc) + +AM_INIT_AUTOMAKE([dist-bzip2 1.9.6]) +AM_MAINTAINER_MODE +AC_CONFIG_HEADER([config.h]) +AM_MAINTAINER_MODE + +if test $USE_MAINTAINER_MODE = yes; then + CFLAGS="-g -Wall -D_REENTRANT" + STATIC=1 + DYNAMIC=0 + BUILD_TEST=true +else + #CFLAGS="-g -Wall" + CFLAGS="$CFLAGS -O2 -Wall -D_REENTRANT" + STATIC=0 + DYNAMIC=1 + BUILD_TEST=false +fi +AM_CONDITIONAL([STATIC_LINK], [test $STATIC -eq 1]) +AM_CONDITIONAL([DYNAMIC_LINK], [test $DYNAMIC -eq 1]) + +# Checks for programs. +AC_PROG_CC +AC_LANG_C +AC_ISC_POSIX +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_HEADER_STDC +AC_PROG_CPP +AM_PROG_LIBTOOL +AC_PROG_INSTALL + +# Checks for libraries. +PKG_CHECK_MODULES(CURL, [libcurl >= 7.15.5]) +AC_SUBST(CURL_CFLAGS) +AC_SUBST(CURL_LIBS) + +PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.6 gthread-2.0]) +AC_SUBST(GLIB_CFLAGS) +AC_SUBST(GLIB_LIBS) + +#PKG_CHECK_MODULES(OPENSSL, [openssl >= 0.9.8]) +#AC_SUBST(OPENSSL_CFLAGS) +#AC_SUBST(OPENSSL_LIBS) + +# Checks for header files. +AC_HEADER_STDC + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_SIZE_T +AC_STRUCT_TM + +# Checks for library functions. + +# Should we build test program +AC_ARG_ENABLE([caldav], + [AC_HELP_STRING(--enable-caldav, Build test application (default=no))], + [case "${enableval}" in + yes) caldav=true ;; + no) caldav=false ;; + *) AC_MSG_ERROR([bad value "${enableval}" for --enable-caldav]) ;; + esac], [caldav=$BUILD_TEST]) +AM_CONDITIONAL([BUILD_CALDAV], [test x$caldav = xtrue]) + +# Should we build unit test program +AC_ARG_ENABLE([unittest], + [AC_HELP_STRING(--enable-unittest, Build unti test application (default=no))], + [case "${enableval}" in + yes) unittest=true ;; + no) unittest=false ;; + *) AC_MSG_ERROR([bad value "${enableval}" for --enable-unittest]) ;; + esac], [unittest=$BUILD_TEST]) +AM_CONDITIONAL([BUILD_UNITTEST], [test x$unittest = xtrue]) + +# Build API documentation +AC_ARG_ENABLE([doc], + [AC_HELP_STRING(--enable-doc, Build API documentation (default=no))], + [case "${enableval}" in + yes) doc=true ;; + no) doc=false ;; + *) AC_MSG_ERROR([bad value "${enableval}" for --enable-doc]) ;; + esac], [doc=false]) +AM_CONDITIONAL([BUILD_DOC], [test x$doc = xtrue]) + +AC_CONFIG_COMMANDS( + summary, + [echo "" + echo "libcaldav will be compiled with these settings:" + echo "" + echo -e "\tCFLAGS:\t\t\t\t$cflags" + echo -e "\tBuild caldav-test:\t\t$caldav" + echo -e "\tBuild unittest:\t\t\t$unittest" + echo -e "\tBuild API documentation:\t$doc" + echo -e "\tLibrary is linked:\t\t$link" + echo "" + echo -e "Now run make to build the library" + echo "" + echo -e "Please send bugs or feature requests to the maintainer(s)." + echo -e "Email addresses can be found in the AUTHORS file." + echo ""], + [caldav=${caldav} + unittest=${unittest} + doc=${doc} + cflags="${CFLAGS}" + if test $DYNAMIC -eq 1; then + link="Dynamic" + else + link="Static" + fi] +) + +AC_OUTPUT([ + Makefile + libcaldav.pc + src/Makefile + test/Makefile + test/src/Makefile + test/ics/Makefile + test/unittest/Makefile +]) diff --git a/doxygen-api.cfg b/doxygen-api.cfg new file mode 100644 index 0000000..43e1bab --- /dev/null +++ b/doxygen-api.cfg @@ -0,0 +1,250 @@ +# Doxyfile 1.5.5 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = $(PROJECT)-$(VERSION) +PROJECT_NUMBER = +OUTPUT_DIRECTORY = $(DOCDIR) +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = $(SRCDIR)/src +STRIP_FROM_INC_PATH = $(SRCDIR)/src +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = YES +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = NO +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = YES +WARNINGS = NO +WARN_IF_UNDOCUMENTED = NO +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = $(SRCDIR)/src +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = *.c \ + *.h +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = $(SRCDIR)/src +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +USE_HTAGS = NO +VERBATIM_HEADERS = NO +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = $(GENERATE_HTML) +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +HTML_DYNAMIC_SECTIONS = NO +CHM_FILE = ../$(PROJECT).chm +HHC_LOCATION = $(HHC_PATH) +GENERATE_CHI = $(GENERATE_CHM) +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = $(GENERATE_LATEX) +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = $(PAPER_SIZE) +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = $(GENERATE_RTF) +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = $(GENERATE_MAN) +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = $(GENERATE_XML) +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = $(DOCDIR)/$(PROJECT).tag +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = $(PERL_PATH) +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = NO +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = $(HAVE_DOT) +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = $(DOT_PATH) +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 1000 +DOT_TRANSPARENT = YES +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/libcaldav.pc b/libcaldav.pc new file mode 100644 index 0000000..87f6b75 --- /dev/null +++ b/libcaldav.pc @@ -0,0 +1,14 @@ +prefix=/usr/local +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +pkglibdir=${libdir}/libcaldav +pkgincludedir=${includedir}/libcaldav + +Name: libcaldav +Description: libcaldav is a client library for CalDAV +Version: 0.6.5 + +Cflags: -pthread -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include +Libs: -pthread -lgthread-2.0 -lrt -lglib-2.0 -lcurl diff --git a/libcaldav.pc.in b/libcaldav.pc.in new file mode 100644 index 0000000..8ea9c6b --- /dev/null +++ b/libcaldav.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +pkglibdir=${libdir}/@PACKAGE@ +pkgincludedir=${includedir}/@PACKAGE@ + +Name: libcaldav +Description: libcaldav is a client library for CalDAV +Version: @VERSION@ + +Cflags: @GLIB_CFLAGS@ @CURL_CFLAGS@ +Libs: @GLIB_LIBS@ @CURL_LIBS@ diff --git a/m4/.svn/all-wcprops b/m4/.svn/all-wcprops new file mode 100644 index 0000000..dbd5fcf --- /dev/null +++ b/m4/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 39 +/svnroot/libcaldav/!svn/ver/10/trunk/m4 +END +acinclude.m4 +K 25 +svn:wc:ra_dav:version-url +V 51 +/svnroot/libcaldav/!svn/ver/1/trunk/m4/acinclude.m4 +END +ax_prog_doxygen.m4 +K 25 +svn:wc:ra_dav:version-url +V 58 +/svnroot/libcaldav/!svn/ver/10/trunk/m4/ax_prog_doxygen.m4 +END diff --git a/m4/.svn/entries b/m4/.svn/entries new file mode 100644 index 0000000..52563f9 --- /dev/null +++ b/m4/.svn/entries @@ -0,0 +1,96 @@ +10 + +dir +42 +https://libcaldav.svn.sourceforge.net/svnroot/libcaldav/trunk/m4 +https://libcaldav.svn.sourceforge.net/svnroot/libcaldav + + + +2010-02-27T11:17:33.222356Z +10 +miras + + + + + + + + + + + + + + +6bb92309-7149-0410-b568-bc30dfd0a1d5 + +acinclude.m4 +file + + + + +2010-05-31T07:07:58.000000Z +9115e99fc4ec059bdd53c777feb4eabf +2008-03-29T18:04:01.076545Z +1 +miras + + + + + + + + + + + + + + + + + + + + + +11536 + +ax_prog_doxygen.m4 +file + + + + +2010-05-31T07:07:58.000000Z +2d616b8dbbafa6396737ce59661169de +2010-02-27T11:17:33.222356Z +10 +miras +has-props + + + + + + + + + + + + + + + + + + + + +17830 + diff --git a/m4/.svn/prop-base/ax_prog_doxygen.m4.svn-base b/m4/.svn/prop-base/ax_prog_doxygen.m4.svn-base new file mode 100644 index 0000000..74fda45 --- /dev/null +++ b/m4/.svn/prop-base/ax_prog_doxygen.m4.svn-base @@ -0,0 +1,5 @@ +K 12 +svn:keywords +V 22 +Author Date Id Rev URL +END diff --git a/m4/.svn/text-base/acinclude.m4.svn-base b/m4/.svn/text-base/acinclude.m4.svn-base new file mode 100644 index 0000000..e4688de --- /dev/null +++ b/m4/.svn/text-base/acinclude.m4.svn-base @@ -0,0 +1,312 @@ +# This file is part of Autoconf. -*- Autoconf -*- + +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Autoconf macro files. + +# Generate automatic documentation using Doxygen. Works in concert with the +# aminclude.m4 file and a compatible doxygen configuration file. Defines the +# following public macros: +# +# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. +# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, +# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' +# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', +# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment +# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' +# paper size. +# +# By default, HTML, PDF and PS documentation is generated as this seems to be +# the most popular and portable combination. MAN pages created by Doxygen are +# usually problematic, though by picking an appropriate subset and doing some +# massaging they might be better than nothing. CHM and RTF are specific for MS +# (note that you can't generate both HTML and CHM at the same time). The XML is +# rather useless unless you apply specialized post-processing to it. +# +# The macro mainly controls the default state of the feature. The use can +# override the default by specifying --enable or --disable. The macros ensure +# that contradictory flags are not given (e.g., --enable-doxygen-html and +# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) +# Finally, each feature will be automatically disabled (with a warning) if the +# required programs are missing. +# +# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with +# the following parameters: a one-word name for the project for use as a +# filename base etc., an optional configuration file name (the default is +# 'Doxyfile', the same as Doxygen's default), and an optional output directory +# name (the default is 'doxygen-doc'). + +## ----------## +## Defaults. ## +## ----------## + +DX_ENV="" +AC_DEFUN([DX_FEATURE_doc], ON) +AC_DEFUN([DX_FEATURE_dot], ON) +AC_DEFUN([DX_FEATURE_man], OFF) +AC_DEFUN([DX_FEATURE_html], ON) +AC_DEFUN([DX_FEATURE_chm], OFF) +AC_DEFUN([DX_FEATURE_chi], OFF) +AC_DEFUN([DX_FEATURE_rtf], OFF) +AC_DEFUN([DX_FEATURE_xml], OFF) +AC_DEFUN([DX_FEATURE_pdf], ON) +AC_DEFUN([DX_FEATURE_ps], ON) + +## --------------- ## +## Private macros. ## +## --------------- ## + +# DX_ENV_APPEND(VARIABLE, VALUE) +# ------------------------------ +# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. +AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) + +# DX_DIRNAME_EXPR +# --------------- +# Expand into a shell expression prints the directory part of a path. +AC_DEFUN([DX_DIRNAME_EXPR], + [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) + +# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) +# ------------------------------------- +# Expands according to the M4 (static) status of the feature. +AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) + +# DX_REQUIRE_PROG(VARIABLE, PROGRAM) +# ---------------------------------- +# Require the specified program to be found for the DX_CURRENT_FEATURE to work. +AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_[]DX_CURRENT_FEATURE$$1" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST([DX_FLAG_[]DX_CURRENT_FEATURE], 0) +fi +]) + +# DX_TEST_FEATURE(FEATURE) +# ------------------------ +# Expand to a shell expression testing whether the feature is active. +AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) + +# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) +# ------------------------------------------------- +# Verify that a required features has the right state before trying to turn on +# the DX_CURRENT_FEATURE. +AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) + +# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) +# ---------------------------------------------------------- +# Turn off the DX_CURRENT_FEATURE if the required feature is off. +AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_[]DX_CURRENT_FEATURE], 0) +]) + +# DX_FEATURE_ARG(FEATURE, DESCRIPTION, +# CHECK_DEPEND, CLEAR_DEPEND, +# REQUIRE, DO-IF-ON, DO-IF-OFF) +# -------------------------------------------- +# Parse the command-line option controlling a feature. CHECK_DEPEND is called +# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), +# otherwise CLEAR_DEPEND is called to turn off the default state if a required +# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional +# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and +# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. +AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) + +## -------------- ## +## Public macros. ## +## -------------- ## + +# DX_XXX_FEATURE(DEFAULT_STATE) +# ----------------------------- +AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) + +# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) +# --------------------------------------------------------- +# PROJECT also serves as the base name for the documentation files. +# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". +AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) diff --git a/m4/.svn/text-base/ax_prog_doxygen.m4.svn-base b/m4/.svn/text-base/ax_prog_doxygen.m4.svn-base new file mode 100644 index 0000000..4e15704 --- /dev/null +++ b/m4/.svn/text-base/ax_prog_doxygen.m4.svn-base @@ -0,0 +1,533 @@ +# =========================================================================== +# http://www.nongnu.org/autoconf-archive/ax_prog_doxygen.html +# =========================================================================== +# +# SYNOPSIS +# +# DX_INIT_DOXYGEN(PROJECT-NAME, DOXYFILE-PATH, [OUTPUT-DIR]) +# DX_DOXYGEN_FEATURE(ON|OFF) +# DX_DOT_FEATURE(ON|OFF) +# DX_HTML_FEATURE(ON|OFF) +# DX_CHM_FEATURE(ON|OFF) +# DX_CHI_FEATURE(ON|OFF) +# DX_MAN_FEATURE(ON|OFF) +# DX_RTF_FEATURE(ON|OFF) +# DX_XML_FEATURE(ON|OFF) +# DX_PDF_FEATURE(ON|OFF) +# DX_PS_FEATURE(ON|OFF) +# +# DESCRIPTION +# +# The DX_*_FEATURE macros control the default setting for the given +# Doxygen feature. Supported features are 'DOXYGEN' itself, 'DOT' for +# generating graphics, 'HTML' for plain HTML, 'CHM' for compressed HTML +# help (for MS users), 'CHI' for generating a seperate .chi file by the +# .chm file, and 'MAN', 'RTF', 'XML', 'PDF' and 'PS' for the appropriate +# output formats. The environment variable DOXYGEN_PAPER_SIZE may be +# specified to override the default 'a4wide' paper size. +# +# By default, HTML, PDF and PS documentation is generated as this seems to +# be the most popular and portable combination. MAN pages created by +# Doxygen are usually problematic, though by picking an appropriate subset +# and doing some massaging they might be better than nothing. CHM and RTF +# are specific for MS (note that you can't generate both HTML and CHM at +# the same time). The XML is rather useless unless you apply specialized +# post-processing to it. +# +# The macros mainly control the default state of the feature. The use can +# override the default by specifying --enable or --disable. The macros +# ensure that contradictory flags are not given (e.g., +# --enable-doxygen-html and --enable-doxygen-chm, +# --enable-doxygen-anything with --disable-doxygen, etc.) Finally, each +# feature will be automatically disabled (with a warning) if the required +# programs are missing. +# +# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN +# with the following parameters: a one-word name for the project for use +# as a filename base etc., an optional configuration file name (the +# default is 'Doxyfile', the same as Doxygen's default), and an optional +# output directory name (the default is 'doxygen-doc'). +# +# Automake Support +# +# The following is a template aminclude.am file for use with Automake. +# Make targets and variables values are controlled by the various +# DX_COND_* conditionals set by autoconf. +# +# The provided targets are: +# +# doxygen-doc: Generate all doxygen documentation. +# +# doxygen-run: Run doxygen, which will generate some of the +# documentation (HTML, CHM, CHI, MAN, RTF, XML) +# but will not do the post processing required +# for the rest of it (PS, PDF, and some MAN). +# +# doxygen-man: Rename some doxygen generated man pages. +# +# doxygen-ps: Generate doxygen PostScript documentation. +# +# doxygen-pdf: Generate doxygen PDF documentation. +# +# Note that by default these are not integrated into the automake targets. +# If doxygen is used to generate man pages, you can achieve this +# integration by setting man3_MANS to the list of man pages generated and +# then adding the dependency: +# +# $(man3_MANS): doxygen-doc +# +# This will cause make to run doxygen and generate all the documentation. +# +# The following variable is intended for use in Makefile.am: +# +# DX_CLEANFILES = everything to clean. +# +# Then add this variable to MOSTLYCLEANFILES. +# +# ----- begin aminclude.am ------------------------------------- +# +# ## --------------------------------- ## +# ## Format-independent Doxygen rules. ## +# ## --------------------------------- ## +# +# if DX_COND_doc +# +# ## ------------------------------- ## +# ## Rules specific for HTML output. ## +# ## ------------------------------- ## +# +# if DX_COND_html +# +# DX_CLEAN_HTML = @DX_DOCDIR@/html +# +# endif DX_COND_html +# +# ## ------------------------------ ## +# ## Rules specific for CHM output. ## +# ## ------------------------------ ## +# +# if DX_COND_chm +# +# DX_CLEAN_CHM = @DX_DOCDIR@/chm +# +# if DX_COND_chi +# +# DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi +# +# endif DX_COND_chi +# +# endif DX_COND_chm +# +# ## ------------------------------ ## +# ## Rules specific for MAN output. ## +# ## ------------------------------ ## +# +# if DX_COND_man +# +# DX_CLEAN_MAN = @DX_DOCDIR@/man +# +# endif DX_COND_man +# +# ## ------------------------------ ## +# ## Rules specific for RTF output. ## +# ## ------------------------------ ## +# +# if DX_COND_rtf +# +# DX_CLEAN_RTF = @DX_DOCDIR@/rtf +# +# endif DX_COND_rtf +# +# ## ------------------------------ ## +# ## Rules specific for XML output. ## +# ## ------------------------------ ## +# +# if DX_COND_xml +# +# DX_CLEAN_XML = @DX_DOCDIR@/xml +# +# endif DX_COND_xml +# +# ## ----------------------------- ## +# ## Rules specific for PS output. ## +# ## ----------------------------- ## +# +# if DX_COND_ps +# +# DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps +# +# DX_PS_GOAL = doxygen-ps +# +# doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps +# +# @DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag +# cd @DX_DOCDIR@/latex; \ +# rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ +# $(DX_LATEX) refman.tex; \ +# $(MAKEINDEX_PATH) refman.idx; \ +# $(DX_LATEX) refman.tex; \ +# countdown=5; \ +# while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ +# refman.log > /dev/null 2>&1 \ +# && test $$countdown -gt 0; do \ +# $(DX_LATEX) refman.tex; \ +# countdown=`expr $$countdown - 1`; \ +# done; \ +# $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi +# +# endif DX_COND_ps +# +# ## ------------------------------ ## +# ## Rules specific for PDF output. ## +# ## ------------------------------ ## +# +# if DX_COND_pdf +# +# DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf +# +# DX_PDF_GOAL = doxygen-pdf +# +# doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf +# +# @DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag +# cd @DX_DOCDIR@/latex; \ +# rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ +# $(DX_PDFLATEX) refman.tex; \ +# $(DX_MAKEINDEX) refman.idx; \ +# $(DX_PDFLATEX) refman.tex; \ +# countdown=5; \ +# while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ +# refman.log > /dev/null 2>&1 \ +# && test $$countdown -gt 0; do \ +# $(DX_PDFLATEX) refman.tex; \ +# countdown=`expr $$countdown - 1`; \ +# done; \ +# mv refman.pdf ../@PACKAGE@.pdf +# +# endif DX_COND_pdf +# +# ## ------------------------------------------------- ## +# ## Rules specific for LaTeX (shared for PS and PDF). ## +# ## ------------------------------------------------- ## +# +# if DX_COND_latex +# +# DX_CLEAN_LATEX = @DX_DOCDIR@/latex +# +# endif DX_COND_latex +# +# .PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) +# +# .INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) +# +# doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag +# +# doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) +# +# @DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) +# rm -rf @DX_DOCDIR@ +# $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) +# +# DX_CLEANFILES = \ +# @DX_DOCDIR@/@PACKAGE@.tag \ +# -r \ +# $(DX_CLEAN_HTML) \ +# $(DX_CLEAN_CHM) \ +# $(DX_CLEAN_CHI) \ +# $(DX_CLEAN_MAN) \ +# $(DX_CLEAN_RTF) \ +# $(DX_CLEAN_XML) \ +# $(DX_CLEAN_PS) \ +# $(DX_CLEAN_PDF) \ +# $(DX_CLEAN_LATEX) +# +# endif DX_COND_doc +# +# ----- end aminclude.am --------------------------------------- +# +# LICENSE +# +# Copyright (c) 2009 Oren Ben-Kiki +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 9 + +## ----------## +## Defaults. ## +## ----------## + +DX_ENV="" +AC_DEFUN([DX_FEATURE_doc], ON) +AC_DEFUN([DX_FEATURE_dot], ON) +AC_DEFUN([DX_FEATURE_man], OFF) +AC_DEFUN([DX_FEATURE_html], ON) +AC_DEFUN([DX_FEATURE_chm], OFF) +AC_DEFUN([DX_FEATURE_chi], OFF) +AC_DEFUN([DX_FEATURE_rtf], OFF) +AC_DEFUN([DX_FEATURE_xml], OFF) +AC_DEFUN([DX_FEATURE_pdf], ON) +AC_DEFUN([DX_FEATURE_ps], ON) + +## --------------- ## +## Private macros. ## +## --------------- ## + +# DX_ENV_APPEND(VARIABLE, VALUE) +# ------------------------------ +# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. +AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) + +# DX_DIRNAME_EXPR +# --------------- +# Expand into a shell expression prints the directory part of a path. +AC_DEFUN([DX_DIRNAME_EXPR], + [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) + +# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) +# ------------------------------------- +# Expands according to the M4 (static) status of the feature. +AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) + +# DX_REQUIRE_PROG(VARIABLE, PROGRAM) +# ---------------------------------- +# Require the specified program to be found for the DX_CURRENT_FEATURE to work. +AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_[]DX_CURRENT_FEATURE$$1" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST(DX_FLAG_[]DX_CURRENT_FEATURE, 0) +fi +]) + +# DX_TEST_FEATURE(FEATURE) +# ------------------------ +# Expand to a shell expression testing whether the feature is active. +AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) + +# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) +# ------------------------------------------------- +# Verify that a required features has the right state before trying to turn on +# the DX_CURRENT_FEATURE. +AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) + +# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) +# ---------------------------------------------------------- +# Turn off the DX_CURRENT_FEATURE if the required feature is off. +AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST(DX_FLAG_[]DX_CURRENT_FEATURE, 0) +]) + +# DX_FEATURE_ARG(FEATURE, DESCRIPTION, +# CHECK_DEPEND, CLEAR_DEPEND, +# REQUIRE, DO-IF-ON, DO-IF-OFF) +# -------------------------------------------- +# Parse the command-line option controlling a feature. CHECK_DEPEND is called +# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), +# otherwise CLEAR_DEPEND is called to turn off the default state if a required +# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional +# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and +# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. +AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) + +## -------------- ## +## Public macros. ## +## -------------- ## + +# DX_XXX_FEATURE(DEFAULT_STATE) +# ----------------------------- +AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) + +# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) +# --------------------------------------------------------- +# PROJECT also serves as the base name for the documentation files. +# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". +AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) diff --git a/m4/acinclude.m4 b/m4/acinclude.m4 new file mode 100644 index 0000000..e4688de --- /dev/null +++ b/m4/acinclude.m4 @@ -0,0 +1,312 @@ +# This file is part of Autoconf. -*- Autoconf -*- + +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Autoconf macro files. + +# Generate automatic documentation using Doxygen. Works in concert with the +# aminclude.m4 file and a compatible doxygen configuration file. Defines the +# following public macros: +# +# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. +# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, +# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' +# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', +# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment +# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' +# paper size. +# +# By default, HTML, PDF and PS documentation is generated as this seems to be +# the most popular and portable combination. MAN pages created by Doxygen are +# usually problematic, though by picking an appropriate subset and doing some +# massaging they might be better than nothing. CHM and RTF are specific for MS +# (note that you can't generate both HTML and CHM at the same time). The XML is +# rather useless unless you apply specialized post-processing to it. +# +# The macro mainly controls the default state of the feature. The use can +# override the default by specifying --enable or --disable. The macros ensure +# that contradictory flags are not given (e.g., --enable-doxygen-html and +# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) +# Finally, each feature will be automatically disabled (with a warning) if the +# required programs are missing. +# +# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with +# the following parameters: a one-word name for the project for use as a +# filename base etc., an optional configuration file name (the default is +# 'Doxyfile', the same as Doxygen's default), and an optional output directory +# name (the default is 'doxygen-doc'). + +## ----------## +## Defaults. ## +## ----------## + +DX_ENV="" +AC_DEFUN([DX_FEATURE_doc], ON) +AC_DEFUN([DX_FEATURE_dot], ON) +AC_DEFUN([DX_FEATURE_man], OFF) +AC_DEFUN([DX_FEATURE_html], ON) +AC_DEFUN([DX_FEATURE_chm], OFF) +AC_DEFUN([DX_FEATURE_chi], OFF) +AC_DEFUN([DX_FEATURE_rtf], OFF) +AC_DEFUN([DX_FEATURE_xml], OFF) +AC_DEFUN([DX_FEATURE_pdf], ON) +AC_DEFUN([DX_FEATURE_ps], ON) + +## --------------- ## +## Private macros. ## +## --------------- ## + +# DX_ENV_APPEND(VARIABLE, VALUE) +# ------------------------------ +# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. +AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) + +# DX_DIRNAME_EXPR +# --------------- +# Expand into a shell expression prints the directory part of a path. +AC_DEFUN([DX_DIRNAME_EXPR], + [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) + +# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) +# ------------------------------------- +# Expands according to the M4 (static) status of the feature. +AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) + +# DX_REQUIRE_PROG(VARIABLE, PROGRAM) +# ---------------------------------- +# Require the specified program to be found for the DX_CURRENT_FEATURE to work. +AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_[]DX_CURRENT_FEATURE$$1" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST([DX_FLAG_[]DX_CURRENT_FEATURE], 0) +fi +]) + +# DX_TEST_FEATURE(FEATURE) +# ------------------------ +# Expand to a shell expression testing whether the feature is active. +AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) + +# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) +# ------------------------------------------------- +# Verify that a required features has the right state before trying to turn on +# the DX_CURRENT_FEATURE. +AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) + +# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) +# ---------------------------------------------------------- +# Turn off the DX_CURRENT_FEATURE if the required feature is off. +AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_[]DX_CURRENT_FEATURE], 0) +]) + +# DX_FEATURE_ARG(FEATURE, DESCRIPTION, +# CHECK_DEPEND, CLEAR_DEPEND, +# REQUIRE, DO-IF-ON, DO-IF-OFF) +# -------------------------------------------- +# Parse the command-line option controlling a feature. CHECK_DEPEND is called +# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), +# otherwise CLEAR_DEPEND is called to turn off the default state if a required +# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional +# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and +# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. +AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) + +## -------------- ## +## Public macros. ## +## -------------- ## + +# DX_XXX_FEATURE(DEFAULT_STATE) +# ----------------------------- +AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) + +# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) +# --------------------------------------------------------- +# PROJECT also serves as the base name for the documentation files. +# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". +AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) diff --git a/m4/ax_prog_doxygen.m4 b/m4/ax_prog_doxygen.m4 new file mode 100644 index 0000000..4e15704 --- /dev/null +++ b/m4/ax_prog_doxygen.m4 @@ -0,0 +1,533 @@ +# =========================================================================== +# http://www.nongnu.org/autoconf-archive/ax_prog_doxygen.html +# =========================================================================== +# +# SYNOPSIS +# +# DX_INIT_DOXYGEN(PROJECT-NAME, DOXYFILE-PATH, [OUTPUT-DIR]) +# DX_DOXYGEN_FEATURE(ON|OFF) +# DX_DOT_FEATURE(ON|OFF) +# DX_HTML_FEATURE(ON|OFF) +# DX_CHM_FEATURE(ON|OFF) +# DX_CHI_FEATURE(ON|OFF) +# DX_MAN_FEATURE(ON|OFF) +# DX_RTF_FEATURE(ON|OFF) +# DX_XML_FEATURE(ON|OFF) +# DX_PDF_FEATURE(ON|OFF) +# DX_PS_FEATURE(ON|OFF) +# +# DESCRIPTION +# +# The DX_*_FEATURE macros control the default setting for the given +# Doxygen feature. Supported features are 'DOXYGEN' itself, 'DOT' for +# generating graphics, 'HTML' for plain HTML, 'CHM' for compressed HTML +# help (for MS users), 'CHI' for generating a seperate .chi file by the +# .chm file, and 'MAN', 'RTF', 'XML', 'PDF' and 'PS' for the appropriate +# output formats. The environment variable DOXYGEN_PAPER_SIZE may be +# specified to override the default 'a4wide' paper size. +# +# By default, HTML, PDF and PS documentation is generated as this seems to +# be the most popular and portable combination. MAN pages created by +# Doxygen are usually problematic, though by picking an appropriate subset +# and doing some massaging they might be better than nothing. CHM and RTF +# are specific for MS (note that you can't generate both HTML and CHM at +# the same time). The XML is rather useless unless you apply specialized +# post-processing to it. +# +# The macros mainly control the default state of the feature. The use can +# override the default by specifying --enable or --disable. The macros +# ensure that contradictory flags are not given (e.g., +# --enable-doxygen-html and --enable-doxygen-chm, +# --enable-doxygen-anything with --disable-doxygen, etc.) Finally, each +# feature will be automatically disabled (with a warning) if the required +# programs are missing. +# +# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN +# with the following parameters: a one-word name for the project for use +# as a filename base etc., an optional configuration file name (the +# default is 'Doxyfile', the same as Doxygen's default), and an optional +# output directory name (the default is 'doxygen-doc'). +# +# Automake Support +# +# The following is a template aminclude.am file for use with Automake. +# Make targets and variables values are controlled by the various +# DX_COND_* conditionals set by autoconf. +# +# The provided targets are: +# +# doxygen-doc: Generate all doxygen documentation. +# +# doxygen-run: Run doxygen, which will generate some of the +# documentation (HTML, CHM, CHI, MAN, RTF, XML) +# but will not do the post processing required +# for the rest of it (PS, PDF, and some MAN). +# +# doxygen-man: Rename some doxygen generated man pages. +# +# doxygen-ps: Generate doxygen PostScript documentation. +# +# doxygen-pdf: Generate doxygen PDF documentation. +# +# Note that by default these are not integrated into the automake targets. +# If doxygen is used to generate man pages, you can achieve this +# integration by setting man3_MANS to the list of man pages generated and +# then adding the dependency: +# +# $(man3_MANS): doxygen-doc +# +# This will cause make to run doxygen and generate all the documentation. +# +# The following variable is intended for use in Makefile.am: +# +# DX_CLEANFILES = everything to clean. +# +# Then add this variable to MOSTLYCLEANFILES. +# +# ----- begin aminclude.am ------------------------------------- +# +# ## --------------------------------- ## +# ## Format-independent Doxygen rules. ## +# ## --------------------------------- ## +# +# if DX_COND_doc +# +# ## ------------------------------- ## +# ## Rules specific for HTML output. ## +# ## ------------------------------- ## +# +# if DX_COND_html +# +# DX_CLEAN_HTML = @DX_DOCDIR@/html +# +# endif DX_COND_html +# +# ## ------------------------------ ## +# ## Rules specific for CHM output. ## +# ## ------------------------------ ## +# +# if DX_COND_chm +# +# DX_CLEAN_CHM = @DX_DOCDIR@/chm +# +# if DX_COND_chi +# +# DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi +# +# endif DX_COND_chi +# +# endif DX_COND_chm +# +# ## ------------------------------ ## +# ## Rules specific for MAN output. ## +# ## ------------------------------ ## +# +# if DX_COND_man +# +# DX_CLEAN_MAN = @DX_DOCDIR@/man +# +# endif DX_COND_man +# +# ## ------------------------------ ## +# ## Rules specific for RTF output. ## +# ## ------------------------------ ## +# +# if DX_COND_rtf +# +# DX_CLEAN_RTF = @DX_DOCDIR@/rtf +# +# endif DX_COND_rtf +# +# ## ------------------------------ ## +# ## Rules specific for XML output. ## +# ## ------------------------------ ## +# +# if DX_COND_xml +# +# DX_CLEAN_XML = @DX_DOCDIR@/xml +# +# endif DX_COND_xml +# +# ## ----------------------------- ## +# ## Rules specific for PS output. ## +# ## ----------------------------- ## +# +# if DX_COND_ps +# +# DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps +# +# DX_PS_GOAL = doxygen-ps +# +# doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps +# +# @DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag +# cd @DX_DOCDIR@/latex; \ +# rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ +# $(DX_LATEX) refman.tex; \ +# $(MAKEINDEX_PATH) refman.idx; \ +# $(DX_LATEX) refman.tex; \ +# countdown=5; \ +# while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ +# refman.log > /dev/null 2>&1 \ +# && test $$countdown -gt 0; do \ +# $(DX_LATEX) refman.tex; \ +# countdown=`expr $$countdown - 1`; \ +# done; \ +# $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi +# +# endif DX_COND_ps +# +# ## ------------------------------ ## +# ## Rules specific for PDF output. ## +# ## ------------------------------ ## +# +# if DX_COND_pdf +# +# DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf +# +# DX_PDF_GOAL = doxygen-pdf +# +# doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf +# +# @DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag +# cd @DX_DOCDIR@/latex; \ +# rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ +# $(DX_PDFLATEX) refman.tex; \ +# $(DX_MAKEINDEX) refman.idx; \ +# $(DX_PDFLATEX) refman.tex; \ +# countdown=5; \ +# while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ +# refman.log > /dev/null 2>&1 \ +# && test $$countdown -gt 0; do \ +# $(DX_PDFLATEX) refman.tex; \ +# countdown=`expr $$countdown - 1`; \ +# done; \ +# mv refman.pdf ../@PACKAGE@.pdf +# +# endif DX_COND_pdf +# +# ## ------------------------------------------------- ## +# ## Rules specific for LaTeX (shared for PS and PDF). ## +# ## ------------------------------------------------- ## +# +# if DX_COND_latex +# +# DX_CLEAN_LATEX = @DX_DOCDIR@/latex +# +# endif DX_COND_latex +# +# .PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) +# +# .INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) +# +# doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag +# +# doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) +# +# @DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) +# rm -rf @DX_DOCDIR@ +# $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) +# +# DX_CLEANFILES = \ +# @DX_DOCDIR@/@PACKAGE@.tag \ +# -r \ +# $(DX_CLEAN_HTML) \ +# $(DX_CLEAN_CHM) \ +# $(DX_CLEAN_CHI) \ +# $(DX_CLEAN_MAN) \ +# $(DX_CLEAN_RTF) \ +# $(DX_CLEAN_XML) \ +# $(DX_CLEAN_PS) \ +# $(DX_CLEAN_PDF) \ +# $(DX_CLEAN_LATEX) +# +# endif DX_COND_doc +# +# ----- end aminclude.am --------------------------------------- +# +# LICENSE +# +# Copyright (c) 2009 Oren Ben-Kiki +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 9 + +## ----------## +## Defaults. ## +## ----------## + +DX_ENV="" +AC_DEFUN([DX_FEATURE_doc], ON) +AC_DEFUN([DX_FEATURE_dot], ON) +AC_DEFUN([DX_FEATURE_man], OFF) +AC_DEFUN([DX_FEATURE_html], ON) +AC_DEFUN([DX_FEATURE_chm], OFF) +AC_DEFUN([DX_FEATURE_chi], OFF) +AC_DEFUN([DX_FEATURE_rtf], OFF) +AC_DEFUN([DX_FEATURE_xml], OFF) +AC_DEFUN([DX_FEATURE_pdf], ON) +AC_DEFUN([DX_FEATURE_ps], ON) + +## --------------- ## +## Private macros. ## +## --------------- ## + +# DX_ENV_APPEND(VARIABLE, VALUE) +# ------------------------------ +# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. +AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) + +# DX_DIRNAME_EXPR +# --------------- +# Expand into a shell expression prints the directory part of a path. +AC_DEFUN([DX_DIRNAME_EXPR], + [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) + +# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) +# ------------------------------------- +# Expands according to the M4 (static) status of the feature. +AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) + +# DX_REQUIRE_PROG(VARIABLE, PROGRAM) +# ---------------------------------- +# Require the specified program to be found for the DX_CURRENT_FEATURE to work. +AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_[]DX_CURRENT_FEATURE$$1" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST(DX_FLAG_[]DX_CURRENT_FEATURE, 0) +fi +]) + +# DX_TEST_FEATURE(FEATURE) +# ------------------------ +# Expand to a shell expression testing whether the feature is active. +AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) + +# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) +# ------------------------------------------------- +# Verify that a required features has the right state before trying to turn on +# the DX_CURRENT_FEATURE. +AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) + +# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) +# ---------------------------------------------------------- +# Turn off the DX_CURRENT_FEATURE if the required feature is off. +AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST(DX_FLAG_[]DX_CURRENT_FEATURE, 0) +]) + +# DX_FEATURE_ARG(FEATURE, DESCRIPTION, +# CHECK_DEPEND, CLEAR_DEPEND, +# REQUIRE, DO-IF-ON, DO-IF-OFF) +# -------------------------------------------- +# Parse the command-line option controlling a feature. CHECK_DEPEND is called +# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), +# otherwise CLEAR_DEPEND is called to turn off the default state if a required +# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional +# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and +# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. +AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) + +## -------------- ## +## Public macros. ## +## -------------- ## + +# DX_XXX_FEATURE(DEFAULT_STATE) +# ----------------------------- +AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) + +# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) +# --------------------------------------------------------- +# PROJECT also serves as the base name for the documentation files. +# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". +AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) diff --git a/rfc4791.pdf b/rfc4791.pdf new file mode 100644 index 0000000..14fde73 --- /dev/null +++ b/rfc4791.pdf @@ -0,0 +1,7663 @@ +%PDF-1.3 +%ª«¬­ +4 0 obj +<< /Type /Info +/Producer (FOP 0.20.5) >> +endobj +5 0 obj +<< /Length 1098 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%"968Q9&AI=/BK3CU?n=NQRp5*/JYCF>*]O]@NkKEhp^q&)&q3!L?!FAJD9CqtBW^)d]DLtC^Ps&5YC/`Sb9lakd6H'5:%AH6[e`i636E"5a.`Tk9Ci&J'?L&Sr&c@1*5C6Xp._Z6Q#"9!;7AWpFIgbh42ZcK?X>)F\iqK+8GqEH_kn*e*W0ZGOkOSL$ba'Kb7Z;X][8&ZLhMjjCu:,EOIRnH])q,6=Cb2e(Q!gX(4-b[MbL-%&Qtl'Yt3;,hoH=BB6]@+JO[#ZBcq-i*5MC"[9T?.+IW9pX&)=,ncDf;7MlN2I35R1N7%@h$[Ls7Nl+3#r'4oEeOH@-\obGBU6\<:a/6O/M+G)o`Negg_<:K65\N,r@e?RYC\`-=r4odXf,4ru5Z]S5s&X[q<"6#]<'se5_SH"gq,OV">o7-USRZojK^X9NWSXm&*3`G@A;_Sq%>*>To]?A#H4$e-5),*od#;-,(cjS1ZT;qb_J)ZLK9U:6TM8"Ss1b`_L^LB(0rsBVWaWFO[B.igG_G[/$W"`;H?#?`0Lc-<5.dh0UDFe)n2uA@C)L.kamX^S.8s`8]MQOp:E<2B_-"@Utt:65\7.N(`2YB'58=g3&i/e6.,22lHet])]=m.u(,b>T/U7]$VUc3DjZO2ejnKMr\M6KRnMSnm(>h'O?4C!!W-6>cn_gR&6$_?R"60&2dWRe*o&t&Ljgs\E5b:Z47[?]>Vb@tEG_L8H:5H0k8>XNdA-#*5ALk6t.JF$0^Ok[bN")fm`Q(ns/9c-#Bs&IO\IY^P8'&`WUb2>_I\,OjRXu0^.S!ZF-<64u-?JI\#BsE6GO_(Rkn^S50K/DmWBke`m;&PUaKKr5>R)V`VE,PGj5Ukj.#u/0eGX=6(^Me7>[Ir*H\%8DM33>a3Y.Rg2>7RBW7e(baJSt[7!6OBSb1o1IG812o]3J!AV$"rYl""gI[fE^88A/$kDtCN>fDVNR8^>2~> +endstream +endobj +6 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 5 0 R +>> +endobj +7 0 obj +<< /Length 2447 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!$I9lo&I&;KZQ'fnB3&P@QR!TrP@A"#MSF@drVo'6[8P_^&?&SZ'da<;=qG6pH'pe5rR4IIm2YRM7M+nlMS^U\V*Y9s:i/lik6nfW4DuqUaj'*b$0#K@))o)!rTC-$bso=hME"=RlDDn-X,&MZ63$8J&7U]c#hb4YlX1N*7*(Z7lD5:p`1Z<@/Y\D5ZiY16Z[-]XC2O,'6Gs&71,Q:R/"ZhI-9?s@$544q_e"^S^OFdR\r"unIu5!sDluONZM?3!;Y=TB-P$uQ`5a:ed/8FH..>1<',-l(Lu;%G'I_-Qp5G(hoWS1UhSf^![S-(2li2fU1rKcZt_mWG_>M3d3b>01:mAU?pGsQC(^0utB5!##FMX!)a*`mK??_gKNFGi7G/0NidnQ]PgU7Us*!lZu%*?WFo]ei/NtV-r@.iCP2KDaJ!GmYIr$HW;b!k:/PB]8hCOBN0BRHab)?YSQRT_Tge/ZN5.;DdC:KK("R9Z\`a#Pt21aB>@O4+Ium.Cfi.OYoqr=I1e^]I(Hh:\N-rAL:OA5mA#feMq"'\XLp?/8,>o6&-l\8TmF5bN).DIAL"(5Vf1hJSpVd]BZ=%/$>*fGg8cfebu!#k"XV^.B1IeG?^aYGJl/'!7d,nkB5OI1@$CPNi#4jQMs6[3PUnankBNQ9Q9j!iuqr0A\XNK&72KL1=3@8l,.U`+6kMT6AA:N+rjj"Y[6T"GCOE]N!->,:I3`@37U\La7aq1L!P6i/OQ6tc&B[k[D?%[lr9!>Q9@lXmF*q9pM-&SgaMd-NQ`Yd)$5]kB+Q(S34ZSI9LKc.r$V849>]a`Mhe5QA\`P:8_nn2;r@WM(&+[&hf(++m\_[Q+IYkF%89OK0D'oVoGX$8&nMK^WVEk\^FMmcB#Hm80@W#G.p,r_3j8bF=ErR8H>S2q]a]R*)B1BOGdK>]_27TtcB(!>7"*$RfqOW7^0C%_M'U*pY$P5W^NhG2$jlin!OO-76etZ2P06,%`=ZjBpa$&ZTkC#0e/1&b\OQU=,klB-nh3m27%P:Si':LnEV%mZ^p%XMT`nO,U%I/\hVh9!(o`B[2'8Iu*M)A\cA6FGl-fc+a!_jYoMc8AAS##dD2's==gCjkJ1#)lYluG.TboO+\3pQq.Th4X\?.MTK#D4bN-8!8/Ar7qg1/9$7VnLbs[QBsD8dfGD%EW:#:BS6rB&[h]Q'n)!W9?9HGdU0<.N>Z8eAoEn!=#ueB%8`/8biUi.=Y<=lI^3$hE3RT+YM<8W[WJ_,)2O+ofUG#IH +endstream +endobj +8 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 7 0 R +/Annots 9 0 R +>> +endobj +9 0 obj +[ +10 0 R +12 0 R +14 0 R +16 0 R +18 0 R +20 0 R +22 0 R +24 0 R +26 0 R +28 0 R +30 0 R +32 0 R +34 0 R +36 0 R +38 0 R +40 0 R +42 0 R +44 0 R +46 0 R +48 0 R +50 0 R +52 0 R +54 0 R +56 0 R +58 0 R +60 0 R +62 0 R +64 0 R +66 0 R +68 0 R +70 0 R +72 0 R +74 0 R +76 0 R +78 0 R +80 0 R +82 0 R +84 0 R +86 0 R +88 0 R +90 0 R +92 0 R +94 0 R +] +endobj +10 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 82.0 686.866 136.45 676.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 11 0 R +/H /I +>> +endobj +12 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 671.056 189.78 661.056 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 13 0 R +/H /I +>> +endobj +14 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 655.056 231.97 645.056 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 15 0 R +/H /I +>> +endobj +16 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 639.056 261.45 629.056 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 17 0 R +/H /I +>> +endobj +18 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 618.056 185.59 608.056 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 19 0 R +/H /I +>> +endobj +20 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 597.246 188.11 587.246 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 21 0 R +/H /I +>> +endobj +22 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 581.436 159.2 571.436 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 23 0 R +/H /I +>> +endobj +24 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 565.436 221.68 555.436 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 25 0 R +/H /I +>> +endobj +26 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 544.436 167.82 534.436 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 27 0 R +/H /I +>> +endobj +28 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 528.626 203.36 518.626 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 29 0 R +/H /I +>> +endobj +30 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 512.626 174.77 502.626 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 31 0 R +/H /I +>> +endobj +32 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 491.626 188.64 481.626 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 33 0 R +/H /I +>> +endobj +34 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 475.816 195.59 465.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 35 0 R +/H /I +>> +endobj +36 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 464.816 403.34 454.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 37 0 R +/H /I +>> +endobj +38 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 448.816 217.82 438.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 39 0 R +/H /I +>> +endobj +40 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 437.816 270.02 427.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 41 0 R +/H /I +>> +endobj +42 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 426.816 262.24 416.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 43 0 R +/H /I +>> +endobj +44 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 415.816 327.23 405.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 45 0 R +/H /I +>> +endobj +46 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 404.816 285.01 394.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 47 0 R +/H /I +>> +endobj +48 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 393.816 261.68 383.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 49 0 R +/H /I +>> +endobj +50 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 382.816 245.04 372.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 51 0 R +/H /I +>> +endobj +52 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 371.816 246.7 361.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 53 0 R +/H /I +>> +endobj +54 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 360.816 245.59 350.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 55 0 R +/H /I +>> +endobj +56 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 349.816 298.34 339.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 57 0 R +/H /I +>> +endobj +58 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 338.816 282.84 328.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 59 0 R +/H /I +>> +endobj +60 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 322.816 172.54 312.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 61 0 R +/H /I +>> +endobj +62 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 311.816 211.16 301.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 63 0 R +/H /I +>> +endobj +64 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 300.816 166.45 290.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 65 0 R +/H /I +>> +endobj +66 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 289.816 305.87 279.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 67 0 R +/H /I +>> +endobj +68 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 278.816 252.8 268.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 69 0 R +/H /I +>> +endobj +70 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 267.816 333.38 257.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 71 0 R +/H /I +>> +endobj +72 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 256.816 328.08 246.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 73 0 R +/H /I +>> +endobj +74 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 245.816 256.97 235.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 75 0 R +/H /I +>> +endobj +76 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 224.816 201.99 214.816 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 77 0 R +/H /I +>> +endobj +78 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 209.006 181.99 199.006 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 79 0 R +/H /I +>> +endobj +80 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 198.006 248.35 188.006 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 81 0 R +/H /I +>> +endobj +82 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 182.006 212.83 172.006 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 83 0 R +/H /I +>> +endobj +84 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 171.006 262.24 161.006 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 85 0 R +/H /I +>> +endobj +86 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 150.006 171.72 140.006 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 87 0 R +/H /I +>> +endobj +88 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 134.196 166.45 124.196 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 89 0 R +/H /I +>> +endobj +90 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 118.196 178.66 108.196 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 91 0 R +/H /I +>> +endobj +92 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 102.196 189.77 92.196 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 93 0 R +/H /I +>> +endobj +94 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 86.196 180.61 76.196 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 95 0 R +/H /I +>> +endobj +96 0 obj +<< /Length 2546 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!$J>Ar7S'Z],&.K%g"ZRT9LM1&$<)*5-?QFOh_U(=9AUdAY7PNALoV]SJZd5a*"d;EbpI;%X$Imj6%Sf=XfZ]eIWd=d0=318TnKTl9H1(!V<15W"0/.U]j`08k`o'&R_6n]p[-aV]*bV+W8'G;iAPNmVfW0'2uOQK$/ebj2`gqT@QBk6Z&@]$lkYIe`!auiJcX=RD5`k*tPO9@:,(5(!f1Np[u"VpEd+-FP=@j)"D(6B\Q,i"WTS\@0MrU]\s]j-k'X_t'.#>!=/W]PB*V6(:hg0@R:U*6R06U'@^9`+e&=(DYL0H8?'GjAQ$;'9(]TkZf7!Z&i14Ee"Uq6H]lHk*4a;R5FVpK60FLf?@8_Ya;GWZFp@BuAeU1Y&.)%n7h4C>f(2u*\"(6cZ&j%4*SG9J+JG>KZ4s8V"GO^*\4dNZB#X;q,,`5'10QKS8%"g8^\r\.Yg_1]irVXmOWQPX#^8r#N\o6.MYcPH]j2.g%VIX@^cc7aa(1ZFB(eKH9%VE0Z7O[$23'_=]:=%*)kBEAmeRE/u84+&6iLld!*X::%?04h+UP'hSK:-"<'$,5CBpYeD\8l&JN*%0\:(X!ni#2HY2'*%'e*&t0\[)_)\ch*XVKgB3fg=](-C,RTM`B(3/He9D(0@odA)+E*d6/Ych%NCU!S_!i!ro.(\U5d><2-R#ee2Q,E*;P>]^H-u'k#:1pZW002u'0Cnc\$]]$ddj+=3VCAOTZbY`17qb"3Ncdff\'r:KSKZGoO`GQak@6kn"6[Li]Xj%DHeWcTl,m=n_VT_q>t?jg^TOnIQ"Pek74CQGaH+a;5LT]UlE[#8Fugi<#VPBCVuM-<[,?\:QhB'/F-^H"ELPJ?[/$_k0lMtRfq=UZan![3eCG*k_Y2!&7M:QN@8Mm_:kR#d"r,G>r$^]7X0ThG[>fZtBc9D<)^Zce$lKtC:^=#BT=-a_Q_g$"i8bjBT^:]2\b"$\A^Vdc+r);`&m6*Ae&Gr8Ab6,7:h"<+^>;U?+M:`*SZ'kCT(s,*oP6`hSH0Rn_!_5k*0\JK\`),A,mT.[ncXVhDe2kI1C@rD4DJks41!:sGQZZ=_mY+#KY9QD=">W8E)&#$&7f;s5*(r^<^[Iq=t6pt>.OpMs/#,dcHQ;H$L!oB46Dmm:9fH1kp9TYMoa:)A:;:lQ?3!\@GG6/\%5]`?1FC3>I;U?FAFim49IV_+cQX-3mY,uT$`C6KhpH-\&2.kGBiBeLE+'7Z=VfeQU^FoAkj%SmWOS*V(M'bmU:;98kqtE;(!bH9X;_e*r+UJNYJddT.BB(bO6Lb2[:`rlS5letY^?]7,JGmpt>`tN+-oAkF(4]n,d=[qRm:K0<:"[)Ej\/Dq74)[MQF#<2#Ge6,)>=#k%68C",KHn4Y7,L0rU_VC:4sR/%&RG[AS2'Q10;3AGldQ9T-QU:)F!mI`X(hoUh&tSW8`[<$:L^VUGSj:B3-j`=@u:H3uM3V\ad77+0:!B_VjL!2?CR&;d*ip.H9rAeWR/>,Q]YdOlKn4W^;iFk'3q`d*riCb>c[^?I\C4`Dkeb<7$f%k'a+Nf"'LC27JFDAe9:U?%`?6Wm&2c1Cm!nHMs747$"Y\9A^C5@24KaG)'"EpIBGb+@>lU[*iOatQ;X;+ZkS2#p`AJ=pgL=SUH#MPTli]-RSZa9+e(LPa.@mADaqD?k"XdNCgV7J;;@uH@\A!6"$gdE-Wc\6B)*og*6me*6T +endstream +endobj +97 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 96 0 R +/Annots 98 0 R +>> +endobj +98 0 obj +[ +99 0 R +101 0 R +103 0 R +105 0 R +107 0 R +109 0 R +111 0 R +113 0 R +115 0 R +117 0 R +119 0 R +121 0 R +123 0 R +125 0 R +127 0 R +129 0 R +131 0 R +133 0 R +135 0 R +137 0 R +139 0 R +141 0 R +143 0 R +145 0 R +147 0 R +149 0 R +151 0 R +153 0 R +155 0 R +157 0 R +159 0 R +161 0 R +163 0 R +165 0 R +167 0 R +169 0 R +171 0 R +173 0 R +175 0 R +177 0 R +179 0 R +181 0 R +183 0 R +185 0 R +187 0 R +189 0 R +191 0 R +193 0 R +] +endobj +99 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 714.0 201.72 704.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 100 0 R +/H /I +>> +endobj +101 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 703.0 280.59 693.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 102 0 R +/H /I +>> +endobj +103 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 687.0 159.77 677.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 104 0 R +/H /I +>> +endobj +105 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 671.0 315.58 661.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 106 0 R +/H /I +>> +endobj +107 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 655.0 239.75 645.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 108 0 R +/H /I +>> +endobj +109 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 644.0 317.81 634.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 110 0 R +/H /I +>> +endobj +111 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 633.0 296.14 623.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 112 0 R +/H /I +>> +endobj +113 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 622.0 310.02 612.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 114 0 R +/H /I +>> +endobj +115 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 611.0 348.93 601.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 116 0 R +/H /I +>> +endobj +117 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 600.0 320.58 590.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 118 0 R +/H /I +>> +endobj +119 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 589.0 253.92 579.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 120 0 R +/H /I +>> +endobj +121 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 578.0 290.6 568.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 122 0 R +/H /I +>> +endobj +123 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 567.0 247.54 557.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 124 0 R +/H /I +>> +endobj +125 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 556.0 278.93 546.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 126 0 R +/H /I +>> +endobj +127 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 545.0 314.48 535.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 128 0 R +/H /I +>> +endobj +129 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 529.0 250.32 519.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 130 0 R +/H /I +>> +endobj +131 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 518.0 348.92 508.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 132 0 R +/H /I +>> +endobj +133 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 502.0 248.64 492.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 134 0 R +/H /I +>> +endobj +135 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 491.0 347.24 481.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 136 0 R +/H /I +>> +endobj +137 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 82.0 470.0 127.57 460.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 138 0 R +/H /I +>> +endobj +139 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 454.19 222.55 444.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 140 0 R +/H /I +>> +endobj +141 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 438.19 206.43 428.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 142 0 R +/H /I +>> +endobj +143 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 427.19 166.99 417.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 144 0 R +/H /I +>> +endobj +145 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 416.19 211.99 406.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 146 0 R +/H /I +>> +endobj +147 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 405.19 228.65 395.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 148 0 R +/H /I +>> +endobj +149 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 394.19 213.1 384.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 150 0 R +/H /I +>> +endobj +151 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 383.19 235.04 373.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 152 0 R +/H /I +>> +endobj +153 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 367.19 156.71 357.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 154 0 R +/H /I +>> +endobj +155 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 351.19 168.11 341.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 156 0 R +/H /I +>> +endobj +157 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 335.19 220.33 325.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 158 0 R +/H /I +>> +endobj +159 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 324.19 183.38 314.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 160 0 R +/H /I +>> +endobj +161 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 313.19 193.93 303.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 162 0 R +/H /I +>> +endobj +163 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 297.19 199.22 287.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 164 0 R +/H /I +>> +endobj +165 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 276.19 192.55 266.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 166 0 R +/H /I +>> +endobj +167 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 260.38 233.36 250.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 168 0 R +/H /I +>> +endobj +169 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 244.38 246.14 234.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 170 0 R +/H /I +>> +endobj +171 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 228.38 284.46 218.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 172 0 R +/H /I +>> +endobj +173 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 212.38 277.26 202.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 174 0 R +/H /I +>> +endobj +175 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 196.38 259.46 186.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 176 0 R +/H /I +>> +endobj +177 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 180.38 253.35 170.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 178 0 R +/H /I +>> +endobj +179 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 169.38 234.21 159.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 180 0 R +/H /I +>> +endobj +181 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 158.38 244.21 148.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 182 0 R +/H /I +>> +endobj +183 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 147.38 240.32 137.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 184 0 R +/H /I +>> +endobj +185 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 136.38 230.32 126.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 186 0 R +/H /I +>> +endobj +187 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 125.38 240.87 115.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 188 0 R +/H /I +>> +endobj +189 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 114.38 290.85 104.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 190 0 R +/H /I +>> +endobj +191 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 103.38 283.09 93.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 192 0 R +/H /I +>> +endobj +193 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 87.38 218.93 77.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 194 0 R +/H /I +>> +endobj +195 0 obj +<< /Length 1422 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gaub*6#YL9'EI'h#tgG"@_Vc"54e5Rs'J-P"3W"dU,5%P-%5EMGPsZ2#O.nh%:[dQ(o^'h&*8hB^_/sZ4#0SeBK]WLES==R>'81Wb>m4T\'>tKs#egJk5L/Uc65527@6pQQ_(H(MqdG]YL\KiDhTh#/HF-5L9'M7A6t1M^o=o3-[/XBCC8LK9GD12i,\AG:hPb+t_p4?!4%$HiIGZHkSe4!0#_Y')CL-ji;1ug))g+CjVhCht.?Q5/Q@ti-FI3[LgF>cH=0H6l(QZ7<#;m\bECNg'&PkM6HCtiUCQ-\^PS_k`Xqk`Sk/Su,@2BRsGW;Gb1?p2A1P8*cJOCW^+fa$Z2-S+:G5mFg6kO(gTEF_#NG#g7h@kTd]VD[Qs(Lr@Du34AWm,p4jWN#;G]/"XQ7RSPjKq&r6Q\,;&NK/"A"R!dfQk!XZ3S.E.iM"K$#Up+dq[M*+A`1RY4i0(incaf9H^WoLLs8ILY>p/"!\G!Mc8.&7EQ[m6sE5YqQicq9;c2W`u_T8h9[Y=dK15Oo@JNDQ!e6>s%%Y,:iu@M'bMlfn'q-GfFCY&j3YcXi@W\]iKomZ/,r;WMCM=5'2t3tmgoa52US)=;]Ha2Ps!"VihFB[dUd/uP-DKR?h,ND?Op,?V1SCD%+t!gTq+gd?Jtr(5l7UaS]k1fD"eG:`tbY/e$3A!FK%!X"s]#99i[fknS#R4Us=`4&s4oQPC0@DSU@\PhNmcG0PNP?OhpV47GYPV-tS)][qg?jQIK!:@>0A^[T(<7bfsX\6@W5fe3D4YQfZe9pN/GN\O+VOZaSe>\#m%dW4+"ob;Q[mX1l$g31h)]'k),!Mu[dOLlg:7,]Yf(cUh5RirVl,a[&NI$?2iDqN9>8ab-G4rNY01c!2kS83pc8JFa;Njcqra:M$BV39pp])]T@uo9XW`7h'cb=?Eeh,l&RZ"YT'+T]+"W7[GA/r008tMiDpu/kWiqrGAO@=/[@6CdoX3JAMa4`_7V6To'l0XS/MH]U,[/j~> +endstream +endobj +196 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 195 0 R +/Annots 197 0 R +>> +endobj +197 0 obj +[ +198 0 R +200 0 R +202 0 R +204 0 R +206 0 R +208 0 R +210 0 R +212 0 R +214 0 R +216 0 R +218 0 R +220 0 R +222 0 R +224 0 R +226 0 R +228 0 R +230 0 R +232 0 R +234 0 R +236 0 R +238 0 R +240 0 R +] +endobj +198 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 719.0 256.98 709.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 199 0 R +/H /I +>> +endobj +200 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 708.0 253.09 698.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 201 0 R +/H /I +>> +endobj +202 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 697.0 259.75 687.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 203 0 R +/H /I +>> +endobj +204 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 686.0 268.09 676.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 205 0 R +/H /I +>> +endobj +206 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 675.0 254.76 665.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 207 0 R +/H /I +>> +endobj +208 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 659.0 236.15 649.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 209 0 R +/H /I +>> +endobj +210 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 643.0 242.81 633.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 211 0 R +/H /I +>> +endobj +212 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 627.0 275.03 617.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 213 0 R +/H /I +>> +endobj +214 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 611.0 268.35 601.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 215 0 R +/H /I +>> +endobj +216 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 590.0 239.51 580.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 217 0 R +/H /I +>> +endobj +218 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 569.19 189.5 559.19 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 219 0 R +/H /I +>> +endobj +220 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 548.38 179.5 538.38 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 221 0 R +/H /I +>> +endobj +222 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 532.57 196.98 522.57 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 223 0 R +/H /I +>> +endobj +224 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 87.0 511.57 169.77 501.57 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 225 0 R +/H /I +>> +endobj +226 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 87.0 490.76 133.64 480.76 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 227 0 R +/H /I +>> +endobj +228 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 474.95 189.19 464.95 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 229 0 R +/H /I +>> +endobj +230 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 458.95 193.63 448.95 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 231 0 R +/H /I +>> +endobj +232 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 437.95 155.61 427.95 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 233 0 R +/H /I +>> +endobj +234 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 417.14 278.63 407.14 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 235 0 R +/H /I +>> +endobj +236 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 396.33 267.84 386.33 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +238 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 375.52 275.87 365.52 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 239 0 R +/H /I +>> +endobj +240 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 72.0 354.71 96.45 344.71 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 241 0 R +/H /I +>> +endobj +242 0 obj +<< /Length 2930 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!;f9lo(%&\dF0BRFMLj08HYkal&6RCM:<1fg&gOrPSWZ;=I&99>>8n%5A@EgHnSjmB%26UVOi(=2D4qdA['cJJNq;`&KAbFZonn*J0f4(i$?5A(V>E%eM,bONHkCc2%YhQ]7<4pJG)pYXlj<@QBXWJ&J[9R]]JItNT0M.:HOg.r>?PD%E#ZM0R,Q5jLVK6EPKjp<]@re=\M^M>.dkM=qe^YFhuQcj>3pbHa5n[\t-jURAjfq=Wi61s:1T5T":&%@ekR@EdHSbQK?X6so4^EJ*e&q6X%@mBVk>Klb*b`jAlqRN$M;nl\AP&Ie/M2(]@'iP-*-?`2^oRMWY]YiH3,7>J&,4?Z,J/K+e!b/i(PqC2N<]/s2WNqtP+g1lN"@FSFdpZ[7oJZ#;qr"R[BQHp9m\+Qrde8Ys]A[LIDi:HmSUT/he>9W/L6(!5d93FO0<+u+g:KWV.K2a8H-,UNLQD8D"/!a`N!9XF"Qh!NmC-4t):0'pUhGK._j[T:H8u!"UQD`&ihsQ5?1q.Q:$N-RSf[udra8>b'L[0L_pQtn@1Y%#^a"OdRa+qjM1QuD^KT1b46($->GAST?,pu-L#T'Y,;Tsp5j`&>s!oj#=+DhF,SG8GJ?ohV)"X+ni'd/(f).Eh/YsQMh@1MCaV\hH=+ANPY&CqspU$*cck!JPG]o3i2BQLJ*_rr[?/d@#n_@$H>`]WeIq4j-cQ>a$O>/@4QKj]#lXGFTI_oZ8I(=B19oY+?%$K]'-"QNpM58a"gHAPnI1hi#o!'#K2M7)@@`G_7D&JF0jl:@9-B*ol1g/3+*/dDZgghQnEn<(?1UW>)7bI5pQoJBgZ@fpiGdF";cXM9.?@9fcSP"e]bKIbDpcs?L*ap4&hOc`b[US@RMsncT+ZY8Hp%fYjs.bV1l!l"!t?JNIC97+i7Yum>REOND0-Ci>gULXYiR/oR;i04W!>,TsjsqmTislSNd0_Hus3EA6.G:)0)G?`KhUmQaPW476s.IVBrW75[-2d+=DEE-7U%.hatC"$+Y]MLW3_cLLMEieo0a*SVM[/F&?DDa`7qY@n>E8m\c`e1QZ]a$6Y/>2k@B7#"mEjd3DJmU>Utg%P_H)U!6r&9I-@L_:rbI??bBmb&@`J(GuatV`b0!/TI-[Be=)-9l\FI+jt7pRA+e4j@)K=;]GU'.Frg]!"g1fnd5_/VN9J?6h#b_BMZ*d?><=C64uVZe-$6'&$^Z7_MNS-41$S"G0,A6A2!_J8-kAT=6h\AjfC@RW8a(.Bt'Do^$[%hL5!?Z)?MZp%R[]QR2@1S0%-k,.n]aH4$D%-0YutIY>.j$[0B>7:+Y(r<+,?@(V5j$X_rjJo$ukpiK.*og/"PpKN&9=)@-9^59]A?4'^hL4Ml]M>Tq`RhH?]Jrt%*h<5ePbj2haZ,goDL%>c:&)JSod07aU8X*G6F9nH*cH$9Ki7%9)`"Fo__eq7ghIbm^.U^_*iILpUtLcGh5Y;*<]b]gpAd1*J@qWa>[Z1!=Lf@9N[/7V#_P3faP2_o:7aCS('s6gP2C+^ruCu-&1Pr5]i_1`1;[k@O2Mr@CIN(;Ub/j;(46_'qp\j:?esK@"2dQ59t?m:5O>lfg`P7Leld?8\h"t:;9\g;mDLBfEV!cXD-%471U$$iD\!84@XL0+>Q;IkoI@M6be_UTtO,\B$YHLUj5Mhg&@sTo0q9faW1qBaI,o\I,B&jIgWatM-D?d_Y28<.ku^[D+D/`>Yq'!rnMmC\gRDTgZGa90j@pXSHUj^\?#GQFq#cLdGkq:FGU\Hst>L/qOUtpA_gT]pZS20.jc(Ac~> +endstream +endobj +243 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 242 0 R +/Annots 244 0 R +>> +endobj +244 0 obj +[ +245 0 R +247 0 R +249 0 R +251 0 R +253 0 R +255 0 R +257 0 R +258 0 R +] +endobj +245 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 178.65 691.866 203.65 681.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 246 0 R +/H /I +>> +endobj +247 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 273.65 691.866 314.19 681.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +249 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 500.54 669.866 539.42 659.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 250 0 R +/H /I +>> +endobj +251 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 92.0 540.894 137.56 530.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 252 0 R +/H /I +>> +endobj +253 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 92.0 508.894 137.56 498.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 254 0 R +/H /I +>> +endobj +255 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 327.51 402.922 439.45 392.922 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 256 0 R +/H /I +>> +endobj +257 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 393.33 316.922 433.87 306.922 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +258 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 446.95 241.922 492.51 231.922 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +259 0 obj +<< /Length 431 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gas1[cVMG$'Ya=Fi7K=cTin)^VOKXaQPbLtAD)OBChmQX.Fme"\(s`&Ra#f%pVD46O)QJ@lZn@9_$#Th7*midM"HV"4R"Rq32R[P4^,gFKZ6SE]SmfoHsLo!3e5o7Qe#-DYH8+M.?1Sre:e6B=mg%tWN*!!q&R+d)J:!j9+ShI`FC<\m_H$o'=D,!UJJ6eI]<<,r(q$c#8.h4=%MoF93n8QSa"or/#G0n=d$*_Wq)!1fGY\-nnk#/*'ZF"MHeSY>3'/;ll,m:F8-n2;-k_,1b"`@$=]c'5.M.usGaP(cK]*oi9.s!c>m5fk:6t>r"e=O&cVV9#P$;=ZNR2ZPrs6.Od5R"(]JK~> +endstream +endobj +260 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 259 0 R +>> +endobj +261 0 obj +<< /Length 1316 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0C9lo&I&A@sBn7^.d#XNt@R@[[:R3o>2Nm/gSgBWOf,c!8rJrj:Bf7sr!$BF.#[._C1q*US4c]Nefsr?L-&0m"Qla$JmlD5YGeNMlMIIM@j$)tOf;m,JWXI70Yb!"5=V0eBY_e6?MKn.#<>MpB$DBE(6Zkea+NE40f9[R,&Z,"L3+V'GqG%e5Ho6sX\UufH!5IS64I];FJ(T'ua_pC/cJq4"c5Nagj)%KVKf54^1)UV\E\A6(,]PCEeX&oqFFuQeoV:O*EfW4P)t[4dP!KlQru8_i[87FeoFg+"aPrq!1=e3l,Z,]Q\'ASc:kYDf6@+\LS`:b?%:*RZR9*XIW&-BU,NGf8>e1kh(qZ2",BV[5_<[-n&;I4Agi/V]XjTRtP2JRQg/SQ6@Hj%Fej`A4Ms&(aZ/nIYWTpN4cUuc8%+mp-MQW/eE5rNb4%EctO"2Y'3=PV\@e=f/63h>BPFh=CZ?'bH*Rh<`.[t#U$lh'6N:*jLL(N2ru(#:ilEI'LggEYD!HL/@A93m36(3HujE0]]r"g,d,I-r7ghY!FtBUS7&\D3G[eWQ(gWM"\\#i$=^+q*."DcKq$c"GbTY$eVI_!8[\J4*Qu2r!soLh_>~> +endstream +endobj +262 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 261 0 R +/Annots 263 0 R +>> +endobj +263 0 obj +[ +264 0 R +265 0 R +266 0 R +268 0 R +269 0 R +271 0 R +272 0 R +274 0 R +276 0 R +277 0 R +279 0 R +280 0 R +281 0 R +282 0 R +283 0 R +] +endobj +264 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 169.78 667.366 208.66 657.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 250 0 R +/H /I +>> +endobj +265 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 169.78 651.366 241.99 641.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +266 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 335.6 651.366 385.03 641.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 267 0 R +/H /I +>> +endobj +268 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 492.23 651.366 537.79 641.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +269 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 169.78 624.366 232.82 614.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 270 0 R +/H /I +>> +endobj +271 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 444.2 624.366 489.2 614.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 79 0 R +/H /I +>> +endobj +272 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 248.38 597.366 293.94 587.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 273 0 R +/H /I +>> +endobj +274 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 350.04 597.366 395.6 587.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 275 0 R +/H /I +>> +endobj +276 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 438.65 597.366 484.21 587.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 273 0 R +/H /I +>> +endobj +277 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 160.33 586.366 205.89 576.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 278 0 R +/H /I +>> +endobj +279 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 197.83 570.366 243.39 560.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 246 0 R +/H /I +>> +endobj +280 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 412.26 570.366 464.76 560.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 75 0 R +/H /I +>> +endobj +281 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 304.47 554.366 341.97 544.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 87 0 R +/H /I +>> +endobj +282 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 362.78 527.366 506.93 517.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 254 0 R +/H /I +>> +endobj +283 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 345.59 479.366 398.09 469.366 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 63 0 R +/H /I +>> +endobj +284 0 obj +<< /Length 2985 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm>99\DE&\d_;;!htoC5*o];%MhHnTl]WH0s+alr;-n"%5Hg4;>R2TJVj>+-:fARqtXLM/*V`Ue%0Ulds_trcRaKpi/>c`_ej#XPUpKot+`G]77q1R_!jpGTJ0+a^D@or,t#VmK\eU*4u)lhm8KhJnZC[mUhoq2a9">r7*/pnFD%tqdAq)[n/JKikm+@%Hbn>P?A[?V[\*@gqU!mrboCL5HHiN[H7\mbcJS50_!PW(#[Vln`>P(?i;jDf$nujNEOf.^K5,\c`V8qPsYuZ#,#Ir:OMDOG(q"X\+IP)r?J'U59JPN]htEc*i#'oJ;S&B`P/#&mV`B.RhXa:spI72W,JB9CAo'eAkNN(TZSr:lM\ZHPZ%S1e2C>4>Vd@Ln6gh5/Jcg3u40EdZmiTW+?0EFZ4rK(JdT/%M2krh*L5'dHP3:JPHXSkob6;5Z#raS>f6IJm?i3(4)Rgmj)C6Gt^+toq\WW6b8S]O9m1MH?9I.p_Wn'3&!mN6>QV36AV_ANCJ/`04!MV;0$!`;kCq@1[D^-JpDX^1`f09l.$eQ@`NRQn%BX13Kk\".HX;U.Ef#2P\&kg.80N=b]!Bti4!sVc!aHGsO-6q>;HcN/hG:MRA`4FRQ!Q,T=eGUVUi7/D+k8*b5HJg-b'N?j$37,"Cc2Vd;#E&"u#X)Zb"?:8&.qaD&CIjEY%foU"\:p\:]Ndb)^G/%uiBRiDhmZ"Pn*@,olDd`#8kH=EnLOlqh/(XV0c20ZUK,")P>7>38egu-[c7K!Vb6qt\MVTO^YY0mDk,(o'RU:cT:Z#k.qDu;Yj(OR&_st5GV]^$@2`0n(a=e*dTHct0/,_hP)hUC*tVh=B-*#9ZlT'KEG9C@l'oLX*/t]FL)LqiO?g&_kc_.T;?Um`bQLqk[$U\@6;gk!i9Ge;$s]#0IJR]G-$pii4!Td\ra[YK-%>602Pj-MY.0[Eea:@O64s1WoI;sN1i6^8=3jOQB&LCe\PKb\.f:*X`t0$*uHN;`385q02Y"]lDRT%:lg@-jeWsLgKMT)'W=_k:OC:,`nDq<^di'NlR\"Kg?r]b5K-sl6rlWqTu,E1Z+J=m&Q1!Jp0]?rK4W'kY(se]7%n2:t"Bm45Rp?M',s0P[&?WNGIrm<<+Id/Ln)WLfJRhVT_p/q[!=?0ZanA"![C4*KmC+:]#n8qb=gRTkHN'6un)\$4,AFOso/7%fM&9PmA+K(Z.ir&e*2rWVV8?MZYnS@[%4ZAJWOFgeq@""Q6@d.IbQZ/Hu>?$(u+3?>bJ9`o.,a(guQT_rR8A7#'tAC+i6!3`GgSdX$V4^.=301L@ImQ"XKT!,RZE[["g8&^\IHI@=6*43etfJ)RF"Thjq>"/N84$Xm:Zg\DM8YZR;?AKAZ";Tn%/;EAg94P`S7!MjVc**X"M[5WH"N[V(n8=b:d>!]%6r[%`.:++4:;_50T6K4XAqE2D$&oeUE*QjF3,;k$F-Xf,=aRq\0Wfdo;22q.ZqI.K/?CTY,U%cNPN]\th2*BB-=5Aj3_L*hPg28lr&<=H<$9fmZP7aZe;)3QXuc>)-OqS1Y,3?e$sNS6`u8ApF4#@D^.qr7H8)_/i)72SZu`AC:P?oK)/[i3[XZ>K]X_HG/38-'MlP6jsNOMBkhlAcDX"(*EKanmKg7=Wh!Ep/t-d]HOhbK]Z?WqO]TQWpA0L':5ZI:_YqNSiO)W[>'UQ*>7dd\oG+qV$8"#oJ>P0E&0PoH0[LOb%sZY.RaDjD0HM6=FA.Z.gR*P&m1UdMlM;hT[83qG$ccLuWg5:R!;BkkHU!7On]'O9(riZ,bc`@X2a%CTu,9bO*mVB1sCY<#L2!9=A/(Ga'cO-Va],/aI94ZMrI5Wk]eF/+Mj^p^ohF'+:7/":drRd:orj;ZXq2+J\=T3_EZ__W0DF:r\r'mc]>*=hI7R@^:`cdI4+@eob'NDqkiY=h/4`fB].=cf90.0C"?aK>!UU1kpC=jh=U3MWiH2(S/hA%a7&sgj6=5P:a2:GS/Dd4^4icGgX#BsMp(=(QoE%EihT+;Q.-dc`o)r1Dc:Bi0iZhm&cs6iHDITX8[+7;n]If~> +endstream +endobj +285 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 284 0 R +/Annots 286 0 R +>> +endobj +286 0 obj +[ +287 0 R +288 0 R +] +endobj +287 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 140.33 593.866 185.33 583.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 29 0 R +/H /I +>> +endobj +288 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 204.77 593.866 249.77 583.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 31 0 R +/H /I +>> +endobj +289 0 obj +<< /Length 1932 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!#]D0)1+&H;*)_>$qaP:-^TRqHX$P*kmsMsZbeFIKW[0U?3P$nd:1q=c7Q-n?JqC$oRcSr!]Gh:4^$qe.9_\@o4!6c&uJP.U)&dR+O<1AbJ$:tV-Y>6q:@jK>?*7g'i*Vj]0CnY8`1Us[%PfSH9h7NB"!Zc&crA*L&T^>J6Vp3J`i\tL?C,Ge/jVK=m!7fB^=LaHPu2e)05BZqd90_/+[>go0AHHRHrN`%Ndkb8t&,4PG_:-T4UVDO)RTOg6tFfVF^e9tbu)Hb#dXe*t+#N!E3I.b,Q:[t^jK*Qq*'`auIXuB$e">KUk7*u)tW9KNL+m*RSk:-k_30O24,.@J-6-+\3_>X8mPBUa=1:BB2Y;%$Z=n;9s)3J+nfMRZ(R[W!NhCa=G"u%KIm>)))]!h"%4"rD,T7b"*Y56r%K_dYSoX-"XI6OLeYbB7J'8aXa;lJ;.ciUotTV0=.b<7(b&T=?$6J42md6Sf>WRgdtJ!=*5*(J)VH_*DrJ932Poj"^6,dk[t'Xk"i)O^9+Lf7_!+JB`dQt)>/r(*"s==e.8LT'ZG?sqnchP`;Da?!Wan%s.g81f?o6-AB]jWP#F"0FP!gsT3BAYC2X$d,Fa+JOC``j%10Nakj;m8FU"e;n3]``9u9Xr@nGLB\=dCQC?O8KW8JNbOgm=q=Dsjq/gUi:?c4W)g5cDD">\sZd_bB;[6UY/S^Q^tDnQHcB%2X*F*#G_3e$(mDEJ^FMM9]#mg!&kIdQa0B,^S\9HC)JObh#7MFe[H;A:RRd_,=JGN%s9nr"^.C`-s_b[l4"Nq-s($g@lKbu"nE:g0Kk&V``p\[r$0;ah'R]<]Aa6`NE`Q4(Vam!#5Hi9p16g7A`!*FXVCJeV,,^N$-gd;X&NG%U3\_m%[L$`l>@TX-EYqXFCm%#4jVG;app<3?h/RcQ9TG&Bh!aah&9c6WUurf^Q2ETe'0(AV)U\r->WIJJU1q\&CRBUIoR$Ag$$(`"N2\C<5=hXaRrTT'h/M8#]dTnElQF?$'!uhY3j&j@t4:6UM^$ZrCJC\l\Lq!JqP]rl!4Z!1I[o-C)c/71CuHo,K?)f86(9G!M\n@66/^62"#o*(ZfmgRT\FYi-0R0hc;iXkWcj6HkGT'd%CI^mXqtRKChr(/etZ=" +endstream +endobj +290 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 289 0 R +>> +endobj +291 0 obj +<< /Length 1872 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D?#uc!'Re<2TRPR)VI9KE0UY\6DW8mKNROH:8\;=^#8uTq(*b;cGk:ASY[d))iI#H'GmQ7;+6VL-FMuMsKD4QCjZ9h[c'JZqFar=QNrF+%aO=pu'A@>;bu`KZ6U<"O783(nle(g0*Ja6N2@jQIRtob_mIYGU4NDhLn=8W52J[**;Qq1q](tHhH$CH7$%?G+>)n/CRoBcZ`EZhS],L7^a7QX\SQn*WqnV>-<\$r@J=K#Tuuk]?(bH\]nPg8CrB/m(qZM)_bYBJecD\P"Gm>7=em,1PS8O%19uNK.bFr[p@4LM*uQo@S6p=0-6)_DQYSl]1e0^G[?$FbFk6Y>gH7f\PTNQ+F]mH:PbVq&CHAlBZ<3@P\MBiK4;g#F.NqP5jp7Ob<]#=gV2GmVYr%=bj>r)(u%ZAXtpG=Nc8=C%f\!m@0FIJ0.JR-E_cj9gt^<@L]d>a!NPpf6gDm5o2"=I-J+G52Qe^?po"7b@$"qR.`tSY\g/N/"#H[Pm"`Tc$/_fa=s9KE:>r\1t+d[4JYU!GYWBLS&@<_58Jd8+r4%L:XOs&!g>btFLObA:5"%O[#q/I]Z[:@kR-1.\A:):L_9;IW*=`D,^\*3hW@AZr2Yr89:p^LE/KBbFi1)?t,^7UG/G$/#NHTsB5;5?uFm+jp$SroIrri!.@ia/s7!d/ntD`e0QcDW3_j&';)M1MM+#%+.#9)X6[^gP+@PpU0H)kmo[]o6bbr!&7K6Z?&8h:OQ11C!V;qYt(O.O*n3G#LWeS1H2'Iji!a674=pl4:"Z6N#\[kobc"ZUfN(Kk&V.:2U>#;Ur+$]b&Tu&RrPhf,!>:@.WJYIK.[P,CQ`bE`tkrg5kDcH[uTOO.OUfj.e[nFh:k:U/U7Ff`CB&BQoMCjn^c/ZM]lt+>_hrc!bY;V5N01Q7dU!bQ7)9Oms!::59>'Jc;N:..LC*-5VQVdV#\XA]n@Z2moG0%f/_ALXk/837nqO374[*l*?T%YYPjm-QBH`!RPNT%:fK.9gl"GRdcMqn07A3qXHA-Z`^Q/t^soF)4Sp@f\<*:c]:mPN\"bS2S5(YXLO48B$$(VH +endstream +endobj +292 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 291 0 R +/Annots 293 0 R +>> +endobj +293 0 obj +[ +294 0 R +295 0 R +] +endobj +294 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 385.28 556.168 437.78 546.168 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 63 0 R +/H /I +>> +endobj +295 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 299.73 512.168 352.23 502.168 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 41 0 R +/H /I +>> +endobj +296 0 obj +<< /Length 2282 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHM>>O!E'Ro4HGhJE-Ohp'n*77C3&.2Va=YQ,@[L\BS+kA\tl3ghqr>o>/N&(rP?F#KgMNHk/IPLNWlW%+=dYkRJu)'Y\RjFZTPmq$:S(TU.S,f,Y?IM+3aP&CL9^)c.LZ(Gr:Pjt=!`s3FFG6g"a94h*#.T5B<&6e`-qmHkG#NH/^V2\X2\c.IF\6ms*)8M73o;b0j3;!4p/N86AI\Pi(?%C`P1V7P'W2SqE+f0nPp[Im/3fNqA-/#FTbUB[,Orf',6I1@VuY(Y1eEcmVD^-Xa/-_QZgdO?KpHFGM&J76I7?l'D,G3:WKtM;T@@,rrteFJ>8B2TO`,1]?QT[NQT0ZB(uH!Hq^nKfq[X:ltN.+S6keq(GBSVJQlZl]jXU54JIDh'b?LYA$_eUE;uUE=>HV8Fk$Wa.o>6&@>,?Wk)Z,6WadSLY/&Y0P,7rf?k[XI2T1Z%]dN!:9M/U+fd,jDA$fbQY1EJVV++H)J2;-OJ*TVgXlBjP>HfCDP3#g[RHYSRETOe'ZdNc86c:egn#C)/`G%6ipOF#fQ%osd8=$FrQJ082V2"A,]4b>N(@K22lB'XM63@Tf\CGLliUB$H)EJGX.MLKM9iGrSK8u8aS!.crVVtXqE#QZ!dkm_5Wlc-a:GSCWTTQ)&'ZOPus+?82qo:/Cq)ENEl=rAo5g/ui!WP31`2eg\c.&;Y%JP<6_<]3ZrWOllB:l)"JY>fDm2giApTs\Wopm3>CsC#gj9k;1bU/t/o'rlhEBg#?m]l9Aac078b9B[p9Mgt8,S](cd!&LN#(@P'8K=(A;=VM\7*c`[RN$NY=5i"2,nA4>kaPj3_u9;aG\5:*ND.6>Z%1TNRFEaSR1B,kWc@TMCCg?JoOUcdWTeR(c";`E9DK$Qb&;C]3U:Z;,M)l0.:W*(=S8_:![r;MLWE&E!T\_uecR4Hn"WWJR5i^IVNVJ-V4qZmD9!ap"C.n9r7!ZDT$Do.^VhDFuRbn<:#)J,ikpF>tRgn6)qWFIALnt`Vok_;B>99A)trT-F'l0s%HQTo*HNX@d>'_heAm7;6bCWOX4nUoM#WJT"fQ@Sg#q87@fGRle#Lqa%Y*@)8M]W/_j=\kVir!MM71gUO[RDB45nh%p@)j[U+ems(6KQoa&^7@(OdnI%/%NlkX2@cgm2B<,3K;`TYV3N>b1*S_<]?4YTpGg7q\m4Tq\3nS(I[gVrp0,t?WS"bg[lCpM[*=P#FS[`Y0m:Up:-Nb3W2RTnA(BsRFcp)aV[PC$V%@EZ9_LAC0[;WU,_(j/IGE3!il/\N'%9[!IK)sjmb+20%8AG22QU=a*Y*Fm3oFDb\iM6Lh/BbGi)'0NkEEVL[77UHGOLSoa^?kfm[D9JdYr#Th5L[sH"\3GmuR3$Q,e5F +endstream +endobj +297 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 296 0 R +/Annots 298 0 R +>> +endobj +298 0 obj +[ +299 0 R +] +endobj +299 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 344.76 234.76 390.32 224.76 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +300 0 obj +<< /Length 2430 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm=D/\Dn&H:Nn_=aU&.kPY/2^ds/,mn(iVZK"PX6[4k_$*bX)\Ob0]AhX:D;@WKD^DLXI.HIB<@P+kq0cBT=[I)4-YW*)Cr]#`a^km_<4OMnR2/lq(!NBd+Qq$,X6&hVne9d*.d'+s$j=09NLb8q*q1f"1=S@@4\-8qF>RJ]1CfeNiPP:nNf&#fm$!eP23a!rq==dj/Y1hCe#qYN^b1WpN^UciAT/.'m1&4`(`QAYcX@9h`k1m2+;`M&]3U!Z1fdQ%r@5gnuToXjiqD\fG,^MtO'l;fNWS&B*.A3[N#=BdFXVmuOOL4M2)/P[22($ffZY$m\aM*c^:nj7s74OfIqkq#n'0K+TQ9bMRMQ7Y.5Ra>'gH!Q,p-l(t/oUAaTL8E&I9sTf.>bP)b5@(TuYR">\mA9BK!%V,n\&=DL94]Mr&r.X"M*N4!6HcVZ_Hn36iabKQ_JEF(Y#+(1!s!;R%7p/&qIt>$e!KB5J90!O6,_mp^r,YYcr23^?8)#Z^QVHF9M&uWR*s2a]VDa8#+r,YLE*%5FnkNAV-`CbGp]&Q"J\Q^OXXk=+ku'6@*NIkeSg9T@5pU^pXZCHRRQf5uf$9>8ij6j;S3f9pbAsSAX9?i+s5b#Voh&*.A!&T?_/j:?DNQjmmb[/`eI@\Pqeu/+fjce3T(=3XZKd+QF5G9X>jfWG?rD=5.p1iLSjfJe-@^)JaMes#kn/7H@a9e,gOFR#42##`oqG%\p9Qd/6&ti)SNpoQ!J=+dK(X$,>:s0[Z,%"8FWpRJE3/D\)W>Fs0tD51d9&%#obQd"kj"U+#6>SJ!98cR!OIMlbUO2Y3r.t:">+/#;P]pCb#HHiF#3F$D9sIC#AkQ9EiQ4HYT2pAU#N^HW0.'p^kmi$"NAc:&:VoK*ngD9"Y=#%WplM8`>PUA[Tn:i65g'#+Bf[iIR03N)sF(F+,^!O&U_'eeI'3[7cCZ".iH2a2[u*Th_&VJ%p=4^C8QG@#*PC(qdlVqUR9+8'D#O]4Du+Qu]tsFcbUX3%NiI#]]S':=.bU"HNs610ZoJq0\M;H[5D[8a3G;NS:KOUb)u-Wg9?r].(gY"WtVAmgTiVN/FCn4%DoPnb8h^`gSK>B(/(<(Z5J5oZN*ahqg`+PeU5gO8)<&2#Gh+_^HD5d?,-7bG9I)sIJImi$VQ^ra_$jP,u6m3$ce4'Cc;m^bh!_lU,]1Sa_8RRMa9TTf8`^i,ScTS<_Z?"`MW_"pLQ#\<=G1[RW8V1j#IL"Kn&RAGjC]>'nko>_2`G*Hb8+!YfIIJ>W,B,"JWW;l'K$!\rTg0OGs(Y@pGq6Q`mFO!>jg?i:3>h889\o]=51AhT%P9f_P"CSe6N-Z>C]]J6cgqW9$g(tQ:YTuGZEO&%M(S$GsaaqK@^kokg7r%E,pJ]&?HZ([Q*fiA[$am31OC#2g`88GT@KR]BN67FbB9)n-g@f4&98^=GM1D%[(N6l`^HLW^&$ETp#J1JnY_IQXs7rbQNsW+O)T&K2'u'(9jZ-%+AU`P"Z4ik&A.u'/Y-7*L,iqM^EopB)QqZpc]FLRrs8;BEFXK*Yn#mf/h1lMX4MBbsLZ=NsklYg""P]=DGrup;4b#.'%m+XQCc\'s9A&(Rj,a!GX(d@V+N)k"(j1U?B,cV`.T8?tPY_3dqV.=_];]%8@mJ!h)UUP[[hu.*/I.]/RlT"0#6j^FCtEC@]m4\tnWU/BkNP^B]c_@,R$r.OLq83YpIGj($r+,Jbi^NE*Q#gHBJ..i'uHi@o3oq[7j?T`5Jl>iRJm$h3\E0>&AWo!+g11[6?ot1W7k,JT+CH-?tn_PAL7NKY0GWEDJ1aZ*M(gPZYc,J2R2j$6^kdsLI[p%J0RM&,7E6P=6O]FK-?)&fo1Yp3lI=2HCW1g0K8fT$N$8:&@Gm7kj7i*_L!6'T=9^J;mt3U!-2V))u~> +endstream +endobj +301 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 300 0 R +/Annots 302 0 R +>> +endobj +302 0 obj +[ +303 0 R +] +endobj +303 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 287.83 569.889 333.39 559.889 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +304 0 obj +<< /Length 2161 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!ku=``=U&:XAW@/XV1A""NbC6He#Zp\IVVqHG7PCtL9iQEtnL1tP0)0qCNe.?8<]1V'2/JpO6EUI<$q/`1*>lF#OnjP,mfVu7Y-e:"_n8LeGL&-OBglLpEf+YYK\N.8&CRTP6_Z5QZ[LH2*MWnk\SYg5NoFL3f_%N2+X2KY-GpJ'SKGj"e$'c^n5L^cS)I&cPupU&EG1($ZG<8pk4*#d1kgBE(&+p`eQj$=.5Fn0_WRa&TH:5Os%N3@B,&e92Uk+Z4RDt(-ATGE-Q-kG28?(Ih0]n\7#3Q0?]BTa/^k8W,&(TYaIr+hMlYjR=VBH]hr^)$;$jWe_DtI*ieX.p8,'1hLS3RAq/@]XD[OB0U`jNE7q,7bWRp*-u]k"RWKiTB3iX;%mmu`9][]38]T>9Tf<4)-eZgl&$d!3kEGV8j\C;f$g7LXSQG7%qV\`m-"hu5>/35-l;c-d_LoGo_e8f3k/j17,b#5I^sn@i\pJ_<*ef>klaA/PWZej)"P_E(^LbH9r4X?,>60pbGDF3pbiLShs[F!=7-RE>b?I43;)CW`eOf9UIh1PfB9s3daKi@.YF`0G'CjQOLM7\_5cF\6VJSkJ\a]W^Bq$5DpU!X;Dje&q\\=cjDqZPtg"o(SBg5T@KZmelc5"H`U[`)57>m17>b?Rqfl4ES!&2U5J"kA'?_W\kn3ZgUD>Xj\+#S^ah/Fh`@Z64AW7V()6r'J=U[>qE*ekHn;5=d@Y]TBbSn#=%:ffIR2QM3VD+hiM?LebamH0gsCkFV,-;,EnYk6%]/DDXtY"7OQSTIT4AQS(((m%bZ.@EYfn>@^;(j"ja;e,9+Q_@2EE[/n\>*FVaIhi[\$s"A!8f`>j,n"*6KEk->nWe=DIfY#\?`a~> +endstream +endobj +305 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 304 0 R +/Annots 306 0 R +>> +endobj +306 0 obj +[ +307 0 R +308 0 R +309 0 R +] +endobj +307 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 376.14 558.889 421.7 548.889 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +308 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 268.38 487.889 328.38 477.889 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 71 0 R +/H /I +>> +endobj +309 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 376.14 135.978 421.7 125.978 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +310 0 obj +<< /Length 2035 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!ktD/\/e&H;*)Tk.RDXB%`Ge;M]i8=a;7d%jh1%N+J[TOg17-;,s;k@MDW7nL.L&T,R%$>^RM`KH8%]Aq_bkK02jn+`DU`3C=u2![0Q9oiBdr"7*u0"_U_aS#^O1q,Xh8l7.go#U+.9\CL7=o4\`ha5Ij^1a/-P4D9C<.5GH_slaSl,iCH@_#V%Z4tc:bYsWu\a3+;a]lB2'QK^=P;:6gUX.NTf10iW;7MX-I+Xf7"35!`M1!L02\oT7CsUQGI1UDcI'k8&fWIs"Y#&\]cKaps]5SsWmD:%FN9C3KL>,25p(4t/l8UDN_7>:'NV8A5Y@I!Dp4DnS*)g0W$s_%nA&=jB'o5($`hZtWXq5Wq8o+eoIY4Me8Y].l/0^#`'1-q2W*b&B/nl%e3oC;7j!M,u@DT;PgH(qr%5b&!/qE].$=algVC4q-?WGan9YK@_,6.OZ)/[Mu;XG`9"(IfR]Y0I)!'[')NsC1n4a_a^,ECI[sH!IQjdmY"H&JjEG=l&(hJ)f*iE='uW7f/0H"F^\WLCI\f+RR%S1_:Qi"htQ*Xb*Ok!r?D%V%IeKBT=]E:3ReO@F)k?0Xua'7Goj),Y3Whaa#"3I&&j.@Q(*:8:V#/)Qq!E=J@3SdV-N(MjY1N!LZE?:WB_kaco;,dP=^^PQ)@8SR09\GR$ZMIVP?5f:Zfh\!^j)qprYqXY3KPp%s_CeN6=*N)S1q)UeQ7f,\)p9n>n"%DoUtP0-W3L&9k:QI.AZ3L94%A.#KdH@VRNG)1X/`>\DgI50hWaVCfe,KR0S@LNtf$jd]t+n+gi4.2O3RWBdiLj:BINd(Q9Y,b.T3Z,)34A^fXFPG24#3T;q'Wq&V/6X?li(^CFoQ*;DA=5sH+IX1\Xm:lHFokn)Eri(&OC](jkB@rO_CeM_!je!>81,[g>U*goG@p,ehj17ONs,e4r>sM;f1s(M2<=29['hDBL'DepJEc@2Kqt7f!n>87p"f>gfp$ZHJ"t@KeUeu7nVdO^esa+,^PCMVD$sScS=/0_ZWheQAT(,B%oI`$H4eW_WT<;Qb&52Fp/TiA@WDf9^j22tBLSlMpP?+:?^>4Uue6>f5b-YG[U&L^57^Au++gm7W?.D%kF4[3+AAM:>l\61?Jem$,!la\.=UWSBRNE,uOWeWVVBp/9)r5(TNBNl*u`"tW"rd)i0g.hHa1rL3U7N+f[egC'3;*U\m%["Sko&\haRI$3ZkLBOV*:K?]mk.&,G6.JT1>',Y%4H_i+X,=]HEeM6:%R47j)q5=M*a.$ScRfh+#>'Ti8c~> +endstream +endobj +311 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 310 0 R +/Annots 312 0 R +>> +endobj +312 0 obj +[ +313 0 R +314 0 R +315 0 R +316 0 R +] +endobj +313 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 215.33 705.5 275.33 695.5 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 71 0 R +/H /I +>> +endobj +314 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 376.14 419.589 421.7 409.589 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +315 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 388.62 359.589 448.62 349.589 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 71 0 R +/H /I +>> +endobj +316 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 376.14 93.398 421.7 83.398 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +317 0 obj +<< /Length 2207 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!Sm>BA7_'RnB3;!Elo6c?.qo$GS`a(a!G+U-8]QLM,Ef83[61+PAOJ)@#Z[7Bf1&J-'`G`h'nB@$64Qb3\!?C]Xd,s'G*`?*F0p8CI=5Lk,`^:D26*ENW7g5"'1cU&5GngI5Pqq?ToC^2@X_)7!,__,&M-:b8#O8^+PUZ>h.Edj*?9D!"aaldfdkOL3#j`@li@C3P2+'=+s9N]N&3>:u4nPLu'#Yr^Co$\&+f5U1K/bm$,a.S,QNpeh47>UF0@"P2bAi[FXR7ADKP@4Ng'k\_NGh+nf`p51e5t$DaqCZH$bIG(@6>a'`.#t(`8o6I%L4#8eQ1j!&ks[)+AW`DVh("H%-uWD9^9P2/kVf-KUM8^[CIGC_U\e@jL3HWk81q>gl@r%Qr*!3D73jqc';Z7O.bghh*$I@O[>';>qQI/\R#'\,mou)%,[5k*0I_.FRA-28`6PiuC'6"f$of53FoY:Qqpb<8&4sd4SrIJ)1j3?,Sogq@!6=/QXYbkZ-%tO,&unf6IRtlE^rgL&d^^4f&[hr'hdEOt1YFp)9D/S-'D2ECoY".WF=A8WOS'6*Sra=Jo1r2R&IKU[8tuFTf:SmMnmJ(FO[\FZ,+[??+6ke>:^+QTn2O:X>p$"jT-(11I-ke=SBa5@7*W!$5G6+*R$OZ*d<^Zn&R"V*&!45F1bL"OtcMX7[iRTpDNDl??3OON9hF117e`,VBPeZ7b;>JQ.4A)8Rbfb!(;;Nd1t_[.`'oCVFjD1J6#@1h1,RH2Zp-6mh=`\A[FsCYH`r%d5Z,rD`)&,qb/G-m"$]m/d7p[;Yt3-G95.TgYSfc1h-O$[DVl$R`7(\ga2t.3+"/+;60iI=!I;/5PAEAWjk3f_j+ulVnVRX]bf9.i(k)JsS$SSsb"/f\o;ju<&#i>1TnEWGr:fs/(EH?_)m?gkV/8ZV;Cl3j'!(#)6c7kL:tT;Dcl]3`*LVi.j3:M20nQ7Q95bn@a6fhfZ9oI\2U@P(VW!t0iiXnG36*?_"@:%j[rUE%q?P7iVeU)V#A=rX>AX,Ugrr3AC?ii]JoOYApsWr'sn3+_IL:T;5&8fgupfNoBgmI\r(Wj8>40o+Kc]*QH,CZSfW$HYO9OgfFI-3uXQj")$=CI<^)o0qeMp<"4I6-b+$abC+M0632"<5%gF``r@Ej:,ASm2]=j-5#&:FgC;fmH(/F@#[7(U[k/gO;fpl'!.`r,>?/gl#ZdPliiKoUW>'DN^-5d/M[94mHSZP@>733O;@_tKG([i%0$[-,Y-?V=IEq!!gcdo'N\*54e80SEb.77pLr(GFjojc0%/J'4#^lFY8a&tAfDX'HX0j`#ujb?^S&H:?.XnUlruVO?QB`=PRGb;6pb,D\i\jl23Y3ou\a-:63k)2,L?Okg?`FdkF79!VTgU5\7`a&u[*1UW(ukWTEP:m`C'k:#p(_8:[p#n31\4\2X$LC8k&%CPrPci3uoD%Vg~> +endstream +endobj +318 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 317 0 R +/Annots 319 0 R +>> +endobj +319 0 obj +[ +320 0 R +321 0 R +322 0 R +] +endobj +320 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 406.98 661.5 466.98 651.5 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 71 0 R +/H /I +>> +endobj +321 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 376.14 341.449 421.7 331.449 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +322 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 373.64 270.449 433.64 260.449 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 71 0 R +/H /I +>> +endobj +323 0 obj +<< /Length 1916 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!kuD/\/e&H88.Tlj^YTM\-UY=;U/F53lbP@gpY?tfC&Q>&jYhFbmm\mN49/=B"tEh'N#1(a<@2AAG^/Cm)H7AE:MsBo\ph7m#JR'7J=IWU-*J.l.O-uRUCj*;o;a(7%!Fp:iAB/k'8R:_.lKYY\UW.sW#cg\$75g$K[2]pT#h*g9RjOo3*(=;A#]I'sD'D\\Y!nJ>NBt=5%DZl@"bmrcAS?>f0ig^DPShK33i6b^6%Yq@mKTZNGZQp/XLoTdFd\;90iRoEn]?^H7;2'3HoJSlo^fA4*f\J5K0CO@=oD\ENI(sn^e"[\kJmuT?k+B%9^3oh?o&Zn[A@(ET0M1OSeiW>qRM5VJR[4o;l]%oaL/$?%_S*2%qe..D<00UC]'Ym\aTT?tn6^akiaVuc^'"kPYt4A0U]("*!FN5DaS%$"5gW'^[f<_$oO.-N:2RaPkVA?aG2`&]VQZo\du1fG>cYKF.M^;??Oa`aS=GROj/_-s>u2KP%Pqt"]50E)jm&_c8+Jg-O0Wca\Tm-oX8&\$909Kn*7A!RcPBX>$!K8kib=bXbsbr?a^Goo'Ak(+Ja%$=(('G)FZMV["LID\r98lSGT%Q6m]_-6CKFdu1Qs<1@:FB+d_hM.20pqh3aRAFZPS>!)&Ce^WGA;adK0S.80"s+<;.^j')!s#"di)(N?j,*!D1mMLOYIl8?E\G5iln-:$f_\L=)iXUt1iM2Y7rr=2d*F&~> +endstream +endobj +324 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 323 0 R +/Annots 325 0 R +>> +endobj +325 0 obj +[ +326 0 R +327 0 R +328 0 R +329 0 R +] +endobj +326 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 376.14 588.609 421.7 578.609 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +327 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 215.33 517.609 275.33 507.609 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 71 0 R +/H /I +>> +endobj +328 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 376.14 241.558 421.7 231.558 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +329 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 425.28 170.558 485.28 160.558 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 71 0 R +/H /I +>> +endobj +330 0 obj +<< /Length 2613 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0E>BA7_'Roe[E:ZJ0@Nik)=>"1)F\GAbP7RjK,s89*FhFho>tL.Il[)[oB=u!p`#MX1@gA.Cs<#*T>TnX-0#\V,j6iU2S@"`.`(S>@TmTr:hphor'@2BJE>7GoaITn=U0h..c3FXcX*0ghG$4sLkR(X3gc#u;+M%7HTLOSY[B23qN<246Q6IH&qk"Hh#8E>8f!NY'`=kRBNCF;htTfDCsQco=WnZYq6Ns-@@;%0DO/`$?Sj1"BAg'n$b#G:VW$rP@GD"&S5XAp%-`N/BupJ9M2-N7*]og+DM<8a&(2j-rP<\'T11:67k*I-QG(HSA3k%$5\Pc*@tcg=#,/ht]E<3D*$cn@5UjRgeKV'HP+8F^`O$pl,hY3>T.$&cm1H<@Uhc9(%Y0jsZ\.$W"\$WYrmHlt=:9_&?)>N;bs^Fq[4^[F,+NC;%'*fiKO>$)nnI^ik7(.iTbE`W;9M&m1;F/W*[I!#Ng0fa!gV1jp>MY^9gC7ZK2f.d4J1FPc)NUG/06@_eL"e(Q9%C%]_)/<3RNKXRYWl;9(ub`I\pN'ZaQ9Kb?62u@cS(%.27#3P7fj;P<4^B4*\dM.[Li0P=iQUV0U?eOkM1U8)%gbDTq[Zp?bEQP!9Pijm$;cH=0P0]1Djcp10b)*W=EUo%jJnN4?e;;okr@b2m3''Sno;Mu>,NgV)Pab,)d-G==XBDf&1R9^kELVaEU=3Ll_ZlZkASJuT6@6Wqbk+4A^g>BT$7Z?4SFp(tQ$i5?trn#ml"E%"7@IaC8CU5I[hcX_>XJqr$LhSg*F]b^u&Bgs4^S[A-M7.DcQ#`fnI`p(oH?3h@$HMjOG8QQp*`r2oi$9Y)?8NPPWtJ;:nU<8VUBj4OhaXf[NZ$`76pJ@7R;%#Bprp,J;c,jJeAms^6FrS:hg=U'Rca;E"Qc`:_(6g_DJ89g=ABGEQuVp"#`SFV"*iORYB$me=O;Gm9^R,feK"O*GdBT:P2O`0QH-?8Ajt8YB7rhiqR!8nSh[)S7B*p7?CDUae_7^I)@pbbbA4hi4`S'7<:_m:7bWXIM2cQWU,,H6`8.YTR22sp/A#`Q$#b(it>"[lY&Fi/9T6[guLUDCQBGTt')E:[NK\T@=]s)IXokSS'&B?C%?7,7asd&;Du1L-l/mWSK6*u;$qbJg=I(oP)AQ*T+em<6OkmHO5;$!SBZ\]5>+Sq/gFb2nT<2j*97+FH^0_O]cf^Sgs+"(1/50\l$fn#6Q4Ch1&EDEPp.#g2Ssm.1*p,C,%+ljiOHinq2'bgD_Q2,OL2LXA4Y$D'`9,TR%t!OYSI.!9HVWp>)bSVWB+!J/QU+'G`oY5/UZR[BP'Ieti>f;VfDS\RHDR(D^cN\DX?Ft0,J__o9^"9p!Irn,3W_B8[` +endstream +endobj +331 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 330 0 R +/Annots 332 0 R +>> +endobj +332 0 obj +[ +333 0 R +] +endobj +333 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 348.38 201.166 393.94 191.166 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +334 0 obj +<< /Length 2528 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHMD3*F0%/t^j,1re7YW0)O\$XtAg\&.#lZHL&(;n^O:i,6fe[@S5^,5`[UL+X4[ZpX^L&sg1P:5uFq2h>c=^N_OLGQuZm+H]3@F+?oS='idSCu&=GG-$\:,lHjZX4ff/nrQ$KLs1)nb@.ugMHgOm.O5eO#nA[hAWJ]h(kqGLt?XLLJoo;U9o7WA"R&;BmC]!9DO%JqqIoIt$)ic_B_%N20[QPbpqk(nrqD\9l/ZH$VB1*<$N&^+Zn*,fsmg+6lTEF2:&kN`==KlB?eicT-1-\'j&4t(G8X?'J5C&9\6pY=kAMc\\jT`I0*EC9_V%k:0BIOI<6^Fd:+f]lI<9opk8>Ol1#\CaG*C.WCkE<'>j`amZ!re9ZirSW#05b]Wq=2uE(75hE@4i#'EJN56;jrMf;6kP7dQ;2e9"fJencXTsD)+O7L?Yid\\qgokm:+;;H(CIS$LdW-lD`;"L#k,fo766<]"#o.*IW!u#HZeTNMMH"V?$T@UiatgJ7cqbo;;C_G[M-gOT=]%*Q1D@jR@F]Mf,TNXj?Z3@Ku@l3i^:]0--F(UC+\KontK,;Q9A/k8F=@5Yfr6e2?WPM@nUMMer]o\Pa9/kM)6?E]TTdo+!P^-ufd,ZpYj!d&0r)=Ee!u5\JFOZP[mk3.FogMV?jK&P3F<Ug;fcY*?4:\4?8`G$\8mL;7_/Ik$E&r]sq;bC$[fo^V4Tk7-T7#'"V!;.KD76X'gn#8#]bb!\nCfP2j.fr%\3!6(poT*dN_>@Pp]s#f=9-/SQf&9;CQ.!6$U+n'Q_3SNl;l6;09WY0fBg*_RluRj\9jVX[kqH(Y*]P@T@ugP*_scAP@oR6-V4O5"tP;Z(`@#nh@NFLpT"tGGK&'lb'T%^\$I85\9_D`DB#4(]>&:"8$7ZdE"4Sq[6\Vn@iiPusDg!GlA.BN&[P`q%ad=F>(bQ+dXYiADmXKfT%`]:@8*IQ(3[!o<:`Fa2a_WAc\$Il7(TKi`Z/]>QhZ6:a"YUTO^TI/s9E>=YDt0YaJ\+:IFpet=JmD;pVJ*>]\1$nIm@l?'1=!])hpi/ZPrjO/Z&@g#b5hO]H8.$2j/DiiJ@S!Q0eD(VMRG8og:(rP^h[ocQnVPVGCB!LA6?)1/U`DM.fd//-6]YN;YZ'9hKX4,d[H)@'^3o6mGGL,bd]^)ESr_7Hf7J;3(b/s/V(Mar-PIW3Q1sX7S14Q0pQ&p^DWgl+VMhiDtSk4#bhWI1I<(QJ7%_YWqpKY;O^MI.?iC\,U&gn]-?#XZY5t]0#ufp*'iZJTbRX:,MS?#bL0OM#D!fdb3dBVi,KEh.G<:=_q;k]lH2>)8Q+lZ@ZZ;/Fi(%jD^g]q&j7kb3&22U$h9do9DM-EKn545mS#lYABUjWXr%]((1V65,8$7Ujs[8#K:;jKU5nop`YQ!\r:amD4eiXE(K]G?6ajkEOWfUM'UIAhDLWZL@cTbk7il_A6Y6:BCCJhUlpglaE^MMcf9-g8:HOU^J%k,Hcuf2Gqp\)"i'2;a[6j:dcXl]O(`6mlpSUM'h3IXOr[7pRLRS2EN[lf7mrpdndg~> +endstream +endobj +335 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 334 0 R +>> +endobj +336 0 obj +<< /Length 2367 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm<>BALj&q9SY@!UBM>LB+k?!?!\#iM(%/ib&$/'5oN(rf$lKVTiL38%ZRXU@f17`7m#+'d7@\,!c+SfYT:01Pr[?Pb23%8-$5e)BQiKjte(@oJ_]*Q*!W=j^N-QprIbSVN-\0Ac)=60gp>KdVt/4I3<]?.TKo=J^iAR^L+E8^fB0b_nk^kI%,0HgeuA:_f;pa&8LP5b^V-Y#Y\-g-h\VJ(sesH4WS,O)egKUSiM"^$-r2>3N[!#(LPP?TS2$R`ZDU2V^q#o!`Pl:oJd'BbnY7pePR5_eD%f?!,pW*WJXhos,'AK[k<8muc+H=$akDrrd;RXh4pq_Si^qlIfm2ebb2r%`C3no0QJS_P:W9.LrCEN#KCq_$U)icginpja8Z2neb51`_A(4nj$B%TK:#cLE0p;,`,H=Tc?b-ib];u7CpWD0FHF/lO_eb0S"l`X$H-RHU#(`c2;HT*eii<`7_KGqh6^R/%/)M#oe/ojo5M?lc[%k*Xqpps7U;I;$U5"W/U%m)\0D<^d&4GRrk5c3E1cj.[H%pgfVWg`7S>2_oM#(Y,?JApMc1@f;uUYi7=Nr"[Ua+(i#3:).-;X!Z]*iJUtIsXV\Adh`eg&[T:c-::ih^mng:JhS3A&D0#Tf4k,3QR[Ani!!Bp0N4!T8pPdo)#drk,cWp<5:]YVKi!up"`NYr>ju5MqFKsnODfr;MeZ]$gE&)"N+2qdmtk%D_ccklV"(J\m>&t1.Vg@2:#*2k`epB4Csm76Y]#a7'i_C[1PYQ0rTc02M+q$9_1AT6hWYOSi6EEPq_$j`,Z#ik:"[t8fV-XSumItVSom)n@8b$>8j1m>[P3M2i`kba-7XV\u?9YhsPhCVf$d=l\7lN=%GqeG86%=&Q9ME?]6(Rn_T7NR&ugWWc].`Y!H7=b`[J[ceuIW\6-;SXDO4)*A%N'HMZ,r(cV.USPliMp?An,HZ&c2MV1BJ73DTjbk1]Dai\fRpnQfS!KcH2`2]$\f(VE$TK#B3C+=NIUn!_1`@40CD%^JG^9Z:D/&`'h`Z^dWUDT#,pdqK(RDc4KAdD.ng61Q9`>_89bi5fc;UlCuWpAo<7l@RBIOZolc%M=(IkZ)ILFfbTa."4*V%l]PL1=1p9VR`fZ&);0;-RQLRbd7oq87^W.W8j1]Lum:66%88<'CkW1,?#R[i[(a&WM?UKp:cSQ-jF?L!)&FEn@Me2ksLQ1/B(90>.gqHNqB(`D)UAn$'lfZrVXHNj@h[J$"!js_$VCk`"\k_JjaK-hjif1NIk6"'IuZe=9YT/=S-9ujoOie0SDDdr[l3[IHRMcb>M,oMb#/Q:2uBnpP,FS17f9=+-)2rV=Z<1M79F>o2fd?\>][D=\iar:)/Gp``AQg`\YEVE'8)lQBcM6mP&q!HRaqC!ZBc`&!/Xm?WAZt+n39KCtFL5=;iJY4c@J@H=g7lK>?Ho)FW4F(nN>/+DQI2S0]amp"'6Rj40c"(o`LP(^Et3qt#@r+GdrYp%F*O>i*cp-:?9S1>\bY,iRgKfPn:=XfFO4<+^+<;Pl!PPlke"_`t`2Vmf[(lpNn+f1oand"&[*Pa'02oMbbC:AZ/;KtDIH9\!i+.q_8lF0ci)#0p#"bn9B>I$'I8g`;GWjns&O%Pd]bY80&!TjcSkEFY]N!>Ci'cMl@\5\etQ\M@_F:/\UBfJ46]gukWD^EGbY0a\:u_nq"(C9!^k>k(AlD:_Qdd8(nec*iE1jM(WkJN]]d;tj"aI/"ng`;]pr= +endstream +endobj +337 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 336 0 R +>> +endobj +338 0 obj +<< /Length 2306 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!Sm=``:f&:WeDW;L2(bb1(fQT(15)jA3E!IM*eB\b1/g-X60F+,A):GL"K<`T-MFO'Z7`,O!7=bb5;DD$/_?60L`!$!_b_38K'4ZHNA#A`;or`c?6c6@q=41rtlpNjtYeM>SnWLlU6\g&gbSu:jVl=Af,Cjl0[5W^#ul=[<1C_$@L=fksNX:13p<&/<*db4L_,9A"i8a"jW=r8T-4V@rjc199VD`X+ZAPa3gVR=gXF.s$@2bHQ'&a!pI5=S5%keSkqT(uhQ(F4eP8oB7ngY?alULeTogA]8f+=X:7:+I-G1+4B-,Koj-QI?Q&rX=9+B$5fD(4KW_5$SQBm^qYSH@sE4Tp"2bgb$1PmgX3=Xp8V/>tGB;DAKD2%'M=f0$i7B:2bbTD-/`S=/==0o(hDC4o1Zb)5&'"A_Ru/Nb!;$^,PPH[$F/I,(o=!#Xd4CmSLg!Y!JKK>FRsZkk+%>,*aId;ZLt)htlO7RnT'+74J%+Mmshf)u:j&o;SM&T:4*1M/JW,&luI+%+N8B)"_O`%V].AT';/ZN:V+_L5VQQFWb_3lC@>$gpJ\!t'kINECE6*.dfpW[P[7[tqo-jgCs"\uZ2&N[6#^BW+sF@<,ik@i49UcR]"^/9M:SSamLnV\60]\csBtdd0^%Z4fn=c/l79R)4nJ3bP"?/;R]"goA1f&?OmpJVd6BoIgT&&hJgh?suWI<;s@_W*%EgP-M<8KTuV$g^`tZ2.4TW`BG9Z*W]L(=gDA9U)6@OG%kT9bZ"L[K!)``rE!pZHF*t,`i2:>1X`fa-H(X0VECH-[&Ig/ch508CjUXpflt^)hq]J4E@\kH@u20XB&aG"Ub=7:qJ[De6'.D:>9Jr]#-"PMa)LX6&cq:.MO6X!H2,:t)iIO<%XVXGq-T2,%TWIr6.HMsamHcu0G;e:<-2a=peIj1"r;:0Ng2(2*4ps!8iYLtLQdJRJbo+Unn\rE?"V3>O@Ld%R9.#s>,O>:O.qcPMXd6#J<@i[YZ87LR?.HTJ*/R-fXYhOK:PGk-9H>\]]jgk6L41cWAfLU5n05@.^VNh9#hkmOe&U]G0l^Tb`ueF4tbIaliIli6nIh9!^WH@B8A8\*VqS#)K$)F:Kf;F'69,JA!qh9MOW)8#=(Q>"7oMnoGL6;GQ8PR;I].dLD[jg@9%&1Jc!r1-ap;+1VOZoK(S+W\6:Nh^ocCM3^AjG>LH;odAb<84E~> +endstream +endobj +339 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 338 0 R +/Annots 340 0 R +>> +endobj +340 0 obj +[ +341 0 R +342 0 R +] +endobj +341 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 218.38 368.94 263.94 358.94 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 250 0 R +/H /I +>> +endobj +342 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 378.36 156.549 423.36 146.549 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 29 0 R +/H /I +>> +endobj +343 0 obj +<< /Length 2420 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!l!D,]1Y&H9tYE;9Vm8[\>EB]nhZ[KfUglhl:^V2'7FM#uC(eSJi$o0C$8#>S89(Vl'C!Y`1P^=9hX:6N'MU#?C:@Km>Q5^#KI(%O)NK@.p8rB=ZVtWW#4p9h5j5;r7V\IB:rZ\P&]\G_5s$Jrgak=_nDXVX"r2g!N)u)8nD(AAa/qK:cBAc.kTFmYY4+O5FT?M!f'4AZ,d=M5"i7W_Q!^(lujs<9JbW.!>(H%4a:,`0_NET:#V#nO.C*96e5,V8oZ;cfqG!l'WB*D:^:[_ClY]QmK\Xm:.Vc[A51>T6F#0*Rf[2B"+c:G+^L6t[^Pgd!a1^GQj4L^&T)&ljFGY,FG!%`HliU#k)!'7I-GgR+iX,CKGetceT)\;9lbL\"46EUpu-t,0'bXk,?:oStbSJmkce$q1o/"rAN$;@.7RYY(Z]3k3T@8I>5D*UqRE,A+Sb`r2ns"lhZSd\CF?Fn-sSq_X701PW/UYT;BG1$)5\NLb(3bCF#08WA5nEPGi@f]UdG&1bVm^[B#4\NXSd?ddV#ogC0?2mWA\q<]"0/O-[eka^Pi`/=#es!C#QlVol:1CkSS!LG;eTmKB-R>`_Isj?*$"he]2V6LM2cIVLn?Rss6P;WY?"e8@L:QT3VREmml#ZDaE]^ae,))ULU%+HVW+,??150JMfXY+\37bu=H)8B,iWq?[maZu`uS[>(A:L)IM7*hW/kAZ`bu9bXXUfh?!$Fh1LI,l>'b/_V!5l)C'@8EF0]5^geC,Lsg='(8?P_rFf;)tjD:\Ph3JPlt_KcE(#6auQk'l451m6E/@X/JELqH7iHqgEVcrDDXkp8f?;%W'a%.gPCOL4;X4Qs_R?EhVoL+$$2D\YgR\m0PE'B@k^^'qgSl;9/^Z,k'K&P!?lIs1acQl>KAe.8;6=B^8)nVI_N;jUih#TUNg\*oG3joh(4RD-Er/>[ctl1uZ.cBV@;KK_/8=\EHp5r9UICiL"m?1^tlMRhE$q4).(p_5fDi1tMluRZulOT:IGb4XiJ=hj.DLJi@3%+:O%'#K(^bAMDeGDNOJuquZ8qX^\T-d4-tXWBm`87sARobLTnPdVTLTVkeO0WjdP]#PcuMf%[oKI1u;Ic(QL9da:7V[kuGE0,0/SZI%"rH='A)X>WaJZW+ON+V?U7?L;CI6=a>)jF@BrFh[:[,R'7"'2B1Vct_=JF6b\cRUl&5gC3M^^34iQZJpVX<5%J0S[T#&BI%Vijb^X()U^T42),hP[jNV:@SjcJ%KXEaggHt&,*d3`ah1m:;ZP4,B=E.2:R3V;ikKRq=ff'Kd1HKA>sb\[UcUO0eXf1/pamPHhZC_lk%Y+P:;m2M'oo4d-g\"aB8-)o.D1,ph0!nk$=qfcr3CpHq1SGQoE2t2;4A2#47'DnP1N<)C@:8"XB_DnT#,a7XPq_1'klO^hS54fo9[*\"=3OI2VmjCA8e$;U,b-S".V2,"eD>M-dMrc-61W@!;(d^gkW+Gcf>8!MlT\+U$eG`oARK`\"`B&FEEhDVO\&Q>op#&M+jD=9Wh_-P?Qk%%XUBfr14.6\OXNo/Wb-@L6'gA,-Yqq1*q&WqdCbE8EtR$Tmn2?E)b6lI3`2^1H'EB@Z^S)lq!dZT%>4Cg2W?BYj:4kEC[=nKi/F%Kf_i&85:-7MC,bRtg%-AmRpkMO100c](h>ETc\[$[PVCNf.TVhqWU$?d1na!FXOp[an^6^&*H&`tPd1LCq&;FL(61T[?c*h[L8n-L:$XNjE3"hkjUN8ifQrV3$0T9,.8reCOZft]RdupJAQH_]qk(XG"g@Gc&o2ClYrL8iq3AYEgC)%W]ilT]N1j2N\&RP)#O_.\)@E5oX3R@:IJR3mQ,T'(`(RX3Gl.NeI4%mg3W`._n4a227KQ)/O?l=]s>/Cmu^iWX.*0>0+!E#`XrMo,h9ZOAB4V.Y*DpUeo6;F9@V$31Jl@'jFI6&a[?*].*bDV-21(:Yk!U?Q^gA~> +endstream +endobj +344 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 343 0 R +/Annots 345 0 R +>> +endobj +345 0 obj +[ +346 0 R +347 0 R +348 0 R +349 0 R +350 0 R +351 0 R +] +endobj +346 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 296.11 566.64 348.61 556.64 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 49 0 R +/H /I +>> +endobj +347 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 477.75 517.64 530.25 507.64 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 51 0 R +/H /I +>> +endobj +348 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 421.38 468.64 473.88 458.64 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 53 0 R +/H /I +>> +endobj +349 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 280.02 419.64 332.52 409.64 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 55 0 R +/H /I +>> +endobj +350 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 442.47 370.64 494.97 360.64 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 57 0 R +/H /I +>> +endobj +351 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 474.0 202.249 519.56 192.249 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 250 0 R +/H /I +>> +endobj +352 0 obj +<< /Length 971 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatn%_,B#A&;KY!$6PHLlImSnPMR^L)*.lEJE[4saL2_^30o]fV"EoP(eB*%(+kqL/rhKdG/)l3='q0Jk=On4T'JDYXQMV8T'pq#k<%]hYJji7qQZ58S@cM.OuFS["6WSoY!;,+\UC>N%9o!YuA,Dk>-=&=%BF`#Xio,X5fu]:.F/jQh'2f3E;h=ajbOCYUgl*n$,)i9'Gca'6JX7ma$7h5L'Flq7A<\YXVNn`pQ(hb&S!mEAg>[O^prX@'1Kt]d2[Hf(A/:oaiBtc)??9's.@;Rj-pYaK5:LoC'r7;Ih!IKg$o[<%lqsF+X9pFnHEs:H4&(=4:@)t/=Mu?4Ph;J3c>@EX=T.46d!ijKMc`R/,`&uuQNC]-s),0h.3+C,S.5iEVc?%PZ=M%q42\gd2g"noUsrIroh#ogmE-^e))r1P?JK[VDR@cO?7um9jW%Bt`0#(Ge:-TbOZRa_2u +endstream +endobj +353 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 352 0 R +>> +endobj +354 0 obj +<< /Length 2266 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau`U=``=U&:Vs/@,Ks=bjk`e:T$"OXYfJ@d+CrPR5b^2#t\f$JcSCas1TUE&ISq,ggm;B(C;:0pY4`_?240IRpY#BQA]S"Ra'_Lf&D[)3V(M(,#=e!:1ChaB[$nMo@qVUZAo%-OlpZ/E)+OaF':3WTbhg+VeJbV:uBT$=`]lN=^S8`T.<@e8s,trN']T3cru:<8'@.G8",VF)<;!flf`AQ:2V1_KtU_?lMU9-,t/CE82rZP^?8M(r$%Cgn>=1D"86H$pCu1Z<)XH%,j!LI2nV&jQmtZqj`B&Ucab,?+o^$T0UV_buf_.K,c-Nlfchn'B0=H1R/Zf\Z]++T$eP=6_SVjaDRLt&QX,h=^$hD72=)c);FJ/J(Snh42qN)@-OBVC?db;`G5UU(2F:)SD!1C?sE_8*.TZ6t)=e:haVQ:K,YT%uNHcej;B=,VT"bpE>Q-&kN,BI$TGL-spU]O`OH,>8s/VQKD[@SKB)Fhk$EGCbj1GPbj.3)]ok(l!@V5+.9p^CTReHLF5n_P8M0rKaMet$GbE-_+$G&bTVb9KCZFYfrHh#*9750c^>d$[;eQ)96-]+A@4=9_%s%,0e9Y4pjJR8_ubOCH?QS3BF!j\H"V/LT-34u4Be=bi;T+f5V7JQS=YA:2q-I!c1To$@\;N69]'2^T:8OqD6#0sc-8c`!W5cQ2QM0RM@%@?(#aDM9lXY76gQ_KA.p7%t]XZ"2O\%KQ!"6V@Wjh45H#Dt=T'$Q/ce)u003<-#]dU,pU[P_\mQTER]EC&!]Br&sD.sfuc!DJtbVpf"g8,o9=/V[4K1mnAjl>KBZ\.a*',IHd6*sj^*VX)+DEeCB'TQPKq;^5YiC29&e!"qs[,A$b1j>]`]h0A4'OCi3>@k?r8R*>kM(D6P'?Sf/hEu;[SqCjDCu*uC9[j#`hbj03PPNQ!7se>5[^l*H-I5es($&m.A+cJ8-uK?9oq8*_jWYBb/SD[-MEO$$s(HDi.-s^30S`_kP("X>$;XR4g]+JK*'Z+](]lJWMG@D:[)sh!p5p9&NlXINB,mgV3t&\L[,XP +endstream +endobj +355 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 354 0 R +/Annots 356 0 R +>> +endobj +356 0 obj +[ +357 0 R +358 0 R +359 0 R +360 0 R +] +endobj +357 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 360.28 660.894 423.32 650.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 270 0 R +/H /I +>> +endobj +358 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 92.0 527.003 142.0 517.003 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 134 0 R +/H /I +>> +endobj +359 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 456.92 338.171 502.48 328.171 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 270 0 R +/H /I +>> +endobj +360 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 344.76 207.78 390.32 197.78 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +361 0 obj +<< /Length 500 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gasakb>&*n']%):1ouF"qP'%=7SOT8`5KU7`/Sb6TSS^2m#8s1pU1bj^r"&ImHlpsSpNMb6u;iC0b4=;fE8B!T_11bXq#]_22l'E-R1d?l+o,W$ncWjjs:MHq3+Zl91K="c%;4C=?U)a/db4NY._^NuGLT%kV]LN33.pP?Fq=C/*FalN0/rH-bj95Ic+*PZ7`W~> +endstream +endobj +362 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 361 0 R +>> +endobj +363 0 obj +<< /Length 2343 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!;fgMYb*&:Ml+#^K$m7'!r\^84C0FO@IHUF`ieqER\qbcN.:F`ElKqB]u]*(m$nV!VJ,TSOk.3-/]obRBcGn^0#=d',[^1?-98ANV$eL;eUX,BVSOd$g?1)]3R4Hp.k];rcZB/9_'S&nSRD;+ZX8G15t?2eRA(bIT_l^)6CD9X&HfelM98k_'SMk\Tf0`sb>gWmA$9V[uD,N%6QZRr\4G('7-#'0\If1VS#@qFPY9IoUUX:/(nbKF+8!gAu57duSbE2(^<**L%]b]$k>F1@c0]O]_'qp@3>&m_`&^OauJ`Q6]W,@o6)sq3V`7g:gdkF!\69i:d-^1=_YRj&Mh)0V]I[(ptL[Om!RE)l#Z3f74*=Xq\?E2iQ7sW'cGnhb_`u[DoMEta7NL\CFch<.e^nKpN$Xfjmg4T\a8a['mhlY#AiVD]eS`17M2i#_(DKTP=kq+E-DPT5^?QTlB"spW,afcm"p7'F:aS%".G"nPfOF?1[`';#-rl1[Mc.0n)+JoW3iP#M4;2a@QS%1A+*Q_5QPUame)2Q#E[]X!jp#o&Zif@na!EA`:149+.kn?gdu`u1`R3N2(B\f%C_lmCU!2)=NduM\2gVeW>bY$Rk:%*nZ#n*2?_8+7L]++<94=X);%$JEWoBITc38EQ.fqAOW9oHi?`*+]j/lBmFF5WEo7p+ZOSHEK#!!=Y?!V+$h3ZN,/2X,bo`Lsmr#:T@)%5B3bQmQI()(Nt*?V?=nFYB^L(gG%=JV2TkMiTa*.$eqfO3_3UEM.*Q`n<0+XB6OSqe/Us23k>D@D'P>Db>lg&'+),)!Pd5"Aa!&N'Y6j:5Ypg]#M"lN*k#)'p@sFW(]"HfnNY_)l6#0%ReOGKK,N@Qo,'2:17!C79-*,iJK'L@]?I48^<&3[2_8ojkK-om-3(=5h-BeNUo/h384Y@E&$Y+=q!0O,\'Be")=]KRmA5KYd!I($_>*gs3J!2^Y<`I"*J*&8rb2)K.\/bg4A&*FWi=[6(eWV4Er]D(il%\]Fa"[p0pe/hoW(%]1$d1bW.&9Zr5T4Buhe>Y1Q%[<:rn+jK#g[9GFq"An7OnZ^YXi.G4HZ^F)Yg*\H*,]WOrfJZ!pRCp:!b[m]'!O(qgU%7f6PQ+/nEP6`T/:5?jtqe"ip[&1mGQ^EO\-N4](o8o`X+\:IX32(K>&jui,GDXGMLLO,](j2[bb)P8#bq+Tj#!>mF&<*k08=^ms7-a=Kbd&N@M7W30TlW2a/kV)Kk=tXI^Yr*QY^^8 +endstream +endobj +364 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 363 0 R +/Annots 365 0 R +>> +endobj +365 0 obj +[ +366 0 R +367 0 R +368 0 R +] +endobj +366 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 422.77 648.866 468.33 638.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 254 0 R +/H /I +>> +endobj +367 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 287.82 564.894 333.38 554.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 254 0 R +/H /I +>> +endobj +368 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 473.34 488.894 518.9 478.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 254 0 R +/H /I +>> +endobj +369 0 obj +<< /Length 2593 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!#^=`<%a&:XAW&H!4E2T,E2T3TE+34AL.\IJ6sg`K]A5a2!.S5jCD[sAO06QAa#^/\lSPfJ\1Y36t9O4;K:&-o`4Bm=QI]%5CplKd7sFa_$aEH&;\j(rBB7%4U,!prH0WTdQMMS#elt+AC.L:=ZPf>hOR@nnF[]M,/4;[?@O^J?\(pI,d3k4?5?LDg2d>!4_Fh\bG[2F>X^6_Kdn_f45t,Jk3gKaPj&UN:qkYABMR^tjC?)1Z6TM*]`8O1Mk68./PNn5_DF[kJRg+e;;mgXZp3?Znq@l&S"LZEA-V#Cm013tm5IF'01GnHWH>RqKTC,YYGKaAj>eea0W2c%50,k=pKo**YmCq_f$F(eK+mt-U';srDIF/X::F6Gk(J&qD$@A3KVOZS*489t6"i[s3qUnWjgj^S_3]=`=4CO1\"X-[7h36+3EA6\oHn9TOo4n"V;i(*1+1^op&9Eg4[&#F[?FXr\s=EW,Z?2/nqc:C>35Pf<2,g[6-B/m;D3t2,gUn2ga#pp1Jnch*o;aa(6#ASVq&rWL0t.(g`Gtt`J1JB)7IbTA;gAZ:RD.'9iZl7On(iEXMtdM5"B,ef(_c/KVB;\Yd>$FPYI`jXMlIM#VALHnpq;f+"j]D#2f51\TrC/U-Ffu-^Y[Re'dC_3_H<4`q.B%969WteNN7)kji=h^kB`8(!HiUS3NDj_E,Q-$8;_0\Y+A,ISeCf<#S/VNbJDfX%=Q.gWO9ke,lZlD66(Q.,Y;1(ro8Y+tHJ;"Enk'4XD;C+kN10kOQ!,4Qh"HKV`L'krM*=PHAM-'*!/m?j<$XdUE<[W34@#;"Y.s>;pQ@,?V-?fTSp(5d#kYPM&t-;4))=d?>b]rSKrNRA.fdUYcNo/0cGAd<*]R<1I__^q>)sf2A#k<&l5N.c,D^2AWgqrT*Mp`fQs%(kFLkg;N'm:']4?bAXKgX^%-6=Y\$?Ir]^^4s"VRX&nDUH4i6JL871rPWd-Y+r>%+08VIkb\0]-GS[[+>6@W2GMk`9TnTQNJcPN>RP7%L@&frnItq;Xc1@,bO>[MIb:\0,l/]_+,:!8;K$Q,+.-t"eFe:1GD\P!f*R`:/m.sD>lFL&@oT?+`J>6LZp?eo7EJUH,>gZ!T?iuAu_`L[?aCD8I02S14Au&,EQ1N:[`L&"T/bkk>i5U6k@;J8sf"l54gUTqiCn%5*XU8Z>^cn.M(l"?s014S+CkSYepb4ZdF&gcuM:^*o&qm07:sN1a/N_E;4V/*@e*Y?+Y<\M4=>/lD.^Ie2`T@ra%`->`7=FiDLY00^@K5TC9gE([he*[kB:1oT9#6'+#(DPHPe"h(pZlren2]`%tSk,ab2hhoNpGbW,cd^RgUXtGsct=G2iarQPaT@bX:m1!UZDnYs@Uc]-ef9/iI*6@hXtN%ha)Sd)1Z/-,@Hj(HG,k$";3Q``j>h_aarDU,`*pA::5Pa#mVSHsL@4_hPN\*?/(MucRY3/qrJCe_>J1C5>4u.R&fN>[b=Qq>),nZF!<#YVQd(gXcLn3+Zh#N]=O"ATkA]s/\1l/^inF/T1%C.fuYTkIa/GJau$1dDOhKX6+KuTb&o+/L?N2QZ#>rN\qef3D!cWW]=7DZ7P1;*G0/h_X#B_gN'oOT]JRm(#,e*hmI4Wl`jROGs8O]p0-nf#sLj38D5%!3KD_dXsd$_/Z5MkTKo)4ch#UPSu*dZaHQ('ekJmuB9BiCJXM^A<-e]2#`%H@YgT\I[E*RF+0gd:]Teap.`cZu5PSC`t^)NiC+P5;Hj)BoS-fC6E"^VRkpgt_?Ki7!Wl&3:jL'-h29crs]aCF;2C[2aIBRQe@AG<&\o,&JS_2&[$?7Yk'D\o5e6n$iKMgC7\Z3^Lh$2K>,Ma*;;TK/GImHCB3/>CYaMIK%a.0qg6Ru$4Q)(!*6dd\$,lQ:bi'o1u'=I,S/V1f>2`r!95HI_mQlQ#+Gi`D[~> +endstream +endobj +370 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 369 0 R +/Annots 371 0 R +>> +endobj +371 0 obj +[ +372 0 R +373 0 R +374 0 R +376 0 R +377 0 R +378 0 R +379 0 R +380 0 R +] +endobj +372 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 156.71 627.0 202.27 617.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 250 0 R +/H /I +>> +endobj +373 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 250.85 616.0 295.85 606.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 211 0 R +/H /I +>> +endobj +374 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 450.86 456.028 496.42 446.028 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 375 0 R +/H /I +>> +endobj +376 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 370.67 424.028 416.23 414.028 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 375 0 R +/H /I +>> +endobj +377 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 92.0 381.028 137.56 371.028 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 375 0 R +/H /I +>> +endobj +378 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 188.09 296.028 233.65 286.028 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 375 0 R +/H /I +>> +endobj +379 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 192.53 264.028 238.09 254.028 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 375 0 R +/H /I +>> +endobj +380 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 212.0 90.637 257.56 80.637 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +381 0 obj +<< /Length 2471 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!Sn968iG&AJ$CYjS3.a'qSs:H.["Cs/Amm)50S1i8`b6pW_7MI8]lO8etWUa.K^5a%[5%\6iUE4OX"p@SI1aa!:)H!n1Cm9&E%Sn$UE\X(/5\Q7_[[E(r+0XA]>lf5f!/lP5sMU;:rd-=%p&9et*)=nO%A;OU[CjJ?,W#;[iZ;'u=7;o\S0A;u(E>O/i:gb=T:k*f#,MK"=533UIL\b'i2dQ@92/9"3n^s3:u.obM-eOcWC,FK.f9"g4(['l+B2CP_F"aI+3O\6@O@3oO[R+X%nlB$a_$UQm!3E\hY(4C=sXKu>P[i^P&6I5A\k.TC($nm@%_`))>A*BlB[6q*L+Rn`Hd&=P'^%qWOiD8i")^G3N*VQ+8KRA#cnEncjfjHq(b$j_=+?>SO/b^,HU3Vm['gfh.hIeGl$K^G6O37jo`"#,7h\RX5K#I(]$sSq/htBgbNP$YjNN?Up6?:Y>%/GOk:[BL2AO<:lfbP"oJ8-(E"!cK5NL\XTS8@P/CToTICnaO?G.A=iKg)P\?*&I_%0fX_uNL'k?tUNTG?.%Ohk/uN[K_(/f3GskA$$AI/0N2+aF'\AH^^:OO`:++0KT\if^&s0(jcmjArhd?+JJjdSAF270-sGh%5cfoh83d:k;2!C%JD1PC=]1C%<*a!gJCG%95V!%8C8\Nlh^pdWb^^e[bqe6SOVD&R?:l1B_geCZ#m3-CcJKT.i%^LF&LPqq;JGL]33DP_p-M->KfLS;3.!8i*U&Jf$_e[&eEsS`Pd'5=2m7>*f^16"55dUerd,4u6i5Nbe6We?b8r$=;5cIX-=H.gHR;1U&>,Lt6T>hjF#Ijm2KH9=_#9G"R70$jlbK32A:KRhZd?e-D4gu=d+LlrRG0Mu%>5b?6@pi-&kiIb34B[nE0-ZaSZ]/3Z7WPK@.hg*N/+,m0SODH%fX,n=#%$UtZ$H26kHgr+AJY>PUrOW_\ghCC[ZXXiA/RpLhH=00%9]%-,j:6B]Uh!N/1iQX;d+"f33Vej)YlM#VM7CM/aU\/c'.=?ba\+&^`dl?Y^db-3l.(b&_OC8=60M)\GM=#BFL'G6bif+mu:Sp3[Dj9%F;GTbf-essO"4661(R^ith*gG'oO]B/R_d:mLVfqV6RD"J8R^IRFE=uX3n*Kj4#diL*@H$`=!+&IQ"`=8lM_emZ'Zbq4eqUIq3iBO0)t$&io=8D-Fk'b@D-]<(o1W4j$^I1pjkPHQQDcm$)Ja]E4V`:>\1Erj+VYc*NWiX5^^dPqKHe-(PR%&E2en"#gQD1>>Y@i8cCr*IfYnD`9[~> +endstream +endobj +382 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 381 0 R +/Annots 383 0 R +>> +endobj +383 0 obj +[ +384 0 R +385 0 R +386 0 R +387 0 R +] +endobj +384 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 243.35 435.288 288.35 425.288 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 178 0 R +/H /I +>> +endobj +385 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 92.0 338.288 144.5 328.288 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 190 0 R +/H /I +>> +endobj +386 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 102.28 251.288 154.78 241.288 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 188 0 R +/H /I +>> +endobj +387 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 92.0 208.288 144.5 198.288 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 192 0 R +/H /I +>> +endobj +388 0 obj +<< /Length 2607 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0F=``=U&:Vs/;#OpK@[?bNBfhNuo$j3YG&8P=e-D@o/@6+jo!"ngqLUOMm",4+-0\s[&Le@FrV"tZqI0B_RnI[/R>*_i041*1LDSO[jSu;QAFk/!)&QC.RBIufSDMZQOV['3jP9Htk>,aZn)iVE8Q[IFSliB5=4N1cM`7is?G-:,WiS.K]VoLa^1:qH$h;$0TQ-PLXC?H%m]r\a9Z4u=Ubk_8_6O;co6,G$I1'R9kW^pV.rh=:Bo//QF#*b%X6rLW?M.(S3+$SbBj^T+fbD!VbIm%'8.)Zj.K/T!Xgk#Q?.5m,!"s7Y-@\DQ$bE,;c!l3CPq,iA]tI#<_CX$YbDJ,)-3./NCn>Vq?:)ir)d63FNIn9E'WIAf)rP.4c_hM9FVH9/Wep$eL\bUC^nRTd\A9b&0NoA8!8h#c'?bj%pC<.T"iKp?57F13#`OkKi0hqe4(b$B.rP7FlBW7CK<]S>_hu%ek6h21>(-u3/XC[e`cMq\OTM8eK]XC+E6-jY^_lfqdC=cb.eC6-+jr.5._(i!CM[4R?#F?"QAblG4k&7!2\7fN"O=Oj11gih@>OU/mS=7jRqEIER0F'f[U85][muM?$q5t')$?]:&'GT1ljsB>-5En"+"sQZKqW6K)F3jcpLm7mL^rnebGL.m0FVK*_b>mjGHX.Fo]%900rra)XT)>%L(*rC7-Q8!1*u()\]X4P]Q&uTY3I2MAW:1JiJ#[(8gle5.g+Y`qj(\e5L`)r-FU]A`]G1-7?`*tkC!N==SQ)#&<-bh]&+!ZWj)i#EW*CUgjr8$pJb"aH6,AW@O[Phbu[e$qP:^_MdnPe[o"VmYhX)G2Ee/hCZXVfd$5UA9?<`e7R+JBB*fqS0+FVLpjhj16X/5iHt/,:,t(0k-QKC&XnY>u8@Y:KQV>TqkreXU11./=RSU:l:";TNrMZY3WH(]T0&X&hidVNC%L:"nB*87Ee)7e&Dg0]G:1"\j_3iq+>&*9*bpKRL1mK^fY,t7$9C>i-V779F@DG*oQ3f/>V&Y-6/=3c3_L6$9))(^+A-HeD5Bp6D@#O+41XKDAaa#(F!-u?/)Dq+.6@AHF"DdHf=qb?1k=9`h*>UV;3IT,jU)-P/3iWqRT\J?a\1mc=/I!AKW(fq&;.ssl$u3k/q`md>cnHJk#+kAoUhR@F-G%h*O4eZ&c^",doV'pnY(A?nKn4(qU-5tb6L.:`-VS=-h8tgh)BfgT?J`)*pF@7d1r#>bj>-^Ot$1=[t%@`+h4IG[[#F$Gl?s[+[:ATtc#[A/DEB$jDEV8.i@8@)Lc`&c`?GfSnP.HP@f]u70VQZ2p%WC-?.S_Z-e.:O<,knm)V$M&9"Qs++-NQi:(VZI^Q.Dp[jfM9L*WiAJq#PE#<#.ktD64Y8^Na'C=;^'r]guL_NA'B[n9V%O)(aGZE"3V_!-XFUoRctdO+gNb1/O6fC(kr&8*r!#(>C?t#+O[%t)3MQ*Ze=[!h\7SUS/!q8MEET@@DSYuZ$tq+c#Fkh6fjYhV=[I)n>2HfB7n7!7uGolA0$IEL96Q_nm0/Nmip^%2$_H=a!&R:%PnqFX/!g=SnE;!/F7?1kn/j>cY*L6e3U)lQ\+RdU`!JcTZW_J!V;Ram\S.Ngqd\@%#9q/l#<$N$-fSo"'4o"!/[*B@HIa3ugd!Pl&1n*qYf.VW&C5Y.XRlhnV8JZS7D*m][On+S__'eS4iR3g9JqTU:lH\4d,7m41MG%45CD(IPlO8Saj"?0BAUimR!K4S&HfVlYG0&*?J>Xs89&6FK5N=FH>0=R97)A!Jk)9cFuNqmR97[>3_8uA>e#n46#O4FO^:="gBmENgf4?U+9piL-j?$,E$H*Jpt35LH59j<3EXJjbNZ^D#4&%];ZtkaRrU2H_2DdRk44`hX0DDnX^[f]YZ\Skgad5OdDh1H[@r9f#U_@IlTpq;'PUgug]e7ge9dg&qo/1Mu$*Gj+@?HNi2g7^5D~> +endstream +endobj +389 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 388 0 R +/Annots 390 0 R +>> +endobj +390 0 obj +[ +391 0 R +392 0 R +393 0 R +394 0 R +395 0 R +396 0 R +397 0 R +] +endobj +391 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 454.98 453.528 499.98 443.528 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 176 0 R +/H /I +>> +endobj +392 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 290.28 313.528 335.28 303.528 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 178 0 R +/H /I +>> +endobj +393 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 373.06 286.528 418.06 276.528 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 194 0 R +/H /I +>> +endobj +394 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 359.17 237.528 411.67 227.528 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 199 0 R +/H /I +>> +endobj +395 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 112.0 226.528 164.5 216.528 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 201 0 R +/H /I +>> +endobj +396 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 303.07 226.528 355.57 216.528 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 203 0 R +/H /I +>> +endobj +397 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 189.48 215.528 234.48 205.528 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 194 0 R +/H /I +>> +endobj +398 0 obj +<< /Length 2422 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!ku=`<%a&:W67+S91Hd>BlnMOd#;jMlc4\2%os:%GM(l+?#(Wd/M\Hft?@k`!L9l'n8c2*nFs&*=jUX$Nt([m@>L=r9gq^*0V'V)jkFnlY'H8EMVYbDSbk9ehbFN=P[5\kXADiYU4lR(cm[:U7E-@?-!lE*2MauLSKNSKWXr@qrH='G%9e.M0cs<8:c)gYn)mkO2BI,IFb#AR:Ul;g?<\+;a1%\=#]:5bMoWqDEVM(R:cn%*Io8A*r6NlQcf5k?j52I/S?QK28#LjOE0(K:iE1F6#P%d0$V/[7KbJCUlS&BW^!nm)>'=HPYU#(n/l*Tq51/Rhf^Um&\sc(:O%CDPSTV+1[kt!nUa+^;_9+k/+tf-Ae@B11/0LgS>>9t9jKV),t^IB)ofuN$sYGQe3Fih__t?Fe!pZ4eK^-$iOlX/a_])ZhQrP"@?UHC$Mm[Irsk&ic6t=99N3>0:%X4%Im>P=>iTc:c#?ljD.5meB>-$Bb0kK/ji5nng<7=nc/.CH_HfA"!h@]oB2TdUHN>Q#/eK>0e/+>,7hH+'"RLfiWfXn=R`8@W4_Xf@u1NUPjpCgu7!!"i!b;'8U_*XV`jM-sTbW0$qa:E9ZM8G!f#b2Y(Jqj/).6aHB0l^jAe#>IfLp"V]gfL,`hL7CgQkK-!Q]S61GiUJbd&7b]mO0BYb-Q)Wgo-/CKarm/8_nIh5guYT5W9?XWBQ!0:cit*pM"$Yu]uh6k2"A)0]\]s`7':0DM[p6K'kF$W"Vr5b'GK-:7G0`G+3"iO)b8PWA??9"81A?pGkD*(I(!oi;r&%#He:Ff=67mY(2R*+d]0(HX0QQ97r3],&$l5_jf(%.V#EQB(+NVs3RU!hog?)Wdf"$L):0fSPhD(nUEJ%A],Csg<^1*6Ubq/HRC)(oq'WZWYo?fa/.[B?[DF[QPQ@Ol"l[LEB8IM4&nVM;E[EI@1CGbuH:QKjK0Jq=;ARjb9F4oSE[jl^1l\!u@\E!$AXLqp4Fh'RtA\)+\"Tn9*CKrU7^62_pj^^et20Jp)Vh.Nr2$Pl%N%0F.o(j]c%)h+dc-j1In*l@$'mP"CG#n*nS^*:V$pdbKK!@EUYO6AU-CQ97bHL2LfJ,a*A^I9J$=VUJg]Xpbt4hE4D!,8[>RY#;r/1S*A^je[gaI0>na4Ygd?LgAEO27X`/o:4:nsBZgd"Ve,t7A3KT+V!=CYdC)mk)592fE<9,fN\0N/PjE,]t4`2!B_&dS=NmmWYEiT2h-JF#ANkap@3Z[*_N-dlnAB7e.S(P>lp2aoVO?uB6j$43P?f?M7Hm:C/.qhHoOm+$;=h@L@fP39;]!l$WXc$)OmD@:iBjDUQ9o4F/2#$p$7q+h:9$Ea]]q#(@.h[8(ahI[T!(5E0MWoPGY1pNVe#u#oV;!J9![ef.LT[8@R$O/29_,Aukh9n(%(GeR"W,Em*j`m@7,'Ie$PeWo<4X6j]VEos*Sbo_at?lQS;>GhbUgh]399PhlRg#H,uf1?AO!nqbLp6bK/**~> +endstream +endobj +399 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 398 0 R +/Annots 400 0 R +>> +endobj +400 0 obj +[ +401 0 R +402 0 R +403 0 R +404 0 R +] +endobj +401 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 139.49 694.5 191.99 684.5 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 51 0 R +/H /I +>> +endobj +402 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 139.49 656.5 191.99 646.5 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 53 0 R +/H /I +>> +endobj +403 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 270.02 629.5 315.02 619.5 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 100 0 R +/H /I +>> +endobj +404 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.94 434.109 157.55 424.109 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +405 0 obj +<< /Length 1740 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU3gN)"=&:O:SW7[H4C,O4`,fMa$Og*LoO9jep4-^$gKM@/)K^;G4ITs,)J/L%@iG"BKp[k!)h0^4CA3.nsoV5tjSD/Ho`:Kd%]+&Y1?<"Q3BRR@aJ$g5eA#-.:':#&'3`#*!?9BRgb;tR1XAP`092%%#E:LQD^%"TAci(\Z\GPPE=c=je;45u/!\)D>PsUY!J^elRZtDX7DBKZll8/TJKI.CRM)I%t?(+,@KI"!Ra"o\KSD$3"PP"UhUtulP5eH0C,#Xk:!8=1'l^QL:h2jn(^:(cXo1O'.P/;4hOj97khNt4C\i%V(bNeW`M3oWoB*Ba7.Q#LRsOb@GqRRW<2kam5$P*O^JXTl\),k,Os4<;K2O.$I"f$PJoosGPAK6\i\[714a>r%)lUVnr3G5$MWtsRF,X)gUh-NnH\W_?9qh\RV9.fX.Ebau]agO)jB"HNbn:.2V>cRPM`;a/s')?blLDc*9[Rsh5-L;RB(qZ:iE#AJl#N%f@r?Z6kYu@'Ci7eYTu^(Gn1i%J/:P71:%Fo^KN?:Vg:T+$;%2Eccc2ieNT2S(\.#N$4n#i0]Ern51Gm5!-*(5(D%I1U`]Zt9`'P+:aMj*S[04c%_:i"njBAOqsNf_jmf:$:fq=R$m;X&C(nNs8H;N:NY4Yi'S)XGgbY+h&^>%#6cmf+*G:NOti$hV>k#m;[OMSN3sXl[f4tV*#SW>c^.j9EJ.@DO`F6]J@H6&lm)m^"MOba"=,):e;4eLV=,+,cl.XIct`f.a$6m$61Kf]2iAolCt9+qj*4(I^/+Z`8;-W44W\FP">/"8?Pl#c_kOMNaRlG9uVUVQZB+bG>Bj?]h9)0?mR_[:"X@JHPT\#55l4\%oL4?d#)HiPNGZ:P/WW&S;s2J!ALD-`2-d5(j^ql>W3^ibJ1GZP3FhtOh#\'"JLe5.[%dHQo/2c7$P]d+%6<38Jp"Zp$GEM\90fB+BbuEXtPY3"'Sjn'*~> +endstream +endobj +406 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 405 0 R +>> +endobj +407 0 obj +<< /Length 2091 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D>BALX'RnB3n75nSR716K75f!<9>EB+"/K<[P?o:E&E#"ie2H"Bhs^(=,SQSX]%p+C[D[9L5(,K?3RYi8Q`2g_]^Fm/N83?2gbd'2YqN3>tg_4&-d5$rQPDX5$c^4lUAj#>[nc2UTDgFbpLD&^cfg^hb[ZZlO]B&7sp[=OfiAXrXf!@qQ&7$*3dGLA@&prs\gR298,"em=1AhNeDJ!R?+r:W/b`clX-G0P"!cdNk\JAE]0cYl&"*bRP`RQG4\#j6UF@?$3gMGI]c([r(OiJW'kKSLNpfiqFcK5<nfEZIRB1*&m0[J.C"4<8U2iuk7!mbSmYqP.I,qNXnB,/$t7DER4X]<+Q/knVp0Yj"RG(,_R%[dLTmV=&KA_\DT-V/P*W\.l&UmIpkBVpWji_CZQAV0'36M;K-MSR14>[NL/r*FmpW%HXV5M])KWdO8Y#:7a(Gsr(C`.B:Dg,0HO#.]iK(gqC\(;-Ej<^BkiG1+cqDXbU>W`d35i.D0-?>nj!^%#d_C?UtPT]t`t\5`od"F.6Wn*%hL`8Po41R#\T>$6:#/W88a&oHrjig1!^S_,;(2D#q0enKgWZG]l4#.C)g<]-JIB4\m3C+(sBdu7[&W']OU28L,t;M$p.RZ_9(0Y+9^AQK_h\m^q^(5;HBnQ!XtVB=(Kh<<HEkIONFhCr?mE'g(+uHG,$&V8Jp!d8#8Z`0r%+oX8XA^ROd\$Y?#ShS78Fj3OD%AeN`qS^"'WHV5e3.N6HHEsbP+mJm(,Ls3(0FNC9<+_O>c)\(jS+$NJ'rPpmQ+N@5;?)K`=Z+7,e!Q5%Lr!LkGMnLGEJfkr#01Qn?gaLY;Z^#YVUR(+]MN(L9=O4FF8=;-X?;MZo`p8>$[?A&'f&PQ*j*c'JfuQKV,@C2hK\W)fIe]FM"qoU,FGDu(-G-@/U?3qbu9,@@^R+H!qHO[Al1c`onM-V'mN#LXc/l5!3:[peN;Pon-UBl%!E"'I#*`H#e;Ul5$1F,BSM0!-!IiNjqsU'nK2]nTCAPf-6g&=`1fhTlaP#jU'M2(`-L;BBtBCKA^6gF^n]_%/9SotcW4Pe^*T_j.fB\Yt7-,ta'K6hFnXL`?_doTujC];S=o4?icj.b&JM;m?JA29:17')8eWVQ*n4JaE?aa4S!CNI=[:^c&UlScOa^X%F*lO/>iTSZlq_0'CP%UI[F5jO=T1B&5,LZ6EA^Qp@s-XYuO>L``tV\"!JmFtW(!k;t$R! +endstream +endobj +408 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 407 0 R +/Annots 409 0 R +>> +endobj +409 0 obj +[ +410 0 R +] +endobj +410 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.94 152.409 157.55 142.409 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +411 0 obj +<< /Length 1800 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0C>BALX'RnB3@+^fhVNu@kjb@j`R"V"1.6*_e3dkt'P;)*!j(-no^W426#_Jp8]0$Dq4%Dfu\`u"8MW1E"7i5r8LoNS?=(b$S6F`bG7\[ag!,IX)KkMc*.sFLUO%rcN+LD6iYQEUtCRg'+5mRf+K&U1;mkmjZ!D;2K1^>[RY(Q\=Xq2#rnUlCV$6UgoU1n%SE>qf4-^?@R)RF.L:35kJSNc13iVSK[E?Y)E#Q3F[^/j7.[Y6#tbk4m/psY;GfS[>;fjZe-euAl3WngFJ_qG!%qH0d^k7:n'n`A5Vo)tnOAE=,WE0uU5l$\_?hk/BakD"POnT5@$CXm%q3ip%n6k)UXKp5bU>/D4d6oGKEC&S[hP:W+Q6MM,/(HCP@H)\NdLgXO;&dmldZ/]FUcXubh+HZhhK.k0GmIs2Dlq#L?Dit9[kdA?R1`>C]Q4BOn%#@Qi7@Msm0CgC3CK7m8`!!C`S)nm"SmB]1.\)@Ub"kDUN)l;DEC5tTYOG]S5&/&&oSYU-Bkf;]l)=QU2Ij3pO_sC3Y:A;BqpeC@]atos/-)R/XgTW8U'V`5qCmBR(]&&JlB-Z5;4^-%ci,h^5RL'@fW./)\F9HkfKW!`un!KO'H0/[;HL>N/mDUeC4k5^QHI-N!%:5+=0&]5r@)l7uA$R'KanCEILC2L.1G]I"ac^[`=OY3j?/GUI=d7a2eYnY:Zm"nO1[cMjNe4#UUXijPYon'noUY\&!HjCrC8b@kg!KmO2KEF_`DKdS,&D*l<[O9IEj,P,8Zfg)=o*+.PiqYbpYc[Jr^\C-EJgE^pigF19sT-GmofA/:[Wu3'TIj*U)b("[sH"*hsRQL2=@cj,Y(0@DSr>J1Vo4'CZ&]kVg7iX;LKsBSh[?NfX:S6^CUF@Dh!4VpTngT.".;PND+hf1_"0^6$LOhR!M]$:B96\FbPT(Z&[>%X)G?mu0#IfjH%9=t-.;-6_ql`Z`3#p#O_UBGJb)o1fb_j_Nq[K^i$lHpKB#*Y+i6Ea$B>Y%7_!lN'\J'67@8LePj)jN:+)@]B8:Isk;"k=,5;I66p`;AAg&>k'iMX5A!)a.RuLi:C=8L9G:U*tPNGl[*Z#RX1+)0:YdTUPN=]dSgCOCFhGlM;$("b%T,N?_:8cs`$)8<8B"#;L6!\NR^,N3fb[@N+5&Ej4)g*TKU`!qNRPt0#kYDEf;=e*lTMqp]Xa[_LE0bG#:!t%u]]6+./W01bjP@VQY.fbg6=&uA5IR2u9eHC%SRshLrk+,SVTs5Be"f*0e0V.;sd"+sPG9)~> +endstream +endobj +412 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 411 0 R +>> +endobj +413 0 obj +<< /Length 1610 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm;CK'7O'`H=\n?cPGB51Rf=_;)WC^&7Ma#XR6Yd5EF0J'P]:rh=6qs/U"36hUfTejq%+Io4%X)kJINmI'SYt'9`&a'1DcB!@,YbR"D_Vr@eYq%7hN&l7Hg`Cl+3ih`en?9&57Y&,.`CYR@!N-#Z1J[]['\H4%`.YehCmg*!JEf[:!8?t6BjJ'anbk[o]+lP>a`nuEB$\GCW#]+iiSDh%4hc?72mP+ZO\3?-2\%Om6D$\EngK_()pMLGCE!/?rLH-c9J\Mn4Z2e,+#3Jdj:WPS[=O:R9DBGQNF;)t=Xj'\Mh4M]c(=CPgq?@=oQ4^MTk-Y"m3'r&)gg:VR[a9Ak)g,ML5;G7-j+k',ZhZi$;ZhG3JUHCW4&GS[WSko"T9[=#+2>\Ztj;JZa=$HPkk"nXZZe\HsAaGTWKoV_TWj"<[qWJkWc710G"?HKQY2-!0"=*=Xc9e,8-9JS(.2*>f/EfC[5<#?s7(s\6/H"O&C\nn*Drdm6c8uHZR[IJM<#U^DWrC1ZH,L3aoT^DHsc(JtniL2il#]X)[M'.Q&6mAWcUD>2j:W\;Bi_[;@,6h]i;t6RX%14hok!mqU@HTO8;l&'h)8AW2@_k[\+Vf,i#l&%,g#i0"J*JY4Lm@YEd<(\Fq%*9OO4n7]g:O^SFAu\\4ET&D6+iQ9OQlB-j`2PQ=/)(N/[-LK3mJFd1RQK8;QXNFoZdDN+\S%WRoC5T4Z:paPY-(kZ1`#gk\u6C%YYN8TPXuLY6h5G=_ArIqM)Dl?R#m9oG2_LK2WY(-d9i&(`Hnee,<&q(C4mR$WsO!j\]T7]7`f@G2],p\Z*^A+?I,XU"ppPkK#_#)C!jR0L1KSeF&rfu(Gde4t7'=j>;3A9Fj"gY(q[opi*cO26mCliM&TUn)_)+t[k^2d[eGSkd!O,+qP[D[4eT@JZ(f&Ia]=@dp4O"C>=4"Wk+A3<~> +endstream +endobj +414 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 413 0 R +>> +endobj +415 0 obj +<< /Length 2046 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D>BALX'Ro4HGhA@+V?gHYq6F_G"DF9"P@fZ8R;Ji4$AcW!Y[-!oPCL?f`f:1X>WQ)P@?>SkcI$hgTBr>OdspgHKHTVLo+#rH42eu)7i[T,S-LRIE1L\,I!aru+0jEmO(/SkYJtd,R4VAD1R'gSR7q4-VIq6Ub[YcG(O@R%S'08\T#\s\Z,`t=b2Ti#h2+=HDqlL\m9AmX;#)EqRsMp)YN&$OQT&oX7r%GN)fo`TQII[nXAgN^.^;h+1e8uBaq.n[?,o9aq>L;M:lMlP&Ab8GSucSunl*Xsa>oc]8]/_"g9,,TB\W*cNZ1g/W&%n;iMGs%RqSH.?ZH"#*&%e'8jn;l-uOf<%WO#I0Qc[:?]ZC7S\2L2H/[jh]C3$s2qSG_)d:a4O^J\.m>a>-;?peG$UHIt]2C*I&BDedSHHr&78dq^:'WCL$)UE>gX^K.0;a47l6Z_cL3iP7d,GBdeA5i$PT`5+a75E7ch3uC4+`.R*Y^HQae&*.un+b9a9jZ\WLe.i7F.TanqkO6\ne7aK+72c5(8^=dk"jAdl_A,?g6X?nKFBb!A*;4ZLD!aJ"Ma0[6^XTs]6g'CI@KYdm_4D<57.P#EGIChejOiQ1YP9qT?9/!m&PbBM3C_9HS)5g(+DRoPkE9TjSKdtu'=67*XGHD&l&AGVbi3Q%Y2gi5iO&_YV6s;\_hLTgO"0JC"QeloEEn&Xgd%Sl*P_aL_?$UX-2*iAT>KdS3@9\4E8Gehr>8NWaU^0J/]2`@t4t<[G37O&EK"70hJfAtJ`i>PaREXcu#[nm0'sKKX\(tnn#^0W(2h4kG;*,VK=e94eP2J;j6;`!GidTE8G#W.?go`#dcaCmtb;:T#St8;CX"+/sQpnOaI,-tBna"GQ5X>c"=FSWW%sn1;SoYF)(9N5g;m**O_1JM%7D[4n#[<]/;[W3\(s]Mk4.\L0\MH@)I*>\-@"BJoc8-u+1IDQ0jNn0hPVR:?H\$U$P]EP*Xk)Gi4Ug@ooU'oRLh8OqFl&pR0RiZT;b[XM[=WO#n.9TE*]^W=u<]8:0k/\:Hb4%7Zh(ZW[m!KBAVB$\W518hXDJZ$jAuh)]*;8YgV:'n72)kPuGk.:`rfT27Yk?Z8UPF^51GZ4BRJ!>;TitR7FN[#:HQ@)>DEL=fr*I]J)X#Rm/-#RbVp9b;TVo)(&,->LOW/HA$p4d?%0foALt#=f)3c!WS/G7Xb%AI[/`fTSRm.Q/*jdL_EK.b:6O]'<5\B)l_;@\kk3\s.D7We`R+iUV&$:HRGMOU4?tBRp=2KDosgCqu*W)dH5jM?;5&H`RCPjM-A*:5@Fh9&T%]4]b=;f&1(-!Eo"H$^_#O0ZFZfto(oRPY!rp._FG%qej*_KssA5/O^7!PGt3Ka.0B&c=E\)ge1Jc_&Hd;mB0RMp+FPju*f4egZ$@sF.BJ8\%_(!t0L.ZSO0rD@o,X,A\ToBP(u1uC;IpU*s"po\N;rrHj%*5V~> +endstream +endobj +416 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 415 0 R +/Annots 417 0 R +>> +endobj +417 0 obj +[ +418 0 R +] +endobj +418 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.94 634.109 157.55 624.109 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +419 0 obj +<< /Length 2181 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0DD0)I1&H88._5(H+AnkH]&cuF'Q=0:3-B;l*b["R>&4]K_ZbZg89D[td_I/$!8NL]OG7u6n?*0](mB/DYpAA=ecTPam_uJ1K>9I_fiZN+mDSpOV;2,?6;JFqSrN^WPi\B@u?njbEDSD%8@%KCffldC)Pa<;4OdpDfo.F^]G_p6@]mo#Y"N,=80CZm[KL$$%.\j76PSh6bq!GsQQj3!?GX+!l0Z@(C0d2eZqU,)U#_$O2=cP`ofAn9p7ZLjl&-p+V<=Fgt:+:?LEJ*k`d9mrUZW=:Aa>,^4M=4_G-N;*XHfmb5-.08d-'/ZWiT^$sV*"K.n/l53Il)Hef4Dq45;ji/;neV`Nem!VIr!?qb]P2bLJqR=gDko_n[oO?2eLs\FFM8;:(1WD+#?Ql+%W"f:B:#WK#,bTnC'e50$M5.*=5&4CfnVF9N34R_(&/[*CsukX5*TgE000i^VU^Er-rIX!rd1Jp!PPWa_"]6`lfZ_jpIRg%E63Jd20p]Za.K"21Z`n:F^AM3TDrb-eaI_EV*I:ZLQU0S(JOJljHNLFAWoR-:WfQ"uSG0/O!5FJN=%.ij_=Kl=E4LlBI)=$nlreB/gCqM$!Tmkl,(IRpdRpJL%@KA].eIYu[jUAG$&EE"tBAZR[gsao3_HGa>bK%iQ;cCmTkAWj]9ijnD3%V)\b(Q"_md'dg'$(T3M1ZdZ.D';l?qT>k/4P2h@n5YhUu7Sl4F.Zi]T0>Zm[-ZSMeIK'N+jjC6$Ca17e0h*7L^>S,[cY0e#PWG]1h]#t6at]B3qn^_Ae43ErX&H.93tIj2[g9`nG<$7/@(J=DL7KEZtE%%H7G9pI/J!&KiU1ZL16UMs(+9Os_ankl#Ok4S=&:JuI>O&&Y&ld>5`H`fkFZ@jerOCqdeq6k!Rm$Da36ref`j'"nNTN\:/<6"(pqKm)P=cqA&E@Uunb:Lt#i0d7\AZEF;FO>K,`Z9Xi-PPB%^7Kf$QI`KJbCl<=&)j:\@c!dF[\3#!(f5s&>,$85UrtHQP.5:e"ST/-=F%l\rKsg9+nUD.#fh0PaH).@(W&)^lekdkQE;/-C1J2]@V50M_o]J3]@%h1dgif&:Y.on#R3Ec2n*A)6&$h,]Wl/W*^;[Z&Fd#ecZu25Gm=2b(WN:\?+e[0!`3B^q]f3<-A0Zje`SAuN/;]t*4MFfohs:Y+J8j7Z84#dlp[2!,f/=ln4QU"O/f0uNDkFXHjjtDnEO7elehk4HIBKgt8?l)YCo:7crjClOaC=ZPpt!KS-=)QR;K^b.Isa*[l40b<6*9>9`i4ZAP9I9tb0H/$+4PJp127%+c"/RVJd@e`E6%_CB.M_fYV!.)o`:mS0/X+\Jiae)>/,BGFaTO:X6@43,i;Np8hr[CnXR*s?:;qc[)eKnX=Kk7>=e6bU!sr1d+Or)'*^^B*'')iO~> +endstream +endobj +420 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 419 0 R +/Annots 421 0 R +>> +endobj +421 0 obj +[ +422 0 R +] +endobj +422 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.94 192.989 157.55 182.989 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +423 0 obj +<< /Length 2026 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm<>Ap!%'RnB35^mIE1,(WkBToT/4)&l-b;qIX>P2E6O);84E<0^9J%l4*(n=tmQ.?HX%,\V>\Y#B]8#,;3kE1Z(L9[uFc-uKN09BrU*$B,Rm_cAj4b89!V96A6qYTK`V?Nt9=;RP/2g^SVi1+kI#V.(No/4SO8Bs3!Gnm\#Y*!#e=Off^7ZUfI68[77iR=s]S^cWQ7@$lc(=8qj_la*F,MQ_a`gLsh4,F_sj8fBIs#h`p=5prTr1N-sF/NnkEY0F\^5elY'__Z^Kd#["#,KJh!7@s*q70Mi;bc8AnKq7[aXKYPPFhj/-G6_H=Cmt4SLJXNiIg8med#IB].R]c0I5p%@8kC4\%eC!J.Io$!rh>2$)(`rmm&m['ss4.OhWAY]/IM/0c_[7U?KV5#b.2+XtVMqgLVG\\%0_l=f8`6K");]U!-MM88i)=cFi,%KWF1-/^F%5Ri@$FKUA-jo?4(*0S@,,LYs:XkA$RBdF4tpJD=t,nO2MZZ?Dln^GfLH$^j=9K^t\[D#\c='KYYjjS$g&>#1;q]Ug(-l7X5@Z\3=U8C7!jDqCf812hQVJG5//B:9/[3aL&MTGNBu9e49$S/)!<]e]f.6jR;fo_DL)VO1>r._;T!2[-0!Hp,+ZL:6-$.bgC7)'nGN3R0lB+\GqYb8;EEn5l0n3CBArRb#(_tiCZG/84"="J$]9P;[d4cd)Q"cf+jmG;.akrl'2+/QuI_dAV\ZMeA&X&TepbU;`DRH14m8`dQqps]L=c>6JZj*KWDiA8`t+^lbXNj_eUb%&/>L2inBR'`S[;Y7UL('a2P@oS>(ISEAn5oR6e0#bQ6DChhP719j$V$d&f]TjPq$N:ui7MUO[Qqp&2cZiK2=/=L';5.jX]t0tCF%_NV.Rk*hY&^C$hVgK@()Z&4EE"Ze/*=TSn\-BAU^?Oa*\;0;K^OP;8CB#G:Sa):c,LN*_k`+?"o('sb$>`)ULdeOol#G4,56TIffI?)lI_424iTbX()7\gg%9T*dMm>g&K&F24ZUfjJKma=o9g:j+dmls0Ik<^"D._S*/!"#rTJ(OoH=s+sb"),=.>**OO_*T.c>6I%tP,CU:/WtFE9U*9MsUdfZ^n*`@oL)6]nERiMRsE>6FT*EUZ6(.4_/)IM':t[BkF(*"tWc#I#W=H4KO@4mucSGid&D9IC38!3JRM;mmB+^e!+Y(S:LLBb`4b[gN0c\ANdVT`CCP>S_lRD+/!"b/llE#"3^47GiL-On2U7:fr\!LE@l.rW?+:Q?E~> +endstream +endobj +424 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 423 0 R +/Annots 425 0 R +>> +endobj +425 0 obj +[ +426 0 R +] +endobj +426 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.94 139.689 157.55 129.689 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +427 0 obj +<< /Length 1766 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0C>BALf'Roe[d*S+iVHR]A2m$ON`CP/d%(,T#flR&9?H$PSI.lsO7?V+2XP*%/k0+X_[02eO=d8aODL34d\#Y;FrJaMV&kZp)52drk0t]X;SDQLHj.XnBYjs4A.G;BWhkJ^,_qd]B\5+7$9WQ`Sesq)BhcX3CCR>eJO8`fE^*8W/MX;_b]YQ;KjdLWY&D[qRbTZg9b97U[p2&@M$'He;P\4K%uZ%(^+\jL4]$RZ1C4GrF+uD?%8`2"&-^P0..pSR@s=dVP*-p:$qVs3WN>\]?Zp#INVr0MdU@YYOb"\I%1a!.R7OP!$2`\%jUJpRi'cjl5kc=QcaXU#tj='t-=2`sOLR'bDHq\Pk1TMmQ#ec3^`<,=7Dd1eESc=JRhdEfk7qm*lfB5e9/=g0N2'U.B@3*DH<#0Q"jF\[H:d5(&YIdu2et:AZs7L[DqJn\$^VRI;A-^.M=O(Z$0JTd>?uM-TU$/a_mNk=IR)[?aOLjA6M]lZ*fR4N;:7Ho`ehO&h$G&eX5&#h2UCm)4p:7(c+D*8`gp@@a3c/+c@#Bi3+A@?D7")cO*l,KNf_'.-/3*/7&TCP-(747lV#c0\c=^K_Wf0>O/c\`q)QN@@/Xr&f.sKHMW@,klC%+@[7a\3h4Fm56-LkKM??Mn/(7\K*1Z*PfZeRi\@6r6;A%fD]le'#e+=9jigS"TD#Z_u1PMBECtIK,7Y>.DXrkHj&W.IsPS``mG@Sp)%>2ncg'f*Y!aN'SSodh2*:?7M3e*Vn=c)om6#A?U:2u^?P^riYgh`7mqW6";-WtHe#!FEm\;90!DD\NI9]q^GTcIW5f!,_Ku=S""*\D@kX4j!_P?f*pZS^5)6t\.=lF8`^U6J/9cR-1crtnl50gU$k)Yn>4jU>i0c!#*5cDNQhP]I>'[A*nNq4&D,a5DUk(#noaWGh4LNAKf-;"9H)M*kCm5D2/2D7Xu+Gg/mZ'k2sr$<*l[=d9E8mY^_!?D?VX"rQ5'ZX#&kniT1Lo5TK/DTq)j(#(4'[PeaLmA1a;non3arX"hZN!%dl="Cs0+$XK@#`Uf_Pc/XE8r7IVTSM(_="TUo/-fc;[5/V6:Vq?U,\;-n2B!1janTX_JL +endstream +endobj +428 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 427 0 R +>> +endobj +429 0 obj +<< /Length 1895 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0DgN)"=&:N^l<'2I,@5M'A@[tD.fPDFE5^&EVb(C,^;@A9d3G\Zn[Y/$X0I5N2MZ'9m3B]N<]'#$^$>X6D(^)("K[UhtAi4%*pa:ehiL,[B6u4)Q).29DfC+\''fknl2IC:^?2P>;2TtlJqEC3(j5hIkBC\6G^H]cnCjQB#NRJthWk;#)CA+1#cO_1MLS,_=j!Lg$ZE=V,bp2=f*hCL5^?`t39q#nX1j`5$KIG`:nB\+7Mj;R-pZNrZ@tW#Z@cLD+IkN6B:'8K]E,l"=C9_)!T7(E!UWKb:B[FAeV?qM\hf,eKKfTD.:=3;'A\uo\>$f9*cCaY:!0_ah+HqZ(P9?S7T/+@'0&B=.breRME^35?CY=@amdA_V]ZK:C>sB<@aC74t4'?4C`JsA0'.^_/ZWSp#;79$Hk0%N8;+YFBV9ks]qK"Q33-AMSiA+ruebHWDHS*/$oO=rf6fTH:tf+o!6ed939q)D]AP6j("9POOhe"q3j$VJ+^l_GE,VE/j[XB]pIF-AU"DN3-(g"e&=)#dkc8WkWL9a!0:g[n8e*cBGEJl&+.qbd.^b^e*5>o&\0Fdb$ROdN9N/-cS=2eLe2%G8Y-4jVK<_DjQ46egZIK,,E#p7`[]-NF/:7Ijg+*8Aps2()8f>mpI,tBJrQpto("BHF^_9PSsc>baPMhm<[N)]>M()>>7qWioukKdqo7]6KVE!:"g8])TZ7hmaC,5:.^:M[\>Q:gW!]*+(bo*)>?a(YCu]TN71+Ao]o"fQfm=*?0HuTiSMdGTph+K0YI.@Q(sHt9;/]KR610];!<+LL@[;ps=WPqBp4Z/E/T5s]bA>QCAPr06eL_LL/eVaOpedpB`@/km.&Nbucqf+h_dQ3p@Fo#=,?-k;mY0AG\Vk:pqtu=+(HLJ>qA#bB&b\Z@E8Bo.#8blA4([KW[64Z1;0UC]i40Uq#nj'AGJf!hot?)o#!6[5OgL_:a/Zg\>rj*kMCd2'r9XbGqlmAd_mXiK2aoo4,6+Z;cr<65Y@@;?_B8`a[V&/SDORRIf="W.aMqVb/4CP.0;$aQC,^XW_)^t35@.C'Er$p'qV&9`e\T%Cd;9S/3IgT<6J!TJJLdc3]&a[mCXH75(T@`T9Wap8m)lN(Ern:"Ko%^F,JSj($BMQ8ZK9]aOhajKh1`'l;'E#.R4b=)0a&(>4i=-3Nk/NCZNlK__4;bfd*H#FB5hrO%c+/,iRZi~> +endstream +endobj +430 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 429 0 R +/Annots 431 0 R +>> +endobj +431 0 obj +[ +432 0 R +] +endobj +432 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.94 682.0 157.55 672.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +433 0 obj +<< /Length 2026 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm;D,]IQ&H9tYn>'F$R7<>"(YOO^27A(CODp%bY2&Z%#R3&N`&ZRkcsP[q?]^f1L!DM2RBbjd=8S`JI<6IrL!eb<4eb*Ts)cS!#]#AYaOCXIL?C`X/7]W%)Jcg/?hTL149k]n(;ggDm^I2%5VS(;X+4$!<>r?/VI>(F%mc,u.qIE&K+ga"(m^ro!`(X?:J@B0V+_h6iY@L:#-Ok/G$fN^SXf[Dt+3BD3coF-`^;8-:8:-dQS/Y@+P)MBJ^UYC6sj;^T5n8bZ'-$KW9r'QXXc>MQI.o67KW_Q.'S<*(=``*CMi]@!FOJKKRHg+i+hNlk$LU=X;+EFA5r(^pL[;&@M4Vp7UaZJ=P#Vc`\t-&pe@W`hKX,UrjN<'Nf@-UX',5Z.NJ>Z93RIdNU/,U,!B!`(D6o_U[-K0AhjVM.L`YaM[OJ"V].h?lhlst\$.9DrEo1t6-DQi$H^gHE!,"g:$c<*$u5Yd-'h%sL`a:qRcts.$I78;GO5'"Kt>hNKpWc-'Z`RX#+BHJEE8\?L^5UZf4RM%rS0)T>&1X-.$#S"#[7K4ndU^g\KE,)f*sQVKoDC%!3fB`U!C9+cJ;PRV^J+V<8h98:>%.fG!$l1*!.j#n@m`(F#:&M)F;ee]A=^]okTV"$NKKo-nEO_U0:KhdcI;?S9KAWSZ,!a&AM-[PcuGS3FumnhF!1o;?]d+]oiM[saGTjJa#Nr/iLq4S%[F6Wr6b>B_Ss7i5a#*!O#[cK2Qhs1-bKn5J]PAUWi-JtP;ne-126^g&ZT)km]Z"Z&8[$[4L>("cD+aFON[p&R!8#$)Yr"%\d$.G7O^g5e]ZgXaal5`mG5S4,OqM540d[j&NBf?3A(@13MWdu2RDb$VK-JLf#Deh3"1=.mbFh!3Ae++fe@[m[r#24G16FC_X+@ajge16#h&+5?pSiT]1VB9I]caE9K\>#M$ZaKBg9=d%mLP_2nchAMqHeWEd+`?=$uO,A>^L'4B/;b?c+3epbcO'XcM,02^4j^QO,7C!uIXHj*K8WPufWZ:`(o)$/WCY]!1'@jQM302Z%%GP4If-X4/".=9o%R7l!;?e%Y"sse+0W'/:3F:$q4/`[(<;kp"lS,+C:44.h6\QJpR870)'3EA"k5(_dW9GMOn(j^DAM/@Li=!`_n`O6UGc";@X:Fi13R"s4#K'm+?+[]e$9CFH"$*sB+=]S<%tbA!3;fks.FC\0AP*na'CJQ>4-ZXr;A63+;Z/aPLcFcUKpZgb;G;Xuf.R;<"P1roLV5VV[i9sOBi1t=cZ`>'F*:WG+Y^hhiM%Xk#Y-uKe0B-iYC?e(CVa=%tQWqleih,9OGVFj^oOQ=Vfet'K=!VmI7G'`k-\',2pJIi1BVVq8nLF(`$AsC-U6Wr?:?GR.TsV2SJEI414#GV2E@,[i[SLJo+#?:ek9mBdXa0M>fetU6Zc'2_[[n*F#m#QrCT]EjJb;lFtH+$gQ$)/Qb_)X\O7(cQNbWU&qefS&47@p\>G*O]\lU +endstream +endobj +434 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 433 0 R +/Annots 435 0 R +>> +endobj +435 0 obj +[ +436 0 R +] +endobj +436 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.94 392.469 157.55 382.469 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +437 0 obj +<< /Length 1875 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%#>uRLh'Re<287c.?Wg9MHBgC]06:\@t&r.$6FD;jNU8B7D)1q:d^O@hh"JQoL2ca).II9Ut^3r"i)R[e\BG6>D41]@hp-XbF1&R0B6X`YtMMQ(=MtYa5-RU"j"r.=66^XrVl#N?E,KIhHgY^`4T.LecIXmX!d94YY0PCJ$3jD$ZPYYJ7[XJ:)DRL3BM]`\?Tk%.+rQ\*^uDB5m6teE6/@(Z@3ZRc1@>XcK"h:?.$%J8eT(\``3T5M-HI0j8AZJNAMgfe)t=&Ct3IVE>`m*X[gY@OZ'F4&9g$`rH+GTbM7n[KBNT-/;onsj6+8>t8d#^>RmA3!BQB$5rjVfEgY89dsdLCb+;R*`_qiF+PFD"0on#kY$?E@G"E+*>scgTlVcKfQXk(P$>DN*uRaf8;5##$QJ$WmIs47HaGgn-^kq8tQh#_J53nR=@Ocno$q[n4#eZTIdI2#D11\'mEnB%-FX=]t"F_pU*AF2,lGj;4%-bI]_imc$>m3E9_jTmPmJ(MXe3Tl/TgB=kb[h2I(\$Ra:?/*\b"EF]J#SR,Y,/f]>#$,I3ceE5a[CQ03p'kbo'/7UFnUOc"ZCS6RJO(TPg;CZU6df12aj&@+sK'6kFSL=(:5CRnQI;.mMFTf5fN$M7I.NqeWd;6MoZ;(imu>Q]ld$$)&Zgp`)/JEI1,N$DKq!7gg-B9XWfDteglU1+3VRW.=ID]'mh>442)"X<;]L5dP!7-fRf!`?MSnQ[F"jNGD"s6#_tLd\Og%M'WsOM](QT#169c,9WGYuN[Dl]8YYHk>&h$1U>DB[t--.IE\O#5,6`H7(cDNpE%Z?\Qr9X-H;qZ?IdERt+NiPp2:)-"F!4$hPU-\"SH/8BMk+OJlBrfoqNQPF#@Ahr>Rh[9C""ngar5QDo>Y7Kot--O/mqn@7AEp';j&Z)Pf-VoKK[(.jO,JL$-jhFBE9;r.gh+ZX`@q`B@FoT!3/cY6;Y1J&o2hE]M6iZ77l?@"tI7nO93LS)e0p*#Ni2*:mArJmpu\lCU?AuI/&"*5;['6;"3Sa\,%$C0@9(33<~> +endstream +endobj +438 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 437 0 R +>> +endobj +439 0 obj +<< /Length 1808 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0DD/\-!&H9tYYdc?g<7]oMgC:+fQmAR0.6*I2erh;_ij?AWMrkMlXsgBT:'tJQ]&([GI`DJjB1BJk#er.[N,'t/W[]7FqGG@-HDget/5ALVa+RWW5=B7Jhp,:QCOiJqPXn=_]:$/YJXTma!RWfQp07#B)i"N:2:6SZ3A5BIZ)+P'R)3mB]U+F`2O7@TT/(mDV/C*6H$1P:fH+q[EnS>L:04In6=Q)TV@NXD$\[EBq5G$n0V?bDl$M,CArMV`l#R7oorop`N9'&i@`%Au7G]$n+@]l!9emn)gm34)t_[kF=&=b7lM[q#r#gVGQHIY/@.,Xm58iE*@c(H''/oTc\Bs`U01N.'bM:^EZakT!!j[db#5s&4\nLA=-5M'ns/m>Fpo5U#>PEl*X>^S(+oG"-k3,@*;ZY@=Z)uUG1UoaF-M-%#UA?YK81j4OeQJD9%'?mRQ?K-&/!B'0[3H[J)YK"ZeRR2e:qss",1^!KFe-j"9gA\86)GoY^cVf;:`G4GB_/$XQkA`EQf23G<2a2WYi=":4U6k`8'\Hi/%ObF_:jgjaf4hNSo\=0340@[N0$\[,6=uXYaP!OoK6drGG#Ds'i4"A?8E@:9g-Gm3T!nqhV=F3U.Eg;VD'/,eeNH-C*)A8WO#K[4F"=SD:(XRG&W.L5*`>H=OVR?tO=<4>-&CNtIH.t("a`D_--O:Q>njhK4k@Va3"Ym/Z)i7[SH/Ik5+Yk-mOCD`!_kli@&LO6PYgmMhOq*A2Id1M1U9:nEqXm]>NQJo-%cVD]V)K4M[1U4M$0ChOkrs24;huV9$WfL%SZ`^^iKg-j`?!Sq98;3srjmE7"1q%R1OJL9C0K(?#8_li\B@QkVYJotAHbL4eZ)O44lNZ]Cm$u4ubE997KtCbD<;L_Vi[Y[ClKcUVY1IFu+8k%#6qN\:J/AGKP<:BSju&A\etM5lYSI/SQ?\^S3MDMkLRBKQ@^!l~> +endstream +endobj +440 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 439 0 R +/Annots 441 0 R +>> +endobj +441 0 obj +[ +442 0 R +] +endobj +442 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.94 714.0 157.55 704.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +443 0 obj +<< /Length 1538 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm;>uTK;'Rf.GA@jM^bXU16Vr\\+NU8uS8O=GQ);=>-$&12=Ouh9WT>0!<@j`BHl"jc.i>c-1ST?*JH^YpCajKi-khP4Efo`jlL[aT-pCDo8i-aiDs/$=,YL"'cq0fiTAPCV@[]O*QOgE8mqh\-f1Cm7Do^$PHd)'"0CLr/3lrJu!L1ubb>j'a5P2=%V<#F=^.Wb89>cBYC?,>crL6!q+#>[C4^$h',(s+0u1?U$IqI_5fu&9,,n6YBb;8no_L5H]E_@OpsjNRk0%ao3:CM=oQZ;Dl1"&4A6P[534>2G\LEW)u@u(NroD=0n^T3iHW0"5rkKRC)$4TB?<5$E8;*=9-L)rOf6A6SW@c9'`Kt)oLNYAP)D9=2mj`BE@62DGpV8u,Kul=Ej.o5G84t58*8.1q6OBe!LuZTGjRqNrj7.9Q`u!@r:Ts;Ra"X+CBJ:>OkJtFX`2,lkotlI_+S)8RR\eAUo[X_8HG+<_o]"96lVcE!TV=ilp5EO8GgV,`X2gLMiO=_$JYd1ke48AQM@H\$Nb9,WbqMtkFtq3k0YNt7mO#n\%g,'"Ci__IYDNCDd`QP;BA/U#3m'#Y("dE\+?aJ.]9M@ltV;r:o!(rl4Q23T#9seqoV'ZXGmC2:A!!8r:>REu#Y="4sbbTBTa<'7,c)?nNgc+!r#WS8eGedP8^tKS-'6$/ST4dP8k#Op=V""=JMD5XrR8Nh^"oFo1-X2n'P3j.$t#=3pR7k$_\X_U,7FT-,bBg=ks,(Tl*=_sS0SN2V0iO,+1HW*S^1ERbP=6&XICmM-P&W1E9@ii4$YJs<[r4]L3"8d"cGCSUcVPQiaU$bT\X@'[5UH[>ttg">3"H3^+KZ*ZT>#9u1pm*BDeYd(!Oqt9?IK3!uP[58@g:Y'sSHD3$=7dUi![Vg(<^]^&V',9.7\RUc5G^Z5H?+X*5>*VkfBg2LL9YfcS(V/e\Nl7,XId$1^bOe!Q8/eP;*.4_@_7ob1o-(Gc~> +endstream +endobj +444 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 443 0 R +>> +endobj +445 0 obj +<< /Length 2052 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%#D/Z1/&H:Nn&bWm)8fNDB_*D@L'V%(*H!C:T0:qZ[bkA99"]t*C/oY6&WWRV!N3"AMp\!gVIr^`sk9j0^R3BC6]ro)o8iMrR7TU-W.I8=(udT\acF,r)JuE9T1\l8SnMe$:+ql19!04?U"3QK3f2I&(2!$N,^7[E$lN4Xr!l8=[gds5`qI2^PXS_7]fpqks-eXUkIFm1%rrsW6e78Ef*6/geKdhWP;!BJDtn1]BA^YaM>b6Pl-$/h9+1D&0)tp+)bs]'P@Gpmn[V%N6Kl=O#gh7U@DU9ai:=_s5gi244pVQW5*j%35pS>BO3is[0ZoVlEq.%1[V/U5p>#NslL-`-Rk-WjtZ\b\['k9*t2.BJ^;(A]:a='%V*l3i`:uPiO6"\3r\n*(_MmdoV6`5?Z(J)rNM9M,/0,OnR+65oQB$ijq<`1Ya+giT2pI?6A[s\2Jl@D$GkMbF_!KOh0_\&u]rEaGe7AWTb$XpJbXQO]9brrV&\qRLS"oVJ;aFff9n(LK95@PbC&Cp(Z5p,Ug#[W.`;t9qAGFC)$ug3]?:_kuGuH.a[t0'6mCTiQaW&Q>ViaA^01m"#jK0d3R(E_q],`O44-a=G>3i!g'uH7Tf)66X%I`U9p8e_R2D>McA;2B:/^Y4nW*)F8[@cF9Zlj#1gsFWA$NF>%>po[qp(H2$c_H3cfkE"A":((CpfMRW*)gT7@W=hCh+3IKVYbm1L1V!^8Yj[f-N7@G,=sj?QJX;ip2Qtl0Zl%H#D(0\7XH8,DY>VqHB#m@U32LPa.Q\IdG)0Jkped@$UR,psD8jiOg0"\'"qZsnC0GHWERTip]g;M/a/qE*-,AG_T,ambr1Dd7jpED+8!7\E,<1?0Ytl=K0mD9M4f,/$QnN3nR=9dC^OaI`g0f5j7^*;%Ym!='$@O19!UBAc"cegVpE5HqU)q:[To@a!4$#Xa=bAH4KHHWFeCF33ntC#2+J8TE^4+aFVriI]u+tBdqgXk@MM)oA_2RmZLNc?c$gJ_01kS%T_KW.XdGk)>biF.=4Ae6Sma64,#7FL=Sd(+/j=,l%9/->Jk%-oi:dX/rqI((3HKYH!T*b>NdNm/e^R)Xlp>%]WW>^@H9Y3j532dU&lcC2T(3YLMjom/>7LY4dr.Bgq6Kj`7Y9[Y?$3o=Jo:%MVeT.u_"%eOt>e[/rA/,Yr_.bIdaRGYuHl'>Ob+_=^R;FB2K66cRYBK(!BK,MX'2b_5t8cToRG$sY0H%_i#UEhL?MIW>n77,]q(io")9NoMhWgSS:/Y*1!.nIPIcb]b#[L)Nhq]MC9GFLol="Jf"=6MkGIr!.~> +endstream +endobj +446 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 445 0 R +/Annots 447 0 R +>> +endobj +447 0 obj +[ +448 0 R +] +endobj +448 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.94 165.689 157.55 155.689 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +449 0 obj +<< /Length 1730 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0C?$"^Z'Re<2n?=S59J'K"QfU,I$$Ob`!m-%XRGCU[*&*$pf[Mn6o\]-1#KVEdf\'Clg%)]J8k8WI.p[g@6$W+`bXRb)/<&9UmHVn1a>O0eL`)Gfn8:9(L:EAb`l$IOB,;LkYWBSRn-6De5*!N?ZS;S3+V&[2O8DI;)7V[5=pD0m]'._A1p@G,iO$O5!tYYpU]Y+3$:L6n/rd('5(.l_0&@No[gVi?k;Z\le)\/qOkipQEAC9:o43%$HHN._g\CBNrSI<]KYQnCJGE&F8*G9ZBFuVU-o6?8`S"$u%&&lmf*/?\im$M2lE-d3>-:$`iP?V?RmbT)r=IVY71:=N-ZojT>@m&6hm7ghniQU&T``LH#@&Ap[LQnh*p:qp3W`mp8US%B8X)`#-Ii5Jm)t,qX.%uZ,]ODsFA:qV4O/u2_f683C*)V[AQF&`p`s%_kH4W!V\]d>cL>fK:6@4MP)G3]4G>`nc(PqW5e-2*Y';DHGf38LVLR>._SAD.`/:'ndRAb)4jDSjP31mPT$EOEE_(0fS[g@n2oJi\iK"f]M/74TF@Tae]Ghl\/!gMlmdg-!2j[B*Ib[GO1+8?Be/Te)/BVIDS0jGF?<5e+Ghm+Y4+hFtlNMaB$K^]s,,dnoS[Rg(Wu1r'C=(J_COML'7j:5o1FP&HJI]7X)S>*HULDKPU0;TM:3,]/GW"X#*u"C?3jAg/k8B\5^:Jii-=ADNrVGYQT8OichW1Bft`>X)sibXE(7@p_/0XF")*Ianm\PS02(7`g8Bl[4oHIZQ38KO8dTPT:;TanQ.CX/.=_uQuhBdSsgTO/WE'ko#8^67ElE^U#c;AF6X6WG4*(3%@i@XgZMl5s_4CVrnlGkZ*ZtMR_FBlh-K=MHmH:&88PM`FG34CDHHpr6RMK'M4u_+LEeRX6Y>GmDukU-P"nrg3kXp?/H&Q(tV)/6VbnCmI8-1p-$m1Jr3ct,i(:]+j9.?$cnLNn6ukF&,:_,2^f<<8ZQK0FFP=\OUSL`2EukDft[3;P.)I$KaqOEYeRPg/jm9`b.e1^:2:%pm+);>c.O$=JNknOh%7ZURW+!l:"8C0hsV!RoYP;??'4Xbf%MiL[[Mk2@+Y/O+LhsqZc`j!%NuW@a-;Ef)u6T.6TK2.%[ikoB@tgF#tLe'V-9#5\b!#tbWF0iC+@*Zp!m%rr&>+2^n?/ee-n^j]FD-JNrt*SCJGui?^m2&OcU%5YscBj,=rfhfCBmtX\EK_Ip"2R6H3umGIAlR,F)LWH/iMsH^/EUFcFaK+#gqN:2?q3Ftd]:B<50VV\Dfu)]'1R'ud9$:?,gRQFp\^\5N5tH"Cp;/%-DkOLO:N2D-2WWN4d`An]/K]e-BrkE9hB[d)/!U<#P"^=_TG3P=^Yo-/kiLG(2,1f+BC\IhTX.UJ/-UT?H7D[[bH`85T) +endstream +endobj +450 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 449 0 R +>> +endobj +451 0 obj +<< /Length 2048 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm<>>s99'Ro4HGd8uEVH,8$Z>:?@3f0Qs6D01Qlu$GX9Hlg#M/@'a_S>!g9-QAn$Ct=3!*f9E7GlM'.)#*u#`kR;YVq9oM^+!#6Y"b;<3rM*cT34-Ef$*%mJc>8;6ReTJD\6_n-$7V?(>1E>_3B^Je5d;NOq_r;,Hj:BP"hBWiUEj>n%aW*'R>HX8tZ*=t-."K->iSE2@tE^'dEjbF>11lQRnHZn7HX7KJJ9uZ\At,ETgceHGhLRK,?Ej-8c7m+/PLP&7^^T,kuKE?VQ.$JKG*(3&YTL(^8b8K!,#kW*dHfcS'peN_r;`e:Mp%S;i0)P@3#R4KLr>%`/YWYc2Rsp4bje)!cW8KV0_^LkEp+M=K['g)p:\Ki.hTOT$1rb$bNX%20D2@XsH0D_]FIIG20d?B86?_hdhEY@EKfa\&PQE0-&`61_;XdBsmIWhLjDR_58d]U,>9*_3=Q_^kjm^W(k!;+!,YOjS+\$jT#gaEA/-'(XD#UXV^ZQ@OD`$NBoI-.m7#ea2n'g\7SmP/jmWdq;MiSaAsU;J%F:Tl.@ZOb&j28U:A.>f<)USIE0DLl->(p*C,c],4rgFuYoLjlXleBnP5AMsXCo'J>0K*@UH)BZ$jsTG@oW`q)$DF2!R8kl;eZ(#[Vg=Y/:@FO(j";4"2?/1Y;j4KZ]aMhAI4@tZBXng1GJRQ=$miO-$GltD>F$JTP=7T>Y%Npb8CII'me?SS"dBHr\1NmNC=4]+)rVlsi_`T(*hT4h=u*UFMWs.FSr8jD=R@7$r[%BVJWE1Zm]n]C\?t'OO`oJ!"L7Gq*gN&]2Ec$mlYqI!Un0"qJ14ofK9%dW1R[RAi6c@"QFWH3Sn1J?A*_?+8iI/.g_b+h?qLQ\#6o?g:!;[fPhZahXgXUhVGOo@0>_7?kER1)eZOUYU]IC!?$rNk`"6ZjQ\ql]JYIFu\n%J6b'Yt^[(,1CC")[3]0UJUTJmQJm*aFWc?,l?F5l_5CKU-MEUmB0Lb--6NjaMG\XD[[V_AKmU$iWGbfO-700TP5T_1KO14\:DGoLT`.n"J[eZ/uDLN8E0'\CACGAkqU>$?CZ2i`ImT#PQlr#>e4G'MT>=SD_LUTP_P2j2LM$B#4"S[$j04*nPSQfP58VXgq#XGnRf;&8N]\bb/JM%1@2g4Cpt#ST:H0=[Z:4mNCJ%1X*YRk:,r;4?2_Dh:*0V3,R$!I+V;*Bm<:PBAp1S&*G&/`KEnO0Nj#Oe)UJu\9b?`V7%/V91i#D#0==`RS=UigbucRBFC>qZ^K2HfaRPFDj);ES>Y5kAJlOu3.oPOpNXMC]~> +endstream +endobj +452 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 451 0 R +/Annots 453 0 R +>> +endobj +453 0 obj +[ +454 0 R +] +endobj +454 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.94 412.189 157.55 402.189 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +455 0 obj +<< /Length 2408 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!ku>Ar7S'RnB3&H%am[4KJ3=P:80:#%?gPGX18FK#(%9=1g$Q<];BdsjS[;QN6BPb"Vf0^QW+/X&U4s#J=+_cUDJ$hjM]HE0:Yh`d-p%[hNojfShh*tJob70Pir(=h:8a?9O96g4PkOnRD:87S$bNeP\0H--:+=UZ]0V69U>%1g.]E-kUu-9?Q9pS7%?F=B>QF'Bfr95%N,&4`3ud*p2P"6"1:99a_,r@F0]/8B*DJH/D=6n62E%Njd!XoSQn_\T<'",":oeZ=_HM$loHM_-`$[,"\;WFW$"KnB[71n:W&t78fGhA4^i3E25Yu\,<7D_>Zb<8IHWhW+IPAqh!1&Pt)kcjt9hr=Fs)de6Po01H]qFN?73RpIBjm!"Q_a\Oj1"bXNrTW[GOf5)6XDR]-P>CI$?U;EQ^_a\9+P*0V"eDniCZ7`<(?IoYVfSbXCel*BhDP.E#M;[_JD=0o9gqIDu`iGVa,"8M0@Q`OsV81GC/]u!bBi<3ZkkL*$?mkZ0n.hFaE_5-0J\"#X'Hn7@I*+Ia*=TK]IgC_)%pTh#.0Np>&mMqsqEi?7qpR#ZJ9je,.]jOqM19o)lR#f\(<\q4Zbli9`?oqbKX'-2Y1m[V;7k'.%TtSf)j^B3M+`./:SSmYpp9+FpGNf=A%engZ5-93W>*FdD1JM-M!qH3g(G#s%MGq'P>S1OHZ2\?@;-3Q#Y8>bJ)E)Y?K'`f+SjDA#a4_$Fd36Q"J2g<'Z&_nq@u30#8&GN*u4n1_5cL!LJ[Tf?AC`-h=S0XO(ST0D=aIK(T:@!Zp"CF:hhArOa9%>.qh:GV0Sg)m3!"*O$=B,M.BXu`J@L!D;YUid/Tm2FqAN1*%>Gjt6%?'No!&gMHMF92o.JsI0<>D8V1keAl:q:]O39CgT\=0[=3+6WECDE`k6DVre'p19:"EI93>Zl>HVC\AW:)=fe'N0'YZc)?n/r")W+V-47Ud?U&=_0de,0iq1A+b$8:OdD6!WM45i!(B>5m`i0@!DpEC6\P&_4Z/&2NNQJ4U=[q1l;7aKJN4F@)MN-+`D\:oDXa0`X1]n>**f">7!>)+>[\IL7l`^jg1BHomi`S/9l(%Nc6WsC7<+Ke/fSR'nGfPrrbT+IX)]Z'&MLCS*5D8gD<"Rn.X.N%oK(Amm%E=r1?68[R3A+E;P!Ijm4]R'(Wk,Eg`alC<2LiI`I3`gN7giqi8uj8)(M#j*SFB-Np+9k#kVqpU`\$%o%E3X+giChP!n@f:eP_3A%`'RcVe3UO>Sgj<=GgrDFf_(Dj4-,PftDtHtNF%QRQPZ0%Z_tQZQa/`8QDbfV8NZSQ'5e]%[9t.V4iRoKJGeR6A\\Jncp"5SlX$lGll6&j?5$H%V7iE]UVj\)GlG]N:4n(a';~> +endstream +endobj +456 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 455 0 R +/Annots 457 0 R +>> +endobj +457 0 obj +[ +458 0 R +459 0 R +460 0 R +461 0 R +462 0 R +] +endobj +458 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 110.6 565.008 155.6 555.008 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 108 0 R +/H /I +>> +endobj +459 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 428.05 498.508 478.05 488.508 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 213 0 R +/H /I +>> +endobj +460 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 294.17 303.508 339.17 293.508 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 178 0 R +/H /I +>> +endobj +461 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 139.49 254.508 191.99 244.508 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 51 0 R +/H /I +>> +endobj +462 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 139.49 216.508 191.99 206.508 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 53 0 R +/H /I +>> +endobj +463 0 obj +<< /Length 1817 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0DD/\-!&H9tYn8Vf=WNfH`H\8AU.IIjB0g*k#g(N[N,([Q:G=V3YGk8718GQRphJm[D#bjh_bRV&9k?+/1[8p3udOraCBQtXn=_XNb?[VXTma!RQ"k@07#B)i"=j&S?,V*PhAe`S-AR'LCNq6B1h']PjZsjuPdj.`/'u5m1k?4\NP37(pSgUHFEK:LdMHt2!VqPaEI!\Pm>S!?pPicCRqc7cg&I`j3h:6eqQ-,_`Lg,hME8A<7,0rjplb<(tFr$@?@.Xd5`%0X(,u268`u`)$!X%"0iAflUjWgg,VZfDuDKS6o&8(XK-O?&D.[JYgWjLa*p<>-\tTht@_U(aTNMe/\,ORI@ZRKtn=TeS/iW8X`/u\N=cuSYFe$I0b_HEe4Frp?nPfBt:tR3:6*\k$[$/:4VlTJ@+;P;4"_)KW<,J/G;u6Ps#UJp*[460@D6aJ$$RE4RfEWVR+IPKt[u9;j9dZe8eK!J-`YcriR;u7h2`mb\=7hlT76Wm"Var?d=t*6`6Y+W1Y66)tC\r-'u0TYhGb`jV)*Q6)M$f\h!4i97/VseS9L>M3p3h7MfS`BO1pmC9-o58*/(uD:j2i8]0qN1_Wr"oTOqlSku#ips5>-7"IXN],=adu_H_9aV1L[6bZ32TnE/K;s9B%4_SbC,q+aRcfXgFll[^FDSipF\oJmn'aXjqX8^QD"p9QQOgpVWafW,L:_9f;J:uqDF/Wl7/t("1&Y9&>j%[5%k_F^L8kouU;:+cRL1/RLoXfRii6B3lq88!kJ@h.r8c!L\I[W*Uah0#U.">*2^elNgi7_2^^0$u``5f&4gaT0SaM:Anlh=*Ye-P)ga-7d4`k2?EgQWj4_.P@P0li]g-1Y!0JQJD`u\E_\@VZs8@j/ah#0^noZZlX(-8;BJ_m**/84g:PME8@n*X6Ws5U[be&?l)@AkPT@EK3GA%cZa#Ud)!T')kWp.Q53.X3jJKDZd`$CYG/%4oX*c4l*;8>sXLrW<<&dAMA[-PaN@Wm#U,3p>/Ku<8*?kLVq)Y)oeY(f'`PiY,dJaA(Td3)~> +endstream +endobj +464 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 463 0 R +/Annots 465 0 R +>> +endobj +465 0 obj +[ +466 0 R +] +endobj +466 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.94 714.0 157.55 704.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +467 0 obj +<< /Length 2337 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0E>Ar7S'RnB3csq^Z[&=oi@k6I_cB^&k3_HWNf`NJJ[Ph9/.4K+brqIL>/>pIuh[V"2FI#ft)Ol^8HBhq5@N_X>8*U*62Fnc$LAXC\nGt3WiX!GNcV;g.(Zn36L*(3sO?;mk!+.mluem[9>QLn8]$4UdB;$a9;A73[>BV4/*Y0SF*Vpe<6Il]gFrm^l'A7ES(aL!JWT>mdmJ4;(r:d/(0N5"cI^d]K)"4C?/DTg^DbEHcR,pC>aCW`tTRaEZ^huE!=[ptBdYr4(2e?q5iY.'%Qh[?;=D3lht$FUF1KZF3/oR#*!tSC\]LTtPduk$$+Ra-c.u](N,<#I_f2[$"Q@5\FsSP)kh5T:ZK-t(T(;O.k]>&E2cr$*Ed^-`]p\cB!Ho.SP&Rjh&M`SRr&&9a+3K'l?Eol;R^'5jU@%-]q0Y(^\\J$o:4\>>BIqHIWApY]*6,%&Xq76H'p>MSCg24d7i3lm^7e\s_ucQa$^*qU430gtGKJXc,Yrop5S+QuS`DmE(!S.6Z&C7;3PY7Vk7$^E$LDH=&4rk*[&20N_a^?1iO,-+:?.9c7ZHR6<L*n)2?R,d/ECaS,:Ab+j*1X5QM3.N/QO"L%qkC;p$[`B2tZ`K].ZBCn(?#HIsE:X4g"t(GR`]7`k4_0R.f'm%T]!oZ4a`L!eqMo+V/amHj@F/X:G9^;&qE$,sIeG'-m=b->/TEL,]K(-QnEh&M:[#`8%RA@^dCVFR\")Wa+G),(R?L>DZ(s8GcmX)58U[e:>T75,c.Gne8Hi@N*7dAKNo>o"_n-FEsk5X_aW5Ce0oY7fLi::1([3\H4h^rI&\Ck-\p!,`1skfFVg2CntJe$P7>f-'#=W;lTmZ1rJQqir]A#I%PE?bTU/6r"#c7Od5Qc1UnOr+]7X)g:tPYMC>f<#t$K,u1UQP?*%=cT;QYWg:%R)jB_4c`PYP@4(8]%hBYAE/*)pP:@;DgHgm]=dJf?4k42)pbsTA)Vjr]ilF)!Q5k!]+=-boe.@u")]20M:>%a"M(*J!+)c0J3Y-%K0"B#`O*;V<*<;CD*9@%:hR"sR"gX*AZJTP$55;;&*L?W0es%602%P/)p%YXRFa);S)KdV2U%c`2kAQ3qu94k_mLU%L:uF_\M#C$!1/cgrshNJ98jkrH28%4\G&.%'Fb&oWjn\_gF*Kg9mRWr"?7#@Mp>7r#B?P=gtCIc4&2$XHH$(-g4<:1`--PRi*?r/V-=^gbA\!sm3=1b0)EQrrsi$Q5tK"f)'=*Q":;`,e"H:>@6pK=cTQM8!KIcJDP_Qu6!dE%WB75J]jOi`l/Ji0qY#1-LHUMm4^eW7^stkdl!*b]WWXaq23@U(P\./h+iI(;t?/("M(`(ms7ld*j5D_=-r<)7;O3Zo+>=)]C[R`ecG8Mcd=S`dMato"![f*OrefuOIK#e_RO%(p71)tG%WrR^;!]\A19o.,M8!Vt,5+Ns`a\g8AY,LF)F2(9a4dcZi(bmcqP*0\_g*`D=[mUJ2eQm;)!7O>,pd";#>r33a4)!]MIg2?kb@Ecm3XH=651e#lr3(QIJi)1BD4eqe'g.u2f-lO".f)">!96Gr0'XrqmK.)kOdrDj>[DF`7`2X.rm-#g[5PE*-I95'd62*=nd<`p`ahC_=[+$UF)TH`[,@*je72\1,#.5e:j6G(L91U*KuP,%]6!1^hcD?dH=tq&Lk/230#XFK1tEh^n#!rm?B1[jX2#rq#a1G*>A-if??l=Dgu$hE^Qrkpp?cifl6S8FA'RsCq7Siq=/+PdJ=(]7c#c~> +endstream +endobj +468 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 467 0 R +/Annots 469 0 R +>> +endobj +469 0 obj +[ +470 0 R +471 0 R +] +endobj +470 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 421.37 157.714 471.37 147.714 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 215 0 R +/H /I +>> +endobj +471 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 397.5 146.714 442.5 136.714 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 211 0 R +/H /I +>> +endobj +472 0 obj +<< /Length 2448 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm<>B?:T&q9SY;#/59Z4MYuYELPFUr9mMUEa8Mm9/l[6A*3Z"RH,soC#J-JEan&UMRoK8g-$>n,E/&?$]#)\M5;.U5lnU80)Q-a@M#7A424X0.k^O9P`_V7Xq"o3G#+`Z"?t5:SO@DqZVJ0WLorH)s/LO?1SlOQLYPf(LOX3>89$JfP$VIuV+uH5SFX]?BTj7%k8MG1EVKR6j@,q-TFg]PI#Q_Zi]g/;IT4XZZ:**9je8J\MT&S+K5.;<+I+-niun,(bJ2[0SCS6X>T?^Dfd>-2hDha9VcdHKQbhNqG-Qb'3g%o4Qs35tIr-([lnYtblh'RioR>Wqt(M/fU];gH3R5]#bQ.#r9Jkjt:85Us^t?:T:&5#W4C)ufD:q#shQ'^YS!0uX%[ZAjI<:bl"6)F\6%co?]7+S!phK$5\f#e5=qCC)[>"si,AM7[N_7gW4Jg+5eTR.b:oF@$#rnZ_oCUJ2V-.o$kgb&KkI30gOl]/I4hdjaS6$QN,Ccs;BX.ain;HN;f-*!a&3[)q3tH:a8.RtK,I?nfR]RAXj9Xk,D/0VEhW2!hUXPI]3uXO\Dip;Sp(dWi*+Pd:P&P;M,e2Lu]K(W[WdL%!dE*,[:OM]X]DN6^'S]c*&S\"[]/L1=>.!K`mm78fjj*(RW>aIc45%!8FCHU0XreZ&bbqH'2)=5n3-rHOtM<4rZSmlW'IAH8:]4JP1V7KM4C!5`Li7L@);IE\(ni)uhYr[s,.YjX::B=Jd,MJ0=JqAnDZrup7GGW`cMFD'<]gjig%?H)ub)l2O@/`S]@6A[]S`^'B(0Y4"r#Q^MT#M/cZ<>Qn)9"oIj>=1rKjO'D''G+?WU>'6&1gLWtEhMI'3+#&n'!!nt"0%ddhQ!Ef+;)t0W3qrE^'E"]gm8%pQ%pZclCn)hE*DQnf;DP9Z^cbX-:;VtCJ.>dj%/)Hbq@4qqQ:m,JUPmtekfcKibFgcq_p(tOPSIQN.#FtNMg@iI@9kH4aBWPhifkOQ;/Mrinhu';BE@^9ddel@CGPTWceJ.6446>O29gY.%o,,e`SlEZHgVB;0c41Bo>"%#ur]Zig?JQgPe)tWOCgMU=_o#6)R2Ugu`1G#6!Ta=$tLL,m>(`SaKk^"l_*a.OMn3Aq>$,KHDfli#kgNl#?)TIRN\TVp"8dNVq!^qWCD'U_$oVS*oOiO_rVUJ[h]i+K,aA`e;tEUa&?!X/#\7?$_Jea@T,o!NM>ls.fti2'))c\l54E`+bJ0NuGS1H4E#@44#%63A?j_E_r@m[PB.'d^jd[\_dl@'(P^g4`<%ueK0iP!H+@;d4"o$'Z/sPckoAZ_4\@Q9#NSk0q:`2RV'MSaib,[=fc<^EKqm$b`'5R)+B.+QGrODVoe"B(]T(lgA3@u`JKQb]A/)n>keNgZhC#PqaLi&;Qp5_V,+W:JY4k)i3pHEQPDif+QX2@KtmZ]e#Lrr28`:M2Qm)tSXeYQg0SY@O&pN>X6nU3ad[fFIZK>!g/P>6'IiaOC'Z:[NJS*,BQ3bi3ems-,ZPq>#P%G5n,R[9$:jBtn[6'sR)EQ2m]1Q5'9I>@$r`2`6d"r+JI-8@*YIWOg29Hh6deT9\HQGTgPA;ti$a8Flag&oST'cUn-o&mm1pM8SF*Rt[ME<,r%R_>[r~> +endstream +endobj +473 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 472 0 R +/Annots 474 0 R +>> +endobj +474 0 obj +[ +475 0 R +] +endobj +475 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.94 397.109 157.55 387.109 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 237 0 R +/H /I +>> +endobj +476 0 obj +<< /Length 361 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GasbUb>,r/&4Q?mMHM8=\@*?kf]@sC!7B:q6<+h>RhgiI7Hjc0M$X:d$Po&K=(gZ%gR0:_,Hld<*nM\mRPN7F;@/1:=J#so[=G]:249T.`u3mO:kf^*].p3[=2n-H!]"?c^bI5NM,XC@#4!?.bBm,ii!a2+$TnY>J:eSBA>Z?ai1=?pQ++`OU8lBl]:V=+YQB%A'38/_WVct`kr%mCh8>FKIQ;g7lJSBGQ)qHoX$"CgPT:Seg2];qSJZpWUYHrKFO;O0X.\8CG4R[M#fcKb>HeZ`Bs'W>$GSbGc\A%R1t;Li]BPIb74gq!PCM9^G5F0/Y4\9^O?dJJNC@T-kP*4d8/=Q@ +endstream +endobj +477 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 476 0 R +>> +endobj +478 0 obj +<< /Length 2988 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0F9p=B7#eX!7@&h*n7^Qr\D(tF7.]V'Q%U_'D`\-bE2B@F*aZU4ICn'C@.-Yt084M>N0*1LY?2:cM+N4e450jfWdRc'N3GuY(VJ7aR"[KB1>Xj^g8!2S%P-LBc<;!B?U%08P5g<*:#7jN5k1pSMH:[>6BK,1"KEt[a%UYFmLH;WFhoi)q]K;aA&&0;&+'EGH/j(c!*+"8EIo5r'&`dcp,aseUCfjjjh0aP^PZQ?,e@>gApsOk0fA,*VURr`2Qb^KmOB(i3[TXXKe%8u-mp3j)Qns1-C*g?XVpICS.YW-.^.g=l8r6@6US%iX3-dJhX[\\T/g)OHL,ZrNEh'#-+C2sQEZC/%prcU$*L*YD?Tf?h$iaZi3>;&VFZ<)26+B*3rYs`-@p,Kbb:0Ls"+YOGA`\aZIfB1T"1PnrphF@T*e;8lptYdsEP/8r-?]HcH"B\@9GjR6ZsLsgC-T<_'@"F&[A"%WZ,n*tP$i`EC$^AEFV5tN_h;AA#J\P#F8aIn@u@PMq:]e3.c,4KO,^u[?Esq#lP.pf(%69b43$Ff:EAkA6lQc;O*32>-q+-qm(4^UZ/C!+D4H(X"-AC[)L"/!]H?Q:5;Q%POs^"H$a']L&m@7n]fr'W*qHe$P>]3&Vj=5>pT5qi-HLb?3"Ec*>TZLF8/7XCt.]/GO5%^S=rV@k2=ZhJV1mX#S?0=/^G97Z+FZVG>5S1^OJR#ps'"'Zi[Gb[[fJRqIN$Mf`K]Vcp]9'F=QrGYT0bWVL-^2r'i+PQg+/o24ujX_b43;^8Q_i]C$%]Re*/(\VTfed0m%h]jYV=QFS2D!+(2VYT+;-Xbo5Mc[WQ3n@4e^8-[@Z8Zs;8E'Qs45ElO39G*Is,(J62)Hbs)Pko]/`YV2eBPMD"EfE_0JB]J3,X`B!&;XD%TZ)G(rnSq9]<--X5tJDfDl")BGYoZ0)!4c(c+;(E?JoZ9+J_O0#=^cqdj(!D;(Fq%6Lpth0iPQ:fC0fPm!F_+0#Ys/#i*f)]clWONF=fG_.7ShPC!E_C%s74Lj]6@;q:jdK;7?FJlT:O^jN=:?c..i(+KM`=qEq^3c]Zk(e`D&F*%QbB*uLBftBgC+4E0'rA&k*Zd/5EmiBfa%#r)Q"o(7042##9isQn[jluXYVDb03W`f`r/K#<=2I&7Rn"]JkIpsQa6Jf#-U:uBAJeR2Bb`kgdO+0<*Tdl`68mJXl,e.HUtpmmc7Jmae)_hp?1pR5&1mb,?O=VcYF),.ZDT0akB=WqB1p0B33IS*$?@"HQYp(\6b+:,3>C+!mfWEBaN.\4YYF/R;Q,1Ef:4,nHtlAF12H`e!FFKRP:OtM3a[+YY"qMWFTlP>@Ye`++_p::l.R?4'eqbaB)7@$V'MfK<%s'/F9.@;_-60aQC5r`6J,r`rn(Ed0,MH>Xag$@BCZf_eL(#4r]"-Q@Ird!119ON~> +endstream +endobj +479 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 478 0 R +/Annots 480 0 R +>> +endobj +480 0 obj +[ +481 0 R +] +endobj +481 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 140.88 498.922 193.38 488.922 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 75 0 R +/H /I +>> +endobj +482 0 obj +<< /Length 2073 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHLgN)%,&:N/3B`(b@`e"KQWQ*%>[M--6VQS,)Th-;5$5-M5U4AIKs*^4J74^jRQJJA-N!CVP(Q3pZ*8jONR_Epae0)aj>`=X3E^[qPr6]Ll_E6*5#kc2G2Z@fC_$0k=LLi4Hr2HU3%jX[6WM4t*0%"daN9bF3.cR\g]Pi\?Ds5`\AjSdcRa'$>YT$NglHsLf500`g7?iGKhb%JOVTL>XnL!\O*=$0(j8VEClAB73Ung2>4c-\n(;\%#JjQSfsL21f!S.:m3ED'X.MCk[]8e`d.Wd?o&f@Wf(X[UOu>PugbdFXLH!h7%0bAQrijEpRt2QZVTH_?-oXN3]8_W#1Y=W>bcjaHHen(`-cl4LmtAkIh@F%;bF!3QY`-n:7FL;=blcQ%AJulGse;MdqW)FZ%I4\q5T=7\pc]h-EaaR3%a\.&nDX3Y;js?X&YTVX@e@tqCP?i7LmC2Pe9%@=BCE;J"X2FD;oi@rV&E].\;'@T2+&G@/jC]?G;0)V91A+,rg!o5`'J'?h6B0k"3:O/oAA9I\iUOLR`&JH?n5jpT9'NR[:@ej+BC2G1UFd1(Ii]eH38n56WE&5"g..R&u``=ZM*F1\_%#bh;C"Y".!GCI>6llkZjmB&c:TJI2?.M-c=H-6%4:?-Y3SI..^TlM64APH4\WbrXMt.Vn`&QHh^dIgGp`lt-n>QWUUN;qKUB[\U?4b)-L]=P,Ib#RiLGRc!#99ss6ig4;o`(,ZAV:*\qJ1P[q*=ct$*]/YXV1iM\El@7Fcn>K53.+TTZ%`I]L],oR$0gEPB%6GXRRJir;heBMjrr)J4fr@P;b(T/aiV!NGu[aIrnt_;'ecR_D5W4ilSOfX$Coo[d9EjT(o0?&Q5/5((e#/E0m)-aDTf=)'RulY'$b&s]kuk.BK3D3;V\aA>nh+10L5XD,d_Up-Q[c:UFa!Bt7iHF3n`XO)OZDG9g.OplrYf`]2-<()j:eNcF7g`3R4>_K<7_t7G$N-ZP,gD9CEi?GJtke-,%R]cF`ktp-u($Lq&DgZ'4*`=%oSXA>D:9Xd#=:lf/C*<>H&6VqHe:uH0@-Y<9-Y6RK8Hn)dIjR1!U+ETu0L4RQZ;bP9&\d5@D)u50?gE)'jCChYdln)UPLBn&#D-l5E]QGbr8L8.pWiIk:2!ITdpe))'Gh+Y`1:*p*5VNk`a]fTG[hhS+sdMd`'AL5F+V>Jo&?fO5A:+u04MA?h'G$`+HD7Y`O)G`7<-@JQCeR2bg$FD=ZQOo`brgI9Dr5Jk':76jql)$/nUdiGi!55]NEE3q[AHCDYdH#WWs,8!_\~> +endstream +endobj +483 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 482 0 R +>> +endobj +484 0 obj +<< /Length 3181 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm>968iI'#+6EW,tU9'f.,SQX#`FEh%A4>Fp[!UWa]e+!;/[YTX;^84rFOqJAihfF7nf]sZs[8:p'FfA0dukkDEi[l5#__MJm`BUPE(GFHHrULa:J#L=S,6A/$d6g#MKgrG(u;@Kj>@]TS7XTKAR)7=W8[]W=/5-m3Nb"!T[/D3_&V=O%[4KR(1,oa2^S`QBJsLUm^ZA[>XpNk&22T(BgN1Wq:_7_Ou\#3.ms`"jLGJ"3cTFaoFY%=tIiJ(CTfH7KB\kmd5'X.n=B[Rs/>4rlul"*qGpMYJgZiWkq$a]M'3/o2sPUG_7md;JZQ[dc&9\j3t^Q'8@,1h\ddQ8b45%uD?eaFTSG*4V5RGIN?kc1\_oJ+p?`0@Z:E1JphJa<)Z2%bR2PNT-[7-oeWQ3W55e&iq*%-1dXZ_oo@&(^[9$L9H[XEbGU#]I=/(AuF]2kSm*ir%1Q:2))i,q`RUnTfC&GY1G>>el*2Q6D2pKYRkmB!gt=&s4qXR:RMrG+BmIV<58N=m$`SpZ$3H1U^aO2X1?mtHL,(M.umm(YEt#\3-BSdpl@:/\YsS6IT!lk.7j`,JB68q)t=g.D*g[DnC5lS(ThU,f]u+h@'@NUjpM;Mg3Se:(8VVAG`"krU-uk`NQ:]/Akaib]+KZk"S"Yrj+9;ls`=,%\hf.^\i>>3t=TG'%Rd/OD]?>p,pR4n,7+WWpE9X1+Y%3\"5)tC8(3!T>=,"<=M>uEln1CTY`uRJ7AFqj;YhGjoKT#k40]SBqOc^Df`0`_1*p.2G=kq4FZuK<3kjM=q.jJ5:4p>9PKVF#pn!^*C^CVl78=6O<)edaq(Tr@q0"1]'s\5"R'fL)"Y=*lXY9cjgAm/-=L`sYh\+2\Q\&quUIL/bK%/C*[kB4PBZ`&^;Eq=HKU&c@M8Y22[QJ,s+];.t%m![3%?69J2QD,GJ57rbnI[(s#)+CS'XVn?$q!r6FCjSS$..DcM\f(J[^/fQ)*e3o%eBBi=_,(r.A!7R.SH;$G"AULL_7St&L0o1\dorHUnFIaB`r'N5b+dH:585BoR/>1"iIdU2BR*'T.@IkL"]rT@mDa=H3B3r3o1[AWq:R,Xc*F(&@fD1$Gf=AN&;s-J'MYM`0Ns+PA,'9TUc%Oj'dM44Wn>4S1VHnRDO`F`>W!N5Yp'krt&JhD?.JEp&J&IX'p'b-(%<+f8:"M1u`bGDHL%/0!Jd3CNZ^K3q5+Zd-+jqD.po`]p)a-PN5X$q1C7G5Ms^LIK&UE,>):jUXXEYf&d)C+E`1KUm;cRM.k*=pie"l:8MCf`gn\[9&Q4,)FAkLg/L.T)rPet*^5;t"cechGs]d[Q-W9ior-CZRYOT#l0j9]aXjb4,[8K?oh+Jt:6MSjNle\TZbB80F8#efA-e^:g$`;',AHU[k0Kq+O8F3:q*S"nDH2\65Ba7=Km!"ZuTEVk9bMU?g(i2f!5pr<0*i%3h*JZ*]X:;C?VUu)6uX?e!'o;TSaodX(:(oOfg'=!u_1i1.Br:'Q%WC,noSqg::N^RZA38\-hP&*LNgkkrPO(9r$*,/Or;gr5a(KT.7.WhN]DCMu?^@J*K&`5$@dMbK[F:psB0F>!40R!Xk3RDKPd7lHUMnP*febU$!Sej/ie/sP,(g.)5W:UT`6eqV(oN>H`9A@cbUq=$o:9Le9%KF('R/CCsjjaP1XOka"\Z.*nOr5\tHSMMCArTa&>\i.,WQ91f+2:,]E(EesCX7p#>OhLMM4"G`".=2hX(qF@dCoJaQ&M>+*YW(FatdgJ/TPru$Rhb='^X#`]?ahraNZ3/VWA1(70ZPi_#MiV[JN&[[W9\);7U?2,P$!3QI>5^B-f]reS,hZ;P_@b8sZZ,Xqm=A%sl#UEt[mGW*[\.;s7WLm0XY2BF=BGCag:CgCs*Vi8MphLcVsR5BQ)Pl<]^@AVrB^]1Y8Z']1p)mBShQa4]/'J3ch[^RQTiMZM1Q(e18C9]51;+u2_ZMN?n4^Rr33m9aO0e$'\a\6YNe.jMRm!P*MrZs/_f]05hP+lMfQDs:$p@AQQngRG0f&FFg0[S^\uT76c:[%n`0a4kJ)!@iFTp)J;3hra#e[Y4Zugsk"GJtDo<W;^ZMp,!HiQ^3^lRQdt2QGN1U$`qj#5)mkBRj:DOoAeiXu\!Eij=-R+'E]mOh7IA57J3A/R:Y2I+6/S-tp5c(I_K9_`Fh\,S<-]p;SR&Cd@RYDG%kcfICmhTRfVWEE3o1IC[q8oi@!^b=IR$pH1_26B^H?aii(OV"bj8JDQl4!F)'*29+4M6"I])nNm8&Dh;-A#p=OXjR]MHcjoRe?WSpGA;`BaPG+Y#`?J9,qt=6d$(lc,A\`-WDH_S]I%%r +endstream +endobj +485 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 484 0 R +/Annots 486 0 R +>> +endobj +486 0 obj +[ +487 0 R +489 0 R +491 0 R +493 0 R +] +endobj +487 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 262.52 349.056 286.96 339.056 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 488 0 R +/H /I +>> +endobj +489 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 350.85 349.056 376.96 339.056 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 490 0 R +/H /I +>> +endobj +491 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 92.0 338.056 165.59 328.056 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 492 0 R +/H /I +>> +endobj +493 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 274.18 317.056 337.22 307.056 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 270 0 R +/H /I +>> +endobj +494 0 obj +<< /Length 2462 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0EgN)%,&:O:SE:hRh`hj(!WAL/cm%d4Be7gJCdn0*1;36Kd+rQ")-"#OU7>_HcOH`B[4bRQ(I;mR"L\_LUSd6Vk:\Z$t@'=fs4aV$s6pL,I2*]Xh_<#0j>Uc+8pRAbmU,_4K$:m?=Z&Hb(gYHBG%Eh)^i@"$[Hj/:/Wg[GWNApqeJ7gjg"@'R/OH.8h:boq,(N\*g/"p)XS\s]a*nC,AGJ;Tj:mc#D),$gP$"fnq93&FNmQHjsGu85ZhJU7NqKZL_L(RajiEs(koS'b#ZRj5-c)?ma>;>':m598+XLMh1rsVel=g8b@)qt=NWMfhl"Y]['&s="#RY1uuO(^nVI9tpp8:&/qT&--2AKa9>o>[?UF-ljoabGV8rllH:6!XFpeoiQ/p;e#<3bXZU&1fEiB)cVSWl4Em\dm7J^KD_n$W[>X7_8=I/h-n#h0/:4'o['(DSS+q7K0`IE%T,f$_Ga06Zhon#.8?TDi)5r_--oI(o@tJT;2DQcUccUX1X)J\MD&)6LQ2NI0R@B6BhE=)cTQ:]7>QO>/o5N`]qpNVHBPoZ_"0EGE/7*Pi(tJ"?d3Q@bO_e`okmY_"8c*Z/ETUN(,BkJQ"q\>,I0l$)b+gWD"Vs6h[F&7q>$=cmG>QaEWIC@=gOj4Y02C,.-TKW`h11KFgMg.VV`Em_7&[j9#tW-q?2"?IphCL5FMQO'u(jAO19?t>SUT>Q&Dc2WJCKq0d#WebYlq='30bWNm\QBe!>hd4XukKcul0SHh@K;Pgn6(GaXnGtHX]+S<&+<+.AabkueNtFHCTU%*3l;892Y+81DjUeK^mW%^F>3.iZ3hT"h6Mtp07hNt*c,_]U'OZ;s$8q#TOFR^[@aM$UjEB5mHIY4%nlCtm>'"6NbJ[&F`m(k*J]#AeLE5RB4Mkh%:W.dFGQKaLr_Aa#5ppH^Ia6YtF"]1ZpL%Koa\\,p,$7%rBbKk_74A_?rSN=IH$i7(`&/Ok*!@N0?GgKfK_?*W40`R!;Ti1'RPgMopAnIOuEY?kOA^V8@J"a3Y'3.ZDX2H!T/#!pXL"\W?!T/d7%>0M7p:gCrBhn;@6`@JB7L0t20D7__E$QVuS:b8:tOa@U@JSNsA-l//k_dN+k'=i(V@oQ6Kr+X'_?T^NZ0CYr?0i2rNa!El&^d<)pKTNg@/&Z-kHODdS&0U[WNH-r818b&Z7=%FU?4c59h[CHD7POC3D0l=!EZ3L_-/VULd2$/-p-`!$3$3e%odY!UH?/mCDp4'FH78ESTpm9d^QSa?GSmL#=4@X73^@b[L)2YX^KM8EG3063oJk;Q&/C?m!%F\7&H'_4P/,PLBgj"N\>%O[q]Zl^`S>0;#>fL0(-`6Ms11I7r\p;WOK0G^a#HIa%tdcAI%S!,Hd#;+4V,*c)I_D8ZMU$Njajl+!YcW.NgD9@+.'UtK],u8`*J].KI:5s7R,E$])MqQFT.^Q2"8upM,&#h`PBTCciT/IaV^iskY[K]H7n2Nb!2hMbBf8A4dHA!?#6GZ.3Yb#np9#;_*DfUK/^6'an$T!BiEX;1;^NoE?rbia_'S5NTQtnk5_Jhg(=bc)IM&8,A+MlgH):ea8Ts^L/aM:qEj%kX=2AGp?JlV9s8p:B/qq,S2FMmnFg!P<)fCn)~> +endstream +endobj +495 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 494 0 R +/Annots 496 0 R +>> +endobj +496 0 obj +[ +497 0 R +498 0 R +499 0 R +] +endobj +497 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 356.7 437.957 395.58 427.957 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 250 0 R +/H /I +>> +endobj +498 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 134.77 359.457 187.27 349.457 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 49 0 R +/H /I +>> +endobj +499 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 413.07 343.457 458.63 333.457 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 500 0 R +/H /I +>> +endobj +501 0 obj +<< /Length 3041 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!;f?#SIW(4GYT0`&'aOEbT^T9q!%dUKORR\ENR(ej(CQ=ubI6u#<8:?L.].4<]W'^;D!k$_,oW+:bG4nn9tHhH.<]3da]3rNBof=>%ulZH7sqOO5Ve*kKbp>2T(l1QKqS%S@ULU0Zn=dl,2a^F2$s1gI00'lA#oB``mUU_h<1h)T`@nWYfMjt)Vg:otWn?jRo>UJrc0^E,nZKW8qr_c9S*HY*"O_>X*'8T=Kno*!,\$i0GN!`*f=,2:6moQX]SIQr!Vnj.'tJ2?mYi\\[tmH^>\oJpmgEb+E.=u!`!4^#E)_@SPjkpC9c.I6Lq>r-/Sn-R1/h?">o3`c']0n4^*#H<";u`jsU)Cg-)^-msIE+9N=.4'O*gC5dIP)Xc#[\=L/IWB2`-HVk#pN_8iJ3'KaW/+4i!'R)Z1#r/SM_^9OU1pg05^@BG/Tjm33V*+qLYTSjos\4.rA;Ak++#t_Q2^bQhp@EEf^k?ttKnd0#&AjO$j!fQr8RhF&iP#)/$6)hFA?/HW^$$;94a>2L]lZTQAiAUJi&5_]n4/Sqrm,6l9?2+rkj$:c4^)C.$jWj?D@pD'^.J0kuue>2k7&Xh!;m;UCL,HUqdm!Bg37RUKm,CpX8e_O8s`:6]F0o0h:Am5(2*p\W0O[QF3EN00Ws.8>o(TX>Led25Z/gGK4\.RW9GXaOMKE`-M6oF;a(@bU<5V_kQ=/O=20U(S-B\&KP@I0Hn!$:s5]fK_!u4(11^"==Qt@Xa6d%EA>tAr+ZUb?pN/SQgIT#rh1kP[$:*TNe[jlcE[!'fU<'bOa)E-[GKrFOIV.428'_T76L;T#sp1b`a;:kpT/E%Nkh<*,%Q(-F/'k)c]T&&unEa7]g+:->.6PGkenhF2\-Cc?T`Jp%Wrk;Ie)nFN;kp%ZG+GCmQ"3G%u$*8('Vbfismhk8D_YNi1-jL'@[-343jDp9`Lc7I+"f0Tft>Z0Zl;qbLjr4.AEsX@gSpbI')[)l'*hGi11Q<=>aZT<24Rf.5o2@CmMp$R0[$(]W3ta:'=T/dmMJ6_DO!F,E-O,QXPU5\d%9rbpFS'1'5JR!ej`:@@s.R\m!1=675[%BT^hu9pUc,Q(CctG%:m*6o;%*&CHV(b>Zm`S/9j@cFjfXrSo7LDgebnFtX_)Au,:gEW#1:b!Aj]ci\TQ7i?0T6XAK,Bs'j4P4&tq)3@eO5lqj*8>21^3mUXqfmSep#@bZR.0+s1i_6=28[K<(!PVp-;-;7`'S$,3a)i8OYiXf9)/?cJr$ZK=^T/LSB;CgN,eqelZ+f6^E$"g=NJUJ#X*Q0Q-uCgr`$bR_M(T:,4hXmiP9>(5o&Y[@;Dc%1fuf/,f6D4?nuI.3Aaedd#;sSBjl*>WK[f_M]1-/1kC<:[-g6+rI',Ts*BBL[)RH'&tm]UO-I)^a$V9="XIo\[c3G#9"Sh,og[Rk3)=P6s%=4V_IU'%48kaRdW/=>1Ta-du`n..gpTNnVshT&LjUSI/jV17FjF;pG>H$1`MuKAGY)*)2qdU%E+gAH'AL?g9WKH9EfoCF=YT(qO8/6Yj)!k3qAYQMMt>[cAl*,Z+,[[M$p4>BX*^(GT:?3O9\ikD*[4X]an@aQrI4J7UQ,a5>?+OV%eSP]=[=I=a:,,do/&_PMcZg^1K<`"VIn3f$mb<^^0ZO0SD=k6I5tp+`iO1$\FU,(KQ5f"SgXRV884',+N\d,q*,d`9-NCNm:DMN:;_r-jkS>:M0o)>RH(jBV1p9N_0TZS4uP5G(YK?:VbS_9q?r'EmPUX;r:rm+qI-i&#YmXGDlP[O~> +endstream +endobj +502 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 501 0 R +>> +endobj +503 0 obj +<< /Length 1288 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm;>Ar7S'RnB3d'+;k=?'W00no^8liLDO+D?G96eVcKU(a6+V!4%"s*gapS!6@\:0mW`Uj9-@^2nPu#VUXTk;e>"k_/70kWE/o#Ke-/4=p4h(]Zs/-epZlP5niKXcgC@@=>tli))#l+[hQ:;eFKHeE^hb9>7C&h_s^UX-DKrJ$u@FJQ@'JPXSod$N2UHqa*]m3Y@X;Z@3F4;2QiAb/i57?OC;.YOsj+T>O&dH('U]>naI=$&S@s/ukjD$?`if*\t4tg;T'>MMIFC>1JcRDVop)35!sC^%hgSba/=)4K;#9:j_k_E:Mre7>cgSn^c%l`iN-DMG"'BKUrYT$!KRcRs*S@6O@FAi)qP*.?RsKWdGoF'#$1*-\;:R#[\Znc4-uIs@>'q#7R97-Tb.J9srM"M-H.qo/F8`d-1f_Ds]$AKjZb<#OHhl1aFk!VBlno:QpEY^t'/OODjerm+(9s,-P[Wt!fmN1$)t9*nU2'@_Ys&6]5hPM+,)CF9FN.5F!UScB`qG5=mr5A.IGHPWJ67EjXTT+7N$2+r//BNRHYN($*,:@r3c<3[*,`;mi)mTl1)j63j,uPCLsA*ac=pe!-CZr6p[]jRSL1ON'.JpDoZ$1(*KK7J+RaSk9QJ1@B"UA +endstream +endobj +504 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 503 0 R +/Annots 505 0 R +>> +endobj +505 0 obj +[ +506 0 R +507 0 R +508 0 R +509 0 R +510 0 R +] +endobj +506 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 228.94 610.394 273.94 600.394 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 31 0 R +/H /I +>> +endobj +507 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 228.94 459.562 281.44 449.562 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 63 0 R +/H /I +>> +endobj +508 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 228.94 319.73 281.44 309.73 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 63 0 R +/H /I +>> +endobj +509 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 484.75 195.898 530.31 185.898 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 375 0 R +/H /I +>> +endobj +510 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 263.1 168.898 315.6 158.898 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 102 0 R +/H /I +>> +endobj +511 0 obj +<< /Length 2048 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0ED0+E#&H;*)U&%,kcX92>GEGQS'V!)_gL1M)g9L68Lr3IJFK0F<-.Z!gBg5L98(Z2OnK*-TBum[njE<^p7eUdn(7n3#RM)ffoYc(8okFD>9SOmJ=OBSYomqWULJ)8ejd\ZjC?.FrFuO/8tPMMq^h[k*j?LUJdk"Xu5p2/>[WgcZb>rJs17<+UQHiMWn(JU%k)8P\*TO:M;'r.MGAD+BDOoM%r)J$V(UTb\<2.37jEd*I!M8*9U0g;FY=t=`f0Aaa(kREJ'L-j\&11#1Ra1Crn@Ec=51;5dOh@da2LZ=KP/_sEX:oQ+NrT5IV]>$$&KPF=rYm:WdJ7uh6iQsN6Ld8Rc'8$V]XJbn[.REi"WABG$IDthH:0i]$#;u'=6H(.UfEl1(G0mbs/A7`5>$&B/j>c]pu2)<,lt17lMIg$#2*efoEXr!a5B]e8u*lW)R_WOQ)'i#Ta(;,oAa<`-4,YOJm.mkFA&ZA[#u8d(RuD82!\>b&rAp]LY]d_nB]-9L&m9,/k#!iIFNCQKD*S.*?=gZoL]9CmFBC^!\OZ(O"@)ZaSnq+d:&2`u/*o;nL10Kh<#gC'ad_"3tq0>f,ZK"b^;VM\rs4K]1[EV]9g,BX)X=W`lJ$jre*nZKO5lK/73>U=J=aLaK3tj"'m,VLd6rnrtI]G`gD:\\b^4?(pTc[c%SY2DhJ`F;Lb8mWqnp]W>TLCt7@rX.C6B#:OP@nmudk)0@Mb!P>j33jiNLDn&224",Djh@dl4e2`c^@(nJN$8E*]\!:X;!!V?.='.C+@l5+^ip!8"kJYP2TFUlC4Q^S3JB;g>MJ\K^prMn1iRRZ&FVK#"O*CmTR[:4Vq/Yis!_hQ00^Z!TMm2[_/s:]^e6\5'=Rbh8oR(YHnESJ7(`J9d%"#!A<:D8THS(lEZ2b/-LJG,70;ZcEK&o^>b8sXBM/G5mdKXkP2=HndjD>_`[pnJg.I>&*-W1>-aVs#$?ClGnEbTHbe8s7e^gcpNr5ckDIc&6%sj1c#[j'XPXn=5H3&"*ZPBNq5Is>g6YO0]@@q`f\tKhO2hfN=Z-cVlamfrAZ>b:FT#bNb5(VRZXNa$L#oc'L+O.8eqUS(7*!a',:d4POsGnD6@Pb]pJGK4;]+Qtk.HQ(4.u,gKDZS3dWY['D[?ss,;AGmn^=MT2-VID1jf8O?2(ufm+dFD>mK,6qt<QmLpshnfL.D7Gq!A=(~> +endstream +endobj +512 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 511 0 R +/Annots 513 0 R +>> +endobj +513 0 obj +[ +514 0 R +] +endobj +514 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 228.94 663.5 273.94 653.5 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 108 0 R +/H /I +>> +endobj +515 0 obj +<< /Length 1705 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0DD/\Gm%0#*jiT7d!6_dhnAD,XTLTX@V%a?TkA]9D$+&kaE]d:+"4+..ta%s!P92=Op4_uNC=K4nU,Ti.JJ!qCK>[Rrn^p[ju,MRN(JsOZ2T]JFoD\>,3*jK=IkV@%#_P-E=7P$kTPJ.9&]@dMj7,_nq&IC3n"".]%tq+dPT(UVI9_>1eU`4'sD4o#QZ.0<$Y'a:K\Md?e'n.Yd(.8enbq4-]6N?WE#51XU(BOEtJ[goTT0eG^do1*=Qah*QqQVCpK/a5F@Mc(qB!\o/Z8paZBBB]VX$cKM!4lJ7Qa`IJ/iP=Gt+!ULVrs^lseDKHFeWgglh_;8\n=o0J]tJcW^!i%eg/IZqMRYtstBR<9?n^imJLFnJ(?92J.Gr%Y`[$asM[()LROe/SVP!@S%O#<*sXN8pI=dl$F*^I4E<>4Yp-AESW_%nmcFH=OUV+(EUl#%6*/3YI@>]Z@P3AY^t"Wm0Tq`4[b=r,aC:*H50>Gbq7QXVEA6rt[]7@02O;(g@Rr!0]%D0FnoT5j.pn:G.3RW1:SY\U*HGg/(dL7;Ch2&eB[WtmfOh&n\h`'%fe\'l=H"aoZXslM%=PG-mReip1lie/go[BD:2tCo77^"+Fh;_cIokojK-OS#;VaTi90MeKjLcGWp.pse0`dcUi)0p<]Z@gUXE"P&WI;L]ri:S.'mM&K.?4_!$'c4K/tu(WWJi]!f7(hHO;#"K&cI5(SOGcrreGL^lgY)*1mbk,[+?5MfE$)KSeu/O9I9.`:33kV":dE;;c?^]Vq)3]H(=b=+s!dmN[/.1q2>YH&JG7`mX7P[jfMIC:OiRdkEA1f:5"Ho!5+/oYBC'V*5:4+QKdaWV:Q7L9Cl*IrFbk_a-k4!*q7SI*R5f&>7>0puu?=.gq?8ahj2b:(j)1gPt!6YuAG>%%$<'NEl\KpIa%7`2u6":jCO,$nUQ[o<-r3KO,i +endstream +endobj +516 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 515 0 R +/Annots 517 0 R +>> +endobj +517 0 obj +[ +518 0 R +] +endobj +518 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 410.3 125.489 455.86 115.489 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +519 0 obj +<< /Length 1565 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!#\D/\\t'`QrrOg-Q=](9Amc3p'fFX:,Te92kWVG60$E5=-Z+CVN((MQ*_:.VSu%a?TZ<)os&nTfE*3R9]Ur/dFsq_<%4"KmqNS[m&;)0B-Z#Ftk:]0Li*q4EO(#'<&$jGTkI8#3`rrT79(i]15I9Un2:SE)&3M`B)>g1otBV&_dZ5S-=f41B=J##[mCYug5C=f?G0EWJ)[pl\B%@Hfd)Ki^]$8==]@/87BdI.2D9+(TaQU%9^]Z)T(#;L,`$Q8u,_L,J>p-(C]+.H:c2Qr0PPdTpuD*R?MZ!UVn>),DfH]*b1_/G0S;:WHu!"A\Q9UKQ*obuls$7@HB?b>EZ]o-i"orOlZFfWtQ@4UY&"QI\X+90>6`ETDhMTM#9>[GZ79`RjWSHs7N^h'O[qRd,h+jt?Jiqjh%^;hLg_-QmqA;&%b5\h*Cc.7u]o7MN:/FDKhh?3GtZh!#M!A[sWI:Sqgi3%K[Pr2g\+,%#WhAJ@:jU%^oO0-gms/TC06Vk,!pWT_W+O$nNniA$qT\[(h6Kg2/>$>e5Kk$lN++:('\`'G9b-uV[1QTS3EbW*!;*B.`6#)!_eBc1ACZ"[5HPp.h'/rY1u.@qQVKp8^h<:_g?G_l\75OF-S8qLWe0fInkAam`fc!FNBT`nccYbkTSXJcR#[^aEY3sU+&gKW"J;Ul_/@pC]K[F<;!f.3QJP_%HK#7_o5I&,n[G;)6V+!0'Y!KsFj%Ze'?J`Xg)KMJ-Z=:V*s9$?:oqLm_Of!BHR4$G/_^>Ie-X[+8C/Q4Hq?;rU>"TL1*=YB()%d32gT=-Y=:6F&\,%nb$Nt$+@.EK13j#nWR='8`9-^:sG-I,a;>J.u%<8Z0uX6n4Jhp9OWc"2Z&hA`!Q4iN^-8/*nO)[fJn/NN$[)An'`[aieL2L,)8`m=,UWo8[@s#o8p9"I<#r;/rhGn*a62_5):WF&iaRG-:mui6[KbGpWBP'6s%_0B)D&.H3o'X20ZOd`\6)_4pEj3focV(%l^1EprjCX9sq`XMnj2@/mfb9^fMnocUnEpd.M#A6K.rIl*q&6uQ?Nt444T+@/9,_(08N;E%K~> +endstream +endobj +520 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 519 0 R +/Annots 521 0 R +>> +endobj +521 0 obj +[ +522 0 R +523 0 R +] +endobj +522 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 254.77 429.998 300.33 419.998 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +523 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 254.77 163.947 300.33 153.947 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +524 0 obj +<< /Length 2188 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!Sm>Ar7S'RnB3n@Y(jW*N8E)8cG5;2,Libu'@7D''UONetl@-cnrd?U%/Kc#[FDEOqmsMS,=68=o:?mp,N<3d?#:oS>4YHI;B#kWKoISg")(0/1@$cNo9.f8Je)%u8c[@Zd!nFOV9)N`#7)4O&eOQ/[AZ2!\nrjJ$2(,:gPoF8;;R?I16cl[m+!U>X^WHkbc87@pcc!pB.`*l>7:5Or>Ve*]LQMhN:GHI8o83$tWp\:ME2_m?YCil,rjH*os+qW?qb'3<*V?W9/6C@n+V\Fj,>7!h$[58h3XFb/@SS-.7iRgVJH710n&.E4QtWaL0a"(i0P?VM`CZ+lU+XPW;X`J`K?88h#*("ttq=6[r>#,+NE)B/f/Ami"mCs"O<`M@L=50F1Vp4AfMEWEKiTNDX,X-Q0YO0:38_6Bb#GhW[dfBZ=;Q)l_4I,icJ<1qLUH-2B[]msa?d^$Sh+dE.hJ[i$:Q7?@1[W_E^iQH4'RI#+I'd.`,DqgI84Q@03'o*u3@,!RO,%4#J.^GFs+KiDcDJ]9LPsBXfLeo8O-b.6pRjsnSgYeWpHVL!GnBY*am^3Ia\?TYJ*./2N?/iU[?\14EG2!e\7Z)#g^DHn?POBY.CK)dG1nBMsKU$T=`f\S`H/*4'8+3NhZ-ORiNlY/#d];/;QESb9&+jDmsACn>(,jeYp\#3P.P[fLn?Hk%E[t^2WYN->$C$:EVg8;GUeL@-^C*9;/!4>S#Y70$2AUCD_`QO"]Q7M/m=uKZD\tXp$=I.dQ^@JjPT1QY*VV@5EuW!l+\@ES=N0opP_Mn]%0635[H!!Ud"@Zt06k'1?H'W0s[#r2"oTcE^8`RY(Oq+rkLh@;po%!5Q]gHMW8KC)5f4QXa#>_T6-HNjp2b40!QT\GIG'._G:Ur$m8&dmXQa"/]rQFfk)eU&W^g@'C.AK&A)^R$)[$"2Kbm\a=.#G1g"(ip:MB`.%C2s2A;#R)ji\raj7WLi,f+%LroG_(GOc\=q$.u+ih=4eQ!PC5s;pU\8>!5].26W<.\YJk69:^qqViJd[8u>.h_urLJ!m_b$7HDc:9::C^BWsVL[*;/CfWl++lBWU[$0<_uRN/3O3hr-d.(9a^?tZDD*C.I90;AgTf*lpe!Rp7?mLUc_NJDTHLcou:)ZSJ]@!_7f&&_ZoXskX/CE3#9+.l_._W]o"1O`XB~> +endstream +endobj +525 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 524 0 R +>> +endobj +526 0 obj +<< /Length 1521 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!#\>Ar7S'RnB3d'Au@Ql/a67F;qZ33`O,8D;9bMA9tMBUO$sac]<=g%+T)>qAkd(#-j7%=TJ"_o$QkcHV]lai-+mTF"::=Ito"l3&$&pd)fLQ8lf0!A69^[IN@;dq$G5\adoMIV["q60/`kTpi8uPXKe]-KCQeigM\W1u'+T\E>lfK%7PAJ+@OU>Q7'0DN%i,+?tdZFd.qH$b)Y4,\3[/jmoI%HP_'Yf+FqClT2g)42-n$\9WRR0]+FZ>hNFX-c)VU8nf4\3P`&'=+6b:^H]B'q9ohM@ljjjirE?=LF!>E*-utBMjjim\.>NR+^h%%Zm5M_NON^TpGA#uk_dAH)Tq0hl%8%kDZ>Ub8%EsPY2gpjf'H?h%7C1/areSi^gX0b#'!`bFoOi)@`BhZp`G5b#IJn<*4N`\_G/C>s5GREfS3j,2f-1B.W]8s9`2=Y]E0]A0(cI%@`d4bfReTok6'K:']i0Kf?9P5d[?[,*Kec5gN&1kruY&/fb>h9FYIdOLJU=RW-VZ>I/JRam,@mHs%mN2LH`rm7IRf`4u&"Wf<>;R+Olkol+P125f+lp-^^_XU7[(H5@'K.,=0_rK-!>^7%q2Ya]$hO[T'$)uf%0HJ_?l?qcjS#%nh^V)N#O>Uoh#mTmZGa9/](Yi@+,\aa@f0FRq-ei33^*,p;=.j02*D6!>7G?qlZ3Xt/'#-gXM'mQ+m+d/0IYEF/1m&/=@JH$HPC1hNi`?VL%=LdYAcG&(2[0(H'aQ;Dc/VtR>quH0Mnbi~> +endstream +endobj +527 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 526 0 R +>> +endobj +528 0 obj +<< /Length 1665 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!#\D/ZI5'`Qrr_=##o;p3,a6cc-!=\GYfD0OU;C=:B*i"@DG,FB@sh+IS71Bao_PEN;dRjqFCZ&d4PcK"NU+8qu/(J"X_DJ9%/aO$5C5Vr0Wcs4ZT*5gA&61)Xf(%KIjUI_9+Z,UD&PP$j$rl/_FsR`+G9^sO,dNjMTNs)V,5m@(H$%i^h][#d497]sZ!>sa-^&X&C)5u^OS"LDJ^`W6H'_EoecBInSN&W,\<8MbIZd$VaSW[eg)S6DV-P&feY(=K\mBcoL(i3.qJG;d,qTAE@aWMbY.ii7fQ^L(?)!K"mdT.0m+@Zs(T[3=m.$o?+n,U7AEXX#C>2/6NMTE&KV241NmkeeJfOJL*\6_3Eg@cEu3o5;jO\$M4(MlCj7*Fuu/2b5?gOrbGGeM(UU6shj:o^9C3Il>`o<5V"95SIj&(G2u,glZ#+^_<$ALF<(-&W+Dp[,H3d?\28pc%j1VK!9)h'eE9ghuCL=ou]7MBH"l`(#r8.6R]Up-0"6Z+30Trb76Hr4&2%X!2qVGLC'=7Qf:ii2l#C,)J=)<%2T]>q8aTBTXp@!,/+-Z`Vk-(GE[044ioUQpJBiEb=+L_J52,;m*p:R#ZpD,0'W&ue>)'9R-2b=EZ!&'poqkN7Xkos9Yqmk/QjP+N\(fY(i*`Qr-!Oip*:8"O0TgFoD&!eh@=4hi@n;>Y>T2(T(:'H3[]h>c7Q.R!fom;U:Uq`.>JDSD$mSI+RnSo6$N]kk#AK8\D^W`g;0p1aZ_O:b\(X#\]4Z"7Tm5JV[UU=of]T#pCI\R`DAt,CgTpA0jnO-eUY^N82K%il#B;(''r86>;3JkdgBD>;F7T3o1_W!ncF4b/Aau>>)N*ARot?6g\[emG#:*gG$%;Rl-c11UKsXE+3pWLT`hRiqk,)u2$h2&[3tCVr92:tp*NOE*Y?A"&E,op@k.Kk60F/:E$,efB!`VDZZnfp3,aG2ILNGuri[msOo([S\+r/6,I9VQQ1@X"XK$H"/$k2c8+@M+IH[8SbjscC87+f*.JP>qUF!S+c,F\B2?*;Zrk1okZH(IG`ndL!48terZfDIs$&2*994d]IH[@B;#g'M`Up4V&Q9^hNDp.\iE'dN;f3Lh.qt=HXHa^"nM\Ya=m,rQ%L>5j"clc!q9s=enC,2W96>9Q7l+X=!.[mJW0fD?JA#kG2@YmVS;fR0=R;)SbtP!>;cq=S_3Zc!?d6>EnIR=:Bti(_Ket=hCW`4/Egm2JS"&D_D%Wb3.PI*H[39I2SDja]c7ej)F.@HqpI(m+A*(oq*6"*.j06tTBj.t)dfR9kG:PJkT1aF9OGSq*KA2b/81\+ZDZ`AF_$`Eb3d09fZ"k&OSco"`_]1\:cRHhb%GP2/nV8UW<=,oUH3uSIK]!m-/]##V0GNL-#OcS\Efij]0(B/hNF(>0"K5>3;Bi,!:i6.G58/!+7N1FDY)prr:j6+iqZ+E!l#"KRK~> +endstream +endobj +529 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 528 0 R +>> +endobj +530 0 obj +<< /Length 1538 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!;d?#SIU'Re<2d(1$?LfI<:7*-BKGd.?mE.TpoL&lE=(n%ghl,/eM/-5J)97;td.,.nP@=qo\>3%j@nF59Zs5ICu]s]e+k_A5mN0N5f'V(#Y1lCRe!Q8[M9&'!i\#g*b/F<=Khm8TDBh?'#5BNajphNsESmH@X?^3D%n^R!HR-6$aZ!,&)l-ftdH#:BJ,$7,FQ2(8Cs1AI")B)&kKUi%R83Tk5=C39nm4ltEmmIL7jp@?u^HKNYPFA?*L]R132Odk+u`\sh%JopP$I!D?$6=8,X=_@@/7<[>!K+.X7=Nl#\F"*(9bi0k53?r&#\uZE?l^BRa:o"(k-tLq!d&8qo*q*ScNr.ihF+^+mZ*EA+it9ALHM#BS1_7P)mQ=pIML)pag*lsbOfo.X"`E$b]7#P#d#-f&;Kn.:c5faKtj^o>bd,rt]c-W9HKG#[$"Pt7Y_nQ"]$`Q[\9h*$ZEH2e:O\KMLX/?DU6f=EemZ803n[V[ur>>Gk=2ZZWGAA_aIa5-:GbCI[jj@0'-I&0q;*tM%oqrta?,t#O57jO.kG`>TI`!^:C&:)8mY"#gg2*FTG@E?`_]T.F+j&R(%7;aG*3j9jcT&D[[@S9.0ni@XGK0h1?S@kjY3<,U+b!"-D)&8.VPT@SU%'F;b$OOLTLYGkXX"A4c?QRul4fA-oaE@WG2`BD0p74fT?Xl3LbDgC6i7ZD^mk\P>^=ml7`3![#(ig]^mQCU3h@i674ft=M4R7Tjkrs[7[:ZsapXp#*Q`:;FX2!M?+s_>2\BfrE0k7fr]@CWQfe,;+YHLM/**V0Di7b72A?5`.]Bn,NBe&@N,ZJC>lMT229_&,Y8j%#8&*1t8=g"aYr4I$jcT@b=OAjBY[-b88(e>Bnf)ZgM<<9ps8Kr^010J&RWd*te*Soc:17Zt*[7%0iio&,aJVfnk.ZHXKiN5M/_dAF]0:s^>$if2o-s.:h~> +endstream +endobj +531 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 530 0 R +>> +endobj +532 0 obj +<< /Length 1953 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatmq`bg_R0fL8Dc'2f`c!YmnhM$Wpj<@L_U`3%;pdL]A*WC'0E66IH]`PtsI0IB3&?_u06,LJ[E`aOc%)r:&M-^#:ZONBb3,k.ojX;:+@_HkPa*Kb31,?jNk`I[hW8"U5/4f@s*WF%pBR"\>5([f:uE5*lY`g0L2S2C!L]&!S36C?LNa*!k7+-NUX2aYrbf1n6.YX:On28gI((m(oPQ/C\3eX7$/*%Oi.r`QC-E/C:r8$9.WSYE9,Q)CTP<[2=e:Q^5@BqsE`Ga(gG&Tok0tq?>t>cb#q0/)Vf",rDn9GoE$];;Lae-BN2;VrTphTe^d#Z8;7GS_h^kQCLu1/NZRd7Rq!;A,h&Mc_^pdUceG`f"(q2mC)^fa-POd'iX5$dKth7hO%g)K1A!*;&_'=a`D(aTL[9'X9Kl5Dh'mfSV@1rIgh9;h-`o&MCZ#^41=[:FTLi_7HKPKJgj5V:J:eiZC2hYo:M#IEQ_Mn?'$kG,lZPc(dS!S1p#CPmB?KYgoZfFViARp*X[(:e[]um>D#q!Ypl3Q?TC&Rn\gIFaY4cP7"#[NHI)@l@*f\tsYtIaE[FC2nYHVj_8X"oYCph:kGNG$G9j?9H&l^3]3Xk"G$EchJ.CV3[DFX1@JK4h"#H[$>D7MFON,2Uns/]T3A,4t9P'oPTNrPj#-da%",6[>?bIBD6FR-Js+/c+!jojuF^1ja4m[qA>lhOoVDruA,I8>0j@8VOlfuuB2!bcd/!#Ok]9WOGX36-h>of9.gef).j$S"ic!pB+NVld/F&Z'U3gp^IbKBb=)LbSTdGafcg<.Ah+*8Dj>?R#"?$)*mq>mG=I5K,=TuA\u@k;HeXU:j.8hb1Yt"a)Imd[%'HWTN_AGD@6,U]3R80DJCg_u4FjU?=4+$^!8#WA&u1_m7UU*fLK(XS76),;9fkqbZ8Fbi5L^$&`8;ng^g[=]b*`H9#mG3o+fl3Jh-Js%G^_0G/mg:Y&"EZU8d$6,Qmo:mi3.n?f2GIP&KP_XKnnJbf(Q8BmiM?Z)AS890BmW;loN$qg+Ef.eqPWo"(3=IH[.7=*j\S$Q[a-YMDH$JmE +endstream +endobj +533 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 532 0 R +>> +endobj +534 0 obj +<< /Length 2482 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm=D,]1K&H88.iT=`50S!s7h.c%5.1%rg'M?1q2[=_,*/415YuB>,k2q-jamU`a$C"lo,r1dncgF!CY,kFui8'6d+ALB#Ikf<7LB1:0p)b_Edb-uXo2OIAr0;<7pGU1N+7:XL\s:%Ep\'.[immmR4![t%Jl/%lfbTU#A0/`$m?<43^U#5##FcD9P"#6e[m**i\NQOCrUFb%86*M"p\2Gj/,+r$HO$,/\IH+mM:7E$JdfjbN?q%_3$Z5s!2nmSnnNE.,8/2sZK^NCCgGRg3UakTl0%k+OX:ecDWd>!V60ok#G0[eLHAG-glglA#DCtXiiG8A;6.upF)X/8r:_3of5T:SdWr,Ou<4Q@j/%,`!N+'Tda)5)!V:\E?Q/]'*Hdm9,sVKO&kK;l-/^FQZ@\Y^"NbE'_Ad.'*(hu@RK1XX[[irl$"N3hM`W6WO\d4I/BqndRufJ"iOWLPOeZ'&^5($Spk@Bfl>11id._Xj`8Ceo2a@oq_FG75]iNVj!HQWkq0+j4pi>UdB/12q1RU:jNbZUIf2l@#&kC\o>\(G$$Z3f[ApTn^BTThn"N%QM&@n9\`H/=sC\-XcC'Ud\j?&mF`/d=MjsKi@m\D>3"PG*lm/Aj`e4QI0Z[a[gno=kO2C+PNV7oNnf&R+pCq!+Wgra)X8<`D0Yr%1?!4TR^DheiNJG*4-Vu3/8>lRGf']?pcAm"qB67)fnfHQ;D,`*BCA<'I",7'9KU(K%W.;%[0-k6hhfJQDnTUfG2\`,t[pVP/TQb]\+>G,4McaI86QE:N)7kECopJhegP@_V+Ki%+SmE\kBX^NDAihJ_W2aq7s<>OTitCZjA0P_i2R/rAb&%b+e"fH?l5fgn0%*!%/t3`4Z/P2_qh=Tj@PU?"mN^JgYVBtc'ikBR.'X\NOR>Rjh`T/F#Y,%!T6/Id!6UKD7lR02IUNe$SP4amE/6"0l?f_nRiTK,$=l/D>uPE]O)EI=":M,0MCDpijKd%B-V?)D@#+;r5-kC6mqGEYSt]Q@XMA0+snE\nYGElP&?FfO!a5Q@:K.O^Y2KC[?-T9-I+&KEd<77(0,G(Jh5WQc)lT_i]qsXqJ6=mYlSn.]aYF^p3:c\+);f.+X.HV@`K!0(9VMC\'F0+((?gd\\fQ4ap&`,6J8O[(`K0ms:B(FB;OCG~> +endstream +endobj +535 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 534 0 R +/Annots 536 0 R +>> +endobj +536 0 obj +[ +537 0 R +] +endobj +537 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 271.71 279.088 317.27 269.088 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 250 0 R +/H /I +>> +endobj +538 0 obj +<< /Length 1732 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHMD,91]&H88.iK$fCDr4otp8T)=eXaiU_44K@I5&TieI^m`+'#0:pl=_e]1LS6%AAW7G/rIqR:g/Fk8?I;]j]RjhSVlWp]QZ$eo*^/'bZ'A`@k^.iS]MiJrGjY('f&s5C/s=hM2aX(jH`YoIu4N!JW66.+O+X$;8=*$,Yl`B(+XUi.u'*iT8(fXI=e2.dUMs<\VeHBq4;b=@k9SmDp0u%u3[6kL6+>]gUm&nZVi+[ikTXFX.Zm8H\ZXZ.*ddQ-p)?23N]91;gSa1.W'Y9lk:'m;q4;9OVHklNXQum,N1C9(F6u=Ab[DG$NrAjg!\o$,=p%k;.ksPWrHe&NqBE*oI$j7G&N[:=`+C-(Wb$YmgdYJp/0`7`06>NI,+5cgO2;<9H_V\,KNh.U"Hu/%'`&9ZN7?R3'[%al)R'%!BV-'?hVC`k@ZC:p*#2KdWFoKc9=3+H,(!2+=$e]_6\qO"C\,b\**/5+uD_&[tk)Inag*+@e:-m*F'EkEaq'@Os;U924OpqOO0KUUeBY0E[q'IRWJ2":-m?4AqSS-q#d0>se`F:j!]dHMl[s@[PfeC`cNiXAH_3Jtdn)[DXf0ISk3Z<9N,5[k)!:5X--jNXe-[DSHq[l+M)-].NbpG--BCn\H#R);MI"JC_D2ojUmW$&/u>suD3?H.B@C=ia^_*ri&/&$E&N^EPD:E,XA:0#Rc`#Rf]h83j7Me$3:gZ]b_iJQI.AXj&H8b.9/)mX7e*kVf#<[!kr/bOilSkY8aAX6]CV^@RGY\.U>_eQA]W5a.Nb:T?MltqLBD1"jQ_)>3J95eEc&ssLR"PI9mk>VR5Z9%6pjiK7=>^T`c[QKF5`^SGCqhK=KF$6n$P4@2ml1J'?3hc:Y]#;]T:&Or[2"ngTWH65;:lm\Q4lgV6ls-qk]:iU=4dt]BKu7rJOe@*<@N!sLTXCE2Y*jt]if_!8ZaI@Lb@R%A"nh"@\FAO(pF1,"Dh[%+[d5BT9FGgW3mq6GU*S0W1qk.K1@g]`[O!U/[`*&SD;1hm5o$iD"R\`N@kPn`6&^`1/:]I4\0>jHX9L<"O>*[l'Bju%YVg*5fG%nVTO@l8[Cn3R)+olV7Z"STkQd/`NeA2UQ7<\M\ffn\MSQAHF+jIG'LjRT.1jD1j(LR=Ik;pDa\m-tAbSuD!2-+ +endstream +endobj +539 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 538 0 R +/Annots 540 0 R +>> +endobj +540 0 obj +[ +541 0 R +] +endobj +541 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 271.71 440.524 317.27 430.524 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 250 0 R +/H /I +>> +endobj +542 0 obj +<< /Length 1958 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!;fgMYb*&:O:S#^o=R2(MS;8AK*N[s!WED:3Qk/rI4NZpQ4X3g*QF;?YX5?ckKTnJX8RO-6;8E#f)]@Y(]bkD\[n7L>EI_TgumIGO??Ub1>a.d$u/r\P%G+]kkp$cFt+cNn7!OU`rS/&Gi!p]/MgKrk80+XYEJ#:+1?jH5Z`@?&q"B^1U"6&Wl1^HUh66MeX_2WTE%5"Et,?q'pHhQ^qa3f4ia`3:P4GG6fhMHZUHe3&s4gqa(7nbc:KMHbS#Td!:akhYo%psHh^,joD\a(K4Yh$b!+@#sSo'F6qN*L@)p?CT8p33!M!PhaXM978\2nI!5bU84V?H!*PSS[>>Vh=-R1D/X];>(]lW/H@Q>S=X*;tmqV@'JnA(h,[HMI/h5'!?J"-?Vc/\Pt/OpYf/c&sn`X(=IpI+8Kn-_q0P^07O>1lp-4cnqoQ1m?Al\=KWgncK:&*3E`eXn#VWObIp;FERXD[Uap10%Ft]\Qb9Il*o.VW-ALl8KI'MC)N%+Q7C/I>L6dU`eHra>l[TQIT_Hea0j?rPjMeXDe/U`Th]+rnGT6s=0A"sjIC#W5KN\XI*`nVubcj_ZJgUHPq>05]K%\1#:MJKIEjS]T:NcZle8)$7tsZN9[%!S2tT&oB::9^73P:q8Ng)Du>H?Q0WK8I^i_h$_e^T\lVm7PF7T*B3[S6p,AU\G'1jA5=31@\cM^I,=Ztg$.)ZH3$a_&jWPpLE#^/N53oBd>;H"KNf(X;,qj)iH1WC>\Jg,c6^#4B2Ij9dMFpUV>GM%f(mZ7N`Zk560aJZPY&a@5"%=Z;o^g$G<]36*=Oulkqk$$m92B*V/RLMo;t?.,_Q?pNo5ro:2H38*nPnqG"u&aK0,m->5Y\;],t8r81=9*lV!8Rj!M,5>R6O&/UY11M[%k[Ja?YN%R@]+;l2VU!"6L+k>q+=-H$A;G7YuDAa5SL7u>Ii(\mA@5eA^,#^<5J3L]=PHRjWL:m==<,J=j53Uoi*T%F-UY?RJ$cOlWemX)p:;\/b3EZ>K0WZnlH$@S)0K.g@SsNC7(=#(8_dS:3O=:^^+Gb9rjP'A_=s,Zs%V6#::,s;EZRd&SLF]CuQ^3PXN=NDK%om!S1ZU:Z&c/e:1@jmp7Enmg/VtoQ;108STq\eq$O#I,9pbX=aR,pS*sqCe[dWD51"t8uk$Jb-6ON,@H;q!G,=)$[m/gpJo%(ag[W?o5KE_$k@BX+]`Gk;mQZ0dmP#!iekutP8U4bmMG"'>'hc;"CRNuifJB*.tI.PA%-+a%tNm9F$(,CT!6t%QXJ$1^PJg3M,DghL6@9Ld]#4%39-K4k-UfK4R~> +endstream +endobj +543 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 542 0 R +>> +endobj +544 0 obj +<< /Length 1865 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!#\D/\/e&H;*)TlhHG/mfdP>'#6eeLi>J4H)Qcb2J(ktTrkingT)C%s=\dH8^=f:HQ"L80#br3pOh0K%YoN$,>]7^]kbn%CZ"n'tR6"oOR/ehd,1Um_,sBpRj"QKFUBG(3EXhB!@W@AVb(rNf`>ib1Ha4d6oEGQ%6$OV_&4c@TFTXuE;1&Klh-36HFG@Fod+0@51Op4'VTQ>oUb7#8"RYTI#.m,3t^@tFRfR)$@)fro:O$1)?I;HM[[+]@Ck4TWQp$?pFI:j7pNEG'g:Z3@iHik2J)OGbgDN_m^^=EiiZrI$4PPXf2b4hb,I)NKZ!:o,iqV3=QULG9"C3$Ea=c;.]"nelhl=>PUto#Oir%@5Vm@1=\pP%P0JQFbeP%`_$@;/:%Q\&2Xa+Tm@WW9s!E"L:!+^d2Xg6Z>4h-UHY?.7cS>A-Z#Pru4fg!="pDpMef6n.0Woc^8TlRd17qLBMblNgUq4V@,i5Hae'+U`&j'@.@hb&"iX<>-MK3:"I9U$f@WAd0tO0VUsnt`OIOiRF[VX>a76!5s6E:3_+6"(JB0GH@0V?bW4g3BoQiTf2>lH1h*qamL>%TGUmW("R#mOK-=Lq-a`:/4AO:sudu2W80T)XA1"a*q_Y-`I9t+Y^rJiLkeW;=\6E2\RGkPtW,a*`V%`@U7+'f<#cd&<%G9AIPGS;nW+>[0(s,+0'',ds4^Q,Z\+q4dIm6(7R88HA;oXTq23kL0MYdi8"5i]M1`S5!i=f7;0SY"phXAiB13?_=5s!G=6`iuu@<[FiSX"Z`P(diqrXV/_K(Beo5`m'Z58gs-!gNMin^W+hEZK^uSdJ)rW*6c01ta[JY&hdj52Ue/a=LhdEN)mV(WC,jT!'UkGS*a#gTu2Yr`MM(]&Lh:/C=o2b(*ha%e-q':n_S^9k$esTGs@_%ICl@cU5Y>/_g;VQIqfg)k->&7Qm"j+ntU;!Eu_r2`Nl&3j<];2qecWd0^/8$XkO2)G?$2@3N4:2Vc5k\,tq%l+J/oRh/3.abhDp-Q@E%>Pg2q/RY;]"m:Ia6tp?p+M(rZN1L,L.K@DM)AtpS-&Hr9gBHd9<#l%F<^@$fcJVI_A6ULV?Oh@2qo0a)c\W=#XO1RR#-"nJTo]+*lSdC-/fh!,XfP=bj/4k(0Lr-$<)+2$er/e(;ekiD;Vk(2D1(&t`!\F@b:tnNWNEes]3oo,k%Rh4JjT!\CjE\-XSQo_0TaE&4!s)I^H-9F1R]Y%q)%qm\+ag,Lbh(p(\\es[ddD\EA=G[)\e(@o@]`e[\>MHPnG^)%6Mlb;.?DWK.l5Wej76ZH&^RWW3kAWWVG7p@E8t/uQp-9X?,pp3"sQ8Z%V90:pE"Dr:6M0#[th_s#9&79:3,:IpPdCXD@]P:F_lR;f5[:779^3O?=N0L>HCUNar[22Y*Cljo0od_c!?m28d3iTKPfdYhr8.\lk/<)DRD8E$pH`DlL6j.=Aod77T;H++Er)@7L$pl,SbqQE_J3@n;8iT8GEm(X>(r`5:Zl&kORj-DnWn2E"m9i6`jO>O:O/I!3gPk6N~> +endstream +endobj +545 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 544 0 R +/Annots 546 0 R +>> +endobj +546 0 obj +[ +547 0 R +] +endobj +547 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 228.94 207.768 273.94 197.768 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 130 0 R +/H /I +>> +endobj +548 0 obj +<< /Length 587 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GarnT9lHOU&A@P9E,W?dfW[%fS#)^!>e3K8rq\no=6[(%5T(0HPmu<+GG]C"ML_o#=jX0N2lb'dC"@Arl:p:Plj33/WYrDf?bkUBY'q@ljF@W#4N,\L`C@:F$]t[ONrte`-`PL1U8#H"-M%T0dS'*>9YCiT]_$7?m7EXWoBu+QGU+2plJY2_[/6?k.VQ[o^ka-Ne*-.QsD45$:-#Up-7+V3@M]^^-)&9Ye(j7Q;.'$)j3%roc$ifjM5."$7l(i4qH^VlE_\Zum+g2~> +endstream +endobj +549 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 548 0 R +/Annots 550 0 R +>> +endobj +550 0 obj +[ +551 0 R +] +endobj +551 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 228.94 652.5 278.94 642.5 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 134 0 R +/H /I +>> +endobj +552 0 obj +<< /Length 671 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=(bAQ&g&A7ljGdN$j,peJVH:se3B[NQ*,P2W35YGlc-nVkAP;`C9;N`''r'5fu(Q/),m`^b7ZdJYS8be6"P&3[ICe(!Ls)B5-^F*/VGq;Lp,7e;0k_)VC`dD1lWHMZbjXO1Z?2a.+4rP_QFCFI3._p5^c%J3Bm'B2S#\QoOG_HJS,t[(lOiKW)E^kDQBDIl-1QVF/>Q_'WTK=erXBNL1JA.+Cd9H!;9Q4%\j?jW?B,sa_MdgUl&U:I1HlS',jaIg*ioD783Lhk(KjAbS)dP;S&<)pZ21mMh\T/b/,6U9ENB!V)K)$p.4E&eBYLC,-S(TNi[8Ub#sDqhQtgC:NstCALIcm4/guI$Uu_`WCf)cHrheuEdq*+>`ph28(N*3uR'0'/>!+fl>i)2,YoWn"-&Yi-ioAFqK&HAErX2Pfq`BU'V.P'c0bi4'u4HKS#"7Gn)%hj73'sY1;5C,VpS:P\si6T!1c4P`5(%C+i_@AC%p85IqLr;UB^SZQAPa('u>@KQN-mrCLn4d6CifC**~> +endstream +endobj +553 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 552 0 R +/Annots 554 0 R +>> +endobj +554 0 obj +[ +555 0 R +556 0 R +557 0 R +] +endobj +555 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 110.6 680.866 163.1 670.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 41 0 R +/H /I +>> +endobj +556 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 261.13 659.866 306.13 649.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 108 0 R +/H /I +>> +endobj +557 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 110.6 637.866 163.1 627.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 207 0 R +/H /I +>> +endobj +558 0 obj +<< /Length 2102 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm=9lo&I&A@sBYc$220hYFBdP5a1Bf\uSM3[cG]/),I8Z4(i"\?i5pK^[Zq*5!V1=O?66icTAgUE(Gps&*jVg"OF`dZjJen9QC3=ENNre4Yod9%/8rG[mFX.B"\4:M/rmkP1NqN(4e??AfH#9&G^@H:&3>*N9s$[1.2+k<_OOZ>=.TU=cI+e9OaqPp^1p>[(9@U1j$e'uj1GsX(8$3gfCYnKUH5Hmu]&Hn_DXtWAEGVc<%Xb:QCdbr;^J;;+=CgrX7Emcs's-Mn5H\4-"^!AoR(NZr=]*7G;[L/!--UlbFW..#2-BY@jqV\8ek3Xl2=B(K3sRANMFnM)m5!og>uee*fpFLs0j6H+A[8K_4%d\9(8V,*L9U8APbu\[^mJqae&pW7m%[nX+oW?"MY5_i"akL;m^jUH$b!_r<]dEj#a4M0Mi,T!2$nUr7_U<:W[L\7J@O(G?"fh;CJtk0uJl-;RIEFq+`CJOAXtV/>4M!#Z"MFH(%>\ph$oKPpdJHiK)!5HdQ`5Q;uh='s@uF??MMhft--r=:7ND[[Y[k-B?0a2FAK=m6hEiFtMMZp^)*RK4+U::_VHaX=2JIoo.=J.gj('Do,8nl70iB_&DV,:LZhJKWJ:75G-<1^R)HiDA`JXIi-44:O2$?Vg,(HGafTKf0!bOJ\L[KmYiN'nLJPBMCX_9e44i!VOf7I"hEdcUW^-G#j[UfU^[*j)A+'XK-@4#,8L@H';Ft@3"/KQ?Do=[GBH%Q]O;0A_?W*g@D9,%m^;6$Akd'jffq6Td.p?S("XV('E2fPJ30p\%n-',9.HI@%^r\.l?/MbR.[+ZS.q7^;m\)W53B\Tn)L"PdVk=^_M^Z0MWB-[R:G>C7ntV>%!l"`VL?1;hZ"F&s/sLC6nJ%Z_H!_!mn/`785)@Rg9FG00<7PCXsEZ^hhq[ncBVuWY'_2&d^n8Eb/m^"fs]'hI1./D4WeK8A6''"h6Pt]be)^2JK2*%CG;p%LpEo&A!Q)p/jp>bf*%r<4LZrNjQ&qj8@RX@^&WcnoXB8uqOE$UtjZfh#kgh[rFH9ruV&a9?WkH-t\2I,*A&6@PJ($\^I:S&DU5FVg*u@1::X;Eb_cS)$tSL_J@?=akO#Y:/jO0&A.5:M011BKA11K`+4"p\:V'#P7ofVe'/K6jX4Z)lP(WRZuY*CP_BcIG\@VY(P3W^RRY1)%)-dRs+q53^3NP"9Hk^f!T6Z`sE'rV9A_`a=3+Hp*W7Z:).,<3-*fRWHmdpO&"o&c0(r/DB`/'?q01=A4OfsieU-V]ud,Khpo`T02R\b;s[Pdpb-(U7YYoHVg/#bBY$=Ho"uaNaOu"'QZlG8$(Qne;o'Z^o&"rO'W.+q+<2[2Md.*4]REL@e:]X$jelN<]Z%`BF:d83jh9rMMMCM]@E")h'Kt%Z$8dbN-/DABK=]:eWjP&bE#H;.4KjGEVeNLYM8@9]+6laGg/obW1/9c/qr[]VT%O-&[V!L747^%g]o9>IYf1`9,4Y?t+WB%J.A2c0;FGC*QNOCO-YP-s>1r7#TD&^XkqCc#C7-0TsD[eOUbX=_,gMZM+'+P:Z1i*G<`R@hM +endstream +endobj +559 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 558 0 R +/Annots 560 0 R +>> +endobj +560 0 obj +[ +561 0 R +562 0 R +563 0 R +565 0 R +566 0 R +567 0 R +568 0 R +] +endobj +561 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 360.29 680.866 405.85 670.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 275 0 R +/H /I +>> +endobj +562 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 239.2 421.866 278.08 411.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 250 0 R +/H /I +>> +endobj +563 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 348.08 421.866 365.86 411.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 564 0 R +/H /I +>> +endobj +565 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 447.22 389.866 472.22 379.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 246 0 R +/H /I +>> +endobj +566 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 135.04 378.866 180.6 368.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 248 0 R +/H /I +>> +endobj +567 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 185.6 378.866 231.16 368.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 254 0 R +/H /I +>> +endobj +568 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 236.16 378.866 281.72 368.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 270 0 R +/H /I +>> +endobj +569 0 obj +<< /Length 698 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GasIe>Ar7='RnB35^cc[D%)4T[bnB4OZKVlPe#8=W"0U&`**QeOKJKU,L-J*3LV-\k$YoEpb)PBNo&)"^^3E%X@EPt7i3BK_gi>+@jm+WP(KtCX'89U(qcULq2O/+l!ipZKQaDa21=t)@727ALcO]Ik3=]Wr3e-Y==K-3TB:B<.bE'_K(L7%\>=3LDUP%NCrj`&S;9N&rNs*],he9coA(%$C3-4-J)\bH:4UFa\QL7sr(%Q^rof.4f>V^LR)_*I82]sNo5]Fp>:Z">f+]pjHi&@iY-"6%W(EHtnZXu*.lUoTCo2nZQ;9=ld?/Hjs3r7;Jqc-X6"Lje\9jLB/+O0;Gf\]2m9ml&nP2k`(1.O2(Ab"\g;.Jca&3X-SH*?:T?k$`ETP%_jh%qHB9!O4e+]fm&(g;P9(r;=7ho4[]$2!n%qVJ\fbK>/ctI^`F&aMNf$q(/%1=FMqOAk>H7N?!LJQ?JMuDT!kA+:,6G(^ZI9#JW/D?@[QR-"=LeJGr[3+QP.\qb?75F/'/j`Xj.~> +endstream +endobj +570 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 569 0 R +/Annots 571 0 R +>> +endobj +571 0 obj +[ +572 0 R +] +endobj +572 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 191.15 680.866 236.71 670.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 573 0 R +/H /I +>> +endobj +574 0 obj +<< /Length 903 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=)_/e6p%))6I4si(fCE&5+2]uZe[$f#=2`YDh:qXZrYj=.22)P.*/uE1@P[#tKOS5fPpS=(PH10KM$fXGh"o5/7"_B=s,57"J/9/BT)M`<^)!%1EnKRCVQbh91MVQ%eUf].\QRGJ]TX+6%n.apk(G-*UkSW\$Bmb^n*2R(cMNh3++sgqB#o[#^;gZPk2c=m!d[Hl3B)aAXCMko_8kZ/XUe:)"-"ofC!EjK6nOB4;2>#\Vc92u1(l/:r$NQ(7=uY3<2YMdmHUGipX]/SOZ@S@_X#>:aGV"^'4<]D(2Z;#s;XQl%=(?PibO0t!l^O^cA;b4%5do)d(?o4=UI@kn-rf]bd1_rRER``V#H.OsL*[(SOgGM)Y3YB3]8W,$Q07jdLY(dZe#Al3hXE5SB?`XKPre]QfC#N;%kVQf/u79?_]07S"3FfiE9m6XDrmEPSMeBih&R=B66ZXYJUfA7;KSH2m7`d]?rJCOBdXAU%\hL0+9NnXsKP2q%es@7e0=S7'e*Rk#]X^jR>:nU62":EsB@r\u=1"rBSef0D&EgeXeA@pDK!EQ0'^N2Z,TDK5YsU\2!af;;s"\9f4T2>A8)F+N`2`ZA~> +endstream +endobj +575 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 574 0 R +>> +endobj +576 0 obj +<< /Length 5905 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatmA>BAQ-&q801d.AcTM-5E5Dk/[s`pk@A3c/VIRaZ!I5g,,2'1m9pabfo\&!e?R?'#'FT!gEq$ekRQ,=O/,(CTreo%Ed#fn/`:>V&*($Q$:ufHM%0Z:,OcYq.F-(8m)PB(>b>+n];aP_>b*iq[0Y\SA24WnP-gr39AG[$u)C5?))?8o2#ZJq[.58J-ViO8Jh9q+8M,nV9A=+m3f1cX4*Ac*h@o%d6spqX@d/iGA>VcY!l8EVXqN//!Wr7,[5Kral`WE=algY[2uK`q\QZip,2McX&2gDL9"B$oJ7Kpg`u1ZUbOU`?[to(<6DCI^=i5&JU'B5k@s4M!*Be^"HPU)S!X\'F!9#BEUT^"[FU[$-/klVHOQdrS4b-)"i2ID&c['B%8O:0b'P%\(@fR]+!-7fIY%]@S6rVA^D-hSth4K=*7<%VoPS,/78+/.Q]]l(f%+hi$cn>,s"cYH8]W$%M]T(Y#TJl;fp:%l1=`4q,UNj(L"X;e#M%$R,B7IG(dkOBtdpJRM2(W,Z?!W"DhIJpLU%m?\iF?3\=)jn<<]E.Ye`?E^E3a1<3[ilB4G%AmF6n2dfqn6'rm#.g&\S_a/U"(4uN)i)Be!0NW)(]9='5k@s4R-2GR_u1cY0I$Z(Dk9oLr(S(D*]0-'UA:L"p?r1;#"qD#T>6\IK=?EH4IGhgM!2$B];ln*P%F\e^Qpi19f]Y8!:\KrW`DMmL!#(@d"i;,'@X9obZ9W4M:eL$Y1t)@p6#-&@bMoWM;\t):T-K+^[<"&[Eii?IC67HoM#KaI0+?nTu'LUkPB07c?0unEWc^O?,PFa^1t-BD=K<]JCu,;*G3=l6s_tf//P:H*FP7H]cnYI;@9UQ;muAmf(K5FFC>Z.B8=#0!0r!;qS1S'2RT>&8g)BDq/+-(/CO^poX*61kkD]m:UoG1Vp'l%CX4QIDR!_j<4e>OFYQh5CeC5P?1XW1e7X0")VOb[+[LD"krpd%rU#3CU3q]5"tLWb-hZ'@D(<(Wq(ZNX*4+Po^%bW]/,_#IbY1oIa#kT"%)tbdjtamCEpnc"Z$a$c2Ki)4JW%H'0u.gMMUG0]bAl_qQR0)*fZo3`g-G0N/K('"ihL5b4I5lXbc`n+80o6B_V2&0%4F;3sr9I=iYK&IX"fD7$E0etl54QUbIpQEiT%1P#1opX*UZp`_?*/%`Z[b&ETD?(PmiV)f^cR]?2ReILmE>+pEOUGqJk"VDZu];eWP?0_hd9@El4/7A@!1R(o@i;#K91'YiLi`omZ&p"b,8GdL[?g&K\ASB:rH35?HiO7"QJq5;']?BlC0XgUfM#WU2ZKjg4q'hUi0R?j`j48n0RjESJD7B"8boKM!#954K$ArpA(9o]71]F8==.V].6c_XN-7"9ZicZTX'G.QK=J"fm`&u?"?J*)S;77;7M<$aPb6M)bIeL9KD2k;9-I:Pj]%UuinqeI$j3@"HU`!^R4Bo")=ts=BYCA+TA?@u!/r/mlAi#]KfomA#s0sPs-8C-p5RmK72a%AV;>lf_4lG[t6**[FI2\gaAl9W$%si8RK8k#ALXhb<`BaK,=8\J!WtZ.OCG1eN$g0:N1kk!;op,+9USlQNj1l5i@/i#3H^)SE$fo&(GGTSVa0C.2$<'kFGc)M/?OdXXCfN<+htKFuE70Y!ud&M`rL)_&@WOBa_V.dS;p%(irVm(laP,//,4UOb"@KG0-GW?'rN!$j*D4D'm[6u3l*f+`AVD'&3p9J&V\dq)YopY`"b&^S9R:2V:kBV]*O.YCDnbE0+A<[iC]QrraMl.(e3`On1TBr(F9.bAI)4MLQI[.61I7.:eg1)eYt=f_l+ngfQJ8_TZN$j.&SYon0k*!]Y8?KPi;[f[%iQ;kdbhjuFGXaq7="Zok%EHg%TQr"U`,gCPQG+2.KIXWniQQllR#,D5@J*rG%;6V8mhVE3NA.D8r2#Q%u)4#*$arFHn&!All$JB?Rssi/Mj$:O$7VGpmTb6'BJkeV]1J8[I6^p*LE0%&RLt4n[u1jhYr5Y\q^,JY&o$p`lb;O9msJ>)>c.q5*Mn]Xl)7bI9f5jU0_ebC4r!%tSUe8`#d#2(LN[MS&#[D6J6_Id$Uh.ke?%=(M1'$.LnR;,1/oVu(8>'i?$!=cIma=7)0;L-snbaA]=V233AJpOB/_2KS]ZW`(#eC=#h!X$5MAF;``l(qEFAdP'=C0_U#/*mMAJ[s]qUX!HF3=u?1/>]T6D7)2)+S's$QOd)mLq$4KZ"QNNBm&e#H?#eW^9-#*Kr]soBA0]84<-k(,adWolOYd3MNg6';>(kB[pYG?+V\K,(6!.%)hZuLT1G5'#rk[70\$AZ/H!0Qa9s-X+!V-#j&VR&tB^B+o4WI_UJNnY^PRe>B[DLb'k<+U#BcY@6c-4tNKO?\^ea=9WsekrEnYdr)5(DG>%e!iN2)O#o;O7>e\H$46#D6lD-*tdY@4!`+*^OVW.Z<>eToKZ*u%4P1lpoS:LX7BX]7F,TOL)rGnhdX+)"pH0D8&>^t[He?M3`6Jc'bANT_nC1sRc)>ZnA8UIC1"Rq!5'iYbVI_+M!@F>]fhUhp@H!$>41\:%U2lD3]R5&Q(N?-8eI3a">s+JZ;-MCfo=']C?cp26i`+kO/l/H>_hpMj01a)GS]huGZ&emkM6,_kK2f\l1oUGB_Q_ZKeF@tErUSu!97/>8TtG]QE4-*52`;m`Fs9N8)me,Aj2*Z(HK-hoaU2B)/>t%_o#2*-d?f^d_Yda_>3`'fkfRpP[#O-\Dd7'r-5_7m.N8d6sou[DSNsd6$sH?$Mb3>4TBkRi2b2>e0Ut?Z3Y&.@WPqQd[1-=3H.',0hZTGE`OJA#K#/FF;At/p<4L90aE`QR3NYl?p2s6-ch>oEcZbj0`J0U)=,JEU::Jl4R/IU%tJBo19.hWW4L$QM"'rW.%NFOmh*:HBtdV0YPM9$Z"jJ4ZNUfkA=7%U^otK&A"ZJ?3%8'If)[`P?OOdl2FdaH*d777DM>M"i7A$QMMUNo\*qYE%H%@iG%9SC4&c(m3Gmm@2[11SWN0/;!:)DmkB_XA[k?P$,4s&[<)8g#lOoWH=-b;3A6GUekT9m>Ml$oWP:l^$cOW-F0:Qb-djCckV%9n)UPXP>'OJFutgmXE!L`!m`7IF/`(Oe.nk#]$ht:Ne-rtL.+r-^T!nOZ5fJXs(\Xl?RG4FbP?*K2-PRMYAi5s47!8KX-I\&XMl,*OpUEDZC&?VmqPe(EI0l`.""s1\&.j6m6r)7H"!m7Ed:^S-)O6WBP-O\KgLCjm,bj*"E^=nVn/i:oa3:Oc)Fj7@.haC5"m[[L3Od.q^9Ot)jZnh@b9G(g))1R.c6CH:USeA<:'pm$rHof/Us'c*f@uhn6rY1Ict*hZ*3Q/RY!oneO=QYFK)nQ8A!UP4C+e>kW8W!7GW'@+_$4p0`[>khU]OMTQr"U`7)2"MS[;`FG[<"8I`nS`&L0NX^AOO[ad5i=`%QarPKN3/WHk)K,3J.E/VUubfZ4$hG'QD3[nAh7!W)dYN:L/!GLo>=cW2J=[Z7*sEpX;\[6>nmM)mLJ[q:E#p%K]1N']tmG5iq[(3WI6,dGnoAXQ*[68igkL1^\>TihTE;[L*=B&0#-3t_j.g5Sem[niEJi"a$*s(UH!]P\Y+Z9nF=jVm\4Q@uK2_Fmp&-un%8En.HI='mumE&96b9CDE/5BNBh8g<:K(>U'^$pWPI!3bBRYl~> +endstream +endobj +577 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 576 0 R +/Annots 578 0 R +>> +endobj +578 0 obj +[ +579 0 R +580 0 R +581 0 R +582 0 R +583 0 R +584 0 R +585 0 R +586 0 R +587 0 R +588 0 R +589 0 R +590 0 R +591 0 R +592 0 R +593 0 R +594 0 R +595 0 R +596 0 R +597 0 R +598 0 R +599 0 R +600 0 R +601 0 R +602 0 R +603 0 R +604 0 R +605 0 R +606 0 R +] +endobj +579 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 269.77 665.894 513.82 655.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2119.txt) +/S /URI >> +/H /I +>> +endobj +580 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 318.1 638.894 446.06 628.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2246.txt) +/S /URI >> +/H /I +>> +endobj +581 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 329.49 611.894 534.09 601.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2445.txt) +/S /URI >> +/H /I +>> +endobj +582 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 222.0 600.894 322.81 590.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2445.txt) +/S /URI >> +/H /I +>> +endobj +583 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 448.38 584.894 493.84 574.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2446.txt) +/S /URI >> +/H /I +>> +endobj +584 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 222.0 573.894 521.4 563.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2446.txt) +/S /URI >> +/H /I +>> +endobj +585 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 222.0 562.894 376.71 552.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2446.txt) +/S /URI >> +/H /I +>> +endobj +586 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 483.35 546.894 514.93 536.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2518.txt) +/S /URI >> +/H /I +>> +endobj +587 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 222.0 535.894 426.7 525.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2518.txt) +/S /URI >> +/H /I +>> +endobj +588 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 273.92 497.894 445.19 487.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2616.txt) +/S /URI >> +/H /I +>> +endobj +589 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 273.1 470.894 347.45 460.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2818.txt) +/S /URI >> +/H /I +>> +endobj +590 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 480.87 454.894 531.89 444.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc3253.txt) +/S /URI >> +/H /I +>> +endobj +591 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 222.0 443.894 502.24 433.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc3253.txt) +/S /URI >> +/H /I +>> +endobj +592 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 277.0 416.894 383.85 406.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc3688.txt) +/S /URI >> +/H /I +>> +endobj +593 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 447.81 400.894 520.77 390.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc3744.txt) +/S /URI >> +/H /I +>> +endobj +594 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 222.0 389.894 476.96 379.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc3744.txt) +/S /URI >> +/H /I +>> +endobj +595 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 330.31 362.894 518.8 352.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc4346.txt) +/S /URI >> +/H /I +>> +endobj +596 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 222.0 351.894 268.66 341.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc4346.txt) +/S /URI >> +/H /I +>> +endobj +597 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 408.08 335.894 531.87 325.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc4790.txt) +/S /URI >> +/H /I +>> +endobj +598 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 222.0 324.894 295.62 314.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc4790.txt) +/S /URI >> +/H /I +>> +endobj +599 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 222.0 297.894 458.55 287.894 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://www.w3.org/TR/2006/REC-xml-20060816) +/S /URI >> +/H /I +>> +endobj +600 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 328.65 228.922 459.93 218.922 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2426.txt) +/S /URI >> +/H /I +>> +endobj +601 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 385.32 174.922 528.54 164.922 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2739.txt) +/S /URI >> +/H /I +>> +endobj +602 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 222.0 163.922 248.11 153.922 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc2739.txt) +/S /URI >> +/H /I +>> +endobj +603 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 336.98 147.922 509.37 137.922 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc4331.txt) +/S /URI >> +/H /I +>> +endobj +604 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 222.0 136.922 405.87 126.922 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc4331.txt) +/S /URI >> +/H /I +>> +endobj +605 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 288.66 120.922 508.26 110.922 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc4511.txt) +/S /URI >> +/H /I +>> +endobj +606 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 222.0 109.922 255.89 99.922 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://tools.ietf.org/html/rfc4511.txt) +/S /URI >> +/H /I +>> +endobj +607 0 obj +<< /Length 912 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%"9iKe#&A@sBkZ4'b'hQu3`(clO#6+r9+9A#HW'P^d%#+-nZA6Sc2#CV@2mm<^AXa$K/\!)+O;j-Kasf)Pn`Ii&H#@ff5X6Oq+7n9>Z!eQZJ)0?;ui@E:VqMNc!BZIItjGQQp+'c1%nD=R,:7Q3G^G>jigj@h]Q78(F>&9-k>in5m3No2[b^bpQ[_]jlPrr/6@:FhLb\gV0]$rhI_f/%9D1bZR(i#m2YaUk>?/0T3gXU%q0A%q,!p@aa2_;3;=GoG(TV[+M`e"&Qo*>!i>rf'GAt$14Z%5'J.$J\-r/n%G&1D2J((j-(Qku3DGrS^g'V,3rK:TE(msS\\Hp"VkhZTKu:>k%L$PKqc(+:^Od2&_"/@bU.phM7hn$lquJRp;B";kPa;SQ[&7qVPpPA.`fT5E2-,8fSOWR%ckCeO76:62cZXs9-9g`p4`A>B_=sB1riW9?5IOj[S8d@'?g4*9W>M9?uQN7rcq\t&oef$e?.bhbq#1uQ2)8HuuQNO2Y]RHE;b*.=gI.s`=9`$[;]Jq=:;f*lX7X$>E$I<^Z9:,&i:ZpGrC%^n",]hd%_C>67G,qpcK4NNX8PDL)46[U]F:qN0%au^5j[PU1eEgWX3'`g78[DsVOOM>JOC@";o#K#g\\B17M)KYo!\tSE>E<"Qep?u3m-UfOL^;]bEWs+jn>6O-ZFQR3TQ[h#gImg&`P7iI(OR)<.Pl?k!.p%Ps_`=1E+,/M[*;L)_!JbN"s[dO!uXFLQd,AD?bhPsXqS-jEJQA[,7hZ!ViEtla~> +endstream +endobj +608 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 607 0 R +/Annots 609 0 R +>> +endobj +609 0 obj +[ +610 0 R +611 0 R +612 0 R +613 0 R +614 0 R +615 0 R +] +endobj +610 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 104.78 631.866 184.25 621.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (mailto:cyrus@daboo.name) +/S /URI >> +/H /I +>> +endobj +611 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 94.5 620.866 186.72 610.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://www.apple.com/) +/S /URI >> +/H /I +>> +endobj +612 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 104.78 533.866 242.28 523.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (mailto:bernard.desruisseaux@oracle.com) +/S /URI >> +/H /I +>> +endobj +613 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 94.5 522.866 189.49 512.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://www.oracle.com/) +/S /URI >> +/H /I +>> +endobj +614 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 104.78 446.866 210.36 436.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (mailto:ldusseault@commerce.net) +/S /URI >> +/H /I +>> +endobj +615 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 94.5 435.866 177.55 425.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://commerce.net/) +/S /URI >> +/H /I +>> +endobj +616 0 obj +<< /Length 836 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU2_/e6`&A@ZM3l4Rc9"$&!]b)B(g5o.j8Il+4"#BDr_5SPkqY+9JKS4,sR1:$)4RMRcHe.IEDLK//L^'6>3,K87BMh1U8!3:K9ooWZT;2/fh7(#+K?b;WYhndoH,"\2F,t2#6b.Xsk&rpdfkZnsKsXKm1R>"q7N4DQd'"d1?u*O2i.tLg.VP?jQ!_9L1D2*-o7/)'Cq;&uD`!Xn11r;Chgj$2,NY$)/,hZju@7eekG/+T<,/dT`1Ju"A[HJlQ!,W)3*iCXFpo-DJ?r3HGrC(RrGegD-EVW=b%;)>c:[I!kTJdBO@VKKE4fo:Q=.*SUq_QofepB0N/DcVULRQ]@6*[.71Ka/tpc&j:#UA3YgqR+MOI'$474H:Z9^0N,0H(s),5cg.%cV4S7i&HYqF[&LR7PAukD$C[>VS=FJqN(~> +endstream +endobj +617 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 616 0 R +/Annots 618 0 R +>> +endobj +618 0 obj +[ +619 0 R +] +endobj +619 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 472.5 691.866 518.06 681.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 270 0 R +/H /I +>> +endobj +620 0 obj +<< /Length 1805 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D?$"^Z'Rf.GG^/N!/@$R)QL+l;,a]o?!E*ktPB?ZZJ,o$>VRC3fJ%sS>,6=NM[o7OVjnj%>ma\T'l`auE\UeU.)<%r7)7(5>/GN_-',]bqLG3k0E+s]GF,g/Q)U,Kpr67sC&?ABe_?aT)O^t^.j#g(;R2gUu`'iJ$.s[]3KtI^uUZHeF_""`CrWSCNJZUN"$BA3'EEn7"$;NRAPt]SO%=mG>3KhXNDqUP3itM40bMRhVhPVPj2X+Y]>V4UfbW/dT?PA9r(*-?G8uA$MEsqM5N1IqnCPYkZ[?apK:#KCW?+_!O0%Hd(2kclSC5o))[/HJhJ3WNdDdu+b.+:CDO!GAHgk)2c3;*$GH-0[Xk*5;s##88>`Wr`A\,Bt$o2T]uHqEa5jDU"qrZIHI,L+(feGJlP7/,oBu%R[\6o=3JVk=55p/JL_%d7$0XMUjLhQ]&<[Uj82:,&c$kq6],3[0[[;%R!F'035C]Cp3?WH;fR2MN=f^OBq^1'kml6RWXRj\f;KdEA@R^OJ&U$monEZ"<,&7m-<_DiU7pB(TYdK2!]iV*)@;r`Tr]')T!5W>Pf@iOfnUajAUOKV9q'iiIMM8+O;>0>!Ki&ZlcUo6n?]g3rV07f#NNTlq"&qZFR?4M-T,hbWKAE/',Pq\J?*(i_r0pi/$jd1%eYWQB$T&:BmH2Md3&jJ1rV+V>uc1f8ZnbA:,+D7C2t*"?G[ig;Eb)J2ToBc[^9nDcpkFK$%K?p9<2OT5?JOhiNi*,+5QAQQseT,VF:<4(YcNK(rYe)AILf\n@;ud/$8T=Rbcq`=A>L(K2uG(R]/pH#*5JAh4pJpPh4X5S"0F.k8QeL$_f3u5lhCqHq\Dcl?77Q@Z`prFa$J:i9i_5>;SaFI%`0ln$ci33`B]qTp:>'"-t68_/@M`KGc_U^TcB"XgmJ;r%FeY3Jq,@+=TH*tsZ&@fSWeW^s%D94Z3L_E%nh?'Cs-*dSpg?`# +endstream +endobj +621 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 620 0 R +>> +endobj +622 0 obj +<< /Length 1528 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm;gN)"=&:O:SYh>A=C)P:pU;X4"-"4,q^_)4"lr5$:/70m8+bICTrjG'7$'-35]5edMLXWAsdlfj,:@1npO1l]uc3+!9*GL4H7hLAALC4ROXqV_@:7cTGO$4YVQ>d9%2c'o-^tnJ=,g8o@a9j$n=hEFB#qj$6@GL.U/"#Y)?I*^!L1u"L6A%)h+WWq.@'N%_FR2Z`bPQN$q,b!hLi5c#pd=4[a8XWm9;<%3C[c%cefX`inPq]Y:+QOebo.PSYmgo(5/gW5MP\:Z&57#4G"Nq"C3GI4BQ*apnRV"*l!g(BYA6A\^_0m7:,c&oV+N\1,d@6pd(csKg^+`'R?E6nA2":PCHqeSHX2)N>iUFIpHK=h+U>SO6DA9Nc(F.AVqJ,#2QJCLb:J"co#4C"#7Rn=Z8Cf9^>`<%7T_=jQplQ[/<#6;_6;PLl-&ub6ds_HdgsubZ!&(#o0P:nWeLq7$htYd:,(6iQGe1A6@YFfBTUQH0.PK9BZZZupVCS].]Iu=0C10sma3'"JAdNaQI"O\L3Rt!oB(J[WiY$3(X\&oi;RK4,t2e^DCZo!T;$Ctgfq\lcF"g8#:cj-TD4m(Gral@D%pH9%37(%u"[ntUhIcpYebJ/>emIZF5Vs0q3B4^1J:CU399fU>ZaRd:@3=;p(e'Cgob5jhLqGts6Sg=AYP-&@ii,g#*kp3TC/q=lu\P)JXeVq:F\@ksXkBJ:@Yo4.3163uR]Z`mjlM#B;R7u7Nb>7*j5hDhsWA2Nef=L\HDL*13!(3Th*hLa>^kusS3`u.fpg,?5I]G2/#3RO!66JaI+Vj,uS0G>-tZ(KumSRUT%_^T&lamn#s.RoP.:6+'gUD-;]i4(?dKHa]#'RO!#'H-Fnl@U"0E22LK:H>EmU@j,q"X8=BFVKfTY\6\\U8"(NS"Bdb8<"-Bsr@4]o_L5//%V/Rd4V*oYk#iDZ+K;jKeFsAdB:$RPn9u5MS3c%7X6;n&-AY:'d-STL`L5)6gk6,Z4SfZ._1ucV"sYf14\JcS_2G +endstream +endobj +623 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 622 0 R +>> +endobj +624 0 obj +<< /Length 1661 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm;gMZ"A&:Ml+T\5Z">2"CCgDQ`.lm?/->>0[6N97r"c:*p"#+3+%rKa"oL84jpC4d]fk#?KRl0>;/F*"/%dJ"m6G_#gP,@;VL:aA<#_1`EcVA'jNNCD^64h<[8[r;cF%oa\!^>\GI$HjbIC_*2RUp0)MR_5%\=EnZJi-8B#he@DGM/^9Q`[R"F+)I#LQa^_l@'ABmi2J;YicS(AT"6k;.n5diOKWEi$9l^_fUu^P-F1rqMj5CW'4GhF<&UBF6%Udp7+O7NQ9@@qC^D2hShf_MO>`V61bs9X=u_Zo^;T.E3>@Jdl>AkMjKqNI<'(BBBEH(lpeM/QYad0";17Ur6k]8T`eU>[/0pg@p_J=\?oZ7&_Ve.`10LQReu%$4sWKV!5Ci_fi&`>1Yf-]@WtDf:q)-m8oI"!rU,V:aH]3$F*AXjT9_3_6=>+E)^:L)GSePp1;u,V6XN3/u)MLPB'F^apU!#!7-:'es4dLm_&#Dtt?J(K%qgUOV\7R"FR?\Jj_5Z0oXn,Yk/2LfehXiu*nE3&"HV-I+)NJg+rD(l`mU.(p,`T.hSVWUU@;)KL_&V.:#54,IN"E.j)-e;jbZ188Uu-O3R['FD3f-[$7cUD1h0S$mO<1.%,MYa0iaumWj=Xk?qAl6Cql40S0:nqpJXtM+-pr30beH)Ze\N>;@$WHJ__f7'##eq*E%n>Q?!\\W^Q3'OE)W)PtF1^jbV55NV\,t3Oja-XBeK05r*CG-*P8Q]/D2KAV)YGJ0RB[U,TA]8N!>Lj(daJRk;#Und!K*XO;1<^g1)PMbH7_/;/,CrqVIfX$J[P%~> +endstream +endobj +625 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 624 0 R +>> +endobj +626 0 obj +<< /Length 1360 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau1.gMYb8&;KZH'LI-+!7c%$cc\.7.?Sf(l4f(1cj%%RA_IWAOk,ILsLVZ%IYrk&)O[Md\k\G!%ZofN#\XB>Y,DUE'7O>=BkhOT(_3boTfN9V8u`FT.fSDnLRso*6qZT%kah3a$"djAG%'d=O3EoLF\InsW_.\0l_KPaTA1=YOS8]M"UU1:]JrGFO"'[_c2Qc4k#+jF=*lHoNkP!rfoQa%)?>4<=5SU(1EOQkqs7G>^nZXnL-XIQ9*R,SUc'gTd]V7[19uY@?[(@rdQEhH'RQ#ZFFmr1<,2c0Kb:?tq8#%,Qd2hb$qt(u4D\A27`,bSW'`?UIO&]`Z/6D:aNC,BgP8cjbWT8E]g'g0.$#r>.>X+\,/tp!i9%X*/eLBY'oYe?T[XLm\8V`-qVj6&>pc(S$+9Y@1\.`je8D(>k-l_)ODS$00eI@.+'234At!W.]/."Gjq'X6r^eSjQl_3VKP&Dn)C6*btk7GXl_'[dOC,TTr6;-T!B?-V@9'QL"[NYf(i!gj>%M#\r@V7ZtLAgb,8)TQd%4d02#\#OKH?Rg?AH02jmJ0[fNiAbX'?_p&5MNFFfS8H92"M)j;n`f49,l>qrMHA9g(:-J:Go=_niC4IJ=m'l^Ip;DW@eH'$gX>D8nrQsY4i.\UA:J,:[_ +endstream +endobj +627 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 626 0 R +>> +endobj +628 0 obj +<< /Length 1967 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0C;01_T&:Vs/@+(Cb9G!L@=Z1JjWPKcu%h**/>]Z6YE52eJ&YQRHYQ)=PA$@)1904^]bZOGFT6@u7G3+`H'CtMa1Yd5,s7Mf%Ok/IC6EEJ@$-u=\lA1ge,\fH3I6?h[GRa-qYSoV)mdUj$^c^!^ihV*$PEq/_84FKD]F%gn?6\]9DtU19emMZF(3nU76j#A%bpU'A&]"qPh"^I&?+2s'kL!`W-I$7lKi]:7m<\0SY2'ncA,@(%Y7:!D4%M\Ju@,P5Y(h#ELh9ZeIpcWkLD]+BJ^/MGN_bFRB05ceIC]%IB-&fj(OPUhQ,c#*#\U-]C]8:SRF,"i/$t6e<,,3FhUQf'\U&1%(a=(U:6OF"J3]?*Li*FnkXA4OL@<056N])__PN?j+&$nsJ93kqL*R>NX9k7E7nC2Vlgd52D_RnCXIQk!O,X3m)YRor$';rN9QE)6$Ag)SLpYNdlW2BTCZ;bZGT@M:0ppO[_jf:m=YfF875/j%*K'Wq^0toQW7:Z;nNe!ZdDdd+1RK/AbrOqK&'PCP<:_WJTV+Rep#ce^K-nR-j*uL081a/I`;-&,ZK2'JO9:M!@([;j9^RpiLZXR/`V/CZi68gDBN.*,6i#pJm:n)WLNlCStAR):m@kY;`;CH.'jRa=NV3._^$=6[^Tr>K)8XYE+`#EJuH_ch+ZtO`r&?5(@I%:Jfm'gKiDS&o0T.Ee5:o2[I:qV5LktI`S=WA7>ZRPk:,3E5%'F]I;[6":"I]%MX\77OZIhBV?,Y0RB"b'aOo4XIs6$MBE#n3@[B5?(3b%m)XfIP9:`XO%[cd.2$sn%"+^!EYSM[YF";0O0Uu/?/oWO?M]*Z;+E3>]tRGJa.?mN)beY=e&N9e)b,RnU!?m^.m2i^I8gtA[YR0in7#cN:(OVrJnG<9:poIg_+[tF5i!Y'&2\aK=>&.Hrr"d]VuV^4oo_JV@`o57GH%i-W?ica<[:'.m+s$.S][PH1PS]4t4Il"IG%%YGEU5T)B*-(4JF~> +endstream +endobj +629 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 628 0 R +>> +endobj +630 0 obj +<< /Length 332 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GarW3btc/1&;9LtMERgL(u)(XjQIqN0Zp"-Q`@'30Pr6OKhA'-0:Wa8'Hpgqa5>21/o:/V0H_3@YceXn@mg=o7j+Yb'3HA$^ja'GDTiOW.3$W9f'?/rW\(X$K<^TZaP(CZ"g9A,Y*@$L4WkQPe97!3*DpKSX)=(sgaj"I.ui*4ZBY?8$hiiY!hSu?$ehFkRnfYAS/_7,H1o)p$3D(I_0(*fLqYaJ +endstream +endobj +631 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 630 0 R +>> +endobj +632 0 obj +<< /Length 1960 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%%?#SIU'Rf_Zcsm,6WkKd'_ltt7L("o\-,s9F50spZ'9sl/P+CamO0hXO?<1#N":-9@kM3sB?;eH4\6?P[O.F5^SCM613ST8VGiI%nZ:mAR1Y5Ehc>)fq\alqpDpIY:;u>q:?F='nZ>J[B@<-7t-`l\"%ub\$)qOLCjb6q1D,69TIY9`05]V*Bf2j4.@3#bAgIC6\Q9&DJjD/PT_1pG5l2L,&faHNrU`(FYCKQSl_bPF$>3UI)bE&+.oTXdGpD-1[,#M'kV)[pq^%BoMiAo:o1PQGUA&@(09[uqY5"/kq_(KWf((-`RIA"9I3S40eYKe^H:o]4?TM>c'9e,DYtG])e:cAV;,pil7JV6G@5oFCU8^uJ_P2'4A(N=[S:D\"nQi$/U!8fEae.'XZte@rCA`N1Oa0LmSs#R[g>0#J8./QG*782XLLS8a3^"!B%gJec/e.^MadX=?t)7k+^6MTf?q,8==]Jc_q$.M]:i37/_F(a(5SC"Ha,;E#Ylcr(U#8m3+6.S`#p.L$09+;h$';ABm:X_grFkA<@VT\EL([A@Xt*W]l=B2:).=Q?"'-+*Xh'Q\AF"X'K3.afCMl1*K8b3g'Kh"&mX!49iG@.K'f&*qD\[ZBVQn9l'Q6cA-qPD&^h+g5Y'1:<+5QA@,+f.m>oZG_f82HK(&gUcQ5_O=utk<"R=7-.)[)jh1aDcNs3rduF[ZJYgj%cKMYTO_oTN3h&C9a5><\n%iap7G0?C'B\,#cuIOT!9]aWus\!'?6.nbT05?.E9LV:ES8s5eS=f)2'6^?]*KQB[0_iY[Q$Ed_`%J4MBB,,2D0':7f[!Fnm%B9ioMWdS&DSdo,\_:Fndj]`SeZKV3YXoNV.9N\StF*8Y/,-FiJLRVbjr_m7gt=>fd5I)HRhk^mjA9)RY^oK[/0>a[_RnS]QR$dhfN3&%n8ZDPQ~> +endstream +endobj +633 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 632 0 R +/Annots 634 0 R +>> +endobj +634 0 obj +[ +635 0 R +636 0 R +637 0 R +] +endobj +635 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 488.89 604.866 535.374 594.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://www.ietf.org/ipr) +/S /URI >> +/H /I +>> +endobj +636 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 92.0 593.866 144.783 583.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (http://www.ietf.org/ipr) +/S /URI >> +/H /I +>> +endobj +637 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 247.26 550.866 313.4 540.866 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (mailto:ietf-ipr@ietf.org) +/S /URI >> +/H /I +>> +endobj +638 0 obj +<< /Length 3115 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm?>AkH>(4OT5csm,Fe)?kQ\#bbp]A4/eC:"Lg+3)_g(939Cak`c-^5$bC%u4YX,9oGb3959I*e$3fEr>C\=5SG0(5*LciqE@O\bP`Q/5#\)(5fuT<+u]VjPk?lq"=<0p?VS@S&OiSg]'1<9KNPTOI?kedrrUQ0Ne+&@2KE];bT.Dh>c?HqtXU"C0U/YeT&,\Cq'*&]K,>FgV^%+rc._nc!j75#ub1q*p_?b^Y[WC(iuuPb!M?2aMm06AMMi6RMA:/A=D^::Y-73=%NcT_0'%U]F;/b7n7k(,Wknc_pX7m2Al6=Vs_l%@X(In?SE(Fl)KM^CU53I][F`jjV/\O?@;$JD`+@FX@c\u%9H?7s*fOV9AhYa0J-T!DKU,VZ;W78%$M2W"._FcOI%9Z`FE)'K?;SYmJ,AG;_bYL3aeZh:YSrP<,l'oGk%0cqlXcXdD;j[mRB:I^hs.YqdAm-X7^Lhg)2/l&qqMB@4!:M!O9biB;_XtRiUeed])k^O-&#fkNf/_%2ocdfd03X$1lVMJ1,5JFhP5;C/:C110,Ak.7\Hb[&lm8^%lBr/t&>>'E"$.Dc"+b+cs71IH-(Xg"#$d*CT#@jR`)(gXsB*\QCt/q:TXqMVnAEH`iD_&1h[S5c0^%9dlM0XS5f(h7U8S_0<>tF3VZB0$;FP:6s`[L)Y&[RSP4'F)L<-QeEs'Vn!P*@jd6Qe=T+N]bp2%r)i?&RF8nCo8NVicM;#J($i)RZ`F#k:!W=*Xca!r)VaSD-KBQ`R]$U,OL!\r,036\Qlp3%-VJsmK"O$,(3!JJ;!qu?M.0qS,9Y,q-0j3?4+`FRj>fObeZV&!bn5VABB0p_@2]9,N(%eB=8nGscigHeSt>'T;"8WS*bW&%^9C$bZqmj$Qol:%bjajBlj(frZF+>%+u?JuC3aO]-f8PMgcUohA4DlZ\IJBLInj=B@Ugs\TB6W^ie.(+qCNngCcZLd6lIF%L-0,UmH](H>!-eTc*@_j>@%JR)SZBdQ-K"aQdV,g"f'_SkeJ1?+o#XD7;ger?r6SaZek5/]JM=`6V$)(:^\o"\i';.?3`&FH\t0olt*<-Ce3;h'P>:+aY@oL#gr#_SX_0>\96dS6+ROS$E"\KTXZ)&$9kb[VWAC!6iXTF4@HFR3G@,m28@:Q`3#/7qig)OOpbQigP:dc*t4\\*o5'6.Gj04?FE3"OF^o%^!=7Kan=,oAl?:s^uWAYB0aS>J#:iJ_9jfHX#3!pWr0@,\bmA?]IW6=A"o?Vi.g!\CucP:W+e%uYF;([s!ikaY;<$#\k2quPIT6)KbmaXI#)Dr@tE=%W`V'>(bkL`(4>LU$P:UOG$bLEZ/Feh[Tadi#sP0i"]$k(l,?_/rYMg&mL_2'.VOeKt.<7(D_]0C!D2f!VeLd0j\PFDk,,DRgYEn)?)P81(S!MQt7(gQ9h./j,jX3mCTV.T'>,\RB'od^0CGBGoM4i`[,V$]p`e(ZsE?l4-LK6LLpfUJN;M)8h[-M:(@GEI:-oXG2`=.B_9O(-XB_J:FMD)RQ,lD]AU2r*K8GpeY[`q=>.]VfVWS);lUT(N\ZZAO)h4(pRU:BlSO>!rRZ_9*^[sa4DfV5DX4Z8rM\eZ4-45SR54uPSV:eI*@J&oP)&mR_bVr0rn^%'.ff`G^O0kYV>(bV23LsAQt:lEH,fl$K5E_&2p$jOc(g4Lj'D7QMJ11Mh'uh?poaUOj.*ET2/XV'O"c<\E!P1B$%[0ja&0u;;).A0iGMd[unNHR'8=]J59C=&sqJ%a6sDZ4T)oF6aMB]l3kd/r2qWhph@TS!aQ]uWFqbm(Ij)cq*?7naQ1nmj/9#<$?R]t:r-AufZIHd?jS]lbT3+c13ZbYf_"IT_s\L"N#sP>#PD`gpPg'1QUs8+,\lVph\gW=U?3R\&@A`Gf+eSRg&0tB9FoSX5&"G"S)Z+pKO7t/$UZV)QF4@>DUu*KjW)Gr9_`M.o*u\,/=$G:mMKTrGK2ZD^H9G\q#)q-j7c+r'>M.d8\jeX==/K@^Og'S+?i_FpilH_BU5Du'i])B,fcb[*_s+AIMlqWe%&;/m(XG6L#!H85MRg)m^>blQEo"CXTp5bi.bX`?o^UAD\m^%'7?t&nB+J.p6-9L.IF=s6_asD_eHi4P69td,0H&sHXe99YA^H.qfb9ZT1C8tT7!`#X,"k$n4OiAOU2AbqhNPme_T3Rp+j\eQ)n_)=EIEo?TD9%rom\@Qc-<'8_WR:>5ci&YTK9I"/C>D<4UoJH~> +endstream +endobj +639 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 638 0 R +/Annots 640 0 R +>> +endobj +640 0 obj +[ +] +endobj +643 0 obj +<< + /Title (\376\377\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\157\0\146\0\40\0\164\0\150\0\151\0\163\0\40\0\115\0\145\0\155\0\157) + /Parent 641 0 R + /Next 645 0 R + /A 642 0 R +>> endobj +645 0 obj +<< + /Title (\376\377\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\116\0\157\0\164\0\151\0\143\0\145) + /Parent 641 0 R + /Prev 643 0 R + /Next 647 0 R + /A 644 0 R +>> endobj +647 0 obj +<< + /Title (\376\377\0\101\0\142\0\163\0\164\0\162\0\141\0\143\0\164) + /Parent 641 0 R + /Prev 645 0 R + /Next 649 0 R + /A 646 0 R +>> endobj +649 0 obj +<< + /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163) + /Parent 641 0 R + /Prev 647 0 R + /Next 650 0 R + /A 648 0 R +>> endobj +650 0 obj +<< + /Title (\376\377\0\61\0\40\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156) + /Parent 641 0 R + /First 651 0 R + /Last 653 0 R + /Prev 649 0 R + /Next 655 0 R + /Count -3 + /A 11 0 R +>> endobj +651 0 obj +<< + /Title (\376\377\0\61\0\56\0\61\0\40\0\116\0\157\0\164\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\157\0\156\0\166\0\145\0\156\0\164\0\151\0\157\0\156\0\163) + /Parent 650 0 R + /Next 652 0 R + /A 13 0 R +>> endobj +652 0 obj +<< + /Title (\376\377\0\61\0\56\0\62\0\40\0\130\0\115\0\114\0\40\0\116\0\141\0\155\0\145\0\163\0\160\0\141\0\143\0\145\0\163\0\40\0\141\0\156\0\144\0\40\0\120\0\162\0\157\0\143\0\145\0\163\0\163\0\151\0\156\0\147) + /Parent 650 0 R + /Prev 651 0 R + /Next 653 0 R + /A 15 0 R +>> endobj +653 0 obj +<< + /Title (\376\377\0\61\0\56\0\63\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\120\0\162\0\145\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\163\0\40\0\141\0\156\0\144\0\40\0\120\0\157\0\163\0\164\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\163) + /Parent 650 0 R + /Prev 652 0 R + /A 17 0 R +>> endobj +655 0 obj +<< + /Title (\376\377\0\62\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\155\0\145\0\156\0\164\0\163\0\40\0\117\0\166\0\145\0\162\0\166\0\151\0\145\0\167) + /Parent 641 0 R + /Prev 650 0 R + /Next 657 0 R + /A 654 0 R +>> endobj +657 0 obj +<< + /Title (\376\377\0\63\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\151\0\156\0\147\0\40\0\104\0\141\0\164\0\141\0\40\0\115\0\157\0\144\0\145\0\154) + /Parent 641 0 R + /First 658 0 R + /Last 660 0 R + /Prev 655 0 R + /Next 661 0 R + /Count -2 + /A 656 0 R +>> endobj +658 0 obj +<< + /Title (\376\377\0\63\0\56\0\61\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\123\0\145\0\162\0\166\0\145\0\162) + /Parent 657 0 R + /Next 660 0 R + /A 23 0 R +>> endobj +660 0 obj +<< + /Title (\376\377\0\63\0\56\0\62\0\40\0\122\0\145\0\143\0\165\0\162\0\162\0\145\0\156\0\143\0\145\0\40\0\141\0\156\0\144\0\40\0\164\0\150\0\145\0\40\0\104\0\141\0\164\0\141\0\40\0\115\0\157\0\144\0\145\0\154) + /Parent 657 0 R + /Prev 658 0 R + /A 659 0 R +>> endobj +661 0 obj +<< + /Title (\376\377\0\64\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163) + /Parent 641 0 R + /First 663 0 R + /Last 665 0 R + /Prev 657 0 R + /Next 666 0 R + /Count -2 + /A 27 0 R +>> endobj +663 0 obj +<< + /Title (\376\377\0\64\0\56\0\61\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\117\0\142\0\152\0\145\0\143\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163) + /Parent 661 0 R + /Next 665 0 R + /A 662 0 R +>> endobj +665 0 obj +<< + /Title (\376\377\0\64\0\56\0\62\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156) + /Parent 661 0 R + /Prev 663 0 R + /A 664 0 R +>> endobj +666 0 obj +<< + /Title (\376\377\0\65\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145) + /Parent 641 0 R + /First 667 0 R + /Last 690 0 R + /Prev 661 0 R + /Next 701 0 R + /Count -21 + /A 33 0 R +>> endobj +667 0 obj +<< + /Title (\376\377\0\65\0\56\0\61\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\123\0\165\0\160\0\160\0\157\0\162\0\164) + /Parent 666 0 R + /First 668 0 R + /Last 668 0 R + /Next 669 0 R + /Count -1 + /A 35 0 R +>> endobj +668 0 obj +<< + /Title (\376\377\0\65\0\56\0\61\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\146\0\157\0\162\0\40\0\164\0\150\0\145\0\40\0\104\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171\0\40\0\157\0\146\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\123\0\165\0\160\0\160\0\157\0\162\0\164) + /Parent 667 0 R + /A 37 0 R +>> endobj +669 0 obj +<< + /Title (\376\377\0\65\0\56\0\62\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163) + /Parent 666 0 R + /First 671 0 R + /Last 688 0 R + /Prev 667 0 R + /Next 690 0 R + /Count -10 + /A 39 0 R +>> endobj +671 0 obj +<< + /Title (\376\377\0\65\0\56\0\62\0\56\0\61\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\55\0\144\0\145\0\163\0\143\0\162\0\151\0\160\0\164\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 669 0 R + /Next 673 0 R + /A 670 0 R +>> endobj +673 0 obj +<< + /Title (\376\377\0\65\0\56\0\62\0\56\0\62\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\55\0\164\0\151\0\155\0\145\0\172\0\157\0\156\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 669 0 R + /Prev 671 0 R + /Next 675 0 R + /A 672 0 R +>> endobj +675 0 obj +<< + /Title (\376\377\0\65\0\56\0\62\0\56\0\63\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\55\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\55\0\143\0\157\0\155\0\160\0\157\0\156\0\145\0\156\0\164\0\55\0\163\0\145\0\164\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 669 0 R + /Prev 673 0 R + /Next 677 0 R + /A 674 0 R +>> endobj +677 0 obj +<< + /Title (\376\377\0\65\0\56\0\62\0\56\0\64\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\55\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\55\0\144\0\141\0\164\0\141\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 669 0 R + /Prev 675 0 R + /Next 679 0 R + /A 676 0 R +>> endobj +679 0 obj +<< + /Title (\376\377\0\65\0\56\0\62\0\56\0\65\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\155\0\141\0\170\0\55\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\55\0\163\0\151\0\172\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 669 0 R + /Prev 677 0 R + /Next 681 0 R + /A 678 0 R +>> endobj +681 0 obj +<< + /Title (\376\377\0\65\0\56\0\62\0\56\0\66\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\155\0\151\0\156\0\55\0\144\0\141\0\164\0\145\0\55\0\164\0\151\0\155\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 669 0 R + /Prev 679 0 R + /Next 683 0 R + /A 680 0 R +>> endobj +683 0 obj +<< + /Title (\376\377\0\65\0\56\0\62\0\56\0\67\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\155\0\141\0\170\0\55\0\144\0\141\0\164\0\145\0\55\0\164\0\151\0\155\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 669 0 R + /Prev 681 0 R + /Next 685 0 R + /A 682 0 R +>> endobj +685 0 obj +<< + /Title (\376\377\0\65\0\56\0\62\0\56\0\70\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\155\0\141\0\170\0\55\0\151\0\156\0\163\0\164\0\141\0\156\0\143\0\145\0\163\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 669 0 R + /Prev 683 0 R + /Next 687 0 R + /A 684 0 R +>> endobj +687 0 obj +<< + /Title (\376\377\0\65\0\56\0\62\0\56\0\71\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\155\0\141\0\170\0\55\0\141\0\164\0\164\0\145\0\156\0\144\0\145\0\145\0\163\0\55\0\160\0\145\0\162\0\55\0\151\0\156\0\163\0\164\0\141\0\156\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 669 0 R + /Prev 685 0 R + /Next 688 0 R + /A 686 0 R +>> endobj +688 0 obj +<< + /Title (\376\377\0\65\0\56\0\62\0\56\0\61\0\60\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\120\0\162\0\145\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\40\0\146\0\157\0\162\0\40\0\120\0\122\0\117\0\120\0\120\0\101\0\124\0\103\0\110) + /Parent 669 0 R + /Prev 687 0 R + /A 59 0 R +>> endobj +690 0 obj +<< + /Title (\376\377\0\65\0\56\0\63\0\40\0\103\0\162\0\145\0\141\0\164\0\151\0\156\0\147\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163) + /Parent 666 0 R + /First 692 0 R + /Last 700 0 R + /Prev 669 0 R + /Count -7 + /A 689 0 R +>> endobj +692 0 obj +<< + /Title (\376\377\0\65\0\56\0\63\0\56\0\61\0\40\0\115\0\113\0\103\0\101\0\114\0\105\0\116\0\104\0\101\0\122\0\40\0\115\0\145\0\164\0\150\0\157\0\144) + /Parent 690 0 R + /First 693 0 R + /Last 694 0 R + /Next 695 0 R + /Count -2 + /A 691 0 R +>> endobj +693 0 obj +<< + /Title (\376\377\0\65\0\56\0\63\0\56\0\61\0\56\0\61\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163) + /Parent 692 0 R + /Next 694 0 R + /A 65 0 R +>> endobj +694 0 obj +<< + /Title (\376\377\0\65\0\56\0\63\0\56\0\61\0\56\0\62\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\123\0\165\0\143\0\143\0\145\0\163\0\163\0\146\0\165\0\154\0\40\0\115\0\113\0\103\0\101\0\114\0\105\0\116\0\104\0\101\0\122\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164) + /Parent 692 0 R + /Prev 693 0 R + /A 67 0 R +>> endobj +695 0 obj +<< + /Title (\376\377\0\65\0\56\0\63\0\56\0\62\0\40\0\103\0\162\0\145\0\141\0\164\0\151\0\156\0\147\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\117\0\142\0\152\0\145\0\143\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163) + /Parent 690 0 R + /First 697 0 R + /Last 697 0 R + /Prev 692 0 R + /Next 698 0 R + /Count -1 + /A 69 0 R +>> endobj +697 0 obj +<< + /Title (\376\377\0\65\0\56\0\63\0\56\0\62\0\56\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\120\0\162\0\145\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\163\0\40\0\146\0\157\0\162\0\40\0\120\0\125\0\124\0\54\0\40\0\103\0\117\0\120\0\131\0\54\0\40\0\141\0\156\0\144\0\40\0\115\0\117\0\126\0\105) + /Parent 695 0 R + /A 696 0 R +>> endobj +698 0 obj +<< + /Title (\376\377\0\65\0\56\0\63\0\56\0\63\0\40\0\116\0\157\0\156\0\55\0\123\0\164\0\141\0\156\0\144\0\141\0\162\0\144\0\40\0\103\0\157\0\155\0\160\0\157\0\156\0\145\0\156\0\164\0\163\0\54\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163\0\54\0\40\0\141\0\156\0\144\0\40\0\120\0\141\0\162\0\141\0\155\0\145\0\164\0\145\0\162\0\163) + /Parent 690 0 R + /Prev 695 0 R + /Next 700 0 R + /A 73 0 R +>> endobj +700 0 obj +<< + /Title (\376\377\0\65\0\56\0\63\0\56\0\64\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\117\0\142\0\152\0\145\0\143\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\105\0\156\0\164\0\151\0\164\0\171\0\40\0\124\0\141\0\147) + /Parent 690 0 R + /Prev 698 0 R + /A 699 0 R +>> endobj +701 0 obj +<< + /Title (\376\377\0\66\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\151\0\156\0\147\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154) + /Parent 641 0 R + /First 703 0 R + /Last 707 0 R + /Prev 666 0 R + /Next 711 0 R + /Count -4 + /A 77 0 R +>> endobj +703 0 obj +<< + /Title (\376\377\0\66\0\56\0\61\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\151\0\156\0\147\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145) + /Parent 701 0 R + /First 705 0 R + /Last 705 0 R + /Next 707 0 R + /Count -1 + /A 702 0 R +>> endobj +705 0 obj +<< + /Title (\376\377\0\66\0\56\0\61\0\56\0\61\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\162\0\145\0\141\0\144\0\55\0\146\0\162\0\145\0\145\0\55\0\142\0\165\0\163\0\171\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145) + /Parent 703 0 R + /A 704 0 R +>> endobj +707 0 obj +<< + /Title (\376\377\0\66\0\56\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\120\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 701 0 R + /First 709 0 R + /Last 709 0 R + /Prev 703 0 R + /Count -1 + /A 706 0 R +>> endobj +709 0 obj +<< + /Title (\376\377\0\66\0\56\0\62\0\56\0\61\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\55\0\150\0\157\0\155\0\145\0\55\0\163\0\145\0\164\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 707 0 R + /A 708 0 R +>> endobj +711 0 obj +<< + /Title (\376\377\0\67\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\151\0\156\0\147\0\40\0\122\0\145\0\160\0\157\0\162\0\164\0\163) + /Parent 641 0 R + /First 713 0 R + /Last 739 0 R + /Prev 701 0 R + /Next 741 0 R + /Count -23 + /A 710 0 R +>> endobj +713 0 obj +<< + /Title (\376\377\0\67\0\56\0\61\0\40\0\122\0\105\0\120\0\117\0\122\0\124\0\40\0\115\0\145\0\164\0\150\0\157\0\144) + /Parent 711 0 R + /Next 714 0 R + /A 712 0 R +>> endobj +714 0 obj +<< + /Title (\376\377\0\67\0\56\0\62\0\40\0\117\0\162\0\144\0\151\0\156\0\141\0\162\0\171\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163) + /Parent 711 0 R + /Prev 713 0 R + /Next 715 0 R + /A 91 0 R +>> endobj +715 0 obj +<< + /Title (\376\377\0\67\0\56\0\63\0\40\0\104\0\141\0\164\0\145\0\40\0\141\0\156\0\144\0\40\0\106\0\154\0\157\0\141\0\164\0\151\0\156\0\147\0\40\0\124\0\151\0\155\0\145) + /Parent 711 0 R + /Prev 714 0 R + /Next 716 0 R + /A 93 0 R +>> endobj +716 0 obj +<< + /Title (\376\377\0\67\0\56\0\64\0\40\0\124\0\151\0\155\0\145\0\40\0\122\0\141\0\156\0\147\0\145\0\40\0\106\0\151\0\154\0\164\0\145\0\162\0\151\0\156\0\147) + /Parent 711 0 R + /Prev 715 0 R + /Next 718 0 R + /A 95 0 R +>> endobj +718 0 obj +<< + /Title (\376\377\0\67\0\56\0\65\0\40\0\123\0\145\0\141\0\162\0\143\0\150\0\151\0\156\0\147\0\40\0\124\0\145\0\170\0\164\0\72\0\40\0\103\0\157\0\154\0\154\0\141\0\164\0\151\0\157\0\156\0\163) + /Parent 711 0 R + /First 720 0 R + /Last 720 0 R + /Prev 716 0 R + /Next 721 0 R + /Count -1 + /A 717 0 R +>> endobj +720 0 obj +<< + /Title (\376\377\0\67\0\56\0\65\0\56\0\61\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\55\0\143\0\157\0\154\0\154\0\141\0\164\0\151\0\157\0\156\0\55\0\163\0\145\0\164\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 718 0 R + /A 719 0 R +>> endobj +721 0 obj +<< + /Title (\376\377\0\67\0\56\0\66\0\40\0\120\0\141\0\162\0\164\0\151\0\141\0\154\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\141\0\154) + /Parent 711 0 R + /Prev 718 0 R + /Next 722 0 R + /A 104 0 R +>> endobj +722 0 obj +<< + /Title (\376\377\0\67\0\56\0\67\0\40\0\116\0\157\0\156\0\55\0\123\0\164\0\141\0\156\0\144\0\141\0\162\0\144\0\40\0\103\0\157\0\155\0\160\0\157\0\156\0\145\0\156\0\164\0\163\0\54\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163\0\54\0\40\0\141\0\156\0\144\0\40\0\120\0\141\0\162\0\141\0\155\0\145\0\164\0\145\0\162\0\163) + /Parent 711 0 R + /Prev 721 0 R + /Next 724 0 R + /A 106 0 R +>> endobj +724 0 obj +<< + /Title (\376\377\0\67\0\56\0\70\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\55\0\161\0\165\0\145\0\162\0\171\0\40\0\122\0\105\0\120\0\117\0\122\0\124) + /Parent 711 0 R + /First 725 0 R + /Last 734 0 R + /Prev 722 0 R + /Next 736 0 R + /Count -10 + /A 723 0 R +>> endobj +725 0 obj +<< + /Title (\376\377\0\67\0\56\0\70\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\120\0\141\0\162\0\164\0\151\0\141\0\154\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\141\0\154\0\40\0\157\0\146\0\40\0\105\0\166\0\145\0\156\0\164\0\163\0\40\0\142\0\171\0\40\0\124\0\151\0\155\0\145\0\40\0\122\0\141\0\156\0\147\0\145) + /Parent 724 0 R + /Next 726 0 R + /A 110 0 R +>> endobj +726 0 obj +<< + /Title (\376\377\0\67\0\56\0\70\0\56\0\62\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\120\0\141\0\162\0\164\0\151\0\141\0\154\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\141\0\154\0\40\0\157\0\146\0\40\0\122\0\145\0\143\0\165\0\162\0\162\0\151\0\156\0\147\0\40\0\105\0\166\0\145\0\156\0\164\0\163) + /Parent 724 0 R + /Prev 725 0 R + /Next 727 0 R + /A 112 0 R +>> endobj +727 0 obj +<< + /Title (\376\377\0\67\0\56\0\70\0\56\0\63\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\105\0\170\0\160\0\141\0\156\0\144\0\145\0\144\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\141\0\154\0\40\0\157\0\146\0\40\0\122\0\145\0\143\0\165\0\162\0\162\0\151\0\156\0\147\0\40\0\105\0\166\0\145\0\156\0\164\0\163) + /Parent 724 0 R + /Prev 726 0 R + /Next 728 0 R + /A 114 0 R +>> endobj +728 0 obj +<< + /Title (\376\377\0\67\0\56\0\70\0\56\0\64\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\120\0\141\0\162\0\164\0\151\0\141\0\154\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\141\0\154\0\40\0\157\0\146\0\40\0\123\0\164\0\157\0\162\0\145\0\144\0\40\0\106\0\162\0\145\0\145\0\40\0\102\0\165\0\163\0\171\0\40\0\103\0\157\0\155\0\160\0\157\0\156\0\145\0\156\0\164\0\163) + /Parent 724 0 R + /Prev 727 0 R + /Next 729 0 R + /A 116 0 R +>> endobj +729 0 obj +<< + /Title (\376\377\0\67\0\56\0\70\0\56\0\65\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\141\0\154\0\40\0\157\0\146\0\40\0\124\0\157\0\55\0\104\0\157\0\163\0\40\0\142\0\171\0\40\0\101\0\154\0\141\0\162\0\155\0\40\0\124\0\151\0\155\0\145\0\40\0\122\0\141\0\156\0\147\0\145) + /Parent 724 0 R + /Prev 728 0 R + /Next 730 0 R + /A 118 0 R +>> endobj +730 0 obj +<< + /Title (\376\377\0\67\0\56\0\70\0\56\0\66\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\141\0\154\0\40\0\157\0\146\0\40\0\105\0\166\0\145\0\156\0\164\0\40\0\142\0\171\0\40\0\125\0\111\0\104) + /Parent 724 0 R + /Prev 729 0 R + /Next 731 0 R + /A 120 0 R +>> endobj +731 0 obj +<< + /Title (\376\377\0\67\0\56\0\70\0\56\0\67\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\141\0\154\0\40\0\157\0\146\0\40\0\105\0\166\0\145\0\156\0\164\0\163\0\40\0\142\0\171\0\40\0\120\0\101\0\122\0\124\0\123\0\124\0\101\0\124) + /Parent 724 0 R + /Prev 730 0 R + /Next 732 0 R + /A 122 0 R +>> endobj +732 0 obj +<< + /Title (\376\377\0\67\0\56\0\70\0\56\0\70\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\141\0\154\0\40\0\157\0\146\0\40\0\105\0\166\0\145\0\156\0\164\0\163\0\40\0\117\0\156\0\154\0\171) + /Parent 724 0 R + /Prev 731 0 R + /Next 733 0 R + /A 124 0 R +>> endobj +733 0 obj +<< + /Title (\376\377\0\67\0\56\0\70\0\56\0\71\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\141\0\154\0\40\0\157\0\146\0\40\0\101\0\154\0\154\0\40\0\120\0\145\0\156\0\144\0\151\0\156\0\147\0\40\0\124\0\157\0\55\0\104\0\157\0\163) + /Parent 724 0 R + /Prev 732 0 R + /Next 734 0 R + /A 126 0 R +>> endobj +734 0 obj +<< + /Title (\376\377\0\67\0\56\0\70\0\56\0\61\0\60\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\101\0\164\0\164\0\145\0\155\0\160\0\164\0\40\0\164\0\157\0\40\0\121\0\165\0\145\0\162\0\171\0\40\0\125\0\156\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171) + /Parent 724 0 R + /Prev 733 0 R + /A 128 0 R +>> endobj +736 0 obj +<< + /Title (\376\377\0\67\0\56\0\71\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\55\0\155\0\165\0\154\0\164\0\151\0\147\0\145\0\164\0\40\0\122\0\105\0\120\0\117\0\122\0\124) + /Parent 711 0 R + /First 737 0 R + /Last 737 0 R + /Prev 724 0 R + /Next 739 0 R + /Count -1 + /A 735 0 R +>> endobj +737 0 obj +<< + /Title (\376\377\0\67\0\56\0\71\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\123\0\165\0\143\0\143\0\145\0\163\0\163\0\146\0\165\0\154\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\55\0\155\0\165\0\154\0\164\0\151\0\147\0\145\0\164\0\40\0\122\0\105\0\120\0\117\0\122\0\124) + /Parent 736 0 R + /A 132 0 R +>> endobj +739 0 obj +<< + /Title (\376\377\0\67\0\56\0\61\0\60\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\146\0\162\0\145\0\145\0\55\0\142\0\165\0\163\0\171\0\55\0\161\0\165\0\145\0\162\0\171\0\40\0\122\0\105\0\120\0\117\0\122\0\124) + /Parent 711 0 R + /First 740 0 R + /Last 740 0 R + /Prev 736 0 R + /Count -1 + /A 738 0 R +>> endobj +740 0 obj +<< + /Title (\376\377\0\67\0\56\0\61\0\60\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\123\0\165\0\143\0\143\0\145\0\163\0\163\0\146\0\165\0\154\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\146\0\162\0\145\0\145\0\55\0\142\0\165\0\163\0\171\0\55\0\161\0\165\0\145\0\162\0\171\0\40\0\122\0\105\0\120\0\117\0\122\0\124) + /Parent 739 0 R + /A 136 0 R +>> endobj +741 0 obj +<< + /Title (\376\377\0\70\0\40\0\107\0\165\0\151\0\144\0\145\0\154\0\151\0\156\0\145\0\163) + /Parent 641 0 R + /First 742 0 R + /Last 754 0 R + /Prev 711 0 R + /Next 755 0 R + /Count -13 + /A 138 0 R +>> endobj +742 0 obj +<< + /Title (\376\377\0\70\0\56\0\61\0\40\0\103\0\154\0\151\0\145\0\156\0\164\0\55\0\164\0\157\0\55\0\103\0\154\0\151\0\145\0\156\0\164\0\40\0\111\0\156\0\164\0\145\0\162\0\157\0\160\0\145\0\162\0\141\0\142\0\151\0\154\0\151\0\164\0\171) + /Parent 741 0 R + /Next 743 0 R + /A 140 0 R +>> endobj +743 0 obj +<< + /Title (\376\377\0\70\0\56\0\62\0\40\0\123\0\171\0\156\0\143\0\150\0\162\0\157\0\156\0\151\0\172\0\141\0\164\0\151\0\157\0\156\0\40\0\117\0\160\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163) + /Parent 741 0 R + /First 744 0 R + /Last 748 0 R + /Prev 742 0 R + /Next 749 0 R + /Count -5 + /A 142 0 R +>> endobj +744 0 obj +<< + /Title (\376\377\0\70\0\56\0\62\0\56\0\61\0\40\0\125\0\163\0\145\0\40\0\157\0\146\0\40\0\122\0\145\0\160\0\157\0\162\0\164\0\163) + /Parent 743 0 R + /First 745 0 R + /Last 747 0 R + /Next 748 0 R + /Count -3 + /A 144 0 R +>> endobj +745 0 obj +<< + /Title (\376\377\0\70\0\56\0\62\0\56\0\61\0\56\0\61\0\40\0\122\0\145\0\163\0\164\0\162\0\151\0\143\0\164\0\40\0\164\0\150\0\145\0\40\0\124\0\151\0\155\0\145\0\40\0\122\0\141\0\156\0\147\0\145) + /Parent 744 0 R + /Next 746 0 R + /A 146 0 R +>> endobj +746 0 obj +<< + /Title (\376\377\0\70\0\56\0\62\0\56\0\61\0\56\0\62\0\40\0\123\0\171\0\156\0\143\0\150\0\162\0\157\0\156\0\151\0\172\0\145\0\40\0\142\0\171\0\40\0\124\0\151\0\155\0\145\0\40\0\122\0\141\0\156\0\147\0\145) + /Parent 744 0 R + /Prev 745 0 R + /Next 747 0 R + /A 148 0 R +>> endobj +747 0 obj +<< + /Title (\376\377\0\70\0\56\0\62\0\56\0\61\0\56\0\63\0\40\0\123\0\171\0\156\0\143\0\150\0\162\0\157\0\156\0\151\0\172\0\141\0\164\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\143\0\145\0\163\0\163) + /Parent 744 0 R + /Prev 746 0 R + /A 150 0 R +>> endobj +748 0 obj +<< + /Title (\376\377\0\70\0\56\0\62\0\56\0\62\0\40\0\122\0\145\0\163\0\164\0\162\0\151\0\143\0\164\0\40\0\164\0\150\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163\0\40\0\122\0\145\0\164\0\165\0\162\0\156\0\145\0\144) + /Parent 743 0 R + /Prev 744 0 R + /A 152 0 R +>> endobj +749 0 obj +<< + /Title (\376\377\0\70\0\56\0\63\0\40\0\125\0\163\0\145\0\40\0\157\0\146\0\40\0\114\0\157\0\143\0\153\0\151\0\156\0\147) + /Parent 741 0 R + /Prev 743 0 R + /Next 750 0 R + /A 154 0 R +>> endobj +750 0 obj +<< + /Title (\376\377\0\70\0\56\0\64\0\40\0\106\0\151\0\156\0\144\0\151\0\156\0\147\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\163) + /Parent 741 0 R + /Prev 749 0 R + /Next 751 0 R + /A 156 0 R +>> endobj +751 0 obj +<< + /Title (\376\377\0\70\0\56\0\65\0\40\0\123\0\164\0\157\0\162\0\151\0\156\0\147\0\40\0\141\0\156\0\144\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\101\0\164\0\164\0\141\0\143\0\150\0\155\0\145\0\156\0\164\0\163) + /Parent 741 0 R + /First 752 0 R + /Last 753 0 R + /Prev 750 0 R + /Next 754 0 R + /Count -2 + /A 158 0 R +>> endobj +752 0 obj +<< + /Title (\376\377\0\70\0\56\0\65\0\56\0\61\0\40\0\111\0\156\0\154\0\151\0\156\0\145\0\40\0\101\0\164\0\164\0\141\0\143\0\150\0\155\0\145\0\156\0\164\0\163) + /Parent 751 0 R + /Next 753 0 R + /A 160 0 R +>> endobj +753 0 obj +<< + /Title (\376\377\0\70\0\56\0\65\0\56\0\62\0\40\0\105\0\170\0\164\0\145\0\162\0\156\0\141\0\154\0\40\0\101\0\164\0\164\0\141\0\143\0\150\0\155\0\145\0\156\0\164\0\163) + /Parent 751 0 R + /Prev 752 0 R + /A 162 0 R +>> endobj +754 0 obj +<< + /Title (\376\377\0\70\0\56\0\66\0\40\0\123\0\164\0\157\0\162\0\151\0\156\0\147\0\40\0\141\0\156\0\144\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\101\0\154\0\141\0\162\0\155\0\163) + /Parent 741 0 R + /Prev 751 0 R + /A 164 0 R +>> endobj +755 0 obj +<< + /Title (\376\377\0\71\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\40\0\104\0\145\0\146\0\151\0\156\0\151\0\164\0\151\0\157\0\156\0\163) + /Parent 641 0 R + /First 757 0 R + /Last 800 0 R + /Prev 741 0 R + /Next 801 0 R + /Count -23 + /A 166 0 R +>> endobj +757 0 obj +<< + /Title (\376\377\0\71\0\56\0\61\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 755 0 R + /Next 759 0 R + /A 756 0 R +>> endobj +759 0 obj +<< + /Title (\376\377\0\71\0\56\0\62\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\155\0\153\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 755 0 R + /Prev 757 0 R + /Next 761 0 R + /A 758 0 R +>> endobj +761 0 obj +<< + /Title (\376\377\0\71\0\56\0\63\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\155\0\153\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\55\0\162\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 755 0 R + /Prev 759 0 R + /Next 763 0 R + /A 760 0 R +>> endobj +763 0 obj +<< + /Title (\376\377\0\71\0\56\0\64\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\55\0\143\0\157\0\154\0\154\0\141\0\164\0\151\0\157\0\156\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 755 0 R + /Prev 761 0 R + /Next 765 0 R + /A 762 0 R +>> endobj +765 0 obj +<< + /Title (\376\377\0\71\0\56\0\65\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\55\0\161\0\165\0\145\0\162\0\171\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 755 0 R + /Prev 763 0 R + /Next 767 0 R + /A 764 0 R +>> endobj +767 0 obj +<< + /Title (\376\377\0\71\0\56\0\66\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\55\0\144\0\141\0\164\0\141\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 755 0 R + /First 769 0 R + /Last 781 0 R + /Prev 765 0 R + /Next 783 0 R + /Count -7 + /A 766 0 R +>> endobj +769 0 obj +<< + /Title (\376\377\0\71\0\56\0\66\0\56\0\61\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\143\0\157\0\155\0\160\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 767 0 R + /Next 771 0 R + /A 768 0 R +>> endobj +771 0 obj +<< + /Title (\376\377\0\71\0\56\0\66\0\56\0\62\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\141\0\154\0\154\0\143\0\157\0\155\0\160\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 767 0 R + /Prev 769 0 R + /Next 773 0 R + /A 770 0 R +>> endobj +773 0 obj +<< + /Title (\376\377\0\71\0\56\0\66\0\56\0\63\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\141\0\154\0\154\0\160\0\162\0\157\0\160\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 767 0 R + /Prev 771 0 R + /Next 775 0 R + /A 772 0 R +>> endobj +775 0 obj +<< + /Title (\376\377\0\71\0\56\0\66\0\56\0\64\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\160\0\162\0\157\0\160\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 767 0 R + /Prev 773 0 R + /Next 777 0 R + /A 774 0 R +>> endobj +777 0 obj +<< + /Title (\376\377\0\71\0\56\0\66\0\56\0\65\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\145\0\170\0\160\0\141\0\156\0\144\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 767 0 R + /Prev 775 0 R + /Next 779 0 R + /A 776 0 R +>> endobj +779 0 obj +<< + /Title (\376\377\0\71\0\56\0\66\0\56\0\66\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\154\0\151\0\155\0\151\0\164\0\55\0\162\0\145\0\143\0\165\0\162\0\162\0\145\0\156\0\143\0\145\0\55\0\163\0\145\0\164\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 767 0 R + /Prev 777 0 R + /Next 781 0 R + /A 778 0 R +>> endobj +781 0 obj +<< + /Title (\376\377\0\71\0\56\0\66\0\56\0\67\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\154\0\151\0\155\0\151\0\164\0\55\0\146\0\162\0\145\0\145\0\142\0\165\0\163\0\171\0\55\0\163\0\145\0\164\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 767 0 R + /Prev 779 0 R + /A 780 0 R +>> endobj +783 0 obj +<< + /Title (\376\377\0\71\0\56\0\67\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\146\0\151\0\154\0\164\0\145\0\162\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 755 0 R + /First 785 0 R + /Last 792 0 R + /Prev 767 0 R + /Next 794 0 R + /Count -5 + /A 782 0 R +>> endobj +785 0 obj +<< + /Title (\376\377\0\71\0\56\0\67\0\56\0\61\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\143\0\157\0\155\0\160\0\55\0\146\0\151\0\154\0\164\0\145\0\162\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 783 0 R + /Next 787 0 R + /A 784 0 R +>> endobj +787 0 obj +<< + /Title (\376\377\0\71\0\56\0\67\0\56\0\62\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\160\0\162\0\157\0\160\0\55\0\146\0\151\0\154\0\164\0\145\0\162\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 783 0 R + /Prev 785 0 R + /Next 789 0 R + /A 786 0 R +>> endobj +789 0 obj +<< + /Title (\376\377\0\71\0\56\0\67\0\56\0\63\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\160\0\141\0\162\0\141\0\155\0\55\0\146\0\151\0\154\0\164\0\145\0\162\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 783 0 R + /Prev 787 0 R + /Next 790 0 R + /A 788 0 R +>> endobj +790 0 obj +<< + /Title (\376\377\0\71\0\56\0\67\0\56\0\64\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\151\0\163\0\55\0\156\0\157\0\164\0\55\0\144\0\145\0\146\0\151\0\156\0\145\0\144\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 783 0 R + /Prev 789 0 R + /Next 792 0 R + /A 205 0 R +>> endobj +792 0 obj +<< + /Title (\376\377\0\71\0\56\0\67\0\56\0\65\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\164\0\145\0\170\0\164\0\55\0\155\0\141\0\164\0\143\0\150\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 783 0 R + /Prev 790 0 R + /A 791 0 R +>> endobj +794 0 obj +<< + /Title (\376\377\0\71\0\56\0\70\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\164\0\151\0\155\0\145\0\172\0\157\0\156\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 755 0 R + /Prev 783 0 R + /Next 796 0 R + /A 793 0 R +>> endobj +796 0 obj +<< + /Title (\376\377\0\71\0\56\0\71\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\164\0\151\0\155\0\145\0\55\0\162\0\141\0\156\0\147\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 755 0 R + /Prev 794 0 R + /Next 798 0 R + /A 795 0 R +>> endobj +798 0 obj +<< + /Title (\376\377\0\71\0\56\0\61\0\60\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\143\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\55\0\155\0\165\0\154\0\164\0\151\0\147\0\145\0\164\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 755 0 R + /Prev 796 0 R + /Next 800 0 R + /A 797 0 R +>> endobj +800 0 obj +<< + /Title (\376\377\0\71\0\56\0\61\0\61\0\40\0\103\0\101\0\114\0\104\0\101\0\126\0\72\0\146\0\162\0\145\0\145\0\55\0\142\0\165\0\163\0\171\0\55\0\161\0\165\0\145\0\162\0\171\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164) + /Parent 755 0 R + /Prev 798 0 R + /A 799 0 R +>> endobj +801 0 obj +<< + /Title (\376\377\0\61\0\60\0\40\0\111\0\156\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163) + /Parent 641 0 R + /Prev 755 0 R + /Next 802 0 R + /A 217 0 R +>> endobj +802 0 obj +<< + /Title (\376\377\0\61\0\61\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163) + /Parent 641 0 R + /Prev 801 0 R + /Next 804 0 R + /A 219 0 R +>> endobj +804 0 obj +<< + /Title (\376\377\0\61\0\62\0\40\0\111\0\101\0\116\0\101\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163) + /Parent 641 0 R + /First 806 0 R + /Last 806 0 R + /Prev 802 0 R + /Next 807 0 R + /Count -1 + /A 803 0 R +>> endobj +806 0 obj +<< + /Title (\376\377\0\61\0\62\0\56\0\61\0\40\0\116\0\141\0\155\0\145\0\163\0\160\0\141\0\143\0\145\0\40\0\122\0\145\0\147\0\151\0\163\0\164\0\162\0\141\0\164\0\151\0\157\0\156) + /Parent 804 0 R + /A 805 0 R +>> endobj +807 0 obj +<< + /Title (\376\377\0\61\0\63\0\40\0\101\0\143\0\153\0\156\0\157\0\167\0\154\0\145\0\144\0\147\0\145\0\155\0\145\0\156\0\164\0\163) + /Parent 641 0 R + /Prev 804 0 R + /Next 808 0 R + /A 225 0 R +>> endobj +808 0 obj +<< + /Title (\376\377\0\61\0\64\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163) + /Parent 641 0 R + /First 809 0 R + /Last 810 0 R + /Prev 807 0 R + /Next 811 0 R + /Count -2 + /A 227 0 R +>> endobj +809 0 obj +<< + /Title (\376\377\0\61\0\64\0\56\0\61\0\40\0\116\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163) + /Parent 808 0 R + /Next 810 0 R + /A 229 0 R +>> endobj +810 0 obj +<< + /Title (\376\377\0\61\0\64\0\56\0\62\0\40\0\111\0\156\0\146\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163) + /Parent 808 0 R + /Prev 809 0 R + /A 231 0 R +>> endobj +811 0 obj +<< + /Title (\376\377\0\101\0\165\0\164\0\150\0\157\0\162\0\47\0\163\0\40\0\101\0\144\0\144\0\162\0\145\0\163\0\163\0\145\0\163) + /Parent 641 0 R + /Prev 808 0 R + /Next 812 0 R + /A 233 0 R +>> endobj +812 0 obj +<< + /Title (\376\377\0\101\0\40\0\103\0\141\0\154\0\104\0\101\0\126\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\40\0\124\0\141\0\142\0\154\0\145\0\40\0\50\0\116\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\51) + /Parent 641 0 R + /Prev 811 0 R + /Next 814 0 R + /A 235 0 R +>> endobj +814 0 obj +<< + /Title (\376\377\0\102\0\40\0\103\0\141\0\154\0\145\0\156\0\144\0\141\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163\0\40\0\125\0\163\0\145\0\144\0\40\0\151\0\156\0\40\0\164\0\150\0\145\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\163) + /Parent 641 0 R + /Prev 812 0 R + /Next 815 0 R + /A 813 0 R +>> endobj +815 0 obj +<< + /Title (\376\377\0\111\0\156\0\164\0\145\0\154\0\154\0\145\0\143\0\164\0\165\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\141\0\156\0\144\0\40\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\123\0\164\0\141\0\164\0\145\0\155\0\145\0\156\0\164\0\163) + /Parent 641 0 R + /Prev 814 0 R + /Next 816 0 R + /A 239 0 R +>> endobj +816 0 obj +<< + /Title (\376\377\0\111\0\156\0\144\0\145\0\170) + /Parent 641 0 R + /Prev 815 0 R + /A 241 0 R +>> endobj +817 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F5 +/BaseFont /Times-Roman +/Encoding /WinAnsiEncoding >> +endobj +818 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F9 +/BaseFont /Courier +/Encoding /WinAnsiEncoding >> +endobj +819 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F6 +/BaseFont /Times-Italic +/Encoding /WinAnsiEncoding >> +endobj +820 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F7 +/BaseFont /Times-Bold +/Encoding /WinAnsiEncoding >> +endobj +1 0 obj +<< /Type /Pages +/Count 84 +/Kids [6 0 R 8 0 R 97 0 R 196 0 R 243 0 R 260 0 R 262 0 R 285 0 R 290 0 R 292 0 R 297 0 R 301 0 R 305 0 R 311 0 R 318 0 R 324 0 R 331 0 R 335 0 R 337 0 R 339 0 R 344 0 R 353 0 R 355 0 R 362 0 R 364 0 R 370 0 R 382 0 R 389 0 R 399 0 R 406 0 R 408 0 R 412 0 R 414 0 R 416 0 R 420 0 R 424 0 R 428 0 R 430 0 R 434 0 R 438 0 R 440 0 R 444 0 R 446 0 R 450 0 R 452 0 R 456 0 R 464 0 R 468 0 R 473 0 R 477 0 R 479 0 R 483 0 R 485 0 R 495 0 R 502 0 R 504 0 R 512 0 R 516 0 R 520 0 R 525 0 R 527 0 R 529 0 R 531 0 R 533 0 R 535 0 R 539 0 R 543 0 R 545 0 R 549 0 R 553 0 R 559 0 R 570 0 R 575 0 R 577 0 R 608 0 R 617 0 R 621 0 R 623 0 R 625 0 R 627 0 R 629 0 R 631 0 R 633 0 R 639 0 R ] >> +endobj +2 0 obj +<< /Type /Catalog +/Pages 1 0 R + /Outlines 641 0 R + /PageMode /UseOutlines + /Names << /Dests << /Names [ (rfc.status) [ 6 0 R /XYZ 67.0 506.542 null ] (rfc.copyrightnotice) [ 6 0 R /XYZ 67.0 416.408 null ] (rfc.abstract) [ 6 0 R /XYZ 67.0 359.274 null ] (rfc.toc) [ 8 0 R /XYZ 67.0 725.0 null ] (rfc.section.1) [ 243 0 R /XYZ 67.0 725.0 null ] (rfc.section.1.1) [ 243 0 R /XYZ 67.0 592.866 null ] (rfc.xref.RFC2119.1) [ 243 0 R /XYZ 67.0 557.894 null ] (rfc.xref.RFC3253.1) [ 243 0 R /XYZ 67.0 525.894 null ] (rfc.section.1.2) [ 243 0 R /XYZ 67.0 443.894 null ] (rfc.xref.W3C.REC-xml-20060816.1) [ 243 0 R /XYZ 67.0 408.922 null ] (rfc.xref.RFC2518.3) [ 243 0 R /XYZ 67.0 247.922 null ] (rfc.section.1.3) [ 243 0 R /XYZ 67.0 208.922 null ] (rfc.section.2) [ 262 0 R /XYZ 67.0 725.0 null ] (requirements) [ 262 0 R /XYZ 67.0 725.0 null ] (rfc.xref.rfc2518bis.1) [ 262 0 R /XYZ 67.0 657.366 null ] (rfc.xref.RFC2518.6) [ 262 0 R /XYZ 67.0 657.366 null ] (rfc.xref.RFC2246.1) [ 262 0 R /XYZ 67.0 603.366 null ] (rfc.xref.RFC2818.1) [ 262 0 R /XYZ 67.0 603.366 null ] (rfc.xref.RFC2246.2) [ 262 0 R /XYZ 67.0 603.366 null ] (rfc.xref.RFC4346.1) [ 262 0 R /XYZ 67.0 592.366 null ] (rfc.xref.RFC2616.2) [ 262 0 R /XYZ 67.0 576.366 null ] (rfc.section.3) [ 285 0 R /XYZ 67.0 725.0 null ] (model) [ 285 0 R /XYZ 67.0 725.0 null ] (rfc.section.3.1) [ 285 0 R /XYZ 67.0 571.866 null ] (rfc.section.3.2) [ 285 0 R /XYZ 67.0 269.894 null ] (recurrence) [ 285 0 R /XYZ 67.0 269.894 null ] (rfc.section.4) [ 290 0 R /XYZ 67.0 725.0 null ] (rfc.section.4.1) [ 290 0 R /XYZ 67.0 690.866 null ] (calendar-object-resource-restrictions) [ 290 0 R /XYZ 67.0 690.866 null ] (rfc.figure.u.1) [ 290 0 R /XYZ 67.0 391.894 null ] (rfc.section.4.2) [ 292 0 R /XYZ 67.0 681.0 null ] (calendar-collection) [ 292 0 R /XYZ 67.0 681.0 null ] (rfc.figure.u.2) [ 292 0 R /XYZ 67.0 608.028 null ] (rfc.section.5) [ 297 0 R /XYZ 67.0 725.0 null ] (rfc.section.5.1) [ 297 0 R /XYZ 67.0 690.866 null ] (rfc.section.5.1.1) [ 297 0 R /XYZ 67.0 606.894 null ] (rfc.figure.u.3) [ 297 0 R /XYZ 67.0 587.003 null ] (rfc.figure.u.4) [ 297 0 R /XYZ 67.0 530.283 null ] (rfc.section.5.2) [ 297 0 R /XYZ 67.0 384.123 null ] (rfc.section.5.2.1) [ 297 0 R /XYZ 67.0 333.151 null ] (calendar-description) [ 297 0 R /XYZ 67.0 333.151 null ] (rfc.xref.RFC2518.7) [ 297 0 R /XYZ 67.0 240.76 null ] (rfc.figure.u.5) [ 297 0 R /XYZ 67.0 148.76 null ] (rfc.figure.u.6) [ 297 0 R /XYZ 67.0 104.04 null ] (rfc.section.5.2.2) [ 301 0 R /XYZ 67.0 668.28 null ] (calendar-timezone) [ 301 0 R /XYZ 67.0 668.28 null ] (rfc.xref.RFC2518.8) [ 301 0 R /XYZ 67.0 575.889 null ] (rfc.figure.u.7) [ 301 0 R /XYZ 67.0 368.889 null ] (rfc.figure.u.8) [ 301 0 R /XYZ 67.0 304.449 null ] (rfc.section.5.2.3) [ 305 0 R /XYZ 67.0 668.28 null ] (supported-calendar-component-set) [ 305 0 R /XYZ 67.0 668.28 null ] (rfc.xref.RFC2518.9) [ 305 0 R /XYZ 67.0 564.889 null ] (rfc.figure.u.9) [ 305 0 R /XYZ 67.0 373.889 null ] (rfc.figure.u.10) [ 305 0 R /XYZ 67.0 329.169 null ] (rfc.section.5.2.4) [ 305 0 R /XYZ 67.0 245.369 null ] (supported-calendar-data) [ 305 0 R /XYZ 67.0 245.369 null ] (rfc.xref.RFC2518.10) [ 305 0 R /XYZ 67.0 141.978 null ] (rfc.figure.u.11) [ 311 0 R /XYZ 67.0 668.5 null ] (rfc.figure.u.12) [ 311 0 R /XYZ 67.0 623.78 null ] (rfc.section.5.2.5) [ 311 0 R /XYZ 67.0 539.98 null ] (max-resource-size) [ 311 0 R /XYZ 67.0 539.98 null ] (rfc.xref.RFC2518.11) [ 311 0 R /XYZ 67.0 425.589 null ] (rfc.figure.u.13) [ 311 0 R /XYZ 67.0 322.589 null ] (rfc.figure.u.14) [ 311 0 R /XYZ 67.0 277.869 null ] (rfc.section.5.2.6) [ 311 0 R /XYZ 67.0 213.789 null ] (min-date-time) [ 311 0 R /XYZ 67.0 213.789 null ] (rfc.xref.RFC2518.12) [ 311 0 R /XYZ 67.0 99.398 null ] (rfc.figure.u.15) [ 318 0 R /XYZ 67.0 580.5 null ] (rfc.figure.u.16) [ 318 0 R /XYZ 67.0 525.92 null ] (rfc.section.5.2.7) [ 318 0 R /XYZ 67.0 461.84 null ] (max-date-time) [ 318 0 R /XYZ 67.0 461.84 null ] (rfc.xref.RFC2518.13) [ 318 0 R /XYZ 67.0 347.449 null ] (rfc.figure.u.17) [ 318 0 R /XYZ 67.0 189.449 null ] (rfc.figure.u.18) [ 318 0 R /XYZ 67.0 134.869 null ] (rfc.section.5.2.8) [ 324 0 R /XYZ 67.0 709.0 null ] (max-instances) [ 324 0 R /XYZ 67.0 709.0 null ] (rfc.xref.RFC2518.14) [ 324 0 R /XYZ 67.0 594.609 null ] (rfc.figure.u.19) [ 324 0 R /XYZ 67.0 480.609 null ] (rfc.figure.u.20) [ 324 0 R /XYZ 67.0 426.029 null ] (rfc.section.5.2.9) [ 324 0 R /XYZ 67.0 361.949 null ] (max-attendees-per-instance) [ 324 0 R /XYZ 67.0 361.949 null ] (rfc.xref.RFC2518.15) [ 324 0 R /XYZ 67.0 247.558 null ] (rfc.figure.u.21) [ 324 0 R /XYZ 67.0 133.558 null ] (rfc.figure.u.22) [ 331 0 R /XYZ 67.0 712.5 null ] (rfc.section.5.2.10) [ 331 0 R /XYZ 67.0 648.42 null ] (rfc.section.5.3) [ 331 0 R /XYZ 67.0 573.529 null ] (creating-resources) [ 331 0 R /XYZ 67.0 573.529 null ] (rfc.section.5.3.1) [ 331 0 R /XYZ 67.0 500.557 null ] (METHOD_MKCALENDAR) [ 331 0 R /XYZ 67.0 500.557 null ] (rfc.xref.RFC2518.16) [ 331 0 R /XYZ 67.0 207.166 null ] (rfc.figure.u.23) [ 331 0 R /XYZ 67.0 191.166 null ] (rfc.figure.u.24) [ 331 0 R /XYZ 67.0 134.306 null ] (rfc.iref.21) [ 335 0 R /XYZ 67.0 706.5 null ] (rfc.iref.22) [ 335 0 R /XYZ 67.0 706.5 null ] (rfc.iref.23) [ 335 0 R /XYZ 67.0 690.5 null ] (rfc.iref.24) [ 335 0 R /XYZ 67.0 690.5 null ] (rfc.iref.25) [ 335 0 R /XYZ 67.0 663.5 null ] (rfc.iref.26) [ 335 0 R /XYZ 67.0 663.5 null ] (rfc.iref.27) [ 335 0 R /XYZ 67.0 636.5 null ] (rfc.iref.28) [ 335 0 R /XYZ 67.0 636.5 null ] (rfc.section.5.3.1.1) [ 335 0 R /XYZ 67.0 537.0 null ] (rfc.section.5.3.1.2) [ 335 0 R /XYZ 67.0 193.109 null ] (rfc.figure.u.25) [ 335 0 R /XYZ 67.0 130.218 null ] (rfc.figure.u.26) [ 337 0 R /XYZ 67.0 319.46 null ] (rfc.section.5.3.2) [ 337 0 R /XYZ 67.0 237.02 null ] (rfc.figure.u.27) [ 339 0 R /XYZ 67.0 688.0 null ] (rfc.figure.u.28) [ 339 0 R /XYZ 67.0 483.38 null ] (rfc.xref.RFC2445.3) [ 339 0 R /XYZ 67.0 374.94 null ] (rfc.section.5.3.2.1) [ 339 0 R /XYZ 67.0 325.94 null ] (putpreconditions) [ 339 0 R /XYZ 67.0 325.94 null ] (rfc.figure.u.29) [ 344 0 R /XYZ 67.0 662.5 null ] (rfc.section.5.3.3) [ 344 0 R /XYZ 67.0 336.14 null ] (rfc.xref.RFC2445.4) [ 344 0 R /XYZ 67.0 208.249 null ] (rfc.section.5.3.4) [ 344 0 R /XYZ 67.0 170.249 null ] (calendar-etag) [ 344 0 R /XYZ 67.0 170.249 null ] (rfc.section.6) [ 355 0 R /XYZ 67.0 725.0 null ] (rfc.section.6.1) [ 355 0 R /XYZ 67.0 690.866 null ] (privileges) [ 355 0 R /XYZ 67.0 690.866 null ] (rfc.section.6.1.1) [ 355 0 R /XYZ 67.0 617.894 null ] (PRIVILEGE_read-free-busy) [ 355 0 R /XYZ 67.0 617.894 null ] (rfc.figure.u.30) [ 355 0 R /XYZ 67.0 485.003 null ] (rfc.section.6.2) [ 355 0 R /XYZ 67.0 368.143 null ] (principal.properties) [ 355 0 R /XYZ 67.0 368.143 null ] (rfc.xref.RFC3744.3) [ 355 0 R /XYZ 67.0 344.171 null ] (rfc.section.6.2.1) [ 355 0 R /XYZ 67.0 317.171 null ] (PROPERTY_calendar-home-set) [ 355 0 R /XYZ 67.0 317.171 null ] (rfc.xref.RFC2518.17) [ 355 0 R /XYZ 67.0 213.78 null ] (rfc.figure.u.31) [ 355 0 R /XYZ 67.0 121.78 null ] (rfc.figure.u.32) [ 355 0 R /XYZ 67.0 86.92 null ] (rfc.section.7) [ 364 0 R /XYZ 67.0 725.0 null ] (reports) [ 364 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC3253.3) [ 364 0 R /XYZ 67.0 654.866 null ] (rfc.section.7.1) [ 364 0 R /XYZ 67.0 594.866 null ] (METHOD_REPORT) [ 364 0 R /XYZ 67.0 594.866 null ] (rfc.xref.RFC3253.4) [ 364 0 R /XYZ 67.0 570.894 null ] (rfc.xref.RFC3253.5) [ 364 0 R /XYZ 67.0 494.894 null ] (rfc.section.7.2) [ 364 0 R /XYZ 67.0 466.894 null ] (rfc.section.7.3) [ 364 0 R /XYZ 67.0 381.922 null ] (rfc.section.7.4) [ 364 0 R /XYZ 67.0 112.95 null ] (rfc.xref.RFC2445.5) [ 370 0 R /XYZ 67.0 633.0 null ] (rfc.section.7.5) [ 370 0 R /XYZ 67.0 540.0 null ] (collation) [ 370 0 R /XYZ 67.0 540.0 null ] (rfc.xref.RFC4790.1) [ 370 0 R /XYZ 67.0 462.028 null ] (rfc.xref.RFC4790.2) [ 370 0 R /XYZ 67.0 430.028 null ] (rfc.xref.RFC4790.3) [ 370 0 R /XYZ 67.0 398.028 null ] (rfc.xref.RFC4790.4) [ 370 0 R /XYZ 67.0 302.028 null ] (rfc.xref.RFC4790.5) [ 370 0 R /XYZ 67.0 270.028 null ] (rfc.section.7.5.1) [ 370 0 R /XYZ 67.0 211.028 null ] (PROPERTY_supported-collation-set) [ 370 0 R /XYZ 67.0 211.028 null ] (rfc.xref.RFC2518.18) [ 370 0 R /XYZ 67.0 107.637 null ] (rfc.figure.u.33) [ 382 0 R /XYZ 67.0 679.5 null ] (rfc.figure.u.34) [ 382 0 R /XYZ 67.0 615.06 null ] (rfc.section.7.6) [ 382 0 R /XYZ 67.0 530.26 null ] (rfc.section.7.7) [ 382 0 R /XYZ 67.0 186.288 null ] (rfc.section.7.8) [ 389 0 R /XYZ 67.0 670.0 null ] (calendar-query) [ 389 0 R /XYZ 67.0 670.0 null ] (rfc.iref.35) [ 389 0 R /XYZ 67.0 330.528 null ] (rfc.iref.36) [ 389 0 R /XYZ 67.0 330.528 null ] (rfc.iref.37) [ 389 0 R /XYZ 67.0 292.528 null ] (rfc.iref.38) [ 389 0 R /XYZ 67.0 292.528 null ] (rfc.iref.39) [ 389 0 R /XYZ 67.0 243.528 null ] (rfc.iref.40) [ 389 0 R /XYZ 67.0 243.528 null ] (rfc.figure.u.35) [ 389 0 R /XYZ 67.0 161.528 null ] (rfc.iref.41) [ 389 0 R /XYZ 67.0 111.948 null ] (rfc.iref.42) [ 389 0 R /XYZ 67.0 111.948 null ] (rfc.iref.43) [ 399 0 R /XYZ 67.0 722.5 null ] (rfc.iref.44) [ 399 0 R /XYZ 67.0 722.5 null ] (rfc.iref.45) [ 399 0 R /XYZ 67.0 684.5 null ] (rfc.iref.46) [ 399 0 R /XYZ 67.0 684.5 null ] (rfc.iref.47) [ 399 0 R /XYZ 67.0 646.5 null ] (rfc.iref.48) [ 399 0 R /XYZ 67.0 646.5 null ] (rfc.iref.49) [ 399 0 R /XYZ 67.0 598.5 null ] (rfc.iref.50) [ 399 0 R /XYZ 67.0 598.5 null ] (rfc.section.7.8.1) [ 399 0 R /XYZ 67.0 547.0 null ] (rfc.figure.u.36) [ 399 0 R /XYZ 67.0 419.109 null ] (rfc.figure.u.37) [ 406 0 R /XYZ 67.0 634.98 null ] (rfc.section.7.8.2) [ 408 0 R /XYZ 67.0 254.3 null ] (rfc.figure.u.38) [ 408 0 R /XYZ 67.0 137.409 null ] (rfc.figure.u.39) [ 412 0 R /XYZ 67.0 506.8 null ] (rfc.section.7.8.3) [ 414 0 R /XYZ 67.0 86.68 null ] (rfc.figure.u.40) [ 416 0 R /XYZ 67.0 619.109 null ] (rfc.figure.u.41) [ 416 0 R /XYZ 67.0 345.469 null ] (rfc.section.7.8.4) [ 420 0 R /XYZ 67.0 283.88 null ] (rfc.figure.u.42) [ 420 0 R /XYZ 67.0 177.989 null ] (rfc.figure.u.43) [ 424 0 R /XYZ 67.0 546.24 null ] (rfc.section.7.8.5) [ 424 0 R /XYZ 67.0 197.58 null ] (rfc.figure.u.44) [ 424 0 R /XYZ 67.0 124.689 null ] (rfc.figure.u.45) [ 428 0 R /XYZ 67.0 496.94 null ] (rfc.section.7.8.6) [ 428 0 R /XYZ 67.0 98.98 null ] (rfc.figure.u.46) [ 430 0 R /XYZ 67.0 667.0 null ] (rfc.figure.u.47) [ 430 0 R /XYZ 67.0 403.22 null ] (rfc.section.7.8.7) [ 434 0 R /XYZ 67.0 461.36 null ] (rfc.figure.u.48) [ 434 0 R /XYZ 67.0 377.469 null ] (rfc.figure.u.49) [ 438 0 R /XYZ 67.0 715.0 null ] (rfc.section.7.8.8) [ 438 0 R /XYZ 67.0 129.7 null ] (rfc.figure.u.50) [ 440 0 R /XYZ 67.0 699.0 null ] (rfc.figure.u.51) [ 440 0 R /XYZ 67.0 484.52 null ] (rfc.section.7.8.9) [ 446 0 R /XYZ 67.0 234.58 null ] (rfc.figure.u.52) [ 446 0 R /XYZ 67.0 150.689 null ] (rfc.figure.u.53) [ 450 0 R /XYZ 67.0 496.94 null ] (rfc.section.7.8.10) [ 452 0 R /XYZ 67.0 481.08 null ] (rfc.figure.u.54) [ 452 0 R /XYZ 67.0 397.189 null ] (rfc.figure.u.55) [ 452 0 R /XYZ 67.0 143.269 null ] (rfc.section.7.9) [ 456 0 R /XYZ 67.0 627.98 null ] (calendar-multiget) [ 456 0 R /XYZ 67.0 627.98 null ] (rfc.iref.53) [ 456 0 R /XYZ 67.0 320.508 null ] (rfc.iref.54) [ 456 0 R /XYZ 67.0 320.508 null ] (rfc.iref.55) [ 456 0 R /XYZ 67.0 282.508 null ] (rfc.iref.56) [ 456 0 R /XYZ 67.0 282.508 null ] (rfc.iref.57) [ 456 0 R /XYZ 67.0 244.508 null ] (rfc.iref.58) [ 456 0 R /XYZ 67.0 244.508 null ] (rfc.section.7.9.1) [ 456 0 R /XYZ 67.0 156.008 null ] (rfc.figure.u.56) [ 464 0 R /XYZ 67.0 699.0 null ] (rfc.figure.u.57) [ 464 0 R /XYZ 67.0 514.1 null ] (rfc.section.7.10) [ 468 0 R /XYZ 67.0 588.54 null ] (free-busy-query) [ 468 0 R /XYZ 67.0 588.54 null ] (rfc.figure.u.58) [ 468 0 R /XYZ 67.0 451.568 null ] (rfc.iref.61) [ 473 0 R /XYZ 67.0 528.5 null ] (rfc.iref.62) [ 473 0 R /XYZ 67.0 528.5 null ] (rfc.section.7.10.1) [ 473 0 R /XYZ 67.0 466.0 null ] (rfc.figure.u.59) [ 473 0 R /XYZ 67.0 382.109 null ] (rfc.figure.u.60) [ 473 0 R /XYZ 67.0 236.649 null ] (rfc.section.8) [ 479 0 R /XYZ 67.0 725.0 null ] (rfc.section.8.1) [ 479 0 R /XYZ 67.0 690.866 null ] (rfc.section.8.2) [ 479 0 R /XYZ 67.0 572.894 null ] (rfc.section.8.2.1) [ 479 0 R /XYZ 67.0 477.922 null ] (rfc.section.8.2.1.1) [ 479 0 R /XYZ 67.0 452.031 null ] (rfc.section.8.2.1.2) [ 479 0 R /XYZ 67.0 318.14 null ] (rfc.section.8.2.1.3) [ 479 0 R /XYZ 67.0 216.249 null ] (rfc.figure.u.61) [ 483 0 R /XYZ 67.0 672.0 null ] (rfc.figure.u.62) [ 483 0 R /XYZ 67.0 389.94 null ] (rfc.section.8.2.2) [ 483 0 R /XYZ 67.0 210.04 null ] (rfc.section.8.3) [ 483 0 R /XYZ 67.0 75.149 null ] (rfc.section.8.4) [ 485 0 R /XYZ 67.0 542.028 null ] (rfc.figure.u.63) [ 485 0 R /XYZ 67.0 237.056 null ] (rfc.figure.u.64) [ 485 0 R /XYZ 67.0 94.176 null ] (rfc.section.8.5) [ 495 0 R /XYZ 67.0 525.82 null ] (rfc.section.8.5.1) [ 495 0 R /XYZ 67.0 463.848 null ] (rfc.xref.RFC4331.1) [ 495 0 R /XYZ 67.0 349.457 null ] (rfc.section.8.5.2) [ 495 0 R /XYZ 67.0 265.957 null ] (rfc.section.8.6) [ 502 0 R /XYZ 67.0 517.0 null ] (rfc.section.9) [ 504 0 R /XYZ 67.0 725.0 null ] (rfc.section.9.1) [ 504 0 R /XYZ 67.0 690.866 null ] (calendar_element) [ 504 0 R /XYZ 67.0 690.866 null ] (rfc.figure.u.65) [ 504 0 R /XYZ 67.0 595.394 null ] (rfc.section.9.2) [ 504 0 R /XYZ 67.0 551.034 null ] (mkcalendar_element) [ 504 0 R /XYZ 67.0 551.034 null ] (rfc.figure.u.66) [ 504 0 R /XYZ 67.0 444.562 null ] (rfc.section.9.3) [ 504 0 R /XYZ 67.0 400.202 null ] (mkcalendar_response_element) [ 504 0 R /XYZ 67.0 400.202 null ] (rfc.figure.u.67) [ 504 0 R /XYZ 67.0 304.73 null ] (rfc.section.9.4) [ 504 0 R /XYZ 67.0 260.37 null ] (ELEMENT_supported-collation) [ 504 0 R /XYZ 67.0 260.37 null ] (rfc.xref.RFC4790.6) [ 504 0 R /XYZ 67.0 201.898 null ] (rfc.figure.u.68) [ 504 0 R /XYZ 67.0 153.898 null ] (rfc.section.9.5) [ 504 0 R /XYZ 67.0 99.678 null ] (calendar_query_element) [ 504 0 R /XYZ 67.0 99.678 null ] (rfc.figure.u.69) [ 512 0 R /XYZ 67.0 648.5 null ] (rfc.section.9.6) [ 512 0 R /XYZ 67.0 574.56 null ] (calendar_data_element) [ 512 0 R /XYZ 67.0 574.56 null ] (rfc.figure.u.70) [ 516 0 R /XYZ 67.0 701.5 null ] (rfc.section.9.6.1) [ 516 0 R /XYZ 67.0 303.18 null ] (comp_element) [ 516 0 R /XYZ 67.0 303.18 null ] (rfc.figure.u.71) [ 516 0 R /XYZ 67.0 211.789 null ] (rfc.xref.RFC2518.19) [ 516 0 R /XYZ 67.0 131.489 null ] (rfc.section.9.6.2) [ 516 0 R /XYZ 67.0 79.989 null ] (allcomp_element) [ 516 0 R /XYZ 67.0 79.989 null ] (rfc.figure.u.72) [ 520 0 R /XYZ 67.0 622.609 null ] (rfc.section.9.6.3) [ 520 0 R /XYZ 67.0 579.249 null ] (allprop_element) [ 520 0 R /XYZ 67.0 579.249 null ] (rfc.figure.u.73) [ 520 0 R /XYZ 67.0 476.858 null ] (rfc.xref.RFC2518.20) [ 520 0 R /XYZ 67.0 435.998 null ] (rfc.section.9.6.4) [ 520 0 R /XYZ 67.0 395.498 null ] (prop_element) [ 520 0 R /XYZ 67.0 395.498 null ] (rfc.figure.u.74) [ 520 0 R /XYZ 67.0 260.107 null ] (rfc.xref.RFC2518.21) [ 520 0 R /XYZ 67.0 169.947 null ] (rfc.section.9.6.5) [ 520 0 R /XYZ 67.0 129.447 null ] (expand_element) [ 520 0 R /XYZ 67.0 129.447 null ] (rfc.figure.u.75) [ 525 0 R /XYZ 67.0 489.5 null ] (rfc.section.9.6.6) [ 525 0 R /XYZ 67.0 396.84 null ] (limit_recurrence_set_element) [ 525 0 R /XYZ 67.0 396.84 null ] (rfc.figure.u.76) [ 527 0 R /XYZ 67.0 701.5 null ] (rfc.section.9.6.7) [ 527 0 R /XYZ 67.0 589.12 null ] (limit_freebusy_set_element) [ 527 0 R /XYZ 67.0 589.12 null ] (rfc.figure.u.77) [ 527 0 R /XYZ 67.0 377.729 null ] (rfc.section.9.7) [ 527 0 R /XYZ 67.0 264.349 null ] (filter_element) [ 527 0 R /XYZ 67.0 264.349 null ] (rfc.figure.u.78) [ 527 0 R /XYZ 67.0 157.877 null ] (rfc.section.9.7.1) [ 527 0 R /XYZ 67.0 114.517 null ] (comp_filter_element) [ 527 0 R /XYZ 67.0 114.517 null ] (rfc.figure.u.79) [ 529 0 R /XYZ 67.0 381.5 null ] (rfc.section.9.7.2) [ 529 0 R /XYZ 67.0 259.26 null ] (prop_filter_element) [ 529 0 R /XYZ 67.0 259.26 null ] (rfc.figure.u.80) [ 531 0 R /XYZ 67.0 577.5 null ] (rfc.section.9.7.3) [ 531 0 R /XYZ 67.0 465.12 null ] (param_filter_element) [ 531 0 R /XYZ 67.0 465.12 null ] (rfc.figure.u.81) [ 531 0 R /XYZ 67.0 237.729 null ] (rfc.section.9.7.4) [ 531 0 R /XYZ 67.0 145.069 null ] (rfc.figure.u.82) [ 533 0 R /XYZ 67.0 663.5 null ] (rfc.section.9.7.5) [ 533 0 R /XYZ 67.0 610.28 null ] (text_match_element) [ 533 0 R /XYZ 67.0 610.28 null ] (rfc.figure.u.83) [ 533 0 R /XYZ 67.0 409.889 null ] (rfc.section.9.8) [ 533 0 R /XYZ 67.0 296.509 null ] (timezone_element) [ 533 0 R /XYZ 67.0 296.509 null ] (rfc.figure.u.84) [ 535 0 R /XYZ 67.0 679.5 null ] (rfc.section.9.9) [ 535 0 R /XYZ 67.0 605.56 null ] (time_range_element) [ 535 0 R /XYZ 67.0 605.56 null ] (rfc.xref.RFC2445.7) [ 535 0 R /XYZ 67.0 285.088 null ] (rfc.figure.u.85) [ 535 0 R /XYZ 67.0 203.088 null ] (rfc.xref.RFC2445.8) [ 539 0 R /XYZ 67.0 446.524 null ] (rfc.figure.u.86) [ 539 0 R /XYZ 67.0 419.524 null ] (rfc.figure.u.87) [ 543 0 R /XYZ 67.0 417.398 null ] (rfc.figure.u.88) [ 543 0 R /XYZ 67.0 149.162 null ] (rfc.figure.u.89) [ 545 0 R /XYZ 67.0 605.508 null ] (rfc.figure.u.90) [ 545 0 R /XYZ 67.0 506.634 null ] (rfc.figure.u.91) [ 545 0 R /XYZ 67.0 391.76 null ] (rfc.section.9.10) [ 545 0 R /XYZ 67.0 288.24 null ] (calendar_multiget_element) [ 545 0 R /XYZ 67.0 288.24 null ] (rfc.figure.u.92) [ 545 0 R /XYZ 67.0 192.768 null ] (rfc.section.9.11) [ 545 0 R /XYZ 67.0 108.968 null ] (free_busy_query_element) [ 545 0 R /XYZ 67.0 108.968 null ] (rfc.figure.u.93) [ 549 0 R /XYZ 67.0 637.5 null ] (rfc.section.10) [ 553 0 R /XYZ 67.0 725.0 null ] (rfc.section.11) [ 559 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2818.2) [ 559 0 R /XYZ 67.0 686.866 null ] (rfc.xref.RFC2518.22) [ 559 0 R /XYZ 67.0 384.866 null ] (rfc.xref.RFC3253.6) [ 559 0 R /XYZ 67.0 384.866 null ] (rfc.xref.RFC3744.5) [ 559 0 R /XYZ 67.0 384.866 null ] (rfc.section.12) [ 570 0 R /XYZ 67.0 725.0 null ] (IANA) [ 570 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC3688.1) [ 570 0 R /XYZ 67.0 686.866 null ] (rfc.section.12.1) [ 570 0 R /XYZ 67.0 658.866 null ] (ns.registration) [ 570 0 R /XYZ 67.0 658.866 null ] (rfc.section.13) [ 575 0 R /XYZ 67.0 725.0 null ] (rfc.references) [ 577 0 R /XYZ 67.0 725.0 null ] (rfc.references.1) [ 577 0 R /XYZ 67.0 690.866 null ] (RFC2119) [ 577 0 R /XYZ 67.0 671.894 null ] (RFC2246) [ 577 0 R /XYZ 67.0 644.894 null ] (RFC2445) [ 577 0 R /XYZ 67.0 617.894 null ] (RFC2446) [ 577 0 R /XYZ 67.0 590.894 null ] (RFC2518) [ 577 0 R /XYZ 67.0 552.894 null ] (RFC2616) [ 577 0 R /XYZ 67.0 514.894 null ] (RFC2818) [ 577 0 R /XYZ 67.0 476.894 null ] (RFC3253) [ 577 0 R /XYZ 67.0 460.894 null ] (RFC3688) [ 577 0 R /XYZ 67.0 422.894 null ] (RFC3744) [ 577 0 R /XYZ 67.0 406.894 null ] (RFC4346) [ 577 0 R /XYZ 67.0 368.894 null ] (RFC4790) [ 577 0 R /XYZ 67.0 341.894 null ] (W3C.REC-xml-20060816) [ 577 0 R /XYZ 67.0 314.894 null ] (rfc.references.2) [ 577 0 R /XYZ 67.0 253.894 null ] (RFC2426) [ 577 0 R /XYZ 67.0 234.922 null ] (rfc2518bis) [ 577 0 R /XYZ 67.0 207.922 null ] (RFC2739) [ 577 0 R /XYZ 67.0 180.922 null ] (RFC4331) [ 577 0 R /XYZ 67.0 153.922 null ] (RFC4511) [ 577 0 R /XYZ 67.0 126.922 null ] (rfc.authors) [ 608 0 R /XYZ 67.0 725.0 null ] (rfc.section.A) [ 617 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC3744.6) [ 617 0 R /XYZ 67.0 697.866 null ] (rfc.table.u.1) [ 617 0 R /XYZ 67.0 676.866 null ] (rfc.section.B) [ 621 0 R /XYZ 67.0 725.0 null ] (examples) [ 621 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.94) [ 621 0 R /XYZ 67.0 628.866 null ] (rfc.figure.u.95) [ 621 0 R /XYZ 67.0 424.246 null ] (rfc.copyright) [ 629 0 R /XYZ 67.0 216.72 null ] (rfc.ipr) [ 633 0 R /XYZ 67.0 725.0 null ] (rfc.index) [ 639 0 R /XYZ 67.0 725.0 null ] ] >> >> + >> +endobj +3 0 obj +<< +/Font << /F5 817 0 R /F9 818 0 R /F6 819 0 R /F7 820 0 R >> +/ProcSet [ /PDF /ImageC /Text ] >> +endobj +11 0 obj +<< +/S /GoTo +/D [243 0 R /XYZ 67.0 725.0 null] +>> +endobj +13 0 obj +<< +/S /GoTo +/D [243 0 R /XYZ 67.0 592.866 null] +>> +endobj +15 0 obj +<< +/S /GoTo +/D [243 0 R /XYZ 67.0 443.894 null] +>> +endobj +17 0 obj +<< +/S /GoTo +/D [243 0 R /XYZ 67.0 208.922 null] +>> +endobj +19 0 obj +<< +/S /GoTo +/D [262 0 R /XYZ 67.0 725.0 null] +>> +endobj +21 0 obj +<< +/S /GoTo +/D [285 0 R /XYZ 67.0 725.0 null] +>> +endobj +23 0 obj +<< +/S /GoTo +/D [285 0 R /XYZ 67.0 571.866 null] +>> +endobj +25 0 obj +<< +/S /GoTo +/D [285 0 R /XYZ 67.0 269.894 null] +>> +endobj +27 0 obj +<< +/S /GoTo +/D [290 0 R /XYZ 67.0 725.0 null] +>> +endobj +29 0 obj +<< +/S /GoTo +/D [290 0 R /XYZ 67.0 690.866 null] +>> +endobj +31 0 obj +<< +/S /GoTo +/D [292 0 R /XYZ 67.0 681.0 null] +>> +endobj +33 0 obj +<< +/S /GoTo +/D [297 0 R /XYZ 67.0 725.0 null] +>> +endobj +35 0 obj +<< +/S /GoTo +/D [297 0 R /XYZ 67.0 690.866 null] +>> +endobj +37 0 obj +<< +/S /GoTo +/D [297 0 R /XYZ 67.0 606.894 null] +>> +endobj +39 0 obj +<< +/S /GoTo +/D [297 0 R /XYZ 67.0 384.123 null] +>> +endobj +41 0 obj +<< +/S /GoTo +/D [297 0 R /XYZ 67.0 333.151 null] +>> +endobj +43 0 obj +<< +/S /GoTo +/D [301 0 R /XYZ 67.0 668.28 null] +>> +endobj +45 0 obj +<< +/S /GoTo +/D [305 0 R /XYZ 67.0 668.28 null] +>> +endobj +47 0 obj +<< +/S /GoTo +/D [305 0 R /XYZ 67.0 245.369 null] +>> +endobj +49 0 obj +<< +/S /GoTo +/D [311 0 R /XYZ 67.0 539.98 null] +>> +endobj +51 0 obj +<< +/S /GoTo +/D [311 0 R /XYZ 67.0 213.789 null] +>> +endobj +53 0 obj +<< +/S /GoTo +/D [318 0 R /XYZ 67.0 461.84 null] +>> +endobj +55 0 obj +<< +/S /GoTo +/D [324 0 R /XYZ 67.0 709.0 null] +>> +endobj +57 0 obj +<< +/S /GoTo +/D [324 0 R /XYZ 67.0 361.949 null] +>> +endobj +59 0 obj +<< +/S /GoTo +/D [331 0 R /XYZ 67.0 648.42 null] +>> +endobj +61 0 obj +<< +/S /GoTo +/D [331 0 R /XYZ 67.0 573.529 null] +>> +endobj +63 0 obj +<< +/S /GoTo +/D [331 0 R /XYZ 67.0 500.557 null] +>> +endobj +65 0 obj +<< +/S /GoTo +/D [335 0 R /XYZ 67.0 537.0 null] +>> +endobj +67 0 obj +<< +/S /GoTo +/D [335 0 R /XYZ 67.0 193.109 null] +>> +endobj +69 0 obj +<< +/S /GoTo +/D [337 0 R /XYZ 67.0 237.02 null] +>> +endobj +71 0 obj +<< +/S /GoTo +/D [339 0 R /XYZ 67.0 325.94 null] +>> +endobj +73 0 obj +<< +/S /GoTo +/D [344 0 R /XYZ 67.0 336.14 null] +>> +endobj +75 0 obj +<< +/S /GoTo +/D [344 0 R /XYZ 67.0 170.249 null] +>> +endobj +77 0 obj +<< +/S /GoTo +/D [355 0 R /XYZ 67.0 725.0 null] +>> +endobj +79 0 obj +<< +/S /GoTo +/D [355 0 R /XYZ 67.0 690.866 null] +>> +endobj +81 0 obj +<< +/S /GoTo +/D [355 0 R /XYZ 67.0 617.894 null] +>> +endobj +83 0 obj +<< +/S /GoTo +/D [355 0 R /XYZ 67.0 368.143 null] +>> +endobj +85 0 obj +<< +/S /GoTo +/D [355 0 R /XYZ 67.0 317.171 null] +>> +endobj +87 0 obj +<< +/S /GoTo +/D [364 0 R /XYZ 67.0 725.0 null] +>> +endobj +89 0 obj +<< +/S /GoTo +/D [364 0 R /XYZ 67.0 594.866 null] +>> +endobj +91 0 obj +<< +/S /GoTo +/D [364 0 R /XYZ 67.0 466.894 null] +>> +endobj +93 0 obj +<< +/S /GoTo +/D [364 0 R /XYZ 67.0 381.922 null] +>> +endobj +95 0 obj +<< +/S /GoTo +/D [364 0 R /XYZ 67.0 112.95 null] +>> +endobj +100 0 obj +<< +/S /GoTo +/D [370 0 R /XYZ 67.0 540.0 null] +>> +endobj +102 0 obj +<< +/S /GoTo +/D [370 0 R /XYZ 67.0 211.028 null] +>> +endobj +104 0 obj +<< +/S /GoTo +/D [382 0 R /XYZ 67.0 530.26 null] +>> +endobj +106 0 obj +<< +/S /GoTo +/D [382 0 R /XYZ 67.0 186.288 null] +>> +endobj +108 0 obj +<< +/S /GoTo +/D [389 0 R /XYZ 67.0 670.0 null] +>> +endobj +110 0 obj +<< +/S /GoTo +/D [399 0 R /XYZ 67.0 547.0 null] +>> +endobj +112 0 obj +<< +/S /GoTo +/D [408 0 R /XYZ 67.0 254.3 null] +>> +endobj +114 0 obj +<< +/S /GoTo +/D [414 0 R /XYZ 67.0 86.68 null] +>> +endobj +116 0 obj +<< +/S /GoTo +/D [420 0 R /XYZ 67.0 283.88 null] +>> +endobj +118 0 obj +<< +/S /GoTo +/D [424 0 R /XYZ 67.0 197.58 null] +>> +endobj +120 0 obj +<< +/S /GoTo +/D [428 0 R /XYZ 67.0 98.98 null] +>> +endobj +122 0 obj +<< +/S /GoTo +/D [434 0 R /XYZ 67.0 461.36 null] +>> +endobj +124 0 obj +<< +/S /GoTo +/D [438 0 R /XYZ 67.0 129.7 null] +>> +endobj +126 0 obj +<< +/S /GoTo +/D [446 0 R /XYZ 67.0 234.58 null] +>> +endobj +128 0 obj +<< +/S /GoTo +/D [452 0 R /XYZ 67.0 481.08 null] +>> +endobj +130 0 obj +<< +/S /GoTo +/D [456 0 R /XYZ 67.0 627.98 null] +>> +endobj +132 0 obj +<< +/S /GoTo +/D [456 0 R /XYZ 67.0 156.008 null] +>> +endobj +134 0 obj +<< +/S /GoTo +/D [468 0 R /XYZ 67.0 588.54 null] +>> +endobj +136 0 obj +<< +/S /GoTo +/D [473 0 R /XYZ 67.0 466.0 null] +>> +endobj +138 0 obj +<< +/S /GoTo +/D [479 0 R /XYZ 67.0 725.0 null] +>> +endobj +140 0 obj +<< +/S /GoTo +/D [479 0 R /XYZ 67.0 690.866 null] +>> +endobj +142 0 obj +<< +/S /GoTo +/D [479 0 R /XYZ 67.0 572.894 null] +>> +endobj +144 0 obj +<< +/S /GoTo +/D [479 0 R /XYZ 67.0 477.922 null] +>> +endobj +146 0 obj +<< +/S /GoTo +/D [479 0 R /XYZ 67.0 452.031 null] +>> +endobj +148 0 obj +<< +/S /GoTo +/D [479 0 R /XYZ 67.0 318.14 null] +>> +endobj +150 0 obj +<< +/S /GoTo +/D [479 0 R /XYZ 67.0 216.249 null] +>> +endobj +152 0 obj +<< +/S /GoTo +/D [483 0 R /XYZ 67.0 210.04 null] +>> +endobj +154 0 obj +<< +/S /GoTo +/D [483 0 R /XYZ 67.0 75.149 null] +>> +endobj +156 0 obj +<< +/S /GoTo +/D [485 0 R /XYZ 67.0 542.028 null] +>> +endobj +158 0 obj +<< +/S /GoTo +/D [495 0 R /XYZ 67.0 525.82 null] +>> +endobj +160 0 obj +<< +/S /GoTo +/D [495 0 R /XYZ 67.0 463.848 null] +>> +endobj +162 0 obj +<< +/S /GoTo +/D [495 0 R /XYZ 67.0 265.957 null] +>> +endobj +164 0 obj +<< +/S /GoTo +/D [502 0 R /XYZ 67.0 517.0 null] +>> +endobj +166 0 obj +<< +/S /GoTo +/D [504 0 R /XYZ 67.0 725.0 null] +>> +endobj +168 0 obj +<< +/S /GoTo +/D [504 0 R /XYZ 67.0 690.866 null] +>> +endobj +170 0 obj +<< +/S /GoTo +/D [504 0 R /XYZ 67.0 551.034 null] +>> +endobj +172 0 obj +<< +/S /GoTo +/D [504 0 R /XYZ 67.0 400.202 null] +>> +endobj +174 0 obj +<< +/S /GoTo +/D [504 0 R /XYZ 67.0 260.37 null] +>> +endobj +176 0 obj +<< +/S /GoTo +/D [504 0 R /XYZ 67.0 99.678 null] +>> +endobj +178 0 obj +<< +/S /GoTo +/D [512 0 R /XYZ 67.0 574.56 null] +>> +endobj +180 0 obj +<< +/S /GoTo +/D [516 0 R /XYZ 67.0 303.18 null] +>> +endobj +182 0 obj +<< +/S /GoTo +/D [516 0 R /XYZ 67.0 79.989 null] +>> +endobj +184 0 obj +<< +/S /GoTo +/D [520 0 R /XYZ 67.0 579.249 null] +>> +endobj +186 0 obj +<< +/S /GoTo +/D [520 0 R /XYZ 67.0 395.498 null] +>> +endobj +188 0 obj +<< +/S /GoTo +/D [520 0 R /XYZ 67.0 129.447 null] +>> +endobj +190 0 obj +<< +/S /GoTo +/D [525 0 R /XYZ 67.0 396.84 null] +>> +endobj +192 0 obj +<< +/S /GoTo +/D [527 0 R /XYZ 67.0 589.12 null] +>> +endobj +194 0 obj +<< +/S /GoTo +/D [527 0 R /XYZ 67.0 264.349 null] +>> +endobj +199 0 obj +<< +/S /GoTo +/D [527 0 R /XYZ 67.0 114.517 null] +>> +endobj +201 0 obj +<< +/S /GoTo +/D [529 0 R /XYZ 67.0 259.26 null] +>> +endobj +203 0 obj +<< +/S /GoTo +/D [531 0 R /XYZ 67.0 465.12 null] +>> +endobj +205 0 obj +<< +/S /GoTo +/D [531 0 R /XYZ 67.0 145.069 null] +>> +endobj +207 0 obj +<< +/S /GoTo +/D [533 0 R /XYZ 67.0 610.28 null] +>> +endobj +209 0 obj +<< +/S /GoTo +/D [533 0 R /XYZ 67.0 296.509 null] +>> +endobj +211 0 obj +<< +/S /GoTo +/D [535 0 R /XYZ 67.0 605.56 null] +>> +endobj +213 0 obj +<< +/S /GoTo +/D [545 0 R /XYZ 67.0 288.24 null] +>> +endobj +215 0 obj +<< +/S /GoTo +/D [545 0 R /XYZ 67.0 108.968 null] +>> +endobj +217 0 obj +<< +/S /GoTo +/D [553 0 R /XYZ 67.0 725.0 null] +>> +endobj +219 0 obj +<< +/S /GoTo +/D [559 0 R /XYZ 67.0 725.0 null] +>> +endobj +221 0 obj +<< +/S /GoTo +/D [570 0 R /XYZ 67.0 725.0 null] +>> +endobj +223 0 obj +<< +/S /GoTo +/D [570 0 R /XYZ 67.0 658.866 null] +>> +endobj +225 0 obj +<< +/S /GoTo +/D [575 0 R /XYZ 67.0 725.0 null] +>> +endobj +227 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 725.0 null] +>> +endobj +229 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 690.866 null] +>> +endobj +231 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 253.894 null] +>> +endobj +233 0 obj +<< +/S /GoTo +/D [608 0 R /XYZ 67.0 725.0 null] +>> +endobj +235 0 obj +<< +/S /GoTo +/D [617 0 R /XYZ 67.0 725.0 null] +>> +endobj +237 0 obj +<< +/S /GoTo +/D [621 0 R /XYZ 67.0 725.0 null] +>> +endobj +239 0 obj +<< +/S /GoTo +/D [633 0 R /XYZ 67.0 725.0 null] +>> +endobj +241 0 obj +<< +/S /GoTo +/D [639 0 R /XYZ 67.0 725.0 null] +>> +endobj +246 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 514.894 null] +>> +endobj +248 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 552.894 null] +>> +endobj +250 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 617.894 null] +>> +endobj +252 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 671.894 null] +>> +endobj +254 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 460.894 null] +>> +endobj +256 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 314.894 null] +>> +endobj +267 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 207.922 null] +>> +endobj +270 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 406.894 null] +>> +endobj +273 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 644.894 null] +>> +endobj +275 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 476.894 null] +>> +endobj +278 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 368.894 null] +>> +endobj +375 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 341.894 null] +>> +endobj +488 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 234.922 null] +>> +endobj +490 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 126.922 null] +>> +endobj +492 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 180.922 null] +>> +endobj +500 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 153.922 null] +>> +endobj +564 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 590.894 null] +>> +endobj +573 0 obj +<< +/S /GoTo +/D [577 0 R /XYZ 67.0 422.894 null] +>> +endobj +641 0 obj +<< + /First 643 0 R + /Last 816 0 R +>> endobj +642 0 obj +<< +/S /GoTo +/D [6 0 R /XYZ 67.0 506.542 null] +>> +endobj +644 0 obj +<< +/S /GoTo +/D [6 0 R /XYZ 67.0 416.408 null] +>> +endobj +646 0 obj +<< +/S /GoTo +/D [6 0 R /XYZ 67.0 359.274 null] +>> +endobj +648 0 obj +<< +/S /GoTo +/D [8 0 R /XYZ 67.0 725.0 null] +>> +endobj +654 0 obj +<< +/S /GoTo +/D [262 0 R /XYZ 67.0 725.0 null] +>> +endobj +656 0 obj +<< +/S /GoTo +/D [285 0 R /XYZ 67.0 725.0 null] +>> +endobj +659 0 obj +<< +/S /GoTo +/D [285 0 R /XYZ 67.0 269.894 null] +>> +endobj +662 0 obj +<< +/S /GoTo +/D [290 0 R /XYZ 67.0 690.866 null] +>> +endobj +664 0 obj +<< +/S /GoTo +/D [292 0 R /XYZ 67.0 681.0 null] +>> +endobj +670 0 obj +<< +/S /GoTo +/D [297 0 R /XYZ 67.0 333.151 null] +>> +endobj +672 0 obj +<< +/S /GoTo +/D [301 0 R /XYZ 67.0 668.28 null] +>> +endobj +674 0 obj +<< +/S /GoTo +/D [305 0 R /XYZ 67.0 668.28 null] +>> +endobj +676 0 obj +<< +/S /GoTo +/D [305 0 R /XYZ 67.0 245.369 null] +>> +endobj +678 0 obj +<< +/S /GoTo +/D [311 0 R /XYZ 67.0 539.98 null] +>> +endobj +680 0 obj +<< +/S /GoTo +/D [311 0 R /XYZ 67.0 213.789 null] +>> +endobj +682 0 obj +<< +/S /GoTo +/D [318 0 R /XYZ 67.0 461.84 null] +>> +endobj +684 0 obj +<< +/S /GoTo +/D [324 0 R /XYZ 67.0 709.0 null] +>> +endobj +686 0 obj +<< +/S /GoTo +/D [324 0 R /XYZ 67.0 361.949 null] +>> +endobj +689 0 obj +<< +/S /GoTo +/D [331 0 R /XYZ 67.0 573.529 null] +>> +endobj +691 0 obj +<< +/S /GoTo +/D [331 0 R /XYZ 67.0 500.557 null] +>> +endobj +696 0 obj +<< +/S /GoTo +/D [339 0 R /XYZ 67.0 325.94 null] +>> +endobj +699 0 obj +<< +/S /GoTo +/D [344 0 R /XYZ 67.0 170.249 null] +>> +endobj +702 0 obj +<< +/S /GoTo +/D [355 0 R /XYZ 67.0 690.866 null] +>> +endobj +704 0 obj +<< +/S /GoTo +/D [355 0 R /XYZ 67.0 617.894 null] +>> +endobj +706 0 obj +<< +/S /GoTo +/D [355 0 R /XYZ 67.0 368.143 null] +>> +endobj +708 0 obj +<< +/S /GoTo +/D [355 0 R /XYZ 67.0 317.171 null] +>> +endobj +710 0 obj +<< +/S /GoTo +/D [364 0 R /XYZ 67.0 725.0 null] +>> +endobj +712 0 obj +<< +/S /GoTo +/D [364 0 R /XYZ 67.0 594.866 null] +>> +endobj +717 0 obj +<< +/S /GoTo +/D [370 0 R /XYZ 67.0 540.0 null] +>> +endobj +719 0 obj +<< +/S /GoTo +/D [370 0 R /XYZ 67.0 211.028 null] +>> +endobj +723 0 obj +<< +/S /GoTo +/D [389 0 R /XYZ 67.0 670.0 null] +>> +endobj +735 0 obj +<< +/S /GoTo +/D [456 0 R /XYZ 67.0 627.98 null] +>> +endobj +738 0 obj +<< +/S /GoTo +/D [468 0 R /XYZ 67.0 588.54 null] +>> +endobj +756 0 obj +<< +/S /GoTo +/D [504 0 R /XYZ 67.0 690.866 null] +>> +endobj +758 0 obj +<< +/S /GoTo +/D [504 0 R /XYZ 67.0 551.034 null] +>> +endobj +760 0 obj +<< +/S /GoTo +/D [504 0 R /XYZ 67.0 400.202 null] +>> +endobj +762 0 obj +<< +/S /GoTo +/D [504 0 R /XYZ 67.0 260.37 null] +>> +endobj +764 0 obj +<< +/S /GoTo +/D [504 0 R /XYZ 67.0 99.678 null] +>> +endobj +766 0 obj +<< +/S /GoTo +/D [512 0 R /XYZ 67.0 574.56 null] +>> +endobj +768 0 obj +<< +/S /GoTo +/D [516 0 R /XYZ 67.0 303.18 null] +>> +endobj +770 0 obj +<< +/S /GoTo +/D [516 0 R /XYZ 67.0 79.989 null] +>> +endobj +772 0 obj +<< +/S /GoTo +/D [520 0 R /XYZ 67.0 579.249 null] +>> +endobj +774 0 obj +<< +/S /GoTo +/D [520 0 R /XYZ 67.0 395.498 null] +>> +endobj +776 0 obj +<< +/S /GoTo +/D [520 0 R /XYZ 67.0 129.447 null] +>> +endobj +778 0 obj +<< +/S /GoTo +/D [525 0 R /XYZ 67.0 396.84 null] +>> +endobj +780 0 obj +<< +/S /GoTo +/D [527 0 R /XYZ 67.0 589.12 null] +>> +endobj +782 0 obj +<< +/S /GoTo +/D [527 0 R /XYZ 67.0 264.349 null] +>> +endobj +784 0 obj +<< +/S /GoTo +/D [527 0 R /XYZ 67.0 114.517 null] +>> +endobj +786 0 obj +<< +/S /GoTo +/D [529 0 R /XYZ 67.0 259.26 null] +>> +endobj +788 0 obj +<< +/S /GoTo +/D [531 0 R /XYZ 67.0 465.12 null] +>> +endobj +791 0 obj +<< +/S /GoTo +/D [533 0 R /XYZ 67.0 610.28 null] +>> +endobj +793 0 obj +<< +/S /GoTo +/D [533 0 R /XYZ 67.0 296.509 null] +>> +endobj +795 0 obj +<< +/S /GoTo +/D [535 0 R /XYZ 67.0 605.56 null] +>> +endobj +797 0 obj +<< +/S /GoTo +/D [545 0 R /XYZ 67.0 288.24 null] +>> +endobj +799 0 obj +<< +/S /GoTo +/D [545 0 R /XYZ 67.0 108.968 null] +>> +endobj +803 0 obj +<< +/S /GoTo +/D [570 0 R /XYZ 67.0 725.0 null] +>> +endobj +805 0 obj +<< +/S /GoTo +/D [570 0 R /XYZ 67.0 658.866 null] +>> +endobj +813 0 obj +<< +/S /GoTo +/D [621 0 R /XYZ 67.0 725.0 null] +>> +endobj +xref +0 821 +0000000000 65535 f +0000260739 00000 n +0000261459 00000 n +0000280862 00000 n +0000000015 00000 n +0000000071 00000 n +0000001261 00000 n +0000001367 00000 n +0000003906 00000 n +0000004026 00000 n +0000004346 00000 n +0000280978 00000 n +0000004481 00000 n +0000281043 00000 n +0000004616 00000 n +0000281110 00000 n +0000004751 00000 n +0000281177 00000 n +0000004886 00000 n +0000281244 00000 n +0000005021 00000 n +0000281309 00000 n +0000005156 00000 n +0000281374 00000 n +0000005290 00000 n +0000281441 00000 n +0000005425 00000 n +0000281508 00000 n +0000005560 00000 n +0000281573 00000 n +0000005695 00000 n +0000281640 00000 n +0000005830 00000 n +0000281705 00000 n +0000005965 00000 n +0000281770 00000 n +0000006100 00000 n +0000281837 00000 n +0000006235 00000 n +0000281904 00000 n +0000006370 00000 n +0000281971 00000 n +0000006505 00000 n +0000282038 00000 n +0000006640 00000 n +0000282104 00000 n +0000006775 00000 n +0000282170 00000 n +0000006910 00000 n +0000282237 00000 n +0000007045 00000 n +0000282303 00000 n +0000007180 00000 n +0000282370 00000 n +0000007314 00000 n +0000282436 00000 n +0000007449 00000 n +0000282501 00000 n +0000007584 00000 n +0000282568 00000 n +0000007719 00000 n +0000282634 00000 n +0000007854 00000 n +0000282701 00000 n +0000007989 00000 n +0000282768 00000 n +0000008124 00000 n +0000282833 00000 n +0000008259 00000 n +0000282900 00000 n +0000008393 00000 n +0000282966 00000 n +0000008528 00000 n +0000283032 00000 n +0000008663 00000 n +0000283098 00000 n +0000008798 00000 n +0000283165 00000 n +0000008933 00000 n +0000283230 00000 n +0000009068 00000 n +0000283297 00000 n +0000009203 00000 n +0000283364 00000 n +0000009338 00000 n +0000283431 00000 n +0000009473 00000 n +0000283498 00000 n +0000009608 00000 n +0000283563 00000 n +0000009743 00000 n +0000283630 00000 n +0000009878 00000 n +0000283697 00000 n +0000010012 00000 n +0000283764 00000 n +0000010145 00000 n +0000012784 00000 n +0000012907 00000 n +0000013310 00000 n +0000283830 00000 n +0000013442 00000 n +0000283896 00000 n +0000013575 00000 n +0000283964 00000 n +0000013708 00000 n +0000284031 00000 n +0000013841 00000 n +0000284099 00000 n +0000013974 00000 n +0000284165 00000 n +0000014107 00000 n +0000284231 00000 n +0000014240 00000 n +0000284297 00000 n +0000014373 00000 n +0000284363 00000 n +0000014506 00000 n +0000284430 00000 n +0000014639 00000 n +0000284497 00000 n +0000014772 00000 n +0000284563 00000 n +0000014904 00000 n +0000284630 00000 n +0000015037 00000 n +0000284696 00000 n +0000015170 00000 n +0000284763 00000 n +0000015303 00000 n +0000284830 00000 n +0000015436 00000 n +0000284897 00000 n +0000015569 00000 n +0000284965 00000 n +0000015702 00000 n +0000285032 00000 n +0000015835 00000 n +0000285098 00000 n +0000015968 00000 n +0000285164 00000 n +0000016103 00000 n +0000285232 00000 n +0000016238 00000 n +0000285300 00000 n +0000016373 00000 n +0000285368 00000 n +0000016508 00000 n +0000285436 00000 n +0000016643 00000 n +0000285503 00000 n +0000016777 00000 n +0000285571 00000 n +0000016912 00000 n +0000285638 00000 n +0000017047 00000 n +0000285705 00000 n +0000017182 00000 n +0000285773 00000 n +0000017317 00000 n +0000285840 00000 n +0000017452 00000 n +0000285908 00000 n +0000017587 00000 n +0000285976 00000 n +0000017722 00000 n +0000286042 00000 n +0000017857 00000 n +0000286108 00000 n +0000017992 00000 n +0000286176 00000 n +0000018127 00000 n +0000286244 00000 n +0000018262 00000 n +0000286312 00000 n +0000018397 00000 n +0000286379 00000 n +0000018532 00000 n +0000286446 00000 n +0000018667 00000 n +0000286513 00000 n +0000018802 00000 n +0000286580 00000 n +0000018937 00000 n +0000286647 00000 n +0000019072 00000 n +0000286715 00000 n +0000019207 00000 n +0000286783 00000 n +0000019342 00000 n +0000286851 00000 n +0000019477 00000 n +0000286918 00000 n +0000019611 00000 n +0000286985 00000 n +0000019744 00000 n +0000021260 00000 n +0000021386 00000 n +0000021583 00000 n +0000287053 00000 n +0000021716 00000 n +0000287121 00000 n +0000021849 00000 n +0000287188 00000 n +0000021982 00000 n +0000287255 00000 n +0000022115 00000 n +0000287323 00000 n +0000022248 00000 n +0000287390 00000 n +0000022381 00000 n +0000287458 00000 n +0000022514 00000 n +0000287525 00000 n +0000022647 00000 n +0000287592 00000 n +0000022780 00000 n +0000287660 00000 n +0000022913 00000 n +0000287726 00000 n +0000023047 00000 n +0000287792 00000 n +0000023181 00000 n +0000287858 00000 n +0000023316 00000 n +0000287926 00000 n +0000023451 00000 n +0000287992 00000 n +0000023586 00000 n +0000288058 00000 n +0000023721 00000 n +0000288126 00000 n +0000023856 00000 n +0000288194 00000 n +0000023991 00000 n +0000288260 00000 n +0000024126 00000 n +0000288326 00000 n +0000024261 00000 n +0000288392 00000 n +0000024396 00000 n +0000288458 00000 n +0000024530 00000 n +0000027554 00000 n +0000027680 00000 n +0000027765 00000 n +0000288524 00000 n +0000027904 00000 n +0000288592 00000 n +0000028043 00000 n +0000288660 00000 n +0000028182 00000 n +0000288728 00000 n +0000028319 00000 n +0000288796 00000 n +0000028456 00000 n +0000288864 00000 n +0000028595 00000 n +0000028734 00000 n +0000028873 00000 n +0000029397 00000 n +0000029507 00000 n +0000030917 00000 n +0000031043 00000 n +0000031184 00000 n +0000031323 00000 n +0000031462 00000 n +0000288932 00000 n +0000031600 00000 n +0000031739 00000 n +0000289000 00000 n +0000031878 00000 n +0000032014 00000 n +0000289068 00000 n +0000032153 00000 n +0000289136 00000 n +0000032291 00000 n +0000032430 00000 n +0000289204 00000 n +0000032569 00000 n +0000032708 00000 n +0000032846 00000 n +0000032984 00000 n +0000033123 00000 n +0000033261 00000 n +0000036340 00000 n +0000036466 00000 n +0000036503 00000 n +0000036641 00000 n +0000036779 00000 n +0000038805 00000 n +0000038915 00000 n +0000040881 00000 n +0000041007 00000 n +0000041044 00000 n +0000041182 00000 n +0000041320 00000 n +0000043696 00000 n +0000043822 00000 n +0000043851 00000 n +0000043988 00000 n +0000046512 00000 n +0000046638 00000 n +0000046667 00000 n +0000046806 00000 n +0000049061 00000 n +0000049187 00000 n +0000049232 00000 n +0000049370 00000 n +0000049508 00000 n +0000049646 00000 n +0000051775 00000 n +0000051901 00000 n +0000051954 00000 n +0000052088 00000 n +0000052226 00000 n +0000052364 00000 n +0000052500 00000 n +0000054801 00000 n +0000054927 00000 n +0000054972 00000 n +0000055106 00000 n +0000055244 00000 n +0000055382 00000 n +0000057392 00000 n +0000057518 00000 n +0000057571 00000 n +0000057709 00000 n +0000057847 00000 n +0000057985 00000 n +0000058123 00000 n +0000060830 00000 n +0000060956 00000 n +0000060985 00000 n +0000061124 00000 n +0000063746 00000 n +0000063856 00000 n +0000066317 00000 n +0000066427 00000 n +0000068827 00000 n +0000068953 00000 n +0000068990 00000 n +0000069127 00000 n +0000069265 00000 n +0000071779 00000 n +0000071905 00000 n +0000071974 00000 n +0000072110 00000 n +0000072246 00000 n +0000072382 00000 n +0000072518 00000 n +0000072654 00000 n +0000072792 00000 n +0000073856 00000 n +0000073966 00000 n +0000076326 00000 n +0000076452 00000 n +0000076505 00000 n +0000076644 00000 n +0000076780 00000 n +0000076919 00000 n +0000077056 00000 n +0000077649 00000 n +0000077759 00000 n +0000080196 00000 n +0000080322 00000 n +0000080367 00000 n +0000080506 00000 n +0000080645 00000 n +0000080783 00000 n +0000083470 00000 n +0000083596 00000 n +0000083681 00000 n +0000083816 00000 n +0000083951 00000 n +0000289272 00000 n +0000084090 00000 n +0000084229 00000 n +0000084366 00000 n +0000084505 00000 n +0000084644 00000 n +0000084780 00000 n +0000087345 00000 n +0000087471 00000 n +0000087524 00000 n +0000087663 00000 n +0000087799 00000 n +0000087938 00000 n +0000088074 00000 n +0000090775 00000 n +0000090901 00000 n +0000090978 00000 n +0000091117 00000 n +0000091256 00000 n +0000091395 00000 n +0000091534 00000 n +0000091671 00000 n +0000091810 00000 n +0000091949 00000 n +0000094465 00000 n +0000094591 00000 n +0000094644 00000 n +0000094778 00000 n +0000094912 00000 n +0000095047 00000 n +0000095186 00000 n +0000097020 00000 n +0000097130 00000 n +0000099315 00000 n +0000099441 00000 n +0000099470 00000 n +0000099609 00000 n +0000101503 00000 n +0000101613 00000 n +0000103317 00000 n +0000103427 00000 n +0000105567 00000 n +0000105693 00000 n +0000105722 00000 n +0000105861 00000 n +0000108136 00000 n +0000108262 00000 n +0000108291 00000 n +0000108430 00000 n +0000110550 00000 n +0000110676 00000 n +0000110705 00000 n +0000110844 00000 n +0000112704 00000 n +0000112814 00000 n +0000114803 00000 n +0000114929 00000 n +0000114958 00000 n +0000115093 00000 n +0000117213 00000 n +0000117339 00000 n +0000117368 00000 n +0000117507 00000 n +0000119476 00000 n +0000119586 00000 n +0000121488 00000 n +0000121614 00000 n +0000121643 00000 n +0000121778 00000 n +0000123410 00000 n +0000123520 00000 n +0000125666 00000 n +0000125792 00000 n +0000125821 00000 n +0000125960 00000 n +0000127784 00000 n +0000127894 00000 n +0000130036 00000 n +0000130162 00000 n +0000130191 00000 n +0000130330 00000 n +0000132832 00000 n +0000132958 00000 n +0000133019 00000 n +0000133156 00000 n +0000133295 00000 n +0000133434 00000 n +0000133572 00000 n +0000133710 00000 n +0000135621 00000 n +0000135747 00000 n +0000135776 00000 n +0000135911 00000 n +0000138342 00000 n +0000138468 00000 n +0000138505 00000 n +0000138644 00000 n +0000138781 00000 n +0000141323 00000 n +0000141449 00000 n +0000141478 00000 n +0000141617 00000 n +0000142071 00000 n +0000142181 00000 n +0000145263 00000 n +0000145389 00000 n +0000145418 00000 n +0000145556 00000 n +0000147723 00000 n +0000147833 00000 n +0000151108 00000 n +0000151234 00000 n +0000151287 00000 n +0000289340 00000 n +0000151426 00000 n +0000289408 00000 n +0000151565 00000 n +0000289476 00000 n +0000151702 00000 n +0000151841 00000 n +0000154397 00000 n +0000154523 00000 n +0000154568 00000 n +0000154706 00000 n +0000154844 00000 n +0000289544 00000 n +0000154983 00000 n +0000158118 00000 n +0000158228 00000 n +0000159610 00000 n +0000159736 00000 n +0000159797 00000 n +0000159935 00000 n +0000160073 00000 n +0000160209 00000 n +0000160348 00000 n +0000160485 00000 n +0000162627 00000 n +0000162753 00000 n +0000162782 00000 n +0000162917 00000 n +0000164716 00000 n +0000164842 00000 n +0000164871 00000 n +0000165009 00000 n +0000166668 00000 n +0000166794 00000 n +0000166831 00000 n +0000166970 00000 n +0000167109 00000 n +0000169391 00000 n +0000169501 00000 n +0000171116 00000 n +0000171226 00000 n +0000172985 00000 n +0000173095 00000 n +0000174727 00000 n +0000174837 00000 n +0000176884 00000 n +0000176994 00000 n +0000179570 00000 n +0000179696 00000 n +0000179725 00000 n +0000179864 00000 n +0000181690 00000 n +0000181816 00000 n +0000181845 00000 n +0000181984 00000 n +0000184036 00000 n +0000184146 00000 n +0000186105 00000 n +0000186231 00000 n +0000186260 00000 n +0000186399 00000 n +0000187079 00000 n +0000187205 00000 n +0000187234 00000 n +0000187369 00000 n +0000188133 00000 n +0000188259 00000 n +0000188304 00000 n +0000188440 00000 n +0000188579 00000 n +0000188716 00000 n +0000190912 00000 n +0000191038 00000 n +0000191115 00000 n +0000191254 00000 n +0000191392 00000 n +0000289612 00000 n +0000191531 00000 n +0000191670 00000 n +0000191808 00000 n +0000191946 00000 n +0000192085 00000 n +0000192876 00000 n +0000193002 00000 n +0000193031 00000 n +0000289680 00000 n +0000193170 00000 n +0000194166 00000 n +0000194276 00000 n +0000200275 00000 n +0000200401 00000 n +0000200646 00000 n +0000200837 00000 n +0000201027 00000 n +0000201218 00000 n +0000201408 00000 n +0000201599 00000 n +0000201788 00000 n +0000201978 00000 n +0000202169 00000 n +0000202358 00000 n +0000202549 00000 n +0000202739 00000 n +0000202930 00000 n +0000203120 00000 n +0000203310 00000 n +0000203501 00000 n +0000203691 00000 n +0000203881 00000 n +0000204071 00000 n +0000204262 00000 n +0000204452 00000 n +0000204646 00000 n +0000204837 00000 n +0000205028 00000 n +0000205218 00000 n +0000205409 00000 n +0000205599 00000 n +0000205790 00000 n +0000205979 00000 n +0000206984 00000 n +0000207110 00000 n +0000207179 00000 n +0000207355 00000 n +0000207527 00000 n +0000207718 00000 n +0000207891 00000 n +0000208074 00000 n +0000208245 00000 n +0000209174 00000 n +0000209300 00000 n +0000209329 00000 n +0000209467 00000 n +0000211366 00000 n +0000211476 00000 n +0000213098 00000 n +0000213208 00000 n +0000214963 00000 n +0000215073 00000 n +0000216527 00000 n +0000216637 00000 n +0000218698 00000 n +0000218808 00000 n +0000219233 00000 n +0000219343 00000 n +0000221397 00000 n +0000221523 00000 n +0000221568 00000 n +0000221745 00000 n +0000221920 00000 n +0000222096 00000 n +0000225305 00000 n +0000225431 00000 n +0000289748 00000 n +0000289802 00000 n +0000225452 00000 n +0000289868 00000 n +0000225649 00000 n +0000289934 00000 n +0000225845 00000 n +0000290000 00000 n +0000225994 00000 n +0000226195 00000 n +0000226419 00000 n +0000226655 00000 n +0000226946 00000 n +0000290064 00000 n +0000227282 00000 n +0000290130 00000 n +0000227518 00000 n +0000227801 00000 n +0000290196 00000 n +0000227995 00000 n +0000228271 00000 n +0000290264 00000 n +0000228530 00000 n +0000290332 00000 n +0000228784 00000 n +0000229003 00000 n +0000229292 00000 n +0000229575 00000 n +0000230067 00000 n +0000290398 00000 n +0000230408 00000 n +0000290466 00000 n +0000230737 00000 n +0000290533 00000 n +0000231063 00000 n +0000290600 00000 n +0000231477 00000 n +0000290668 00000 n +0000231838 00000 n +0000290735 00000 n +0000232163 00000 n +0000290803 00000 n +0000232464 00000 n +0000290870 00000 n +0000232765 00000 n +0000290936 00000 n +0000233067 00000 n +0000233445 00000 n +0000291004 00000 n +0000233784 00000 n +0000291072 00000 n +0000234039 00000 n +0000234298 00000 n +0000234494 00000 n +0000234843 00000 n +0000291140 00000 n +0000235216 00000 n +0000235607 00000 n +0000291207 00000 n +0000236036 00000 n +0000236358 00000 n +0000291275 00000 n +0000236664 00000 n +0000291343 00000 n +0000236937 00000 n +0000291411 00000 n +0000237220 00000 n +0000291479 00000 n +0000237540 00000 n +0000291547 00000 n +0000237835 00000 n +0000291613 00000 n +0000238102 00000 n +0000238285 00000 n +0000238524 00000 n +0000238773 00000 n +0000291681 00000 n +0000239011 00000 n +0000291747 00000 n +0000239327 00000 n +0000239658 00000 n +0000239880 00000 n +0000291815 00000 n +0000240300 00000 n +0000240629 00000 n +0000241037 00000 n +0000241438 00000 n +0000241845 00000 n +0000242310 00000 n +0000242720 00000 n +0000243049 00000 n +0000243414 00000 n +0000243738 00000 n +0000244102 00000 n +0000291881 00000 n +0000244493 00000 n +0000244839 00000 n +0000291948 00000 n +0000245240 00000 n +0000245563 00000 n +0000245956 00000 n +0000246170 00000 n +0000246471 00000 n +0000246789 00000 n +0000247029 00000 n +0000247290 00000 n +0000247578 00000 n +0000247841 00000 n +0000248146 00000 n +0000248349 00000 n +0000248571 00000 n +0000248905 00000 n +0000249128 00000 n +0000249363 00000 n +0000249610 00000 n +0000292015 00000 n +0000249900 00000 n +0000292083 00000 n +0000250165 00000 n +0000292151 00000 n +0000250457 00000 n +0000292219 00000 n +0000250802 00000 n +0000292286 00000 n +0000251147 00000 n +0000292353 00000 n +0000251462 00000 n +0000292420 00000 n +0000251813 00000 n +0000292487 00000 n +0000252064 00000 n +0000292554 00000 n +0000252348 00000 n +0000292622 00000 n +0000252632 00000 n +0000292690 00000 n +0000252898 00000 n +0000292758 00000 n +0000253176 00000 n +0000292825 00000 n +0000253536 00000 n +0000292892 00000 n +0000253869 00000 n +0000292960 00000 n +0000254179 00000 n +0000293028 00000 n +0000254471 00000 n +0000293095 00000 n +0000254778 00000 n +0000255091 00000 n +0000293162 00000 n +0000255415 00000 n +0000293229 00000 n +0000255701 00000 n +0000293297 00000 n +0000255981 00000 n +0000293364 00000 n +0000256272 00000 n +0000293431 00000 n +0000256610 00000 n +0000256920 00000 n +0000257245 00000 n +0000293499 00000 n +0000257498 00000 n +0000293565 00000 n +0000257769 00000 n +0000257996 00000 n +0000258208 00000 n +0000258426 00000 n +0000258656 00000 n +0000258898 00000 n +0000259105 00000 n +0000293633 00000 n +0000259457 00000 n +0000259810 00000 n +0000260183 00000 n +0000260299 00000 n +0000260410 00000 n +0000260517 00000 n +0000260629 00000 n +trailer +<< +/Size 821 +/Root 2 0 R +/Info 4 0 R +>> +startxref +293699 +%%EOF diff --git a/src/.svn/all-wcprops b/src/.svn/all-wcprops new file mode 100644 index 0000000..7bf56a4 --- /dev/null +++ b/src/.svn/all-wcprops @@ -0,0 +1,137 @@ +K 25 +svn:wc:ra_dav:version-url +V 40 +/svnroot/libcaldav/!svn/ver/42/trunk/src +END +delete-caldav-object.c +K 25 +svn:wc:ra_dav:version-url +V 63 +/svnroot/libcaldav/!svn/ver/41/trunk/src/delete-caldav-object.c +END +caldav.h +K 25 +svn:wc:ra_dav:version-url +V 49 +/svnroot/libcaldav/!svn/ver/39/trunk/src/caldav.h +END +get-display-name.c +K 25 +svn:wc:ra_dav:version-url +V 59 +/svnroot/libcaldav/!svn/ver/41/trunk/src/get-display-name.c +END +Makefile.in +K 25 +svn:wc:ra_dav:version-url +V 52 +/svnroot/libcaldav/!svn/ver/42/trunk/src/Makefile.in +END +delete-caldav-object.h +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/libcaldav/!svn/ver/1/trunk/src/delete-caldav-object.h +END +get-display-name.h +K 25 +svn:wc:ra_dav:version-url +V 58 +/svnroot/libcaldav/!svn/ver/1/trunk/src/get-display-name.h +END +get-caldav-report.c +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/libcaldav/!svn/ver/41/trunk/src/get-caldav-report.c +END +modify-caldav-object.c +K 25 +svn:wc:ra_dav:version-url +V 63 +/svnroot/libcaldav/!svn/ver/41/trunk/src/modify-caldav-object.c +END +lock-caldav-object.c +K 25 +svn:wc:ra_dav:version-url +V 61 +/svnroot/libcaldav/!svn/ver/41/trunk/src/lock-caldav-object.c +END +add-caldav-object.c +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/libcaldav/!svn/ver/41/trunk/src/add-caldav-object.c +END +get-caldav-report.h +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/libcaldav/!svn/ver/39/trunk/src/get-caldav-report.h +END +md5.c +K 25 +svn:wc:ra_dav:version-url +V 45 +/svnroot/libcaldav/!svn/ver/1/trunk/src/md5.c +END +options-caldav-server.c +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/libcaldav/!svn/ver/41/trunk/src/options-caldav-server.c +END +caldav-utils.c +K 25 +svn:wc:ra_dav:version-url +V 55 +/svnroot/libcaldav/!svn/ver/42/trunk/src/caldav-utils.c +END +Makefile.am +K 25 +svn:wc:ra_dav:version-url +V 52 +/svnroot/libcaldav/!svn/ver/39/trunk/src/Makefile.am +END +modify-caldav-object.h +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/libcaldav/!svn/ver/1/trunk/src/modify-caldav-object.h +END +lock-caldav-object.h +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/libcaldav/!svn/ver/9/trunk/src/lock-caldav-object.h +END +add-caldav-object.h +K 25 +svn:wc:ra_dav:version-url +V 59 +/svnroot/libcaldav/!svn/ver/1/trunk/src/add-caldav-object.h +END +caldav.c +K 25 +svn:wc:ra_dav:version-url +V 49 +/svnroot/libcaldav/!svn/ver/39/trunk/src/caldav.c +END +md5.h +K 25 +svn:wc:ra_dav:version-url +V 45 +/svnroot/libcaldav/!svn/ver/1/trunk/src/md5.h +END +options-caldav-server.h +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/libcaldav/!svn/ver/10/trunk/src/options-caldav-server.h +END +caldav-utils.h +K 25 +svn:wc:ra_dav:version-url +V 55 +/svnroot/libcaldav/!svn/ver/34/trunk/src/caldav-utils.h +END diff --git a/src/.svn/entries b/src/.svn/entries new file mode 100644 index 0000000..ac8f411 --- /dev/null +++ b/src/.svn/entries @@ -0,0 +1,776 @@ +10 + +dir +42 +https://libcaldav.svn.sourceforge.net/svnroot/libcaldav/trunk/src +https://libcaldav.svn.sourceforge.net/svnroot/libcaldav + + + +2010-05-29T15:45:56.236020Z +42 +miras + + + + + + + + + + + + + + +6bb92309-7149-0410-b568-bc30dfd0a1d5 + +delete-caldav-object.c +file + + + + +2010-05-31T07:07:58.000000Z +fab35eb73b0fb9581aa487decd83b6c6 +2010-05-25T20:53:04.081178Z +41 +miras + + + + + + + + + + + + + + + + + + + + + +8643 + +caldav.h +file + + + + +2010-05-31T07:07:58.000000Z +8b27bf73c1c7bb060ad21312f5f9af05 +2010-05-23T20:43:55.305076Z +39 +miras + + + + + + + + + + + + + + + + + + + + + +11331 + +get-display-name.c +file + + + + +2010-05-31T07:07:58.000000Z +e605700922c480f35815279a20484248 +2010-05-25T20:53:04.081178Z +41 +miras + + + + + + + + + + + + + + + + + + + + + +4631 + +Makefile.in +file + + + + +2010-05-31T07:07:58.000000Z +dd17920f8308f34a5cb6f4c546fb59ea +2010-05-29T15:45:56.236020Z +42 +miras + + + + + + + + + + + + + + + + + + + + + +21254 + +delete-caldav-object.h +file + + + + +2010-05-31T07:07:58.000000Z +a73e19682e34e9c903940f3f0fd48435 +2008-03-29T18:04:01.076545Z +1 +miras + + + + + + + + + + + + + + + + + + + + + +1244 + +get-display-name.h +file + + + + +2010-05-31T07:07:58.000000Z +78c67f8d08738e976c2decb360d90eac +2008-03-29T18:04:01.076545Z +1 +miras + + + + + + + + + + + + + + + + + + + + + +1240 + +get-caldav-report.c +file + + + + +2010-05-31T07:07:58.000000Z +fd4ef5b191fc0b3a7ea76b14a078e06c +2010-05-25T20:53:04.081178Z +41 +miras + + + + + + + + + + + + + + + + + + + + + +8572 + +modify-caldav-object.c +file + + + + +2010-05-31T07:07:58.000000Z +18119fb7cabfe0a193035aad23ccacef +2010-05-25T20:53:04.081178Z +41 +miras + + + + + + + + + + + + + + + + + + + + + +8992 + +lock-caldav-object.c +file + + + + +2010-05-31T07:07:58.000000Z +d94186940ab1caf2a060ae6bc4a836ca +2010-05-25T20:53:04.081178Z +41 +miras + + + + + + + + + + + + + + + + + + + + + +9360 + +add-caldav-object.c +file + + + + +2010-05-31T07:07:58.000000Z +9272e45b03647c432efbc8d8a6217537 +2010-05-25T20:53:04.081178Z +41 +miras + + + + + + + + + + + + + + + + + + + + + +4341 + +get-caldav-report.h +file + + + + +2010-05-31T07:07:58.000000Z +4063fdac318ff1c4b8d5845fd6d526f3 +2010-05-23T20:43:55.305076Z +39 +miras + + + + + + + + + + + + + + + + + + + + + +1609 + +md5.c +file + + + + +2010-05-31T07:07:58.000000Z +4c393b2163ae5ab0d8461709e4680b68 +2008-03-29T18:04:01.076545Z +1 +miras + + + + + + + + + + + + + + + + + + + + + +11719 + +options-caldav-server.c +file + + + + +2010-05-31T07:07:58.000000Z +bca50708fda598af1cf6c3171bf01e0d +2010-05-25T20:53:04.081178Z +41 +miras + + + + + + + + + + + + + + + + + + + + + +4545 + +Makefile.am +file + + + + +2010-05-31T07:07:58.000000Z +d4e689953457ac1f09d9bc85d4d3e855 +2010-05-23T20:43:55.305076Z +39 +miras + + + + + + + + + + + + + + + + + + + + + +1098 + +modify-caldav-object.h +file + + + + +2010-05-31T07:07:58.000000Z +7369d16e16cb3d208a3d576f69685f76 +2008-03-29T18:04:01.076545Z +1 +miras + + + + + + + + + + + + + + + + + + + + + +1244 + +caldav-utils.c +file + + + + +2010-05-31T07:07:58.000000Z +fb4b55bfc19b10aba28e8e047a9493bc +2010-05-29T15:45:56.236020Z +42 +miras + + + + + + + + + + + + + + + + + + + + + +17444 + +lock-caldav-object.h +file + + + + +2010-05-31T07:07:58.000000Z +1f07eba06bb4fe89eb8c42a6fb67df55 +2008-04-07T22:11:32.666799Z +9 +miras + + + + + + + + + + + + + + + + + + + + + +2088 + +add-caldav-object.h +file + + + + +2010-05-31T07:07:58.000000Z +4f4e1336005bc1eb283696d92ce6075f +2008-03-29T18:04:01.076545Z +1 +miras + + + + + + + + + + + + + + + + + + + + + +1236 + +caldav.c +file + + + + +2010-05-31T07:07:58.000000Z +6307ba82867c515caa761ea0e03c9e0d +2010-05-23T20:43:55.305076Z +39 +miras + + + + + + + + + + + + + + + + + + + + + +21199 + +md5.h +file + + + + +2010-05-31T07:07:58.000000Z +5238bb8df57b98358aa184bb97d686d5 +2008-03-29T18:04:01.076545Z +1 +miras + + + + + + + + + + + + + + + + + + + + + +1517 + +options-caldav-server.h +file + + + + +2010-05-31T07:07:58.000000Z +100c2c473b064d0b0c99135a3f8c8992 +2010-02-27T11:17:33.222356Z +10 +miras + + + + + + + + + + + + + + + + + + + + + +1774 + +caldav-utils.h +file + + + + +2010-05-31T07:07:58.000000Z +790120ed34d83d7a82dd21e6543c65fc +2010-04-07T22:56:57.177660Z +34 +miras + + + + + + + + + + + + + + + + + + + + + +5300 + diff --git a/src/.svn/text-base/Makefile.am.svn-base b/src/.svn/text-base/Makefile.am.svn-base new file mode 100644 index 0000000..59d3126 --- /dev/null +++ b/src/.svn/text-base/Makefile.am.svn-base @@ -0,0 +1,53 @@ +AUTOMAKE_OPTIONS = gnu + +INCLUDES = @CURL_CFLAGS@ @GLIB_CFLAGS@ \ + -I$(top_srcdir) -I$(top_builddir) + +if STATIC_LINK +noinst_LTLIBRARIES = libcaldav.la +endif + +if DYNAMIC_LINK +lib_LTLIBRARIES = libcaldav.la +endif + +libcaldav_la_LDFLAGS = -version-info @LIBVERSION@ + +libcaldav_la_SOURCES = \ + caldav.h \ + caldav.c \ + add-caldav-object.c \ + add-caldav-object.h \ + delete-caldav-object.c \ + delete-caldav-object.h \ + modify-caldav-object.c \ + modify-caldav-object.h \ + get-caldav-report.c \ + get-caldav-report.h \ + get-display-name.c \ + get-display-name.h \ + caldav-utils.c \ + caldav-utils.h \ + md5.c \ + md5.h \ + options-caldav-server.c \ + options-caldav-server.h \ + lock-caldav-object.c \ + lock-caldav-object.h \ + get-freebusy-report.c \ + get-freebusy-report.h + +libcaldav_includedir=$(includedir)/libcaldav-@VERSION@ +libcaldav_include_HEADERS = caldav.h + +noinst_HEADERS = \ + add-caldav-object.h \ + delete-caldav-object.h \ + modify-caldav-object.h \ + get-caldav-report.h \ + caldav-utils.h + +libcaldav_la_LIBADD = \ + @CURL_LIBS@ \ + @GLIB_LIBS@ + diff --git a/src/.svn/text-base/Makefile.in.svn-base b/src/.svn/text-base/Makefile.in.svn-base new file mode 100644 index 0000000..5803fc2 --- /dev/null +++ b/src/.svn/text-base/Makefile.in.svn-base @@ -0,0 +1,649 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src +DIST_COMMON = $(libcaldav_include_HEADERS) $(noinst_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(libcaldav_includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +libcaldav_la_DEPENDENCIES = +am_libcaldav_la_OBJECTS = caldav.lo add-caldav-object.lo \ + delete-caldav-object.lo modify-caldav-object.lo \ + get-caldav-report.lo get-display-name.lo caldav-utils.lo \ + md5.lo options-caldav-server.lo lock-caldav-object.lo \ + get-freebusy-report.lo +libcaldav_la_OBJECTS = $(am_libcaldav_la_OBJECTS) +libcaldav_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libcaldav_la_LDFLAGS) $(LDFLAGS) -o $@ +@DYNAMIC_LINK_TRUE@am_libcaldav_la_rpath = -rpath $(libdir) +@STATIC_LINK_TRUE@am_libcaldav_la_rpath = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libcaldav_la_SOURCES) +DIST_SOURCES = $(libcaldav_la_SOURCES) +HEADERS = $(libcaldav_include_HEADERS) $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURL_CFLAGS = @CURL_CFLAGS@ +CURL_LIBS = @CURL_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DX_CONFIG = @DX_CONFIG@ +DX_DOCDIR = @DX_DOCDIR@ +DX_DOT = @DX_DOT@ +DX_DOXYGEN = @DX_DOXYGEN@ +DX_DVIPS = @DX_DVIPS@ +DX_EGREP = @DX_EGREP@ +DX_ENV = @DX_ENV@ +DX_FLAG_chi = @DX_FLAG_chi@ +DX_FLAG_chm = @DX_FLAG_chm@ +DX_FLAG_doc = @DX_FLAG_doc@ +DX_FLAG_dot = @DX_FLAG_dot@ +DX_FLAG_html = @DX_FLAG_html@ +DX_FLAG_man = @DX_FLAG_man@ +DX_FLAG_pdf = @DX_FLAG_pdf@ +DX_FLAG_ps = @DX_FLAG_ps@ +DX_FLAG_rtf = @DX_FLAG_rtf@ +DX_FLAG_xml = @DX_FLAG_xml@ +DX_HHC = @DX_HHC@ +DX_LATEX = @DX_LATEX@ +DX_MAKEINDEX = @DX_MAKEINDEX@ +DX_PDFLATEX = @DX_PDFLATEX@ +DX_PERL = @DX_PERL@ +DX_PROJECT = @DX_PROJECT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBVERSION = @LIBVERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = gnu +INCLUDES = @CURL_CFLAGS@ @GLIB_CFLAGS@ \ + -I$(top_srcdir) -I$(top_builddir) + +@STATIC_LINK_TRUE@noinst_LTLIBRARIES = libcaldav.la +@DYNAMIC_LINK_TRUE@lib_LTLIBRARIES = libcaldav.la +libcaldav_la_LDFLAGS = -version-info @LIBVERSION@ +libcaldav_la_SOURCES = \ + caldav.h \ + caldav.c \ + add-caldav-object.c \ + add-caldav-object.h \ + delete-caldav-object.c \ + delete-caldav-object.h \ + modify-caldav-object.c \ + modify-caldav-object.h \ + get-caldav-report.c \ + get-caldav-report.h \ + get-display-name.c \ + get-display-name.h \ + caldav-utils.c \ + caldav-utils.h \ + md5.c \ + md5.h \ + options-caldav-server.c \ + options-caldav-server.h \ + lock-caldav-object.c \ + lock-caldav-object.h \ + get-freebusy-report.c \ + get-freebusy-report.h + +libcaldav_includedir = $(includedir)/libcaldav-@VERSION@ +libcaldav_include_HEADERS = caldav.h +noinst_HEADERS = \ + add-caldav-object.h \ + delete-caldav-object.h \ + modify-caldav-object.h \ + get-caldav-report.h \ + caldav-utils.h + +libcaldav_la_LIBADD = \ + @CURL_LIBS@ \ + @GLIB_LIBS@ + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libcaldav.la: $(libcaldav_la_OBJECTS) $(libcaldav_la_DEPENDENCIES) + $(libcaldav_la_LINK) $(am_libcaldav_la_rpath) $(libcaldav_la_OBJECTS) $(libcaldav_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add-caldav-object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caldav-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caldav.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delete-caldav-object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get-caldav-report.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get-display-name.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get-freebusy-report.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lock-caldav-object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modify-caldav-object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/options-caldav-server.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-libcaldav_includeHEADERS: $(libcaldav_include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(libcaldav_includedir)" || $(MKDIR_P) "$(DESTDIR)$(libcaldav_includedir)" + @list='$(libcaldav_include_HEADERS)'; test -n "$(libcaldav_includedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libcaldav_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(libcaldav_includedir)" || exit $$?; \ + done + +uninstall-libcaldav_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(libcaldav_include_HEADERS)'; test -n "$(libcaldav_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(libcaldav_includedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(libcaldav_includedir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libcaldav_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-libcaldav_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES \ + uninstall-libcaldav_includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ + ctags distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES \ + install-libcaldav_includeHEADERS install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-libLTLIBRARIES \ + uninstall-libcaldav_includeHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/.svn/text-base/add-caldav-object.c.svn-base b/src/.svn/text-base/add-caldav-object.c.svn-base new file mode 100644 index 0000000..544c069 --- /dev/null +++ b/src/.svn/text-base/add-caldav-object.c.svn-base @@ -0,0 +1,131 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "add-caldav-object.h" +#include +#include +#include +#include +#include + +/** + * Function for adding a new event. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_add(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + gchar* url; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: text/calendar; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "If-None-Match: *"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + data.trace_ascii = settings->trace_ascii; + + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + gchar* tmp = random_file_name(settings->file); + gchar* s = rebuild_url(settings, NULL); + if (g_str_has_suffix(s, "/")) { + url = g_strdup_printf("%slibcaldav-%s.ics", s, tmp); + } + else { + url = g_strdup_printf("%s/libcaldav-%s.ics", s, tmp); + } + g_free(s); + g_free(tmp); + curl_easy_setopt(curl, CURLOPT_URL, url); + tmp = g_strdup(settings->file); + g_free(settings->file); + settings->file = verify_uid(tmp); + g_free(tmp); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, settings->file); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(settings->file)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 201) { + error->str = g_strdup(chunk.memory); + error->code = code; + result = TRUE; + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_slist_free_all(http_header); + curl_easy_cleanup(curl); + return result; +} + diff --git a/src/.svn/text-base/add-caldav-object.h.svn-base b/src/.svn/text-base/add-caldav-object.h.svn-base new file mode 100644 index 0000000..0756e74 --- /dev/null +++ b/src/.svn/text-base/add-caldav-object.h.svn-base @@ -0,0 +1,35 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __ADD_CALDAV_OBJECT_H__ +#define __ADD_CALDAV_OBJECT_H__ + +#include "caldav-utils.h" +#include "caldav.h" + +/** + * Function for adding a new event. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_add(caldav_settings* settings, caldav_error* error); + +#endif + diff --git a/src/.svn/text-base/caldav-utils.c.svn-base b/src/.svn/text-base/caldav-utils.c.svn-base new file mode 100644 index 0000000..50ce7ae --- /dev/null +++ b/src/.svn/text-base/caldav-utils.c.svn-base @@ -0,0 +1,713 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "caldav-utils.h" +#include "md5.h" +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * This function is burrowed from the libcurl documentation + * @param text + * @param stream + * @param ptr + * @param size + * @param nohex + */ +void dump(const char* text, FILE* stream, char* ptr, size_t size, char nohex) { + size_t i; + size_t c; + + unsigned int width=0x10; + + if(nohex) + /* without the hex output, we can fit more on screen */ + width = 0x40; + fprintf(stream, "%s, %zd bytes (0x%zx)\n", text, size, size); + for(i=0; i=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.'); + /* check again for 0D0A, to avoid an extra \n if it's at width */ + if (nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) { + i+=(c+3-width); + break; + } + } + fputc('\n', stream); /* newline */ + } + fflush(stream); +} + +/** + * This function is burrowed from the libcurl documentation + * @param handle + * @param type + * @param data + * @param size + * @param userp + * @return + */ +int my_trace(CURL* handle, curl_infotype type, char* data, size_t size, void* userp) { + struct config_data* config = (struct config_data *)userp; + const char* text; + (void)handle; /* prevent compiler warning */ + + switch (type) { + case CURLINFO_TEXT: + fprintf(stderr, "== Info: %s", data); + default: /* in case a new one is introduced to shock us */ + return 0; + case CURLINFO_HEADER_OUT: + text = "=> Send header"; + break; + case CURLINFO_DATA_OUT: + text = "=> Send data"; + break; + case CURLINFO_SSL_DATA_OUT: + text = "=> Send SSL data"; + break; + case CURLINFO_HEADER_IN: + text = "<= Recv header"; + break; + case CURLINFO_DATA_IN: + text = "<= Recv data"; + break; + case CURLINFO_SSL_DATA_IN: + text = "<= Recv SSL data"; + break; + } + dump(text, stderr, data, size, config->trace_ascii); + return 0; +} + +/** + * This function is burrowed from the libcurl documentation + * @param ptr + * @param size + * @return void* to memory region + */ +static void* myrealloc(void* ptr, size_t size) { +/* There might be a realloc() out there that doesn't like reallocing + * NULL pointers, so we take care of it here + * */ + if(ptr) + return realloc(ptr, size); + else + return malloc(size); +} + +/** + * This function is burrowed from the libcurl documentation + * @param ptr + * @param size + * @param nmemb + * @param data + * @return number of written bytes + */ +size_t WriteMemoryCallback(void* ptr, size_t size, size_t nmemb, void* data) { + size_t realsize = size * nmemb; + struct MemoryStruct* mem = (struct MemoryStruct *)data; + mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1); + + if (mem->memory) { + memcpy(&(mem->memory[mem->size]), ptr, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + } + return realsize; +} + +/** + * This function is burrowed from the libcurl documentation + * @param ptr + * @param size + * @param nmemb + * @param data + * @return number of written bytes + */ +size_t WriteHeaderCallback(void* ptr, size_t size, size_t nmemb, void* data) { + size_t realsize = size * nmemb; + struct MemoryStruct* mem = (struct MemoryStruct *)data; + mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1); + + if (mem->memory) { + memcpy(&(mem->memory[mem->size]), ptr, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + } + return realsize; +} + +/* +size_t ReadMemoryCallback(void* ptr, size_t size, size_t nmemb, void* data){ + struct MemoryStruct* mem = (struct MemoryStruct *)data; + + memcpy(ptr, mem->memory, mem->size); + return mem->size; +} +*/ + +/** + * Initialize caldav settings structure. + * @param settings @see caldav_settings + */ +void init_caldav_settings(caldav_settings* settings) { + settings->username = NULL; + settings->password = NULL; + settings->url = NULL; + settings->file = NULL; + settings->usehttps = FALSE; + settings->custom_cacert = NULL; + settings->verify_ssl_certificate = TRUE; + settings->debug = FALSE; + settings->trace_ascii = TRUE; + settings->ACTION = UNKNOWN; + settings->start = 0; + settings->end = 0; +} + +/** + * Free memory assigned to caldav settings structure. + * @param settings @see caldav_settings + */ +void free_caldav_settings(caldav_settings* settings) { + if (settings->username) { + g_free(settings->username); + settings->username = NULL; + } + if (settings->password) { + g_free(settings->password); + settings->password = NULL; + } + if (settings->url) { + g_free(settings->url); + settings->url = NULL; + } + if (settings->file) { + g_free(settings->file); + settings->file = NULL; + } + if (settings->custom_cacert) { + g_free(settings->custom_cacert); + settings->custom_cacert = NULL; + } + settings->verify_ssl_certificate = TRUE; + settings->usehttps = FALSE; + settings->debug = FALSE; + settings->trace_ascii = TRUE; + settings->ACTION = UNKNOWN; + settings->start = 0; + settings->end = 0; +} + +static gchar* place_after_hostname(const gchar* start, const gchar* stop) { + gchar* newpos = NULL; + gchar* pos = (gchar *) stop; + gboolean digit = TRUE; + + if (pos && stop && strcmp(start, pos) != 0) { + while (*pos != ':' && strcmp(start, pos) != 0) + --pos; + if (pos > start) { + gchar* tmp = (gchar *) pos + 1; + /* is pos++ a port number */ + while (*tmp != '/' && digit) { + if (isdigit(*tmp) != 0) { + digit = TRUE; + tmp++; + } + else + digit = FALSE; + } + if (digit) { + /* pos was a port number */ + while (*pos != '@' && strcmp(start, pos) != 0) + --pos; + if (strcmp(start, pos) != 0) + newpos = pos; + } + else { + while (*pos != '@' && pos != stop) + pos++; + if (pos != stop) + newpos = pos; + } + } + else { + /* is a username present */ + gchar* tmp = NULL; + while (*pos != '/' && pos != stop) { + if (*pos == '@') + tmp = pos; + pos++; + } + if (tmp && pos != stop) + newpos = tmp; + } + } + return newpos; +} + +/** + * Parse URL + * @param settings @see caldav_settings + * @param url String containing URL to collection + */ +void parse_url(caldav_settings* settings, const char* url) { + char* start; + char* pos; + char* end; + char* login; + + login = pos = end = start = NULL; + if (!url) + return; + if ((pos = strstr(url, "//")) != NULL) { + /* Does the URL use https ?*/ + if (!g_ascii_strncasecmp(url,"https",5) && settings->usehttps == FALSE) { + settings->usehttps=TRUE; + } + start = g_strdup(&(*(pos + 2))); + if ((pos = place_after_hostname(start, strrchr(start, '\0') - 1)) != NULL) { + /* username and/or password present */ + login = g_strndup(start, pos - start); + end = pos; + if ((pos = strrchr(login, ':')) != NULL) { + /* both username and password is present */ + settings->username = g_strndup(login, pos - login); + settings->password = g_strdup(++pos); + } + else { + /* only username present */ + settings->username = g_strdup(login); + settings->password = NULL; + } + g_free(login); + settings->url = g_strdup(++end); + } + else { + /* no username or password present */ + settings->url = g_strdup(start); + settings->username = NULL; + settings->password = NULL; + } + g_free(start); + } +} + +/** + * Find a specific HTTP header from last request + * @param header HTTP header to search for + * @param headers String of HTTP headers from last request + * @param lowcase Should string be returned in all lower case. + * @return The header found or NULL + */ +#define MAX_TOKENS 2 +gchar* get_response_header( + const char* header, gchar* headers, gboolean lowcase) { + gchar* line; + gchar* head = NULL; + gchar* oldhead = NULL; + gchar** buf; + gchar* header_list; + gchar* saveptr; + + header_list = g_strdup(headers); + line = strtok_r(header_list, "\r\n", &saveptr); + if (line != NULL) { + do { + buf = g_strsplit(line, ":", MAX_TOKENS); + if (buf[1] != NULL) { + if (g_ascii_strcasecmp(buf[0], header) == 0) { + if (head) { + oldhead = head; + head = g_strconcat(head, ", ", buf[1], NULL); + g_free(oldhead); + } + else + head = g_strdup(buf[1]); + if (head) + g_strstrip(head); + } + } + g_strfreev(buf); + } while ((line = strtok_r(NULL, "\r\n", &saveptr)) != NULL); + } + g_free(header_list); + if (head) + return (lowcase) ? g_ascii_strdown(head, -1) : head; + else + return NULL; +} + +static const char* VCAL_HEAD = +"BEGIN:VCALENDAR\r\n" +"PRODID:-//CalDAV Calendar//NONSGML libcaldav//EN\r\n" +"VERSION:2.0\r\n"; +static const char* VCAL_FOOT = "END:VCALENDAR"; + +/** + * Parse response from CalDAV server. Internal function. + * @param report Response from server + * @param element XML element to find + * @param type VCalendar element to find + * @param wrap Is this the final parsing or just a part + * @param recursive Stop after first match or not + * @return the parsed result + */ +static gchar* parse_caldav_report_wrap( + char* report, const char* element, const char* type, + gboolean wrap, gboolean recursive) { + char* pos; + char* start; + char* object; + char* tmp_report; + char* tmp; + gchar* response; + gchar* begin_type; + gchar* end_type; + gboolean keep_going = TRUE; + + begin_type = g_strdup_printf("BEGIN:%s", type); + end_type = g_strdup_printf("END:%s", type); + pos = start = object = response = NULL; + tmp_report = g_strdup(report); + while ((pos = strstr(tmp_report, element)) != NULL && keep_going) { + pos = strchr(pos, '>'); + if (!pos) { + break; + } + pos = &(*(pos + 1)); + pos = strstr(pos, begin_type); + if (!pos) { + break; + } + object = &(*(pos + strlen(begin_type))); + object = g_strchug(object); + start = g_strdup(object); + if ((pos = strstr(start, end_type)) == NULL) { + g_free(start); + break; + } + object = g_strndup(start, strlen(start) - strlen(pos)); + if (response) { + tmp = g_strdup(response); + g_free(response); + response = g_strdup_printf("%s%s\r\n%s%s\r\n", + tmp, begin_type, object, end_type); + g_free(tmp); + } + else { + if (wrap) + response = g_strdup_printf("%s%s\r\n%s%s\r\n", + VCAL_HEAD, begin_type, object, end_type); + else + response = g_strdup_printf("%s\r\n%s%s\r\n", + begin_type, object, end_type); + } + if (recursive) { + pos = strchr(pos, '>'); + g_free(tmp_report); + tmp_report = g_strdup(&(*(pos + 1))); + } + else { + keep_going = FALSE; + } + g_free(start); + g_free(object); + } + g_free(tmp_report); + g_free(begin_type); + g_free(end_type); + if (wrap) + if (response) { + object = g_strdup(response); + g_free(response); + response = g_strdup_printf("%s%s", object, VCAL_FOOT); + g_free(object); + } + return response; +} + +/** + * Parse response from CalDAV server + * @param report Response from server + * @param element XML element to find + * @param type VCalendar element to find + * @return the parsed result + */ +gchar* parse_caldav_report(char* report, const char* element, const char* type) { + gchar* response = NULL; + gchar* timezone = NULL; + gchar* temp = NULL; + + if (!report || !element || !type) + return NULL; + /* test for VTIMEZONE. + * Only the first found will be used and this will then + * be the time zone for the entire report + */ + timezone = parse_caldav_report_wrap( + report, element, "VTIMEZONE", FALSE, FALSE); + if (timezone) { + response = g_strdup_printf("%s%s", VCAL_HEAD, timezone); + g_free(timezone); + temp = parse_caldav_report_wrap(report, element, type, FALSE, TRUE); + if (temp) { + gchar* tmp = g_strdup(response); + g_free(response); + response = g_strdup_printf("%s%s%s", tmp, temp, VCAL_FOOT); + g_free(tmp); + g_free(temp); + } + else { + g_free(response); + return NULL; + } + } + else + response = parse_caldav_report_wrap(report, element, type, TRUE, TRUE); + return response; +} + +/** + * Convert a time_t variable to CalDAV DateTime + * @param time a specific date and time + * @return the CalDAV DateTime + */ +gchar* get_caldav_datetime(time_t* time) { + struct tm *current; + gchar* datetime; + + current = localtime(time); + datetime = g_strdup_printf("%d%.2d%.2dT%.2d%.2d%.2dZ", + current->tm_year + 1900, current->tm_mon + 1, current->tm_mday, + current->tm_hour, current->tm_min, current->tm_sec); + return datetime; +} + +/** + * Create a random text string, using MD5. @see caldav_md5_hex_digest() + * @param text some text to randomize + * @return MD5 hash of text + */ +gchar* random_file_name(gchar* text) { + unsigned char* name; + gchar md5sum[33]; + + name = (unsigned char *) g_strdup(text); + caldav_md5_hex_digest(md5sum, name); + g_free(name); + return g_strdup(md5sum); +} + +/** + * Does the event contain a UID element or not. If not add it. + * @param object A specific event + * @return event, eventually added UID + */ +gchar* verify_uid(gchar* object) { + gchar* uid; + gchar* newobj; + gchar* pos; + + newobj = g_strdup(object); + uid = get_response_header("uid", object, TRUE); + if (!uid) { + object = g_strdup(newobj); + g_free(newobj); + pos = strstr(object, "END:VEVENT"); + newobj = g_strndup(object, strlen(object) - strlen(pos)); + newobj = g_strchomp(newobj); + uid = random_file_name(object); + gchar*tmp = g_strdup(newobj); + g_free(newobj); + newobj = g_strdup_printf("%s\r\nUID:libcaldav-%s@tempuri.org\r\n%s", + tmp, uid, pos); + g_free(uid); + g_free(tmp); + g_free(object); + } + else + g_free(uid); + /*uid = g_strdup(newobj); + g_free(newobj);*/ + g_strchomp(newobj); + /*g_free(uid);*/ + return newobj; +} + +/** + * Fetch a URL from a XML element + * @param text String + * @return URL + */ +#define ELEM_HREF "href>" +gchar* get_url(gchar* text) { + gchar* pos; + gchar* url = NULL; + + if ((pos = strstr(text, ELEM_HREF)) == NULL) + return url; + pos = &(*(pos + strlen(ELEM_HREF))); + url = g_strndup(pos, strlen(pos) - strlen(strchr(pos, '<'))); + return url; +} + +/** + * Fetch any element from XML + * @param text String + * @param tag The element to look for + * @return element + */ +gchar* get_tag(const gchar* tag, gchar* text) { + gchar *pos; + gchar* res = NULL; + gchar* the_tag = NULL; + + /*printf("%s\n", text);*/ + the_tag = g_strdup_printf("<%s>", tag); + if ((pos = strstr(text, the_tag)) == NULL) { + g_free(the_tag); + return res; + } + pos = &(*(pos + strlen(the_tag))); + res = g_strndup(pos, strlen(pos) - strlen(strchr(pos, '<'))); + g_free(the_tag); + return res; +} + +/** + * Fetch the etag element from XML + * @param text String + * @return etag + */ +#define ELEM_ETAG "getetag" +gchar* get_etag(gchar* text) { + gchar* etag = NULL; + + etag = get_tag(ELEM_ETAG, text); + /* Maybe namespace prefixed */ + if (!etag) { + etag = get_tag("D:getetag", text); + } + return etag; +} + +/** + * Fetch host from URL + * @param url URL + * @return host + */ +gchar* get_host(gchar* url) { + gchar** buf; + gchar* result = NULL; + + buf = g_strsplit(url, "/", 2); + if (buf[0]) { + result = g_strdup(buf[0]); + } + g_strfreev(buf); + return result; +} + +/** + * rebuild a raw URL with https if needed from the settings + * @param settings caldav_settings + * @param uri URI to use instead of base + * @return URL + */ + +gchar* rebuild_url(caldav_settings* settings, gchar* uri){ + gchar* url = NULL; + gchar* mystr = NULL; + if (settings->usehttps) { + mystr = "https://"; + } else { + mystr = "http://"; + } + if (uri) + url = g_strdup_printf("%s%s", mystr, uri); + else + url = g_strdup_printf("%s%s", mystr,settings->url); + + return url; +} + +/** + * Prepare a curl connection + * @param settings caldav_settings + * @return CURL + */ +CURL* get_curl(caldav_settings* setting) { + CURL* curl; + gchar* userpwd = NULL; + gchar* url = NULL; + + curl = curl_easy_init(); + if (curl) { + if (setting->username) { + if (setting->password) + userpwd = g_strdup_printf("%s:%s", + setting->username, setting->password); + else + userpwd = g_strdup_printf("%s", setting->username); + curl_easy_setopt(curl, CURLOPT_USERPWD, userpwd); + g_free(userpwd); + } + if (setting->verify_ssl_certificate) + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2); + else { + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); + } + if (setting->custom_cacert) + curl_easy_setopt(curl, CURLOPT_CAINFO, setting->custom_cacert); + curl_easy_setopt(curl, CURLOPT_USERAGENT, __CALDAV_USERAGENT); + url = rebuild_url(setting, NULL); + curl_easy_setopt(curl, CURLOPT_URL, url); + g_free(url); + } + return (curl) ? curl : NULL; +} diff --git a/src/.svn/text-base/caldav-utils.h.svn-base b/src/.svn/text-base/caldav-utils.h.svn-base new file mode 100644 index 0000000..02c84d7 --- /dev/null +++ b/src/.svn/text-base/caldav-utils.h.svn-base @@ -0,0 +1,221 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __CALDAV_UTILS_H__ +#define __CALDAV_UTILS_H__ + +#include +#include +#include +#include "caldav.h" + +/** + * @typedef struct _CALDAV_SETTINGS caldav_settings + * A pointer to a struct _CALDAV_SETTINGS + */ +typedef struct _CALDAV_SETTINGS caldav_settings; + +/** + * @struct _CALDAV_SETTINGS + * A struct used to exchange all user input between various parts + * of the library + */ +struct _CALDAV_SETTINGS { + gchar* username; + gchar* password; + gchar* url; + gchar* file; + gboolean usehttps; + gboolean verify_ssl_certificate; + gchar* custom_cacert; + gboolean debug; + gboolean use_locking; + char trace_ascii; + CALDAV_ACTION ACTION; + time_t start; + time_t end; +}; + +/** + * @typedef struct MemoryStruct memory_ptr + * A pointer to a struct MemoryStruct + */ +typedef struct MemoryStruct memory_ptr; + +/** + * @struct MemoryStruct + * Used to hold messages between the CalDAV server and the library + */ +struct MemoryStruct { + char *memory; + size_t size; +}; + +/** @struct config_data + * Used to exchange user options to the library + */ +struct config_data { + char trace_ascii; +}; + +/** + * This function is burrowed from the libcurl documentation + * @param text + * @param stream + * @param ptr + * @param size + * @param nohex + */ +void dump(const char* text, FILE* stream, char* ptr, size_t size, char nohex); + +/** + * This function is burrowed from the libcurl documentation + * @param handle + * @param type + * @param data + * @param size + * @param userp + * @return + */ +int my_trace(CURL* handle, curl_infotype type, char* data, size_t size, void* userp); + +/** + * This function is burrowed from the libcurl documentation + * @param ptr + * @param size + * @return void* to memory region + */ +size_t WriteMemoryCallback(void* ptr, size_t size, size_t nmemb, void* data); + +/** + * This function is burrowed from the libcurl documentation + * @param ptr + * @param size + * @param nmemb + * @param data + * @return number of written bytes + */ +size_t WriteHeaderCallback(void* ptr, size_t size, size_t nmemb, void* data); + +/*size_t ReadMemoryCallback(void* ptr, size_t size, size_t nmemb, void* data);*/ + +/** + * Initialize caldav settings structure. + * @param settings @see caldav_settings + */ +void init_caldav_settings(caldav_settings* settings); + +/** + * Free momory assigned to caldav settings structure. + * @param settings @see caldav_settings + */ +void free_caldav_settings(caldav_settings* settings); + +/** + * Parse URL + * @param settings @see caldav_settings + * @param url String containing URL to collection + */ +void parse_url(caldav_settings* settings, const char* url); + +/** + * Find a specific HTTP header from last request + * @param header HTTP header to search for + * @param headers String of HTTP headers from last request + * @param lowcase Should string be returned in all lower case. + * @return The header found or NULL + */ +gchar* get_response_header( + const char* header, gchar* headers, gboolean lowcase); + +/** + * Parse response from CalDAV server + * @param report Response from server + * @param element XML element to find + * @param type VCalendar element to find + * @return the parsed result + */ +gchar* parse_caldav_report(char* report, const char* element, const char* type); + +/** + * Convert a time_t variable to CalDAV DateTime + * @param time a specific date and time + * @return the CalDAV DateTime + */ +gchar* get_caldav_datetime(time_t* time); + +/** + * Create a random text string, using MD5. @see caldav_md5_hex_digest() + * @param text some text to randomize + * @return MD5 hash of text + */ +gchar* random_file_name(gchar* text); + +/** + * Does the event contain a UID element or not. If not add it. + * @param object A specific event + * @return event, eventually added UID + */ +gchar* verify_uid(gchar* object); + +/** + * Fetch a URL from a XML element + * @param text String + * @return URL + */ +gchar* get_url(gchar* text); + +/** + * Fetch host from URL + * @param url URL + * @return host + */ +gchar* get_host(gchar* url); + +/** + * Fetch the etag element from XML + * @param text String + * @return etag + */ +gchar* get_etag(gchar* text); + +/** + * Fetch any element from XML + * @param text String + * @return element + */ +gchar* get_tag(const gchar* tag, gchar* text); + + + +/** + * rebuild a raw URL with https if needed from the settings + * @param settings caldav_settings + * @return URL + */ +gchar* rebuild_url(caldav_settings* setting, gchar* uri); + +/** + * Prepare a curl connection + * @param settings caldav_settings + * @return CURL + */ +CURL* get_curl(caldav_settings* setting); + +#endif diff --git a/src/.svn/text-base/caldav.c.svn-base b/src/.svn/text-base/caldav.c.svn-base new file mode 100644 index 0000000..193429c --- /dev/null +++ b/src/.svn/text-base/caldav.c.svn-base @@ -0,0 +1,745 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "caldav.h" +#include "caldav-utils.h" +#include "get-caldav-report.h" +#include "add-caldav-object.h" +#include "delete-caldav-object.h" +#include "modify-caldav-object.h" +#include "get-display-name.h" +#include "options-caldav-server.h" +#include "get-freebusy-report.h" +#include +#include +#include +#include +#include + +static void init_runtime(runtime_info* info) { + if (! info) + return; + if (! info->error) + info->error = g_new0(caldav_error, 1); + if (! info->options) { + info->options = g_new0(debug_curl, 1); + info->options->trace_ascii = 1; + info->options->debug = 0; + info->options->verify_ssl_certificate = TRUE; + info->options->use_locking = TRUE; + info->options->custom_cacert = NULL; + } +} + +/** + * @param curl An instance of libcurl. + * @param settings Defines CalDAV resource. Receiver is responsible for freeing + * the memory. URL is part of the structure. [http://][username:password@]host[:port]/url-path. + * See (RFC1738). + * @return FALSE (zero) mens URL does not reference a CalDAV calendar + * resource. TRUE if the URL does reference a CalDAV calendar resource. + */ +static gboolean test_caldav_enabled(CURL* curl, + caldav_settings* settings, + caldav_error* error) { + return caldav_getoptions(curl, settings, NULL, error, TRUE); +} + +/* + * @param settings An instance of caldav_settings. @see caldav_settings + * @return TRUE if there was an error. Error can be in libcurl, in libcaldav, + * or an error related to the CalDAV protocol. + */ +static gboolean make_caldav_call(caldav_settings* settings, + runtime_info* info) { + CURL* curl; + gboolean result = FALSE; + + g_return_val_if_fail(info != NULL, TRUE); + + curl = get_curl(settings); + if (!curl) { + info->error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + if (!test_caldav_enabled(curl, settings, info->error)) { + g_free(settings->file); + settings->file = NULL; + curl_easy_cleanup(curl); + return TRUE; + } + curl_easy_cleanup(curl); + switch (settings->ACTION) { + case GETALL: result = caldav_getall(settings, info->error); break; + case GET: result = caldav_getrange(settings, info->error); break; + case ADD: result = caldav_add(settings, info->error); break; + case DELETE: result = caldav_delete(settings, info->error); break; + case MODIFY: result = caldav_modify(settings, info->error); break; + case GETCALNAME: result = caldav_getname(settings, info->error); break; + case FREEBUSY: result = caldav_freebusy(settings, info->error); break; + default: break; + } + return result; +} + +/** + * Function for adding a new event. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_add_object(const char* object, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + init_caldav_settings(&settings); + settings.file = g_strdup(object); + settings.ACTION = ADD; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for deleting an event. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_delete_object(const char* object, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + init_caldav_settings(&settings); + settings.file = g_strdup(object); + settings.ACTION = DELETE; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for modifying an event. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_modify_object(const char* object, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + init_caldav_settings(&settings); + settings.file = g_strdup(object); + settings.ACTION = MODIFY; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for getting a collection of events determined by time range. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param start time_t variable specifying start and end for range. Both + * are included in range. + * @param end time_t variable specifying start and end for range. Both + * are included in range. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_get_object(response *result, + time_t start, + time_t end, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + if (!result) { + result = malloc(sizeof(response *)); + memset(result, '\0', sizeof(response *)); + } + init_caldav_settings(&settings); + settings.ACTION = GET; + settings.start = start; + settings.end = end; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + result->msg = NULL; + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + result->msg = g_strdup(settings.file); + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for getting all events from the collection. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_getall_object(response* result, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + if (!result) { + result = malloc(sizeof(response *)); + memset(result, '\0', sizeof(response *)); + } + init_caldav_settings(&settings); + settings.ACTION = GETALL; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + result->msg = NULL; + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + result->msg = g_strdup(settings.file); + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for getting the stored display name for the collection. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_get_displayname(response* result, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + if (!result) { + result = malloc(sizeof(response *)); + memset(result, '\0', sizeof(response *)); + } + init_caldav_settings(&settings); + settings.ACTION = GETCALNAME; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + result->msg = NULL; + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + result->msg = g_strdup(settings.file); + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function to test wether a calendar resource is CalDAV enabled or not. + * @param URL Defines CalDAV resource. Receiver is responsible for + * freeing the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @result 0 (zero) means no CalDAV support, otherwise CalDAV support + * detechted. + */ +int caldav_enabled_resource(const char* URL, runtime_info* info) { + CURL* curl; + caldav_settings settings; + struct config_data data; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + init_caldav_settings(&settings); + + parse_url(&settings, URL); + curl = get_curl(&settings); + if (!curl) { + info->error->code = -1; + info->error->str = g_strdup("Could not initialize libcurl"); + settings.file = NULL; + return TRUE; + } + + if (info->options->trace_ascii) + data.trace_ascii = 1; + else + data.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + + if (info->options->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + gboolean res = test_caldav_enabled(curl, &settings, info->error); + free_caldav_settings(&settings); + curl_easy_cleanup(curl); + return (res && (info->error->code == 0 || info->error->code == 200)) ? 1 : 0; +} + +/** + * Function for getting free/busy information. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param start time_t variable specifying start and end for range. Both + * are included in range. + * @param end time_t variable specifying start and end for range. Both + * are included in range. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_get_freebusy(response *result, + time_t start, + time_t end, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + if (!result) { + result = malloc(sizeof(response *)); + memset(result, '\0', sizeof(response *)); + } + init_caldav_settings(&settings); + settings.ACTION = FREEBUSY; + settings.start = start; + settings.end = end; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + result->msg = NULL; + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + result->msg = g_strdup(settings.file); + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function which supports sending various options inside the library. + * @param curl_options A struct debug_curl. See debug_curl. + */ +void caldav_set_options(debug_curl curl_options) { +} + +/** + * @deprecated Function to call in case of errors. + * Caller provides a pointer to a local caldav_error structure. + * Caldav_get_error will initialize pointer if NULL. + * Caller is responsible for freeing returned memory. + * After the first call the internal error buffer is reset. + * @param lib_error A pointer to a struct _caldav_error. @see _caldav_error + * @return An initialized caldav_error pointer to memory where error + * messages can be found from the last call to the library. + */ +caldav_error* caldav_get_error(caldav_error* lib_error) { + if (!lib_error) { + lib_error = g_new0(caldav_error, 1); + } + return lib_error; +} + +/** + * Function for freeing memory for a previous initialization of a + * caldav_error. @see caldav_get_error() + * Caller provides a pointer to a local caldav_error structure. + * @param lib_error A pointer to a struct _caldav_error. @see _caldav_error + */ +void caldav_free_error(caldav_error* lib_error) { + if (lib_error->str) + g_free(lib_error->str); + g_free(lib_error); + lib_error = NULL; +} + +/** + * Function to call to get a list of supported CalDAV options for a server + * @param URL Defines CalDAV resource. Receiver is responsible for + * freeing the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @result A list of available options or NULL in case of any error. + */ +char** caldav_get_server_options(const char* URL, runtime_info* info) { + CURL* curl; + caldav_settings settings; + response server_options; + gchar** option_list = NULL; + gchar** tmp; + gboolean res = FALSE; + + g_return_val_if_fail(info != NULL, NULL); + + init_runtime(info); + tmp = option_list = NULL; + init_caldav_settings(&settings); + + parse_url(&settings, URL); + curl = get_curl(&settings); + if (!curl) { + info->error->code = -1; + info->error->str = g_strdup("Could not initialize libcurl"); + settings.file = NULL; + return NULL; + } + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + + res = caldav_getoptions(curl, &settings, &server_options, info->error, FALSE); + if (res) { + if (server_options.msg) { + option_list = g_strsplit(server_options.msg, ", ", 0); + tmp = &(*(option_list)); + while (*tmp) { + g_strstrip(*tmp++); + } + } + } + free_caldav_settings(&settings); + curl_easy_cleanup(curl); + return (option_list) ? option_list : NULL; +} + +/** + * Function for getting an initialized runtime_info structure + * @return runtime_info. @see runtime_info + */ +runtime_info* caldav_get_runtime_info() { + runtime_info* rt_info; + + rt_info = g_new0(runtime_info, 1); + rt_info->error = g_new0(caldav_error, 1); + rt_info->options = g_new0(debug_curl, 1); + + return rt_info; +} + +/** + * Function for freeing memory for a previous initialization of an info + * structure + * @param info Address to a pointer to a runtime_info structure. @see + * runtime_info + */ +void caldav_free_runtime_info(runtime_info** info) { + runtime_info* ri; + + if (*info) { + ri = *info; + if (ri->error) { + if (ri->error->str) + g_free(ri->error->str); + g_free(ri->error); + ri->error = NULL; + } + if (ri->options) { + if (ri->options->custom_cacert) + g_free(ri->options->custom_cacert); + g_free(ri->options); + ri->options = NULL; + } + g_free(ri); + *info = ri = NULL; + } +} + +/** + * Function for getting an initialized response structure + * @return response. @see _response + */ +response* caldav_get_response() { + response* r; + + r = g_new0(response, 1); + + return r; +} + +/** + * Function for freeing memory for a previous initialization of an response + * structure + * @param info Address to a pointer to a response structure. @see + * _response + */ +void caldav_free_response(response** resp) { + response* r; + + if (*resp) { + r = *resp; + if (r->msg) + g_free(r->msg); + g_free(r); + *resp = r = NULL; + } +} diff --git a/src/.svn/text-base/caldav.h.svn-base b/src/.svn/text-base/caldav.h.svn-base new file mode 100644 index 0000000..28cb24e --- /dev/null +++ b/src/.svn/text-base/caldav.h.svn-base @@ -0,0 +1,343 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/** + * @file caldav.h + * @brief interface to the caldav library. + * The library conforms to RFC4791. For further information follow this + * link http://www.ietf.org/rfc/rfc4791.txt + */ + +/** + * @mainpage + * This document is the documentation for the public interface to libcaldav. + * If you want to study the implementation look for the developers API. + * + * The libray and documentation is Copyright (c) 2008 Michael Rasmussen + * (mir@datanom.net) + * + * License for the source code. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * License for the documentation. + * + * Permission is granted to copy, distribute and/or modify this document + * under the terms of the GNU Free Documentation License, Version 1.2 + * or any later version published by the Free Software Foundation; + * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + * Texts. + */ + +#ifndef __CALDAV_H__ +#define __CALDAV_H__ + +#include + +/* For debug purposes */ +/** + * @typedef struct debug_curl + * A struct used to set internal options in the library + */ +typedef struct { + int trace_ascii; /** @var int trace_ascii + * 0 or 1 + */ + int debug; /** @var int debug + * 0 or 1 + */ + int verify_ssl_certificate; + int use_locking; + char* custom_cacert; +} debug_curl; + +/** + * @typedef struct _caldav_error caldav_error + * Pointer to a caldav_error structure + */ +typedef struct _caldav_error caldav_error; + +/** + * @struct _caldav_error + * A struct for storing error codes and messages + */ +struct _caldav_error { + long code; /** + * @var long code + * if < 0 internal error > 0 CalDAV protocol error. + */ + char* str; /** @var char* str + * For storing human readable error message + */ +}; + +/** + * @typedef struct runtime_info + * Pointer to a runtime structure holding debug and error information + */ +typedef struct { + caldav_error* error; + debug_curl* options; +} runtime_info; + +/* CalDAV is defined in RFC4791 */ + +/* Buffer to hold response */ +/** + * @typedef struct _response response + * Pointer to a _response structure + */ +typedef struct _response response; + +/** + * @struct _response + * A struct used for returning messages from the library to users + */ +struct _response { + char* msg; /** @var char* msg + * String for storing response + */ +}; + +/** + * @enum CALDAV_ACTION specifies supported CalDAV actions. + * UNKNOWN. An unknown action. + * ADD. Add a CalDAV calendar object. + * DELETE. Delete a CalDAV calendar object. + * MODIFY. Modify a CalDAV calendar object. + * GET. Get one or more CalDAV calendar object(s). + * GETALL. Get all CalDAV calendar objects. + */ +typedef enum { + UNKNOWN, + ADD, + DELETE, + FREEBUSY, + MODIFY, + GET, + GETALL, + GETCALNAME, + ISCALDAV, + OPTIONS +} CALDAV_ACTION; + +/** + * @enum CALDAV_RESPONSE specifies CalDAV error states. + * OK (HTTP 200). Request was satisfied. + * FORBIDDEN (HTTP 403). Access not allowed. Dont repeat request. + * CONFLICT (HTTP 409). Conflict between current state of CalDAV collection + * and request. Client must solve the conflict and then resend request. + * LOCKED (HTTP 423). Locking failed. + */ +typedef enum { + OK, + FORBIDDEN, + CONFLICT, + LOCKED, + NOTIMPLEMENTED +} CALDAV_RESPONSE; + + +#ifndef __CALDAV_USERAGENT +#define __CALDAV_USERAGENT "libcurl-agent/0.1" +#endif + + +/** + * Function for adding a new event. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_add_object(const char* object, + const char* URL, + runtime_info* info); + +/** + * Function for deleting an event. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_delete_object(const char* object, + const char* URL, + runtime_info* info); + +/** + * Function for modifying an event. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_modify_object(const char* object, + const char* URL, + runtime_info* info); + +/** + * Function for getting a collection of events determined by time range. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param start time_t variable specifying start for range. Included in search. + * @param end time_t variable specifying end for range. Included in search. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_get_object(response* result, + time_t start, + time_t end, + const char* URL, + runtime_info* info); + +/** + * Function for getting all events from the collection. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_getall_object(response* result, + const char* URL, + runtime_info* info); + +/** + * Function for getting the stored display name for the collection. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_get_displayname(response* result, + const char* URL, + runtime_info* info); + +/** + * Function to test wether a calendar resource is CalDAV enabled or not. + * @param URL Defines CalDAV resource. Receiver is responsible for + * freeing the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @result 0 (zero) means no CalDAV support, otherwise CalDAV support + * detechted. + */ +int caldav_enabled_resource(const char* URL, runtime_info* info); + +/** + * Function for getting free/busy information. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param start time_t variable specifying start and end for range. Both + * are included in range. + * @param end time_t variable specifying start and end for range. Both + * are included in range. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_get_freebusy(response *result, + time_t start, + time_t end, + const char* URL, + runtime_info* info); + +/** + * @deprecated Always returns an initialized empty caldav_error + * Function to call in case of errors. + * Caller provides a pointer to a local caldav_error structure. + * Caldav_get_error will initialize pointer if NULL. + * Caller is responsible for freeing returned memory. + * After the first call the internal error buffer is reset. + * @param lib_error A pointer to a struct _caldav_error. @see _caldav_error + * @return An initialized caldav_error pointer to memory where error + * messages can be found from the last call to the library. + */ +caldav_error* caldav_get_error(caldav_error* lib_error); + +/** + * Function for freeing memory for a previous initialization of a + * caldav_error. @see caldav_get_error() + * Caller provides a pointer to a local caldav_error structure. + * @param lib_error A pointer to a struct _caldav_error. @see _caldav_error + */ +void caldav_free_error(caldav_error* lib_error); + +/* Setting various options in library */ + +/** + * @deprecated Does nothing + * Function which supports sending various options inside the library. + * @param curl_options A struct debug_curl. See debug_curl. + */ +void caldav_set_options(debug_curl curl_options); + +/** + * Function to call to get a list of supported CalDAV options for a server + * @param URL Defines CalDAV resource. Receiver is responsible for + * freeing the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @result A list of available options or NULL in case of any error. + */ +char** caldav_get_server_options(const char* URL, runtime_info* info); + +/** + * Function for getting an initialized runtime_info structure + * @return runtime_info. @see runtime_info + */ +runtime_info* caldav_get_runtime_info(); + +/** + * Function for freeing memory for a previous initialization of an info + * structure + * @param info Address to a pointer to a runtime_info structure. @see + * runtime_info + */ +void caldav_free_runtime_info(runtime_info** info); + +/** + * Function for getting an initialized response structure + * @return response. @see _response + */ +response* caldav_get_response(); + +/** + * Function for freeing memory for a previous initialization of an response + * structure + * @param info Address to a pointer to a response structure. @see + * _response + */ +void caldav_free_response(response** info); + +#endif diff --git a/src/.svn/text-base/delete-caldav-object.c.svn-base b/src/.svn/text-base/delete-caldav-object.c.svn-base new file mode 100644 index 0000000..adaa916 --- /dev/null +++ b/src/.svn/text-base/delete-caldav-object.c.svn-base @@ -0,0 +1,284 @@ +/* vim: set textwidth=80 tabstop=4: */ +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "delete-caldav-object.h" +#include "lock-caldav-object.h" +#include +#include +#include +#include +#include + +/** + * A static literal string containing the first part of the calendar query. + * The actual UID to use for the query is added at runtime. + */ +static char* search_head = +"" +"" +" " +" " +" " +" " +" " +" " +" " +" "; + +/** + * A static literal string containing the last part of the calendar query + */ +static char* search_tail = +"" +" " +" " +" " +""; + +/** + * Function for deleting an event. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_delete(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gchar* search; + gchar* uid; + gboolean LOCKSUPPORT = FALSE; + gchar* lock_token = NULL; + gboolean result = FALSE; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: infinity"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + gchar* file = g_strdup(settings->file); + if ((uid = get_response_header("uid", file, FALSE)) == NULL) { + g_free(file); + error->code = 1; + error->str = g_strdup("Error: Missing required UID for object"); + return TRUE; + } + g_free(file); + /* + * ICalendar server does not support collation + * %s + */ + search = g_strdup_printf( + "%s\r\n%s\r\n%s", + search_head, uid, search_tail); + g_free(uid); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, search); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(search)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + g_free(search); + curl_slist_free_all(http_header); + http_header = NULL; + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 207) { + error->code = code; + error->str = g_strdup(chunk.memory); + result = TRUE; + } + else { + /* enable uploading */ + gchar* url = NULL; + gchar* etag = NULL; + url = get_url(chunk.memory); + if (url) { + etag = get_etag(chunk.memory); + if (etag) { + gchar* host = get_host(settings->url); + if (host) { + file = g_strdup(url); + g_free(url); + url = g_strdup_printf("%s%s", host, file); + g_free(file); + g_free(host); + } + else { + g_free(etag); + g_free(url); + url = NULL; + } + } + else { + g_free(url); + url = NULL; + } + } + if (url) { + int lock = 0; + caldav_error lock_error; + + file = g_strdup(etag); + g_free(etag); + etag = g_strdup_printf("If-Match: %s", file); + g_free(file); + http_header = curl_slist_append(http_header, etag); + g_free(etag); + http_header = curl_slist_append(http_header, + "Content-Type: text/calendar; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append( + http_header, "Transfer-Encoding:"); + if (settings->use_locking) + LOCKSUPPORT = caldav_lock_support(settings, &lock_error); + else + LOCKSUPPORT = FALSE; + if (LOCKSUPPORT) { + lock_token = caldav_lock_object(url, settings, &lock_error); + if (lock_token) { + http_header = curl_slist_append( + http_header, g_strdup_printf( + "If: (%s)", lock_token)); + } + /* + * If error code is 423 (Resource is LOCKED) bail out + */ + else if (lock_error.code == 423) { + lock = -1; + } + /* + * If error code is 501 (Not implemented) we continue + * hoping for the best. + */ + else if (lock_error.code == 501) { + lock_token = g_strdup(""); + } + else { + lock = -1; + } + } + if (! LOCKSUPPORT || (LOCKSUPPORT && lock_token && lock_error.code != 423)) { + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + curl_easy_setopt(curl, CURLOPT_URL, rebuild_url(settings, url)); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, NULL); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, 0); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (LOCKSUPPORT && lock_token) { + caldav_unlock_object( + lock_token, url, settings, &lock_error); + } + } + g_free(url); + g_free(lock_token); + if (res != 0 || lock < 0) { + /* Is this a lock_error don't change error*/ + if (lock == 0 || lock_error.code == 423) { + error->code = code; + error->str = g_strdup(chunk.memory); + } + else { + error->code = lock_error.code; + error->str = g_strdup(lock_error.str); + } + result = TRUE; + g_free(settings->file); + settings->file = NULL; + } + else { + long code; + res = curl_easy_getinfo( + curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 204) { + error->code = code; + error->str = g_strdup(chunk.memory); + result = TRUE; + } + } + curl_slist_free_all(http_header); + } + else { + error->code = code; + if (chunk.memory) + error->str = g_strdup(chunk.memory); + else + error->str = g_strdup("No object found"); + result = TRUE; + } + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_easy_cleanup(curl); + return result; +} diff --git a/src/.svn/text-base/delete-caldav-object.h.svn-base b/src/.svn/text-base/delete-caldav-object.h.svn-base new file mode 100644 index 0000000..7576a29 --- /dev/null +++ b/src/.svn/text-base/delete-caldav-object.h.svn-base @@ -0,0 +1,35 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __DELETE_CALDAV_OBJECT_H__ +#define __DELETE_CALDAV_OBJECT_H__ + +#include "caldav-utils.h" +#include "caldav.h" + +/** + * Function for deleting an event. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_delete(caldav_settings* settings, caldav_error* error); + +#endif + diff --git a/src/.svn/text-base/get-caldav-report.c.svn-base b/src/.svn/text-base/get-caldav-report.c.svn-base new file mode 100644 index 0000000..52b4e28 --- /dev/null +++ b/src/.svn/text-base/get-caldav-report.c.svn-base @@ -0,0 +1,254 @@ +/* vim: set textwidth=80 tabstop=4 smarttab: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "get-caldav-report.h" +#include +#include +#include +#include +#include + +/** + * A static literal string containing the calendar query for fetching + * all events from collection. + */ +static const char* getall_request = +"" +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +"\r\n"; + +/** + * A static literal string containing the first part of the calendar query. + * The actual VEVENT to search for is added at runtime. + */ +static const char* getrange_request_head = +"" +/*"" +" "*/ +"" +" " +/*" "*/ +" " +" " +" " +" " +" "; + +/** + * A static literal string containing the last part of the calendar query + */ +static const char* getrange_request_foot = +" " +" " +" " +"\r\n"; + +/** + * Function for getting all events from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_getall(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: 1"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + data.trace_ascii = settings->trace_ascii; + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, getall_request); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(getall_request)); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 207) { + error->code = code; + error->str = g_strdup(headers.memory); + result = TRUE; + } + else { + gchar* report; + report = parse_caldav_report( + chunk.memory, "calendar-data", "VEVENT"); + settings->file = g_strdup(report); + g_free(report); + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_slist_free_all(http_header); + curl_easy_cleanup(curl); + return result; +} + +/** + * Function for getting all events within a time range from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_getrange(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE + 1]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + gchar* request = NULL; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: 1"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + request = g_strdup_printf( + "%s\r\n\r\n%s", + getrange_request_head, get_caldav_datetime(&settings->start), + get_caldav_datetime(&settings->end), getrange_request_foot); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(request)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + gchar* report; + report = parse_caldav_report(chunk.memory, "calendar-data", "VEVENT"); + settings->file = g_strdup(report); + g_free(report); + } + g_free(request); + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_slist_free_all(http_header); + curl_easy_cleanup(curl); + return result; +} + diff --git a/src/.svn/text-base/get-caldav-report.h.svn-base b/src/.svn/text-base/get-caldav-report.h.svn-base new file mode 100644 index 0000000..7bce7f3 --- /dev/null +++ b/src/.svn/text-base/get-caldav-report.h.svn-base @@ -0,0 +1,43 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __GET_CALDAV_REPORT_H__ +#define __GET_CALDAV_REPORT_H__ + +#include "caldav-utils.h" +#include "caldav.h" +#include + +/** + * Function for getting all events from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_getall(caldav_settings* settings, caldav_error* error); + +/** + * Function for getting all events within a time range from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_getrange(caldav_settings* settings, caldav_error* error); + +#endif diff --git a/src/.svn/text-base/get-display-name.c.svn-base b/src/.svn/text-base/get-display-name.c.svn-base new file mode 100644 index 0000000..c776713 --- /dev/null +++ b/src/.svn/text-base/get-display-name.c.svn-base @@ -0,0 +1,138 @@ +/* vim: set textwidth=80 tabstop=4 smarttab: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "get-caldav-report.h" +#include +#include +#include +#include +#include + +/** + * A static literal string containing the calendar query for fetching + * the stored display name for the collection. + */ +static const char* getname_request = +"" +"" +" " +" " +" " +"\r\n"; + +/** + * Function for getting the display name from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_getname(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: 0"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + data.trace_ascii = settings->trace_ascii; + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, getname_request); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(getname_request)); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PROPFIND"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 207) { + error->code = code; + error->str = g_strdup(headers.memory); + result = TRUE; + } + else { + gchar* displayname; + displayname = get_tag("displayname", chunk.memory); + /* Maybe namespace prefixed */ + if (!displayname) { + displayname = get_tag("D:displayname", chunk.memory); + } + settings->file = (displayname) ? + g_strdup(displayname) : g_strdup(""); + g_free(displayname); + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_slist_free_all(http_header); + curl_easy_cleanup(curl); + return result; +} + diff --git a/src/.svn/text-base/get-display-name.h.svn-base b/src/.svn/text-base/get-display-name.h.svn-base new file mode 100644 index 0000000..5c80272 --- /dev/null +++ b/src/.svn/text-base/get-display-name.h.svn-base @@ -0,0 +1,34 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __GET_DISPLAY_NAME_H__ +#define __GET_DISPLAY_NAME_H__ + +#include "caldav-utils.h" + +/** + * Function for getting the display name from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_getname(caldav_settings* settings, caldav_error* error); + +#endif + diff --git a/src/.svn/text-base/lock-caldav-object.c.svn-base b/src/.svn/text-base/lock-caldav-object.c.svn-base new file mode 100644 index 0000000..1ddf926 --- /dev/null +++ b/src/.svn/text-base/lock-caldav-object.c.svn-base @@ -0,0 +1,292 @@ +/* vim: set textwidth=80 tabstop=4: */ +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "lock-caldav-object.h" +#include "options-caldav-server.h" +#include +#include +#include +#include +#include + +/** + * A static literal string containing the lock query. + */ +static char* lock_query = +"" +"" +" " +" " +""; + +/** + * Function which requests a lock on a calendar resource + * @param URI The resource to request lock on. + * @param settings @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return The Lock-Token or NULL in case of error + */ +gchar* caldav_lock_object( + gchar* URI, caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gchar* lock_token = NULL; + gchar* url; + + if (! caldav_lock_support(settings, error)) + return lock_token; + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return lock_token; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Timeout: Second-300"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + if (settings->usehttps) { + url = g_strdup_printf("https://%s", URI); + } else { + url = g_strdup_printf("http://%s", URI); + } + curl_easy_setopt(curl, CURLOPT_URL, url); + g_free(url); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, lock_query); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(lock_query)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "LOCK"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + curl_slist_free_all(http_header); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 200) { + gchar* status = get_tag("status", chunk.memory); + if (status && strstr(status, "423") != NULL) { + error->code = 423; + error->str = g_strdup(status); + } + else { + error->code = code; + error->str = g_strdup(chunk.memory); + } + g_free(status); + } + else { + lock_token = get_response_header( + "Lock-Token", headers.memory, FALSE); + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_easy_cleanup(curl); + return lock_token; +} + +/** + * Function which requests to have a lock removed from a calendar resource + * @param lock_token A privious aquired Lock-Token + * @param URI The resource to request unlock on. + * @param settings @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return False in case the lock could not be removed. True otherwise. + */ +gboolean caldav_unlock_object(gchar* lock_token, gchar* URI, + caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + gchar* url; + + if (! caldav_lock_support(settings, error)) + return result; + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + g_strdup_printf("Lock-Token: %s", lock_token)); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + if (settings->usehttps) { + url = g_strdup_printf("https://%s", URI); + } else { + url = g_strdup_printf("http://%s", URI); + } + curl_easy_setopt(curl, CURLOPT_URL, url); + g_free(url); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "UNLOCK"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + curl_slist_free_all(http_header); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 204) { + error->code = code; + error->str = g_strdup(chunk.memory); + } + else { + result = TRUE; + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_easy_cleanup(curl); + return result; +} + +/** + * Function to test whether the server supports locking or not. Searching + * for PROP LOCK. If LOCK is present then according to RFC4791 PROP UNLOCK + * must also be present. + * @param settings @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return True if locking is supported by the server. False otherwise + */ +gboolean caldav_lock_support(caldav_settings* settings, caldav_error* error) { + gboolean found = FALSE; + gchar* url = NULL; + gchar* mystr = NULL; + runtime_info* info; + + info = caldav_get_runtime_info(); + info->options->verify_ssl_certificate = settings->verify_ssl_certificate; + info->options->custom_cacert = g_strdup(settings->custom_cacert); + if (settings->usehttps) { + mystr = g_strdup("https://"); + } else { + mystr = g_strdup("http://"); + } + + + if (settings->username && settings->password) { + url = g_strdup_printf("%s%s:%s@%s", + mystr, settings->username, settings->password, settings->url); + } + else if (settings->username) { + url = g_strdup_printf("%s%s@%s", + mystr, settings->username, settings->url); + } + else { + url = g_strdup_printf("%s%s", mystr, settings->url); + } + gchar** options = caldav_get_server_options(url, info); + g_free(url); + gchar** tmp = options; + caldav_free_runtime_info(&info); + while (*options) { + if (strcmp(*options++, "LOCK") == 0) { + found = TRUE; + break; + } + } + g_strfreev(tmp); + g_free(mystr); + return found; +} + + diff --git a/src/.svn/text-base/lock-caldav-object.h.svn-base b/src/.svn/text-base/lock-caldav-object.h.svn-base new file mode 100644 index 0000000..6dd884f --- /dev/null +++ b/src/.svn/text-base/lock-caldav-object.h.svn-base @@ -0,0 +1,55 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __LOCK_CALDAV_OBJECT_H__ +#define __LOCK_CALDAV_OBJECT_H__ + +#include "caldav-utils.h" +#include "caldav.h" + +/** + * Function which requests a lock on a calendar resource + * @param URI The resource to request lock on. + * @param settings @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return The Lock-Token or NULL in case of error + */ +gchar* caldav_lock_object( + gchar* URI, caldav_settings* settings, caldav_error* error); + +/** + * Function which requests to have a lock removed from a calendar resource + * @param lock_token A privious aquired Lock-Token + * @param URI The resource to request unlock on. + * @param settings @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return False in case the lock could not be removed. True otherwise. + */ +gboolean caldav_unlock_object(gchar* lock_token, gchar* URI, + caldav_settings* settings, caldav_error* error); + +/** + * Function to test whether the server supports locking or not + * @param settings @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return True if locking is supported by the server. False otherwise + */ +gboolean caldav_lock_support(caldav_settings* settings, caldav_error* error); + +#endif diff --git a/src/.svn/text-base/md5.c.svn-base b/src/.svn/text-base/md5.c.svn-base new file mode 100644 index 0000000..62d4b2d --- /dev/null +++ b/src/.svn/text-base/md5.c.svn-base @@ -0,0 +1,442 @@ +/** md5.c - MD5 Message-Digest Algorithm + * Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc. + * + * according to the definition of MD5 in RFC 1321 from April 1992. + * NOTE: This is *not* the same file as the one from glibc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 3, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Written by Ulrich Drepper , 1995. + * heavily modified for GnuPG by . + * modified again for Sylpheed by 2001-02-11. + */ + + +/* Test values: + * "" D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E + * "a" 0C C1 75 B9 C0 F1 B6 A8 31 C3 99 E2 69 77 26 61 + * "abc 90 01 50 98 3C D2 4F B0 D6 96 3F 7D 28 E1 7F 72 + * "message digest" F9 6B 69 7D 7C B7 93 8D 52 5A 2F 31 AA F1 61 D0 + */ + +#include +#include +#include +#include +#include + +#include "md5.h" + +/**************** + * Rotate a 32 bit integer by n bytes + */ +#if defined(__GNUC__) && defined(__i386__) +static inline u32 +rol( u32 x, int n) +{ + __asm__("roll %%cl,%0" + :"=r" (x) + :"0" (x),"c" (n)); + return x; +} +#else +#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) ) +#endif + + +static void +md5_init(MD5_CONTEXT *ctx) +{ + ctx->A = 0x67452301; + ctx->B = 0xefcdab89; + ctx->C = 0x98badcfe; + ctx->D = 0x10325476; + + ctx->nblocks = 0; + ctx->count = 0; + ctx->finalized = 0; +} + +/* These are the four functions used in the four steps of the MD5 algorithm + and defined in the RFC 1321. The first function is a little bit optimized + (as found in Colin Plumbs public domain implementation). */ +/* #define FF(b, c, d) ((b & c) | (~b & d)) */ +#define FF(b, c, d) (d ^ (b & (c ^ d))) +#define FG(b, c, d) FF (d, b, c) +#define FH(b, c, d) (b ^ c ^ d) +#define FI(b, c, d) (c ^ (b | ~d)) + + +/**************** + * transform n*64 bytes + */ +static void +transform(MD5_CONTEXT *ctx, const unsigned char *data) +{ + u32 correct_words[16]; + u32 A = ctx->A; + u32 B = ctx->B; + u32 C = ctx->C; + u32 D = ctx->D; + u32 *cwp = correct_words; + +#ifdef BIG_ENDIAN_HOST + { + int i; + unsigned char *p2; + const unsigned char *p1; + + for (i = 0, p1 = data, p2 = (unsigned char*)correct_words; + i < 16; i++, p2 += 4) { + p2[3] = *p1++; + p2[2] = *p1++; + p2[1] = *p1++; + p2[0] = *p1++; + } + } +#else + memcpy(correct_words, data, 64); +#endif + + +#define OP(a, b, c, d, s, T) \ + do { \ + a += FF (b, c, d) + (*cwp++) + T; \ + a = rol(a, s); \ + a += b; \ + } while (0) + + /* Before we start, one word about the strange constants. + They are defined in RFC 1321 as + + T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 + */ + + /* Round 1. */ + OP (A, B, C, D, 7, 0xd76aa478); + OP (D, A, B, C, 12, 0xe8c7b756); + OP (C, D, A, B, 17, 0x242070db); + OP (B, C, D, A, 22, 0xc1bdceee); + OP (A, B, C, D, 7, 0xf57c0faf); + OP (D, A, B, C, 12, 0x4787c62a); + OP (C, D, A, B, 17, 0xa8304613); + OP (B, C, D, A, 22, 0xfd469501); + OP (A, B, C, D, 7, 0x698098d8); + OP (D, A, B, C, 12, 0x8b44f7af); + OP (C, D, A, B, 17, 0xffff5bb1); + OP (B, C, D, A, 22, 0x895cd7be); + OP (A, B, C, D, 7, 0x6b901122); + OP (D, A, B, C, 12, 0xfd987193); + OP (C, D, A, B, 17, 0xa679438e); + OP (B, C, D, A, 22, 0x49b40821); + +#undef OP +#define OP(f, a, b, c, d, k, s, T) \ + do { \ + a += f (b, c, d) + correct_words[k] + T; \ + a = rol(a, s); \ + a += b; \ + } while (0) + + /* Round 2. */ + OP (FG, A, B, C, D, 1, 5, 0xf61e2562); + OP (FG, D, A, B, C, 6, 9, 0xc040b340); + OP (FG, C, D, A, B, 11, 14, 0x265e5a51); + OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); + OP (FG, A, B, C, D, 5, 5, 0xd62f105d); + OP (FG, D, A, B, C, 10, 9, 0x02441453); + OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); + OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); + OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); + OP (FG, D, A, B, C, 14, 9, 0xc33707d6); + OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); + OP (FG, B, C, D, A, 8, 20, 0x455a14ed); + OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); + OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); + OP (FG, C, D, A, B, 7, 14, 0x676f02d9); + OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); + + /* Round 3. */ + OP (FH, A, B, C, D, 5, 4, 0xfffa3942); + OP (FH, D, A, B, C, 8, 11, 0x8771f681); + OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); + OP (FH, B, C, D, A, 14, 23, 0xfde5380c); + OP (FH, A, B, C, D, 1, 4, 0xa4beea44); + OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); + OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); + OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); + OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); + OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); + OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); + OP (FH, B, C, D, A, 6, 23, 0x04881d05); + OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); + OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); + OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); + OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); + + /* Round 4. */ + OP (FI, A, B, C, D, 0, 6, 0xf4292244); + OP (FI, D, A, B, C, 7, 10, 0x432aff97); + OP (FI, C, D, A, B, 14, 15, 0xab9423a7); + OP (FI, B, C, D, A, 5, 21, 0xfc93a039); + OP (FI, A, B, C, D, 12, 6, 0x655b59c3); + OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); + OP (FI, C, D, A, B, 10, 15, 0xffeff47d); + OP (FI, B, C, D, A, 1, 21, 0x85845dd1); + OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); + OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); + OP (FI, C, D, A, B, 6, 15, 0xa3014314); + OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); + OP (FI, A, B, C, D, 4, 6, 0xf7537e82); + OP (FI, D, A, B, C, 11, 10, 0xbd3af235); + OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); + OP (FI, B, C, D, A, 9, 21, 0xeb86d391); + + /* Put checksum in context given as argument. */ + ctx->A += A; + ctx->B += B; + ctx->C += C; + ctx->D += D; +} + + + +/* The routine updates the message-digest context to + * account for the presence of each of the characters inBuf[0..inLen-1] + * in the message whose digest is being computed. + */ +static void +md5_update(MD5_CONTEXT *hd, const unsigned char *inbuf, size_t inlen) +{ + if (hd->count == 64) { /* flush the buffer */ + transform( hd, hd->buf ); + hd->count = 0; + hd->nblocks++; + } + if (!inbuf) + return; + if (hd->count) { + for (; inlen && hd->count < 64; inlen--) + hd->buf[hd->count++] = *inbuf++; + md5_update(hd, NULL, 0); + if (!inlen) + return; + } + + while (inlen >= 64) { + transform(hd, inbuf); + hd->count = 0; + hd->nblocks++; + inlen -= 64; + inbuf += 64; + } + + for (; inlen && hd->count < 64; inlen--) + hd->buf[hd->count++] = *inbuf++; +} + + + +/* The routine final terminates the message-digest computation and + * ends with the desired message digest in mdContext->digest[0...15]. + * The handle is prepared for a new MD5 cycle. + * Returns 16 bytes representing the digest. + */ + +static void +do_final(MD5_CONTEXT *hd) +{ + u32 t, msb, lsb; + unsigned char *p; + + md5_update(hd, NULL, 0); /* flush */ + + msb = 0; + t = hd->nblocks; + if ((lsb = t << 6) < t) /* multiply by 64 to make a byte count */ + msb++; + msb += t >> 26; + t = lsb; + if ((lsb = t + hd->count) < t) /* add the count */ + msb++; + t = lsb; + if ((lsb = t << 3) < t) /* multiply by 8 to make a bit count */ + msb++; + msb += t >> 29; + + if (hd->count < 56) { /* enough room */ + hd->buf[hd->count++] = 0x80; /* pad */ + while(hd->count < 56) + hd->buf[hd->count++] = 0; /* pad */ + } else { /* need one extra block */ + hd->buf[hd->count++] = 0x80; /* pad character */ + while (hd->count < 64) + hd->buf[hd->count++] = 0; + md5_update(hd, NULL, 0); /* flush */ + memset(hd->buf, 0, 56); /* fill next block with zeroes */ + } + + /* append the 64 bit count */ + hd->buf[56] = lsb ; + hd->buf[57] = lsb >> 8; + hd->buf[58] = lsb >> 16; + hd->buf[59] = lsb >> 24; + hd->buf[60] = msb ; + hd->buf[61] = msb >> 8; + hd->buf[62] = msb >> 16; + hd->buf[63] = msb >> 24; + transform(hd, hd->buf); + + p = hd->buf; +#ifdef BIG_ENDIAN_HOST +#define X(a) do { *p++ = hd->a ; *p++ = hd->a >> 8; \ + *p++ = hd->a >> 16; *p++ = hd->a >> 24; } while(0) +#else /* little endian */ + /*#define X(a) do { *(u32*)p = hd->##a ; p += 4; } while(0)*/ + /* Unixware's cpp doesn't like the above construct so we do it his way: + * (reported by Allan Clark) */ +#define X(a) do { *(u32*)p = (*hd).a ; p += 4; } while(0) +#endif + X(A); + X(B); + X(C); + X(D); +#undef X + hd->finalized = 1; +} + +static void +md5_final(unsigned char *digest, MD5_CONTEXT *ctx) +{ + if (!ctx->finalized) + do_final(ctx); + memcpy(digest, ctx->buf, 16); +} + +/* + * Creates a MD5 digest in hex fomrat (lowercase letters) from the + * string S. hextdigest but be buffer of at lease 33 bytes! + */ +static void +md5_hex_digest(char *hexdigest, const unsigned char *s) +{ + int i; + MD5_CONTEXT context; + unsigned char digest[16]; + + md5_init(&context); + md5_update(&context, s, strlen((gchar *) s)); + md5_final(digest, &context); + + for (i = 0; i < 16; i++) + sprintf(hexdigest + 2 * i, "%02x", digest[i]); +} + + +/* +** Function: md5_hmac +** taken from the file rfc2104.txt +** written by Martin Schaaf +*/ +static void +md5_hmac(unsigned char *digest, + const unsigned char* text, int text_len, + const unsigned char* key, int key_len) +{ + MD5_CONTEXT context; + unsigned char k_ipad[64]; /* inner padding - + * key XORd with ipad + */ + unsigned char k_opad[64]; /* outer padding - + * key XORd with opad + */ + /* unsigned char tk[16]; */ + int i; + + /* start out by storing key in pads */ + memset(k_ipad, 0, sizeof k_ipad); + memset(k_opad, 0, sizeof k_opad); + if (key_len > 64) { + /* if key is longer than 64 bytes reset it to key=MD5(key) */ + MD5_CONTEXT tctx; + + md5_init(&tctx); + md5_update(&tctx, key, key_len); + md5_final(k_ipad, &tctx); + md5_final(k_opad, &tctx); + } else { + memcpy(k_ipad, key, key_len); + memcpy(k_opad, key, key_len); + } + + /* + * the HMAC_MD5 transform looks like: + * + * MD5(K XOR opad, MD5(K XOR ipad, text)) + * + * where K is an n byte key + * ipad is the byte 0x36 repeated 64 times + * opad is the byte 0x5c repeated 64 times + * and text is the data being protected + */ + + + /* XOR key with ipad and opad values */ + for (i = 0; i < 64; i++) { + k_ipad[i] ^= 0x36; + k_opad[i] ^= 0x5c; + } + + /* + * perform inner MD5 + */ + md5_init(&context); /* init context for 1st + * pass */ + md5_update(&context, k_ipad, 64); /* start with inner pad */ + md5_update(&context, text, text_len); /* then text of datagram */ + md5_final(digest, &context); /* finish up 1st pass */ + /* + * perform outer MD5 + */ + md5_init(&context); /* init context for 2nd + * pass */ + md5_update(&context, k_opad, 64); /* start with outer pad */ + md5_update(&context, digest, 16); /* then results of 1st + * hash */ + md5_final(digest, &context); /* finish up 2nd pass */ +} + + +static void +md5_hex_hmac(char *hexdigest, + const unsigned char* text, int text_len, + const unsigned char* key, int key_len) +{ + unsigned char digest[16]; + int i; + + md5_hmac(digest, text, text_len, key, key_len); + for (i = 0; i < 16; i++) + sprintf(hexdigest + 2 * i, "%02x", digest[i]); +} + +void caldav_md5_hex_digest(char *hexdigest, const unsigned char *s) { + md5_hex_digest(hexdigest, s); +} + +void caldav_md5_hex_hmac(char *hexdigest, + const unsigned char* text, int text_len, + const unsigned char* key, int key_len) { + md5_hex_hmac(hexdigest, text, text_len, key, key_len); +} diff --git a/src/.svn/text-base/md5.h.svn-base b/src/.svn/text-base/md5.h.svn-base new file mode 100644 index 0000000..7605214 --- /dev/null +++ b/src/.svn/text-base/md5.h.svn-base @@ -0,0 +1,52 @@ +/** + * md5.h - MD5 Message-Digest Algorithm + * Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc. + * + * according to the definition of MD5 in RFC 1321 from April 1992. + * NOTE: This is *not* the same file as the one from glibc + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 3, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _MD5_HDR_ +#define _MD5_HDR_ + +#include + +/** + * @typedef u32 + * Kept this typedef for compatibility reasons + */ +#ifndef HAVE_U32_TYPEDEF + #undef u32 + typedef guint32 u32; + #define HAVE_U32_TYPEDEF +#endif + +typedef struct { /* Hmm, should be private */ + u32 A,B,C,D; + u32 nblocks; + unsigned char buf[64]; + int count; + int finalized; +} MD5_CONTEXT; + +void caldav_md5_hex_digest(char *hexdigest, const unsigned char *s); + +void caldav_md5_hex_hmac(char *hexdigest, + const unsigned char* text, int text_len, + const unsigned char* key, int key_len); + +#endif /* _MD5_HDR_ */ + diff --git a/src/.svn/text-base/modify-caldav-object.c.svn-base b/src/.svn/text-base/modify-caldav-object.c.svn-base new file mode 100644 index 0000000..f42f3ae --- /dev/null +++ b/src/.svn/text-base/modify-caldav-object.c.svn-base @@ -0,0 +1,296 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "modify-caldav-object.h" +#include "lock-caldav-object.h" +#include +#include +#include +#include +#include + +/** + * A static literal string containing the first part of the calendar query. + * The actual UID to use for the query is added at runtime. + */ +static char* search_head = +"" +"" +" " +" " +" " +" " +" " +" " +" " +" "; + +/** + * A static literal string containing the last part of the calendar query + */ +static char* search_tail = +"" +" " +" " +" " +""; + +/** + * Function for modifying an event. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_modify(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gchar* search; + gchar* uid; + gboolean result = FALSE; + gboolean LOCKSUPPORT = FALSE; + gchar* lock_token = NULL; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: 1"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + gchar* file = g_strdup(settings->file); + if ((uid = get_response_header("uid", file, FALSE)) == NULL) { + g_free(file); + error->code = 1; + error->str = g_strdup("Error: Missing required UID for object"); + return TRUE; + } + g_free(file); + /* + * collation is not supported by ICalendar. + * %s + */ + search = g_strdup_printf( + "%s\r\n%s\r\n%s", + search_head, uid, search_tail); + g_free(uid); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, search); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(search)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + curl_slist_free_all(http_header); + http_header = NULL; + g_free(search); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 207) { + error->code = code; + error->str = g_strdup(chunk.memory); + result = TRUE; + } + else { + /* enable uploading */ + gchar* url = NULL; + gchar* etag = NULL; + url = get_url(chunk.memory); + if (url) { + etag = get_etag(chunk.memory); + if (etag) { + gchar* host = get_host(settings->url); + if (host) { + file = g_strdup(url); + g_free(url); + url = g_strdup_printf("%s%s", host, file); + g_free(file); + g_free(host); + } + else { + g_free(etag); + g_free(url); + url = NULL; + } + } + else { + g_free(url); + url = NULL; + } + if (url) { + int lock = 0; + caldav_error lock_error; + + file = g_strdup(etag); + g_free(etag); + etag = g_strdup_printf("If-Match: %s", file); + g_free(file); + http_header = curl_slist_append(http_header, etag); + g_free(etag); + http_header = curl_slist_append(http_header, + "Content-Type: text/calendar; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append( + http_header, "Transfer-Encoding:"); + if (settings->use_locking) + LOCKSUPPORT = caldav_lock_support(settings, &lock_error); + else + LOCKSUPPORT = FALSE; + if (LOCKSUPPORT) { + lock_token = caldav_lock_object(url, settings, &lock_error); + if (lock_token) { + http_header = curl_slist_append( + http_header, g_strdup_printf( + "If: (%s)", lock_token)); + } + /* + * If error code is 423 (Resource is LOCKED) bail out + */ + else if (lock_error.code == 423) { + lock = -1; + } + /* + * If error code is 501 (Not implemented) we continue + * hoping for the best. + */ + else if (lock_error.code == 501) { + lock_token = g_strdup(""); + } + else { + lock = -1; + } + } + if (! LOCKSUPPORT || (LOCKSUPPORT && lock_token && lock_error.code != 423)) { + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + curl_easy_setopt(curl, CURLOPT_URL, rebuild_url(settings, url)); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, settings->file); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, + strlen(settings->file)); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); + res = curl_easy_perform(curl); + if (LOCKSUPPORT && lock_token) { + caldav_unlock_object( + lock_token, url, settings, &lock_error); + } + } + g_free(url); + g_free(lock_token); + if (res != 0 || lock < 0) { + /* Is this a lock_error don't change error*/ + if (lock == 0 || lock_error.code == 423) { + error->code = code; + error->str = g_strdup(chunk.memory); + } + else { + error->code = lock_error.code; + error->str = g_strdup(lock_error.str); + } + result = TRUE; + g_free(settings->file); + settings->file = NULL; + } + else { + long code; + res = curl_easy_getinfo( + curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 204) { + error->code = code; + error->str = g_strdup(chunk.memory); + result = TRUE; + } + } + curl_slist_free_all(http_header); + } + else { + error->code = code; + if (chunk.memory) + error->str = g_strdup(chunk.memory); + else + error->str = g_strdup("No object found"); + result = TRUE; + } + } + else { + /* + * No object found on server. Posible synchronization + * problem or a server side race condition + */ + error->code = 409; + error->str = g_strdup("No object found"); + result = TRUE; + } + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_easy_cleanup(curl); + return result; +} + diff --git a/src/.svn/text-base/modify-caldav-object.h.svn-base b/src/.svn/text-base/modify-caldav-object.h.svn-base new file mode 100644 index 0000000..39ac718 --- /dev/null +++ b/src/.svn/text-base/modify-caldav-object.h.svn-base @@ -0,0 +1,34 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __MODIFY_CALDAV_OBJECT_H__ +#define __MODIFY_CALDAV_OBJECT_H__ + +#include "caldav-utils.h" +#include "caldav.h" + +/** + * Function for modifying an event. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_modify(caldav_settings* settings, caldav_error* error); + +#endif diff --git a/src/.svn/text-base/options-caldav-server.c.svn-base b/src/.svn/text-base/options-caldav-server.c.svn-base new file mode 100644 index 0000000..1d97d04 --- /dev/null +++ b/src/.svn/text-base/options-caldav-server.c.svn-base @@ -0,0 +1,135 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "options-caldav-server.h" +#include +#include +#include +#include +#include + +/** + * Function for getting supported options from a server. + * @param curl A pointer to an initialized CURL instance + * @param settings struct containing the URL to the server. If authentication + * is required prior to making the call the credentials must be available + * via CURLOPT_USERPWD before calling. + * @param result A pointer to a struct _response. If test is true + * this variable can be NULL. Caller is responsible for freeing associated + * memory. + * @param error A pointer to caldav_error. @see caldav_error + * @param test if this is true response will be whether the server + * represented by the URL is a CalDAV collection or not. + * @return FALSE in case of error, TRUE otherwise. + */ +gboolean caldav_getoptions(CURL* curl, caldav_settings* settings, response* result, + caldav_error* error, gboolean test) { + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct MemoryStruct chunk; + struct MemoryStruct headers; + gboolean enabled = FALSE; + + if (! curl) + return FALSE; + + if (!error) { + error = (caldav_error *) malloc(sizeof(struct _caldav_error)); + memset(error, '\0', sizeof(struct _caldav_error)); + } + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "OPTIONS"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res == 0) { + gchar* head; + head = get_response_header("DAV", headers.memory, TRUE); + if (head && strstr(head, "calendar-access") != NULL) { + enabled = TRUE; + if (! test) { + result->msg = g_strdup( + get_response_header("Allow", headers.memory, FALSE)); + } + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code == 200) { + error->code = -1; + error->str = g_strdup("URL is not a CalDAV resource"); + } + else { + error->code = -1 * code; + error->str = g_strdup(headers.memory); + } + } + g_free(head); + } + else if ( + (res == CURLE_SSL_CONNECT_ERROR || + CURLE_PEER_FAILED_VERIFICATION || + CURLE_SSL_ENGINE_NOTFOUND || + CURLE_SSL_ENGINE_SETFAILED || + CURLE_SSL_CERTPROBLEM || + CURLE_SSL_CIPHER || + CURLE_SSL_CACERT || + CURLE_SSL_CACERT_BADFILE || + CURLE_SSL_CRL_BADFILE || + CURLE_SSL_ISSUER_ERROR) && settings->usehttps) { + error->code = -2; + error->str = g_strdup(error_buf); + } + else if (res == CURLE_COULDNT_RESOLVE_HOST) { + error->code = -3; + error->str = g_strdup("Could not resolve host"); + } + else if (res == CURLE_COULDNT_CONNECT) { + error->code = -4; + error->str = g_strdup("Unable to connect"); + } + else { + error->code = -1; + error->str = g_strdup("URL is not a CalDAV resource"); + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET"); + return enabled; +} diff --git a/src/.svn/text-base/options-caldav-server.h.svn-base b/src/.svn/text-base/options-caldav-server.h.svn-base new file mode 100644 index 0000000..d17cba2 --- /dev/null +++ b/src/.svn/text-base/options-caldav-server.h.svn-base @@ -0,0 +1,43 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __OPTIONS_CALDAV_SERVER_H__ +#define __OPTIONS_CALDAV_SERVER_H__ + +#include "caldav-utils.h" +#include "caldav.h" + +/** + * Function for getting supported options from a server. + * @param curl A pointer to an initialized CURL instance + * @param settings struct containing the URL to the server. If authentication + * is required prior to making the call the credentials must be available + * via CURLOPT_USERPWD before calling. + * @param result A pointer to a struct _response. If test is true + * this variable can be NULL. Caller is responsible for freeing associated + * memory. + * @param error A pointer to caldav_error. @see caldav_error + * @param test if this is true response will be whether the server + * represented by the URL is a CalDAV collection or not. + * @return FALSE in case of error, TRUE otherwise. + */ +gboolean caldav_getoptions(CURL* curl, caldav_settings* settings, response* result, + caldav_error* error, gboolean test); + +#endif diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..59d3126 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,53 @@ +AUTOMAKE_OPTIONS = gnu + +INCLUDES = @CURL_CFLAGS@ @GLIB_CFLAGS@ \ + -I$(top_srcdir) -I$(top_builddir) + +if STATIC_LINK +noinst_LTLIBRARIES = libcaldav.la +endif + +if DYNAMIC_LINK +lib_LTLIBRARIES = libcaldav.la +endif + +libcaldav_la_LDFLAGS = -version-info @LIBVERSION@ + +libcaldav_la_SOURCES = \ + caldav.h \ + caldav.c \ + add-caldav-object.c \ + add-caldav-object.h \ + delete-caldav-object.c \ + delete-caldav-object.h \ + modify-caldav-object.c \ + modify-caldav-object.h \ + get-caldav-report.c \ + get-caldav-report.h \ + get-display-name.c \ + get-display-name.h \ + caldav-utils.c \ + caldav-utils.h \ + md5.c \ + md5.h \ + options-caldav-server.c \ + options-caldav-server.h \ + lock-caldav-object.c \ + lock-caldav-object.h \ + get-freebusy-report.c \ + get-freebusy-report.h + +libcaldav_includedir=$(includedir)/libcaldav-@VERSION@ +libcaldav_include_HEADERS = caldav.h + +noinst_HEADERS = \ + add-caldav-object.h \ + delete-caldav-object.h \ + modify-caldav-object.h \ + get-caldav-report.h \ + caldav-utils.h + +libcaldav_la_LIBADD = \ + @CURL_LIBS@ \ + @GLIB_LIBS@ + diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..5803fc2 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,649 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src +DIST_COMMON = $(libcaldav_include_HEADERS) $(noinst_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(libcaldav_includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +libcaldav_la_DEPENDENCIES = +am_libcaldav_la_OBJECTS = caldav.lo add-caldav-object.lo \ + delete-caldav-object.lo modify-caldav-object.lo \ + get-caldav-report.lo get-display-name.lo caldav-utils.lo \ + md5.lo options-caldav-server.lo lock-caldav-object.lo \ + get-freebusy-report.lo +libcaldav_la_OBJECTS = $(am_libcaldav_la_OBJECTS) +libcaldav_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libcaldav_la_LDFLAGS) $(LDFLAGS) -o $@ +@DYNAMIC_LINK_TRUE@am_libcaldav_la_rpath = -rpath $(libdir) +@STATIC_LINK_TRUE@am_libcaldav_la_rpath = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libcaldav_la_SOURCES) +DIST_SOURCES = $(libcaldav_la_SOURCES) +HEADERS = $(libcaldav_include_HEADERS) $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURL_CFLAGS = @CURL_CFLAGS@ +CURL_LIBS = @CURL_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DX_CONFIG = @DX_CONFIG@ +DX_DOCDIR = @DX_DOCDIR@ +DX_DOT = @DX_DOT@ +DX_DOXYGEN = @DX_DOXYGEN@ +DX_DVIPS = @DX_DVIPS@ +DX_EGREP = @DX_EGREP@ +DX_ENV = @DX_ENV@ +DX_FLAG_chi = @DX_FLAG_chi@ +DX_FLAG_chm = @DX_FLAG_chm@ +DX_FLAG_doc = @DX_FLAG_doc@ +DX_FLAG_dot = @DX_FLAG_dot@ +DX_FLAG_html = @DX_FLAG_html@ +DX_FLAG_man = @DX_FLAG_man@ +DX_FLAG_pdf = @DX_FLAG_pdf@ +DX_FLAG_ps = @DX_FLAG_ps@ +DX_FLAG_rtf = @DX_FLAG_rtf@ +DX_FLAG_xml = @DX_FLAG_xml@ +DX_HHC = @DX_HHC@ +DX_LATEX = @DX_LATEX@ +DX_MAKEINDEX = @DX_MAKEINDEX@ +DX_PDFLATEX = @DX_PDFLATEX@ +DX_PERL = @DX_PERL@ +DX_PROJECT = @DX_PROJECT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBVERSION = @LIBVERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = gnu +INCLUDES = @CURL_CFLAGS@ @GLIB_CFLAGS@ \ + -I$(top_srcdir) -I$(top_builddir) + +@STATIC_LINK_TRUE@noinst_LTLIBRARIES = libcaldav.la +@DYNAMIC_LINK_TRUE@lib_LTLIBRARIES = libcaldav.la +libcaldav_la_LDFLAGS = -version-info @LIBVERSION@ +libcaldav_la_SOURCES = \ + caldav.h \ + caldav.c \ + add-caldav-object.c \ + add-caldav-object.h \ + delete-caldav-object.c \ + delete-caldav-object.h \ + modify-caldav-object.c \ + modify-caldav-object.h \ + get-caldav-report.c \ + get-caldav-report.h \ + get-display-name.c \ + get-display-name.h \ + caldav-utils.c \ + caldav-utils.h \ + md5.c \ + md5.h \ + options-caldav-server.c \ + options-caldav-server.h \ + lock-caldav-object.c \ + lock-caldav-object.h \ + get-freebusy-report.c \ + get-freebusy-report.h + +libcaldav_includedir = $(includedir)/libcaldav-@VERSION@ +libcaldav_include_HEADERS = caldav.h +noinst_HEADERS = \ + add-caldav-object.h \ + delete-caldav-object.h \ + modify-caldav-object.h \ + get-caldav-report.h \ + caldav-utils.h + +libcaldav_la_LIBADD = \ + @CURL_LIBS@ \ + @GLIB_LIBS@ + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libcaldav.la: $(libcaldav_la_OBJECTS) $(libcaldav_la_DEPENDENCIES) + $(libcaldav_la_LINK) $(am_libcaldav_la_rpath) $(libcaldav_la_OBJECTS) $(libcaldav_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add-caldav-object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caldav-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caldav.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delete-caldav-object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get-caldav-report.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get-display-name.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get-freebusy-report.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lock-caldav-object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modify-caldav-object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/options-caldav-server.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-libcaldav_includeHEADERS: $(libcaldav_include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(libcaldav_includedir)" || $(MKDIR_P) "$(DESTDIR)$(libcaldav_includedir)" + @list='$(libcaldav_include_HEADERS)'; test -n "$(libcaldav_includedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libcaldav_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(libcaldav_includedir)" || exit $$?; \ + done + +uninstall-libcaldav_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(libcaldav_include_HEADERS)'; test -n "$(libcaldav_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(libcaldav_includedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(libcaldav_includedir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libcaldav_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-libcaldav_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES \ + uninstall-libcaldav_includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ + ctags distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES \ + install-libcaldav_includeHEADERS install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-libLTLIBRARIES \ + uninstall-libcaldav_includeHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/add-caldav-object.c b/src/add-caldav-object.c new file mode 100644 index 0000000..68a4377 --- /dev/null +++ b/src/add-caldav-object.c @@ -0,0 +1,132 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "add-caldav-object.h" +#include +#include +#include +#include +#include + +/** + * Function for adding a new event. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_add(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + gchar* url; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: text/calendar; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "If-None-Match: *"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + data.trace_ascii = settings->trace_ascii; + + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + gchar* tmp = random_file_name(settings->file); + gchar* s = rebuild_url(settings, NULL); + if (g_str_has_suffix(s, "/")) { + url = g_strdup_printf("%slibcaldav-%s.ics", s, tmp); + } + else { + url = g_strdup_printf("%s/libcaldav-%s.ics", s, tmp); + } + g_free(s); + g_free(tmp); + curl_easy_setopt(curl, CURLOPT_URL, url); + tmp = g_strdup(settings->file); + g_free(settings->file); + settings->file = verify_uid(tmp); + g_free(tmp); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, settings->file); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(settings->file)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 201) { + error->str = g_strdup(chunk.memory); + error->code = code; + result = TRUE; + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_slist_free_all(http_header); + curl_easy_cleanup(curl); + return result; +} + diff --git a/src/add-caldav-object.h b/src/add-caldav-object.h new file mode 100644 index 0000000..0756e74 --- /dev/null +++ b/src/add-caldav-object.h @@ -0,0 +1,35 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __ADD_CALDAV_OBJECT_H__ +#define __ADD_CALDAV_OBJECT_H__ + +#include "caldav-utils.h" +#include "caldav.h" + +/** + * Function for adding a new event. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_add(caldav_settings* settings, caldav_error* error); + +#endif + diff --git a/src/caldav-utils.c b/src/caldav-utils.c new file mode 100644 index 0000000..aa3f02e --- /dev/null +++ b/src/caldav-utils.c @@ -0,0 +1,729 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "caldav-utils.h" +#include "md5.h" +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * This function is burrowed from the libcurl documentation + * @param text + * @param stream + * @param ptr + * @param size + * @param nohex + */ +void dump(const char* text, FILE* stream, char* ptr, size_t size, char nohex) { + size_t i; + size_t c; + + unsigned int width=0x10; + + if(nohex) + /* without the hex output, we can fit more on screen */ + width = 0x40; + fprintf(stream, "%s, %zd bytes (0x%zx)\n", text, size, size); + for(i=0; i=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.'); + /* check again for 0D0A, to avoid an extra \n if it's at width */ + if (nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) { + i+=(c+3-width); + break; + } + } + fputc('\n', stream); /* newline */ + } + fflush(stream); +} + +/** + * This function is burrowed from the libcurl documentation + * @param handle + * @param type + * @param data + * @param size + * @param userp + * @return + */ +int my_trace(CURL* handle, curl_infotype type, char* data, size_t size, void* userp) { + struct config_data* config = (struct config_data *)userp; + const char* text; + (void)handle; /* prevent compiler warning */ + + switch (type) { + case CURLINFO_TEXT: + fprintf(stderr, "== Info: %s", data); + default: /* in case a new one is introduced to shock us */ + return 0; + case CURLINFO_HEADER_OUT: + text = "=> Send header"; + break; + case CURLINFO_DATA_OUT: + text = "=> Send data"; + break; + case CURLINFO_SSL_DATA_OUT: + text = "=> Send SSL data"; + break; + case CURLINFO_HEADER_IN: + text = "<= Recv header"; + break; + case CURLINFO_DATA_IN: + text = "<= Recv data"; + break; + case CURLINFO_SSL_DATA_IN: + text = "<= Recv SSL data"; + break; + } + dump(text, stderr, data, size, config->trace_ascii); + return 0; +} + +/** + * This function is burrowed from the libcurl documentation + * @param ptr + * @param size + * @return void* to memory region + */ +static void* myrealloc(void* ptr, size_t size) { +/* There might be a realloc() out there that doesn't like reallocing + * NULL pointers, so we take care of it here + * */ + if(ptr) + return realloc(ptr, size); + else + return malloc(size); +} + +/** + * This function is burrowed from the libcurl documentation + * @param ptr + * @param size + * @param nmemb + * @param data + * @return number of written bytes + */ +size_t WriteMemoryCallback(void* ptr, size_t size, size_t nmemb, void* data) { + size_t realsize = size * nmemb; + struct MemoryStruct* mem = (struct MemoryStruct *)data; + mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1); + + if (mem->memory) { + memcpy(&(mem->memory[mem->size]), ptr, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + } + return realsize; +} + +/** + * This function is burrowed from the libcurl documentation + * @param ptr + * @param size + * @param nmemb + * @param data + * @return number of written bytes + */ +size_t WriteHeaderCallback(void* ptr, size_t size, size_t nmemb, void* data) { + size_t realsize = size * nmemb; + struct MemoryStruct* mem = (struct MemoryStruct *)data; + mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1); + + if (mem->memory) { + memcpy(&(mem->memory[mem->size]), ptr, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + } + return realsize; +} + +/* +size_t ReadMemoryCallback(void* ptr, size_t size, size_t nmemb, void* data){ + struct MemoryStruct* mem = (struct MemoryStruct *)data; + + memcpy(ptr, mem->memory, mem->size); + return mem->size; +} +*/ + +/** + * Initialize caldav settings structure. + * @param settings @see caldav_settings + */ +void init_caldav_settings(caldav_settings* settings) { + settings->username = NULL; + settings->password = NULL; + settings->url = NULL; + settings->file = NULL; + settings->usehttps = FALSE; + settings->custom_cacert = NULL; + settings->verify_ssl_certificate = TRUE; + settings->debug = FALSE; + settings->trace_ascii = TRUE; + settings->ACTION = UNKNOWN; + settings->start = 0; + settings->end = 0; +} + +/** + * Free memory assigned to caldav settings structure. + * @param settings @see caldav_settings + */ +void free_caldav_settings(caldav_settings* settings) { + if (settings->username) { + g_free(settings->username); + settings->username = NULL; + } + if (settings->password) { + g_free(settings->password); + settings->password = NULL; + } + if (settings->url) { + g_free(settings->url); + settings->url = NULL; + } + if (settings->file) { + g_free(settings->file); + settings->file = NULL; + } + if (settings->custom_cacert) { + g_free(settings->custom_cacert); + settings->custom_cacert = NULL; + } + settings->verify_ssl_certificate = TRUE; + settings->usehttps = FALSE; + settings->debug = FALSE; + settings->trace_ascii = TRUE; + settings->ACTION = UNKNOWN; + settings->start = 0; + settings->end = 0; +} + +static gchar* place_after_hostname(const gchar* start, const gchar* stop) { + gchar* newpos = NULL; + gchar* pos = (gchar *) stop; + gboolean digit = TRUE; + + if (pos && stop && strcmp(start, pos) != 0) { + while (*pos != ':' && strcmp(start, pos) != 0) + --pos; + if (pos > start) { + gchar* tmp = (gchar *) pos + 1; + /* is pos++ a port number */ + while (*tmp != '/' && digit) { + if (isdigit(*tmp) != 0) { + digit = TRUE; + tmp++; + } + else + digit = FALSE; + } + if (digit) { + /* pos was a port number */ + while (*pos != '@' && strcmp(start, pos) != 0) + --pos; + if (strcmp(start, pos) != 0) + newpos = pos; + } + else { + while (*pos != '@' && pos != stop) + pos++; + if (pos != stop) + newpos = pos; + } + } + else { + /* is a username present */ + gchar* tmp = NULL; + while (*pos != '/' && pos != stop) { + if (*pos == '@') + tmp = pos; + pos++; + } + if (tmp && pos != stop) + newpos = tmp; + } + } + return newpos; +} + +/** + * Parse URL + * @param settings @see caldav_settings + * @param url String containing URL to collection + */ +void parse_url(caldav_settings* settings, const char* url) { + char* start; + char* pos; + char* end; + char* login; + + login = pos = end = start = NULL; + if (!url) + return; + if ((pos = strstr(url, "//")) != NULL) { + /* Does the URL use https ?*/ + if (!g_ascii_strncasecmp(url,"https",5) && settings->usehttps == FALSE) { + settings->usehttps=TRUE; + } + start = g_strdup(&(*(pos + 2))); + if ((pos = place_after_hostname(start, strrchr(start, '\0') - 1)) != NULL) { + /* username and/or password present */ + login = g_strndup(start, pos - start); + end = pos; + if ((pos = strrchr(login, ':')) != NULL) { + /* both username and password is present */ + settings->username = g_strndup(login, pos - login); + settings->password = g_strdup(++pos); + } + else { + /* only username present */ + settings->username = g_strdup(login); + settings->password = NULL; + } + g_free(login); + settings->url = g_strdup(++end); + } + else { + /* no username or password present */ + settings->url = g_strdup(start); + settings->username = NULL; + settings->password = NULL; + } + g_free(start); + } +} + +/** + * Find a specific HTTP header from last request + * @param header HTTP header to search for + * @param headers String of HTTP headers from last request + * @param lowcase Should string be returned in all lower case. + * @return The header found or NULL + */ +#define MAX_TOKENS 2 +gchar* get_response_header( + const char* header, gchar* headers, gboolean lowcase) { + gchar* line; + gchar* head = NULL; + gchar* oldhead = NULL; + gchar** buf; + gchar* header_list; + gchar* saveptr; + + header_list = g_strdup(headers); + line = strtok_r(header_list, "\r\n", &saveptr); + if (line != NULL) { + do { + buf = g_strsplit(line, ":", MAX_TOKENS); + if (buf[1] != NULL) { + if (g_ascii_strcasecmp(buf[0], header) == 0) { + if (head) { + if (strcmp(head, buf[1]) != 0) { + oldhead = head; + head = g_strconcat(head, ", ", buf[1], NULL); + g_free(oldhead); + } + } + else + head = g_strdup(buf[1]); + if (head) + g_strstrip(head); + } + } + g_strfreev(buf); + } while ((line = strtok_r(NULL, "\r\n", &saveptr)) != NULL); + } + g_free(header_list); + if (head) + return (lowcase) ? g_ascii_strdown(head, -1) : head; + else + return NULL; +} + +static const char* VCAL_HEAD = +"BEGIN:VCALENDAR\r\n" +"PRODID:-//CalDAV Calendar//NONSGML libcaldav//EN\r\n" +"VERSION:2.0\r\n"; +static const char* VCAL_FOOT = "END:VCALENDAR"; + +/** + * Parse response from CalDAV server. Internal function. + * @param report Response from server + * @param element XML element to find + * @param type VCalendar element to find + * @param wrap Is this the final parsing or just a part + * @param recursive Stop after first match or not + * @return the parsed result + */ +static gchar* parse_caldav_report_wrap( + char* report, const char* element, const char* type, + gboolean wrap, gboolean recursive) { + char* pos; + char* start; + char* object; + char* tmp_report; + char* tmp; + gchar* response; + gchar* begin_type; + gchar* end_type; + gboolean keep_going = TRUE; + + begin_type = g_strdup_printf("BEGIN:%s", type); + end_type = g_strdup_printf("END:%s", type); + pos = start = object = response = NULL; + tmp_report = g_strdup(report); + while ((pos = strstr(tmp_report, element)) != NULL && keep_going) { + pos = strchr(pos, '>'); + if (!pos) { + break; + } + pos = &(*(pos + 1)); + pos = strstr(pos, begin_type); + if (!pos) { + break; + } + object = &(*(pos + strlen(begin_type))); + object = g_strchug(object); + start = g_strdup(object); + if ((pos = strstr(start, end_type)) == NULL) { + g_free(start); + break; + } + char end_not_found = 1; + while (end_not_found == 1) { + if (strstr(pos+1, end_type) < strstr(pos+1, element)) { + if (strstr(pos+1, end_type) != NULL) { + pos = strstr(pos+1, end_type); + } + else { + end_not_found = 0; + } + } + else { + end_not_found = 0; + } + } + object = g_strndup(start, strlen(start) - strlen(pos)); + if (response) { + tmp = g_strdup(response); + g_free(response); + response = g_strdup_printf("%s%s\r\n%s%s\r\n", + tmp, begin_type, object, end_type); + g_free(tmp); + } + else { + if (wrap) + response = g_strdup_printf("%s%s\r\n%s%s\r\n", + VCAL_HEAD, begin_type, object, end_type); + else + response = g_strdup_printf("%s\r\n%s%s\r\n", + begin_type, object, end_type); + } + if (recursive) { + pos = strchr(pos, '>'); + g_free(tmp_report); + tmp_report = g_strdup(&(*(pos + 1))); + } + else { + keep_going = FALSE; + } + g_free(start); + g_free(object); + } + g_free(tmp_report); + g_free(begin_type); + g_free(end_type); + if (wrap) + if (response) { + object = g_strdup(response); + g_free(response); + response = g_strdup_printf("%s%s", object, VCAL_FOOT); + g_free(object); + } + return response; +} + +/** + * Parse response from CalDAV server + * @param report Response from server + * @param element XML element to find + * @param type VCalendar element to find + * @return the parsed result + */ +gchar* parse_caldav_report(char* report, const char* element, const char* type) { + gchar* response = NULL; + gchar* timezone = NULL; + gchar* temp = NULL; + + if (!report || !element || !type) + return NULL; + /* test for VTIMEZONE. + * Only the first found will be used and this will then + * be the time zone for the entire report + */ + timezone = parse_caldav_report_wrap( + report, element, "VTIMEZONE", FALSE, FALSE); + if (timezone) { + response = g_strdup_printf("%s%s", VCAL_HEAD, timezone); + g_free(timezone); + temp = parse_caldav_report_wrap(report, element, type, FALSE, TRUE); + if (temp) { + gchar* tmp = g_strdup(response); + g_free(response); + response = g_strdup_printf("%s%s%s", tmp, temp, VCAL_FOOT); + g_free(tmp); + g_free(temp); + } + else { + g_free(response); + return NULL; + } + } + else + response = parse_caldav_report_wrap(report, element, type, TRUE, TRUE); + return response; +} + +/** + * Convert a time_t variable to CalDAV DateTime + * @param time a specific date and time + * @return the CalDAV DateTime + */ +gchar* get_caldav_datetime(time_t* time) { + struct tm *current; + gchar* datetime; + + current = localtime(time); + datetime = g_strdup_printf("%d%.2d%.2dT%.2d%.2d%.2dZ", + current->tm_year + 1900, current->tm_mon + 1, current->tm_mday, + current->tm_hour, current->tm_min, current->tm_sec); + return datetime; +} + +/** + * Create a random text string, using MD5. @see caldav_md5_hex_digest() + * @param text some text to randomize + * @return MD5 hash of text + */ +gchar* random_file_name(gchar* text) { + unsigned char* name; + gchar md5sum[33]; + + name = (unsigned char *) g_strdup(text); + caldav_md5_hex_digest(md5sum, name); + g_free(name); + return g_strdup(md5sum); +} + +/** + * Does the event contain a UID element or not. If not add it. + * @param object A specific event + * @return event, eventually added UID + */ +gchar* verify_uid(gchar* object) { + gchar* uid; + gchar* newobj; + gchar* pos; + + newobj = g_strdup(object); + uid = get_response_header("uid", object, TRUE); + if (!uid) { + object = g_strdup(newobj); + g_free(newobj); + pos = strstr(object, "END:VEVENT"); + newobj = g_strndup(object, strlen(object) - strlen(pos)); + newobj = g_strchomp(newobj); + uid = random_file_name(object); + gchar*tmp = g_strdup(newobj); + g_free(newobj); + newobj = g_strdup_printf("%s\r\nUID:libcaldav-%s@tempuri.org\r\n%s", + tmp, uid, pos); + g_free(uid); + g_free(tmp); + g_free(object); + } + else + g_free(uid); + /*uid = g_strdup(newobj); + g_free(newobj);*/ + g_strchomp(newobj); + /*g_free(uid);*/ + return newobj; +} + +/** + * Fetch a URL from a XML element + * @param text String + * @return URL + */ +#define ELEM_HREF "href>" +gchar* get_url(gchar* text) { + gchar* pos; + gchar* url = NULL; + + if ((pos = strstr(text, ELEM_HREF)) == NULL) + return url; + pos = &(*(pos + strlen(ELEM_HREF))); + url = g_strndup(pos, strlen(pos) - strlen(strchr(pos, '<'))); + return url; +} + +/** + * Fetch any element from XML + * @param text String + * @param tag The element to look for + * @return element + */ +gchar* get_tag(const gchar* tag, gchar* text) { + gchar *pos; + gchar* res = NULL; + gchar* the_tag = NULL; + + /*printf("%s\n", text);*/ + the_tag = g_strdup_printf("<%s>", tag); + if ((pos = strstr(text, the_tag)) == NULL) { + g_free(the_tag); + return res; + } + pos = &(*(pos + strlen(the_tag))); + res = g_strndup(pos, strlen(pos) - strlen(strchr(pos, '<'))); + g_free(the_tag); + return res; +} + +/** + * Fetch the etag element from XML + * @param text String + * @return etag + */ +#define ELEM_ETAG "getetag" +gchar* get_etag(gchar* text) { + gchar* etag = NULL; + + etag = get_tag(ELEM_ETAG, text); + /* Maybe namespace prefixed */ + if (!etag) { + etag = get_tag("D:getetag", text); + } + return etag; +} + +/** + * Fetch host from URL + * @param url URL + * @return host + */ +gchar* get_host(gchar* url) { + gchar** buf; + gchar* result = NULL; + + buf = g_strsplit(url, "/", 2); + if (buf[0]) { + result = g_strdup(buf[0]); + } + g_strfreev(buf); + return result; +} + +/** + * rebuild a raw URL with https if needed from the settings + * @param settings caldav_settings + * @param uri URI to use instead of base + * @return URL + */ + +gchar* rebuild_url(caldav_settings* settings, gchar* uri){ + gchar* url = NULL; + gchar* mystr = NULL; + if (settings->usehttps) { + mystr = "https://"; + } else { + mystr = "http://"; + } + if (uri) + url = g_strdup_printf("%s%s", mystr, uri); + else + url = g_strdup_printf("%s%s", mystr,settings->url); + + return url; +} + +/** + * Prepare a curl connection + * @param settings caldav_settings + * @return CURL + */ +CURL* get_curl(caldav_settings* setting) { + CURL* curl; + gchar* userpwd = NULL; + gchar* url = NULL; + + curl = curl_easy_init(); + if (curl) { + if (setting->username) { + if (setting->password) + userpwd = g_strdup_printf("%s:%s", + setting->username, setting->password); + else + userpwd = g_strdup_printf("%s", setting->username); + curl_easy_setopt(curl, CURLOPT_USERPWD, userpwd); + g_free(userpwd); + } + if (setting->verify_ssl_certificate) + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2); + else { + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); + } + if (setting->custom_cacert) + curl_easy_setopt(curl, CURLOPT_CAINFO, setting->custom_cacert); + curl_easy_setopt(curl, CURLOPT_USERAGENT, __CALDAV_USERAGENT); + url = rebuild_url(setting, NULL); + curl_easy_setopt(curl, CURLOPT_URL, url); + g_free(url); + } + return (curl) ? curl : NULL; +} diff --git a/src/caldav-utils.h b/src/caldav-utils.h new file mode 100644 index 0000000..02c84d7 --- /dev/null +++ b/src/caldav-utils.h @@ -0,0 +1,221 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __CALDAV_UTILS_H__ +#define __CALDAV_UTILS_H__ + +#include +#include +#include +#include "caldav.h" + +/** + * @typedef struct _CALDAV_SETTINGS caldav_settings + * A pointer to a struct _CALDAV_SETTINGS + */ +typedef struct _CALDAV_SETTINGS caldav_settings; + +/** + * @struct _CALDAV_SETTINGS + * A struct used to exchange all user input between various parts + * of the library + */ +struct _CALDAV_SETTINGS { + gchar* username; + gchar* password; + gchar* url; + gchar* file; + gboolean usehttps; + gboolean verify_ssl_certificate; + gchar* custom_cacert; + gboolean debug; + gboolean use_locking; + char trace_ascii; + CALDAV_ACTION ACTION; + time_t start; + time_t end; +}; + +/** + * @typedef struct MemoryStruct memory_ptr + * A pointer to a struct MemoryStruct + */ +typedef struct MemoryStruct memory_ptr; + +/** + * @struct MemoryStruct + * Used to hold messages between the CalDAV server and the library + */ +struct MemoryStruct { + char *memory; + size_t size; +}; + +/** @struct config_data + * Used to exchange user options to the library + */ +struct config_data { + char trace_ascii; +}; + +/** + * This function is burrowed from the libcurl documentation + * @param text + * @param stream + * @param ptr + * @param size + * @param nohex + */ +void dump(const char* text, FILE* stream, char* ptr, size_t size, char nohex); + +/** + * This function is burrowed from the libcurl documentation + * @param handle + * @param type + * @param data + * @param size + * @param userp + * @return + */ +int my_trace(CURL* handle, curl_infotype type, char* data, size_t size, void* userp); + +/** + * This function is burrowed from the libcurl documentation + * @param ptr + * @param size + * @return void* to memory region + */ +size_t WriteMemoryCallback(void* ptr, size_t size, size_t nmemb, void* data); + +/** + * This function is burrowed from the libcurl documentation + * @param ptr + * @param size + * @param nmemb + * @param data + * @return number of written bytes + */ +size_t WriteHeaderCallback(void* ptr, size_t size, size_t nmemb, void* data); + +/*size_t ReadMemoryCallback(void* ptr, size_t size, size_t nmemb, void* data);*/ + +/** + * Initialize caldav settings structure. + * @param settings @see caldav_settings + */ +void init_caldav_settings(caldav_settings* settings); + +/** + * Free momory assigned to caldav settings structure. + * @param settings @see caldav_settings + */ +void free_caldav_settings(caldav_settings* settings); + +/** + * Parse URL + * @param settings @see caldav_settings + * @param url String containing URL to collection + */ +void parse_url(caldav_settings* settings, const char* url); + +/** + * Find a specific HTTP header from last request + * @param header HTTP header to search for + * @param headers String of HTTP headers from last request + * @param lowcase Should string be returned in all lower case. + * @return The header found or NULL + */ +gchar* get_response_header( + const char* header, gchar* headers, gboolean lowcase); + +/** + * Parse response from CalDAV server + * @param report Response from server + * @param element XML element to find + * @param type VCalendar element to find + * @return the parsed result + */ +gchar* parse_caldav_report(char* report, const char* element, const char* type); + +/** + * Convert a time_t variable to CalDAV DateTime + * @param time a specific date and time + * @return the CalDAV DateTime + */ +gchar* get_caldav_datetime(time_t* time); + +/** + * Create a random text string, using MD5. @see caldav_md5_hex_digest() + * @param text some text to randomize + * @return MD5 hash of text + */ +gchar* random_file_name(gchar* text); + +/** + * Does the event contain a UID element or not. If not add it. + * @param object A specific event + * @return event, eventually added UID + */ +gchar* verify_uid(gchar* object); + +/** + * Fetch a URL from a XML element + * @param text String + * @return URL + */ +gchar* get_url(gchar* text); + +/** + * Fetch host from URL + * @param url URL + * @return host + */ +gchar* get_host(gchar* url); + +/** + * Fetch the etag element from XML + * @param text String + * @return etag + */ +gchar* get_etag(gchar* text); + +/** + * Fetch any element from XML + * @param text String + * @return element + */ +gchar* get_tag(const gchar* tag, gchar* text); + + + +/** + * rebuild a raw URL with https if needed from the settings + * @param settings caldav_settings + * @return URL + */ +gchar* rebuild_url(caldav_settings* setting, gchar* uri); + +/** + * Prepare a curl connection + * @param settings caldav_settings + * @return CURL + */ +CURL* get_curl(caldav_settings* setting); + +#endif diff --git a/src/caldav.c b/src/caldav.c new file mode 100644 index 0000000..9e2b0af --- /dev/null +++ b/src/caldav.c @@ -0,0 +1,995 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "caldav.h" +#include "caldav-utils.h" +#include "get-caldav-report.h" +#include "add-caldav-object.h" +#include "delete-caldav-object.h" +#include "modify-caldav-object.h" +#include "get-display-name.h" +#include "options-caldav-server.h" +#include "get-freebusy-report.h" +#include +#include +#include +#include +#include + +static void init_runtime(runtime_info* info) { + if (! info) + return; + if (! info->error) + info->error = g_new0(caldav_error, 1); + if (! info->options) { + info->options = g_new0(debug_curl, 1); + info->options->trace_ascii = 1; + info->options->debug = 0; + info->options->verify_ssl_certificate = TRUE; + info->options->use_locking = TRUE; + info->options->custom_cacert = NULL; + } +} + +/** + * @param curl An instance of libcurl. + * @param settings Defines CalDAV resource. Receiver is responsible for freeing + * the memory. URL is part of the structure. [http://][username:password@]host[:port]/url-path. + * See (RFC1738). + * @return FALSE (zero) mens URL does not reference a CalDAV calendar + * resource. TRUE if the URL does reference a CalDAV calendar resource. + */ +static gboolean test_caldav_enabled(CURL* curl, + caldav_settings* settings, + caldav_error* error) { + return caldav_getoptions(curl, settings, NULL, error, TRUE); +} + +/* + * @param settings An instance of caldav_settings. @see caldav_settings + * @return TRUE if there was an error. Error can be in libcurl, in libcaldav, + * or an error related to the CalDAV protocol. + */ +static gboolean make_caldav_call(caldav_settings* settings, + runtime_info* info) { + CURL* curl; + gboolean result = FALSE; + + g_return_val_if_fail(info != NULL, TRUE); + + curl = get_curl(settings); + if (!curl) { + info->error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + if (!test_caldav_enabled(curl, settings, info->error)) { + g_free(settings->file); + settings->file = NULL; + curl_easy_cleanup(curl); + return TRUE; + } + curl_easy_cleanup(curl); + switch (settings->ACTION) { + case GETALL: result = caldav_getall(settings, info->error); break; + case GET: result = caldav_getrange(settings, info->error); break; + case GETALLTASKS: result = caldav_tasks_getall(settings, info->error); break; + case GETTASKS: result = caldav_tasks_getrange(settings, info->error); break; + case ADD: result = caldav_add(settings, info->error); break; + case DELETE: result = caldav_delete(settings, info->error); break; + case MODIFY: result = caldav_modify(settings, info->error); break; + case DELETETASKS: result = caldav_tasks_delete(settings, info->error); break; + case MODIFYTASKS: result = caldav_tasks_modify(settings, info->error); break; + case GETCALNAME: result = caldav_getname(settings, info->error); break; + case FREEBUSY: result = caldav_freebusy(settings, info->error); break; + default: break; + } + return result; +} + +/** + * Function for adding a new event. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_add_object(const char* object, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + init_caldav_settings(&settings); + settings.file = g_strdup(object); + settings.ACTION = ADD; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for deleting an event. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_delete_object(const char* object, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + init_caldav_settings(&settings); + settings.file = g_strdup(object); + settings.ACTION = DELETE; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for modifying an event. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_modify_object(const char* object, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + init_caldav_settings(&settings); + settings.file = g_strdup(object); + settings.ACTION = MODIFY; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for getting a collection of events determined by time range. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param start time_t variable specifying start and end for range. Both + * are included in range. + * @param end time_t variable specifying start and end for range. Both + * are included in range. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_get_object(response *result, + time_t start, + time_t end, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + if (!result) { + result = malloc(sizeof(response *)); + memset(result, '\0', sizeof(response *)); + } + init_caldav_settings(&settings); + settings.ACTION = GET; + settings.start = start; + settings.end = end; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + result->msg = NULL; + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + result->msg = g_strdup(settings.file); + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for getting all events from the collection. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_getall_object(response* result, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + if (!result) { + result = malloc(sizeof(response *)); + memset(result, '\0', sizeof(response *)); + } + init_caldav_settings(&settings); + settings.ACTION = GETALL; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + result->msg = NULL; + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + result->msg = g_strdup(settings.file); + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for deleting a task. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_tasks_delete_object(const char* object, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + init_caldav_settings(&settings); + settings.file = g_strdup(object); + settings.ACTION = DELETETASKS; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for modifying a task. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_tasks_modify_object(const char* object, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + init_caldav_settings(&settings); + settings.file = g_strdup(object); + settings.ACTION = MODIFYTASKS; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for getting a collection of tasks determined by time range. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param start time_t variable specifying start and end for range. Both + * are included in range. + * @param end time_t variable specifying start and end for range. Both + * are included in range. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_tasks_get_object(response *result, + time_t start, + time_t end, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + if (!result) { + result = malloc(sizeof(response *)); + memset(result, '\0', sizeof(response *)); + } + init_caldav_settings(&settings); + settings.ACTION = GETTASKS; + settings.start = start; + settings.end = end; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + result->msg = NULL; + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + result->msg = g_strdup(settings.file); + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for getting all tasks from the collection. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_tasks_getall_object(response* result, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + if (!result) { + result = malloc(sizeof(response *)); + memset(result, '\0', sizeof(response *)); + } + init_caldav_settings(&settings); + settings.ACTION = GETALLTASKS; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + result->msg = NULL; + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + result->msg = g_strdup(settings.file); + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function for getting the stored display name for the collection. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_get_displayname(response* result, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + if (!result) { + result = malloc(sizeof(response *)); + memset(result, '\0', sizeof(response *)); + } + init_caldav_settings(&settings); + settings.ACTION = GETCALNAME; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + result->msg = NULL; + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + result->msg = g_strdup(settings.file); + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function to test wether a calendar resource is CalDAV enabled or not. + * @param URL Defines CalDAV resource. Receiver is responsible for + * freeing the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @result 0 (zero) means no CalDAV support, otherwise CalDAV support + * detechted. + */ +int caldav_enabled_resource(const char* URL, runtime_info* info) { + CURL* curl; + caldav_settings settings; + struct config_data data; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + init_caldav_settings(&settings); + + parse_url(&settings, URL); + curl = get_curl(&settings); + if (!curl) { + info->error->code = -1; + info->error->str = g_strdup("Could not initialize libcurl"); + settings.file = NULL; + return TRUE; + } + + if (info->options->trace_ascii) + data.trace_ascii = 1; + else + data.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + + if (info->options->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + gboolean res = test_caldav_enabled(curl, &settings, info->error); + free_caldav_settings(&settings); + curl_easy_cleanup(curl); + return (res && (info->error->code == 0 || info->error->code == 200)) ? 1 : 0; +} + +/** + * Function for getting free/busy information. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param start time_t variable specifying start and end for range. Both + * are included in range. + * @param end time_t variable specifying start and end for range. Both + * are included in range. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_get_freebusy(response *result, + time_t start, + time_t end, + const char* URL, + runtime_info* info) { + caldav_settings settings; + CALDAV_RESPONSE caldav_response; + + g_return_val_if_fail(info != NULL, TRUE); + + init_runtime(info); + if (!result) { + result = malloc(sizeof(response *)); + memset(result, '\0', sizeof(response *)); + } + init_caldav_settings(&settings); + settings.ACTION = FREEBUSY; + settings.start = start; + settings.end = end; + if (info->options->debug) + settings.debug = TRUE; + else + settings.debug = FALSE; + if (info->options->trace_ascii) + settings.trace_ascii = 1; + else + settings.trace_ascii = 0; + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + parse_url(&settings, URL); + gboolean res = make_caldav_call(&settings, info); + if (res) { + result->msg = NULL; + if (info->error->code > 0) { + switch (info->error->code) { + case 403: caldav_response = FORBIDDEN; break; + case 409: caldav_response = CONFLICT; break; + case 423: caldav_response = LOCKED; break; + case 501: caldav_response = NOTIMPLEMENTED; break; + default: caldav_response = CONFLICT; break; + } + } + else { + /* fall-back to conflicting state */ + caldav_response = CONFLICT; + } + } + else { + result->msg = g_strdup(settings.file); + caldav_response = OK; + } + free_caldav_settings(&settings); + return caldav_response; +} + +/** + * Function which supports sending various options inside the library. + * @param curl_options A struct debug_curl. See debug_curl. + */ +void caldav_set_options(debug_curl curl_options) { +} + +/** + * @deprecated Function to call in case of errors. + * Caller provides a pointer to a local caldav_error structure. + * Caldav_get_error will initialize pointer if NULL. + * Caller is responsible for freeing returned memory. + * After the first call the internal error buffer is reset. + * @param lib_error A pointer to a struct _caldav_error. @see _caldav_error + * @return An initialized caldav_error pointer to memory where error + * messages can be found from the last call to the library. + */ +caldav_error* caldav_get_error(caldav_error* lib_error) { + if (!lib_error) { + lib_error = g_new0(caldav_error, 1); + } + return lib_error; +} + +/** + * Function for freeing memory for a previous initialization of a + * caldav_error. @see caldav_get_error() + * Caller provides a pointer to a local caldav_error structure. + * @param lib_error A pointer to a struct _caldav_error. @see _caldav_error + */ +void caldav_free_error(caldav_error* lib_error) { + if (lib_error->str) + g_free(lib_error->str); + g_free(lib_error); + lib_error = NULL; +} + +/** + * Function to call to get a list of supported CalDAV options for a server + * @param URL Defines CalDAV resource. Receiver is responsible for + * freeing the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @result A list of available options or NULL in case of any error. + */ +char** caldav_get_server_options(const char* URL, runtime_info* info) { + CURL* curl; + caldav_settings settings; + response server_options; + gchar** option_list = NULL; + gchar** tmp; + gboolean res = FALSE; + + g_return_val_if_fail(info != NULL, NULL); + + init_runtime(info); + tmp = option_list = NULL; + init_caldav_settings(&settings); + + parse_url(&settings, URL); + curl = get_curl(&settings); + if (!curl) { + info->error->code = -1; + info->error->str = g_strdup("Could not initialize libcurl"); + settings.file = NULL; + return NULL; + } + if (info->options->use_locking) + settings.use_locking = 1; + else + settings.use_locking = 0; + + res = caldav_getoptions(curl, &settings, &server_options, info->error, FALSE); + if (res) { + if (server_options.msg) { + option_list = g_strsplit(server_options.msg, ", ", 0); + tmp = &(*(option_list)); + while (*tmp) { + g_strstrip(*tmp++); + } + } + } + free_caldav_settings(&settings); + curl_easy_cleanup(curl); + return (option_list) ? option_list : NULL; +} + +/** + * Function for getting an initialized runtime_info structure + * @return runtime_info. @see runtime_info + */ +runtime_info* caldav_get_runtime_info() { + runtime_info* rt_info; + + rt_info = g_new0(runtime_info, 1); + rt_info->error = g_new0(caldav_error, 1); + rt_info->options = g_new0(debug_curl, 1); + + return rt_info; +} + +/** + * Function for freeing memory for a previous initialization of an info + * structure + * @param info Address to a pointer to a runtime_info structure. @see + * runtime_info + */ +void caldav_free_runtime_info(runtime_info** info) { + runtime_info* ri; + + if (*info) { + ri = *info; + if (ri->error) { + if (ri->error->str) + g_free(ri->error->str); + g_free(ri->error); + ri->error = NULL; + } + if (ri->options) { + if (ri->options->custom_cacert) + g_free(ri->options->custom_cacert); + g_free(ri->options); + ri->options = NULL; + } + g_free(ri); + *info = ri = NULL; + } +} + +/** + * Function for getting an initialized response structure + * @return response. @see _response + */ +response* caldav_get_response() { + response* r; + + r = g_new0(response, 1); + + return r; +} + +/** + * Function for freeing memory for a previous initialization of an response + * structure + * @param info Address to a pointer to a response structure. @see + * _response + */ +void caldav_free_response(response** resp) { + response* r; + + if (*resp) { + r = *resp; + if (r->msg) + g_free(r->msg); + g_free(r); + *resp = r = NULL; + } +} diff --git a/src/caldav.h b/src/caldav.h new file mode 100644 index 0000000..5734404 --- /dev/null +++ b/src/caldav.h @@ -0,0 +1,407 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/** + * @file caldav.h + * @brief interface to the caldav library. + * The library conforms to RFC4791. For further information follow this + * link http://www.ietf.org/rfc/rfc4791.txt + */ + +/** + * @mainpage + * This document is the documentation for the public interface to libcaldav. + * If you want to study the implementation look for the developers API. + * + * The libray and documentation is Copyright (c) 2008 Michael Rasmussen + * (mir@datanom.net) + * + * License for the source code. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * License for the documentation. + * + * Permission is granted to copy, distribute and/or modify this document + * under the terms of the GNU Free Documentation License, Version 1.2 + * or any later version published by the Free Software Foundation; + * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + * Texts. + */ + +#ifndef __CALDAV_H__ +#define __CALDAV_H__ + +#include + +/* For debug purposes */ +/** + * @typedef struct debug_curl + * A struct used to set internal options in the library + */ +typedef struct { + int trace_ascii; /** @var int trace_ascii + * 0 or 1 + */ + int debug; /** @var int debug + * 0 or 1 + */ + int verify_ssl_certificate; + int use_locking; + char* custom_cacert; +} debug_curl; + +/** + * @typedef struct _caldav_error caldav_error + * Pointer to a caldav_error structure + */ +typedef struct _caldav_error caldav_error; + +/** + * @struct _caldav_error + * A struct for storing error codes and messages + */ +struct _caldav_error { + long code; /** + * @var long code + * if < 0 internal error > 0 CalDAV protocol error. + */ + char* str; /** @var char* str + * For storing human readable error message + */ +}; + +/** + * @typedef struct runtime_info + * Pointer to a runtime structure holding debug and error information + */ +typedef struct { + caldav_error* error; + debug_curl* options; +} runtime_info; + +/* CalDAV is defined in RFC4791 */ + +/* Buffer to hold response */ +/** + * @typedef struct _response response + * Pointer to a _response structure + */ +typedef struct _response response; + +/** + * @struct _response + * A struct used for returning messages from the library to users + */ +struct _response { + char* msg; /** @var char* msg + * String for storing response + */ +}; + +/** + * @enum CALDAV_ACTION specifies supported CalDAV actions. + * UNKNOWN. An unknown action. + * ADD. Add a CalDAV calendar object. + * DELETE. Delete a CalDAV calendar object. + * MODIFY. Modify a CalDAV calendar object. + * GET. Get one or more CalDAV calendar object(s). + * GETALL. Get all CalDAV calendar objects. + */ +typedef enum { + UNKNOWN, + ADD, + DELETE, + FREEBUSY, + MODIFY, + GET, + GETALL, + GETCALNAME, + ISCALDAV, + OPTIONS, + DELETETASKS, + MODIFYTASKS, + GETTASKS, + GETALLTASKS, +} CALDAV_ACTION; + +/** + * @enum CALDAV_RESPONSE specifies CalDAV error states. + * OK (HTTP 200). Request was satisfied. + * FORBIDDEN (HTTP 403). Access not allowed. Dont repeat request. + * CONFLICT (HTTP 409). Conflict between current state of CalDAV collection + * and request. Client must solve the conflict and then resend request. + * LOCKED (HTTP 423). Locking failed. + */ +typedef enum { + OK, + FORBIDDEN, + CONFLICT, + LOCKED, + NOTIMPLEMENTED +} CALDAV_RESPONSE; + + +#ifndef __CALDAV_USERAGENT +#define __CALDAV_USERAGENT "libcurl-agent/0.1" +#endif + + +/** + * Function for adding a new event. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_add_object(const char* object, + const char* URL, + runtime_info* info); + +/** + * Function for deleting an event. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_delete_object(const char* object, + const char* URL, + runtime_info* info); + +/** + * Function for modifying an event. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_modify_object(const char* object, + const char* URL, + runtime_info* info); + +/** + * Function for getting a collection of events determined by time range. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param start time_t variable specifying start for range. Included in search. + * @param end time_t variable specifying end for range. Included in search. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_get_object(response* result, + time_t start, + time_t end, + const char* URL, + runtime_info* info); + +/** + * Function for getting all events from the collection. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_getall_object(response* result, + const char* URL, + runtime_info* info); + +/** + * Function for deleting a task. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_tasks_delete_object(const char* object, + const char* URL, + runtime_info* info); + +/** + * Function for modifying a task. + * @param object Appointment following ICal format (RFC2445). Receiver is + * responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_tasks_modify_object(const char* object, + const char* URL, + runtime_info* info); + +/** + * Function for getting a collection of tasks determined by time range. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param start time_t variable specifying start for range. Included in search. + * @param end time_t variable specifying end for range. Included in search. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_tasks_get_object(response* result, + time_t start, + time_t end, + const char* URL, + runtime_info* info); + +/** + * Function for getting all tasks from the collection. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_tasks_getall_object(response* result, + const char* URL, + runtime_info* info); + +/** + * Function for getting the stored display name for the collection. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_get_displayname(response* result, + const char* URL, + runtime_info* info); + +/** + * Function to test wether a calendar resource is CalDAV enabled or not. + * @param URL Defines CalDAV resource. Receiver is responsible for + * freeing the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @result 0 (zero) means no CalDAV support, otherwise CalDAV support + * detechted. + */ +int caldav_enabled_resource(const char* URL, runtime_info* info); + +/** + * Function for getting free/busy information. + * @param result A pointer to struct _response where the result is to stored. + * @see response. Caller is responsible for freeing the memory. + * @param start time_t variable specifying start and end for range. Both + * are included in range. + * @param end time_t variable specifying start and end for range. Both + * are included in range. + * @param URL Defines CalDAV resource. Receiver is responsible for freeing + * the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE + */ +CALDAV_RESPONSE caldav_get_freebusy(response *result, + time_t start, + time_t end, + const char* URL, + runtime_info* info); + +/** + * @deprecated Always returns an initialized empty caldav_error + * Function to call in case of errors. + * Caller provides a pointer to a local caldav_error structure. + * Caldav_get_error will initialize pointer if NULL. + * Caller is responsible for freeing returned memory. + * After the first call the internal error buffer is reset. + * @param lib_error A pointer to a struct _caldav_error. @see _caldav_error + * @return An initialized caldav_error pointer to memory where error + * messages can be found from the last call to the library. + */ +caldav_error* caldav_get_error(caldav_error* lib_error); + +/** + * Function for freeing memory for a previous initialization of a + * caldav_error. @see caldav_get_error() + * Caller provides a pointer to a local caldav_error structure. + * @param lib_error A pointer to a struct _caldav_error. @see _caldav_error + */ +void caldav_free_error(caldav_error* lib_error); + +/* Setting various options in library */ + +/** + * @deprecated Does nothing + * Function which supports sending various options inside the library. + * @param curl_options A struct debug_curl. See debug_curl. + */ +void caldav_set_options(debug_curl curl_options); + +/** + * Function to call to get a list of supported CalDAV options for a server + * @param URL Defines CalDAV resource. Receiver is responsible for + * freeing the memory. [http://][username[:password]@]host[:port]/url-path. + * See (RFC1738). + * @param info Pointer to a runtime_info structure. @see runtime_info + * @result A list of available options or NULL in case of any error. + */ +char** caldav_get_server_options(const char* URL, runtime_info* info); + +/** + * Function for getting an initialized runtime_info structure + * @return runtime_info. @see runtime_info + */ +runtime_info* caldav_get_runtime_info(); + +/** + * Function for freeing memory for a previous initialization of an info + * structure + * @param info Address to a pointer to a runtime_info structure. @see + * runtime_info + */ +void caldav_free_runtime_info(runtime_info** info); + +/** + * Function for getting an initialized response structure + * @return response. @see _response + */ +response* caldav_get_response(); + +/** + * Function for freeing memory for a previous initialization of an response + * structure + * @param info Address to a pointer to a response structure. @see + * _response + */ +void caldav_free_response(response** info); + +#endif diff --git a/src/delete-caldav-object.c b/src/delete-caldav-object.c new file mode 100644 index 0000000..9a85168 --- /dev/null +++ b/src/delete-caldav-object.c @@ -0,0 +1,533 @@ +/* vim: set textwidth=80 tabstop=4: */ +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "delete-caldav-object.h" +#include "lock-caldav-object.h" +#include +#include +#include +#include +#include + +/** + * A static literal string containing the first part of the calendar query. + * The actual UID to use for the query is added at runtime. + */ +static char* search_head = +"" +"" +" " +" " +" " +" " +" " +" " +" " +" "; + +/** + * A static literal string containing the first part of the calendar query. + * The actual UID to use for the query is added at runtime. + */ +static char* search_tasks_head = +"" +"" +" " +" " +" " +" " +" " +" " +" " +" "; + +/** + * A static literal string containing the last part of the calendar query + */ +static char* search_tail = +"" +" " +" " +" " +""; + +/** + * Function for deleting an event. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_delete(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gchar* search; + gchar* uid; + gboolean LOCKSUPPORT = FALSE; + gchar* lock_token = NULL; + gboolean result = FALSE; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: infinity"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + gchar* file = g_strdup(settings->file); + if ((uid = get_response_header("uid", file, FALSE)) == NULL) { + g_free(file); + error->code = 1; + error->str = g_strdup("Error: Missing required UID for object"); + return TRUE; + } + g_free(file); + /* + * ICalendar server does not support collation + * %s + */ + search = g_strdup_printf( + "%s\r\n%s\r\n%s", + search_head, uid, search_tail); + g_free(uid); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, search); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(search)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + g_free(search); + curl_slist_free_all(http_header); + http_header = NULL; + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 207) { + error->code = code; + error->str = g_strdup(chunk.memory); + result = TRUE; + } + else { + /* enable uploading */ + gchar* url = NULL; + gchar* etag = NULL; + url = get_url(chunk.memory); + if (url) { + etag = get_etag(chunk.memory); + if (etag) { + gchar* host = get_host(settings->url); + if (host) { + file = g_strdup(url); + g_free(url); + url = g_strdup_printf("%s%s", host, file); + g_free(file); + g_free(host); + } + else { + g_free(etag); + g_free(url); + url = NULL; + } + } + else { + g_free(url); + url = NULL; + } + } + if (url) { + int lock = 0; + caldav_error lock_error; + + file = g_strdup(etag); + g_free(etag); + etag = g_strdup_printf("If-Match: %s", file); + g_free(file); + http_header = curl_slist_append(http_header, etag); + g_free(etag); + http_header = curl_slist_append(http_header, + "Content-Type: text/calendar; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append( + http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + if (settings->use_locking) + LOCKSUPPORT = caldav_lock_support(settings, &lock_error); + else + LOCKSUPPORT = FALSE; + if (LOCKSUPPORT) { + lock_token = caldav_lock_object(url, settings, &lock_error); + if (lock_token) { + http_header = curl_slist_append( + http_header, g_strdup_printf( + "If: (%s)", lock_token)); + } + /* + * If error code is 423 (Resource is LOCKED) bail out + */ + else if (lock_error.code == 423) { + lock = -1; + } + /* + * If error code is 501 (Not implemented) we continue + * hoping for the best. + */ + else if (lock_error.code == 501) { + lock_token = g_strdup(""); + } + else { + lock = -1; + } + } + if (! LOCKSUPPORT || (LOCKSUPPORT && lock_token && lock_error.code != 423)) { + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + curl_easy_setopt(curl, CURLOPT_URL, rebuild_url(settings, url)); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, NULL); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, 0); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (LOCKSUPPORT && lock_token) { + caldav_unlock_object( + lock_token, url, settings, &lock_error); + } + } + g_free(url); + g_free(lock_token); + if (res != 0 || lock < 0) { + /* Is this a lock_error don't change error*/ + if (lock == 0 || lock_error.code == 423) { + error->code = code; + error->str = g_strdup(chunk.memory); + } + else { + error->code = lock_error.code; + error->str = g_strdup(lock_error.str); + } + result = TRUE; + g_free(settings->file); + settings->file = NULL; + } + else { + long code; + res = curl_easy_getinfo( + curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 204) { + error->code = code; + error->str = g_strdup(chunk.memory); + result = TRUE; + } + } + curl_slist_free_all(http_header); + } + else { + error->code = code; + if (chunk.memory) + error->str = g_strdup(chunk.memory); + else + error->str = g_strdup("No object found"); + result = TRUE; + } + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_easy_cleanup(curl); + return result; +} + +/** + * Function for deleting a task. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_tasks_delete(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gchar* search; + gchar* uid; + gboolean LOCKSUPPORT = FALSE; + gchar* lock_token = NULL; + gboolean result = FALSE; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: infinity"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + gchar* file = g_strdup(settings->file); + if ((uid = get_response_header("uid", file, FALSE)) == NULL) { + g_free(file); + error->code = 1; + error->str = g_strdup("Error: Missing required UID for object"); + return TRUE; + } + g_free(file); + /* + * ICalendar server does not support collation + * %s + */ + search = g_strdup_printf( + "%s\r\n%s\r\n%s", + search_tasks_head, uid, search_tail); + g_free(uid); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, search); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(search)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + g_free(search); + curl_slist_free_all(http_header); + http_header = NULL; + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 207) { + error->code = code; + error->str = g_strdup(chunk.memory); + result = TRUE; + } + else { + /* enable uploading */ + gchar* url = NULL; + gchar* etag = NULL; + url = get_url(chunk.memory); + if (url) { + etag = get_etag(chunk.memory); + if (etag) { + gchar* host = get_host(settings->url); + if (host) { + file = g_strdup(url); + g_free(url); + url = g_strdup_printf("%s%s", host, file); + g_free(file); + g_free(host); + } + else { + g_free(etag); + g_free(url); + url = NULL; + } + } + else { + g_free(url); + url = NULL; + } + } + if (url) { + int lock = 0; + caldav_error lock_error; + + file = g_strdup(etag); + g_free(etag); + etag = g_strdup_printf("If-Match: %s", file); + g_free(file); + http_header = curl_slist_append(http_header, etag); + g_free(etag); + http_header = curl_slist_append(http_header, + "Content-Type: text/calendar; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append( + http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + if (settings->use_locking) + LOCKSUPPORT = caldav_lock_support(settings, &lock_error); + else + LOCKSUPPORT = FALSE; + if (LOCKSUPPORT) { + lock_token = caldav_lock_object(url, settings, &lock_error); + if (lock_token) { + http_header = curl_slist_append( + http_header, g_strdup_printf( + "If: (%s)", lock_token)); + } + /* + * If error code is 423 (Resource is LOCKED) bail out + */ + else if (lock_error.code == 423) { + lock = -1; + } + /* + * If error code is 501 (Not implemented) we continue + * hoping for the best. + */ + else if (lock_error.code == 501) { + lock_token = g_strdup(""); + } + else { + lock = -1; + } + } + if (! LOCKSUPPORT || (LOCKSUPPORT && lock_token && lock_error.code != 423)) { + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + curl_easy_setopt(curl, CURLOPT_URL, rebuild_url(settings, url)); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, NULL); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, 0); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (LOCKSUPPORT && lock_token) { + caldav_unlock_object( + lock_token, url, settings, &lock_error); + } + } + g_free(url); + g_free(lock_token); + if (res != 0 || lock < 0) { + /* Is this a lock_error don't change error*/ + if (lock == 0 || lock_error.code == 423) { + error->code = code; + error->str = g_strdup(chunk.memory); + } + else { + error->code = lock_error.code; + error->str = g_strdup(lock_error.str); + } + result = TRUE; + g_free(settings->file); + settings->file = NULL; + } + else { + long code; + res = curl_easy_getinfo( + curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 204) { + error->code = code; + error->str = g_strdup(chunk.memory); + result = TRUE; + } + } + curl_slist_free_all(http_header); + } + else { + error->code = code; + if (chunk.memory) + error->str = g_strdup(chunk.memory); + else + error->str = g_strdup("No object found"); + result = TRUE; + } + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_easy_cleanup(curl); + return result; +} diff --git a/src/delete-caldav-object.h b/src/delete-caldav-object.h new file mode 100644 index 0000000..cddf711 --- /dev/null +++ b/src/delete-caldav-object.h @@ -0,0 +1,43 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __DELETE_CALDAV_OBJECT_H__ +#define __DELETE_CALDAV_OBJECT_H__ + +#include "caldav-utils.h" +#include "caldav.h" + +/** + * Function for deleting an event. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_delete(caldav_settings* settings, caldav_error* error); + +/** + * Function for deleting a task. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_tasks_delete(caldav_settings* settings, caldav_error* error); + +#endif + diff --git a/src/get-caldav-report.c b/src/get-caldav-report.c new file mode 100644 index 0000000..d916259 --- /dev/null +++ b/src/get-caldav-report.c @@ -0,0 +1,472 @@ +/* vim: set textwidth=80 tabstop=4 smarttab: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "get-caldav-report.h" +#include +#include +#include +#include +#include + +/** + * A static literal string containing the calendar query for fetching + * all events from collection. + */ +static const char* getall_request = +"" +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +"\r\n"; + +/** + * A static literal string containing the first part of the calendar query. + * The actual VEVENT to search for is added at runtime. + */ +static const char* getrange_request_head = +"" +/*"" +" "*/ +"" +" " +/*" "*/ +" " +" " +" " +" " +" "; + +/** + * A static literal string containing the last part of the calendar query + */ +static const char* getrange_request_foot = +" " +" " +" " +"\r\n"; + +/** + * A static literal string containing the calendar query for fetching + * all tasks from collection. + */ +static const char* getall_tasks_request = +"" +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +"\r\n"; + +/** + * A static literal string containing the first part of the calendar query. + * The actual VTODO to search for is added at runtime. + */ +static const char* getrange_tasks_request_head = +"" +/*"" +" "*/ +"" +" " +/*" "*/ +" " +" " +" " +" " +" "; + +/** + * Function for getting all events from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_getall(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: 1"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + data.trace_ascii = settings->trace_ascii; + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, getall_request); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(getall_request)); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 207) { + error->code = code; + error->str = g_strdup(headers.memory); + result = TRUE; + } + else { + gchar* report; + report = parse_caldav_report( + chunk.memory, "calendar-data", "VEVENT"); + settings->file = g_strdup(report); + g_free(report); + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_slist_free_all(http_header); + curl_easy_cleanup(curl); + return result; +} + +/** + * Function for getting all events within a time range from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_getrange(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE + 1]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + gchar* request = NULL; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: 1"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + request = g_strdup_printf( + "%s\r\n\r\n%s", + getrange_request_head, get_caldav_datetime(&settings->start), + get_caldav_datetime(&settings->end), getrange_request_foot); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(request)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + gchar* report; + report = parse_caldav_report(chunk.memory, "calendar-data", "VEVENT"); + settings->file = g_strdup(report); + g_free(report); + } + g_free(request); + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_slist_free_all(http_header); + curl_easy_cleanup(curl); + return result; +} + +/** + * Function for getting all tasks from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_tasks_getall(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: 1"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + data.trace_ascii = settings->trace_ascii; + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, getall_tasks_request); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(getall_tasks_request)); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 207) { + error->code = code; + error->str = g_strdup(headers.memory); + result = TRUE; + } + else { + gchar* report; + report = parse_caldav_report( + chunk.memory, "calendar-data", "VTODO"); + settings->file = g_strdup(report); + g_free(report); + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_slist_free_all(http_header); + curl_easy_cleanup(curl); + return result; +} + +/** + * Function for getting all events within a time range from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_tasks_getrange(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE + 1]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + gchar* request = NULL; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: 1"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + request = g_strdup_printf( + "%s\r\n\r\n%s", + getrange_tasks_request_head, get_caldav_datetime(&settings->start), + get_caldav_datetime(&settings->end), getrange_request_foot); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(request)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + gchar* report; + report = parse_caldav_report(chunk.memory, "calendar-data", "VTODO"); + settings->file = g_strdup(report); + g_free(report); + } + g_free(request); + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_slist_free_all(http_header); + curl_easy_cleanup(curl); + return result; +} diff --git a/src/get-caldav-report.h b/src/get-caldav-report.h new file mode 100644 index 0000000..f769685 --- /dev/null +++ b/src/get-caldav-report.h @@ -0,0 +1,59 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __GET_CALDAV_REPORT_H__ +#define __GET_CALDAV_REPORT_H__ + +#include "caldav-utils.h" +#include "caldav.h" +#include + +/** + * Function for getting all events from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_getall(caldav_settings* settings, caldav_error* error); + +/** + * Function for getting all events within a time range from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_getrange(caldav_settings* settings, caldav_error* error); + +/** + * Function for getting all tasks from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_tasks_getall(caldav_settings* settings, caldav_error* error); + +/** + * Function for getting all tasks within a time range from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_tasks_getrange(caldav_settings* settings, caldav_error* error); + +#endif diff --git a/src/get-display-name.c b/src/get-display-name.c new file mode 100644 index 0000000..8fc0ff8 --- /dev/null +++ b/src/get-display-name.c @@ -0,0 +1,139 @@ +/* vim: set textwidth=80 tabstop=4 smarttab: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "get-caldav-report.h" +#include +#include +#include +#include +#include + +/** + * A static literal string containing the calendar query for fetching + * the stored display name for the collection. + */ +static const char* getname_request = +"" +"" +" " +" " +" " +"\r\n"; + +/** + * Function for getting the display name from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_getname(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: 0"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + data.trace_ascii = settings->trace_ascii; + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, getname_request); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(getname_request)); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PROPFIND"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 207) { + error->code = code; + error->str = g_strdup(headers.memory); + result = TRUE; + } + else { + gchar* displayname; + displayname = get_tag("displayname", chunk.memory); + /* Maybe namespace prefixed */ + if (!displayname) { + displayname = get_tag("D:displayname", chunk.memory); + } + settings->file = (displayname) ? + g_strdup(displayname) : g_strdup(""); + g_free(displayname); + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_slist_free_all(http_header); + curl_easy_cleanup(curl); + return result; +} + diff --git a/src/get-display-name.h b/src/get-display-name.h new file mode 100644 index 0000000..5c80272 --- /dev/null +++ b/src/get-display-name.h @@ -0,0 +1,34 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __GET_DISPLAY_NAME_H__ +#define __GET_DISPLAY_NAME_H__ + +#include "caldav-utils.h" + +/** + * Function for getting the display name from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_getname(caldav_settings* settings, caldav_error* error); + +#endif + diff --git a/src/get-freebusy-report.c b/src/get-freebusy-report.c new file mode 100644 index 0000000..f75ab92 --- /dev/null +++ b/src/get-freebusy-report.c @@ -0,0 +1,140 @@ +/* vim: set textwidth=80 tabstop=4 smarttab: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "get-freebusy-report.h" +#include +#include +#include + +/** + * A static literal string containing the first part of the calendar query. + * The actual VEVENT to search for is added at runtime. + */ +static const char* getrange_request_head = +"" +""; + +/** + * A static literal string containing the last part of the calendar query + */ +static const char* getrange_request_foot = +"\r\n"; + +/** + * Function for getting freebusy within a time range from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_freebusy(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE + 1]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + gchar* request = NULL; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: 1"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + request = g_strdup_printf( + "%s\r\n\r\n%s", + getrange_request_head, get_caldav_datetime(&settings->start), + get_caldav_datetime(&settings->end), getrange_request_foot); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(request)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 200) { + error->code = code; + error->str = g_strdup(headers.memory); + result = TRUE; + } + else { + /*gchar* report; + report = parse_caldav_report(chunk.memory, "calendar-data", "VFREEBUSY"); + settings->file = g_strdup(report);*/ + settings->file = g_strdup(chunk.memory); + /*g_free(report);*/ + } + } + g_free(request); + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_slist_free_all(http_header); + curl_easy_cleanup(curl); + return result; +} diff --git a/src/get-freebusy-report.h b/src/get-freebusy-report.h new file mode 100644 index 0000000..6c52c51 --- /dev/null +++ b/src/get-freebusy-report.h @@ -0,0 +1,35 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __GET_FREEBUSY_REPORT_H__ +#define __GET_FREEBUSY_REPORT_H__ + +#include "caldav-utils.h" +#include "caldav.h" +#include + +/** + * Function for getting freebusy within a time range from collection. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_freebusy(caldav_settings* settings, caldav_error* error); + +#endif diff --git a/src/lock-caldav-object.c b/src/lock-caldav-object.c new file mode 100644 index 0000000..1ddf926 --- /dev/null +++ b/src/lock-caldav-object.c @@ -0,0 +1,292 @@ +/* vim: set textwidth=80 tabstop=4: */ +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "lock-caldav-object.h" +#include "options-caldav-server.h" +#include +#include +#include +#include +#include + +/** + * A static literal string containing the lock query. + */ +static char* lock_query = +"" +"" +" " +" " +""; + +/** + * Function which requests a lock on a calendar resource + * @param URI The resource to request lock on. + * @param settings @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return The Lock-Token or NULL in case of error + */ +gchar* caldav_lock_object( + gchar* URI, caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gchar* lock_token = NULL; + gchar* url; + + if (! caldav_lock_support(settings, error)) + return lock_token; + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return lock_token; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Timeout: Second-300"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + if (settings->usehttps) { + url = g_strdup_printf("https://%s", URI); + } else { + url = g_strdup_printf("http://%s", URI); + } + curl_easy_setopt(curl, CURLOPT_URL, url); + g_free(url); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, lock_query); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(lock_query)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "LOCK"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + curl_slist_free_all(http_header); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 200) { + gchar* status = get_tag("status", chunk.memory); + if (status && strstr(status, "423") != NULL) { + error->code = 423; + error->str = g_strdup(status); + } + else { + error->code = code; + error->str = g_strdup(chunk.memory); + } + g_free(status); + } + else { + lock_token = get_response_header( + "Lock-Token", headers.memory, FALSE); + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_easy_cleanup(curl); + return lock_token; +} + +/** + * Function which requests to have a lock removed from a calendar resource + * @param lock_token A privious aquired Lock-Token + * @param URI The resource to request unlock on. + * @param settings @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return False in case the lock could not be removed. True otherwise. + */ +gboolean caldav_unlock_object(gchar* lock_token, gchar* URI, + caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gboolean result = FALSE; + gchar* url; + + if (! caldav_lock_support(settings, error)) + return result; + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + g_strdup_printf("Lock-Token: %s", lock_token)); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + if (settings->usehttps) { + url = g_strdup_printf("https://%s", URI); + } else { + url = g_strdup_printf("http://%s", URI); + } + curl_easy_setopt(curl, CURLOPT_URL, url); + g_free(url); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "UNLOCK"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + curl_slist_free_all(http_header); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 204) { + error->code = code; + error->str = g_strdup(chunk.memory); + } + else { + result = TRUE; + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_easy_cleanup(curl); + return result; +} + +/** + * Function to test whether the server supports locking or not. Searching + * for PROP LOCK. If LOCK is present then according to RFC4791 PROP UNLOCK + * must also be present. + * @param settings @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return True if locking is supported by the server. False otherwise + */ +gboolean caldav_lock_support(caldav_settings* settings, caldav_error* error) { + gboolean found = FALSE; + gchar* url = NULL; + gchar* mystr = NULL; + runtime_info* info; + + info = caldav_get_runtime_info(); + info->options->verify_ssl_certificate = settings->verify_ssl_certificate; + info->options->custom_cacert = g_strdup(settings->custom_cacert); + if (settings->usehttps) { + mystr = g_strdup("https://"); + } else { + mystr = g_strdup("http://"); + } + + + if (settings->username && settings->password) { + url = g_strdup_printf("%s%s:%s@%s", + mystr, settings->username, settings->password, settings->url); + } + else if (settings->username) { + url = g_strdup_printf("%s%s@%s", + mystr, settings->username, settings->url); + } + else { + url = g_strdup_printf("%s%s", mystr, settings->url); + } + gchar** options = caldav_get_server_options(url, info); + g_free(url); + gchar** tmp = options; + caldav_free_runtime_info(&info); + while (*options) { + if (strcmp(*options++, "LOCK") == 0) { + found = TRUE; + break; + } + } + g_strfreev(tmp); + g_free(mystr); + return found; +} + + diff --git a/src/lock-caldav-object.h b/src/lock-caldav-object.h new file mode 100644 index 0000000..6dd884f --- /dev/null +++ b/src/lock-caldav-object.h @@ -0,0 +1,55 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __LOCK_CALDAV_OBJECT_H__ +#define __LOCK_CALDAV_OBJECT_H__ + +#include "caldav-utils.h" +#include "caldav.h" + +/** + * Function which requests a lock on a calendar resource + * @param URI The resource to request lock on. + * @param settings @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return The Lock-Token or NULL in case of error + */ +gchar* caldav_lock_object( + gchar* URI, caldav_settings* settings, caldav_error* error); + +/** + * Function which requests to have a lock removed from a calendar resource + * @param lock_token A privious aquired Lock-Token + * @param URI The resource to request unlock on. + * @param settings @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return False in case the lock could not be removed. True otherwise. + */ +gboolean caldav_unlock_object(gchar* lock_token, gchar* URI, + caldav_settings* settings, caldav_error* error); + +/** + * Function to test whether the server supports locking or not + * @param settings @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return True if locking is supported by the server. False otherwise + */ +gboolean caldav_lock_support(caldav_settings* settings, caldav_error* error); + +#endif diff --git a/src/md5.c b/src/md5.c new file mode 100644 index 0000000..62d4b2d --- /dev/null +++ b/src/md5.c @@ -0,0 +1,442 @@ +/** md5.c - MD5 Message-Digest Algorithm + * Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc. + * + * according to the definition of MD5 in RFC 1321 from April 1992. + * NOTE: This is *not* the same file as the one from glibc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 3, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Written by Ulrich Drepper , 1995. + * heavily modified for GnuPG by . + * modified again for Sylpheed by 2001-02-11. + */ + + +/* Test values: + * "" D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E + * "a" 0C C1 75 B9 C0 F1 B6 A8 31 C3 99 E2 69 77 26 61 + * "abc 90 01 50 98 3C D2 4F B0 D6 96 3F 7D 28 E1 7F 72 + * "message digest" F9 6B 69 7D 7C B7 93 8D 52 5A 2F 31 AA F1 61 D0 + */ + +#include +#include +#include +#include +#include + +#include "md5.h" + +/**************** + * Rotate a 32 bit integer by n bytes + */ +#if defined(__GNUC__) && defined(__i386__) +static inline u32 +rol( u32 x, int n) +{ + __asm__("roll %%cl,%0" + :"=r" (x) + :"0" (x),"c" (n)); + return x; +} +#else +#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) ) +#endif + + +static void +md5_init(MD5_CONTEXT *ctx) +{ + ctx->A = 0x67452301; + ctx->B = 0xefcdab89; + ctx->C = 0x98badcfe; + ctx->D = 0x10325476; + + ctx->nblocks = 0; + ctx->count = 0; + ctx->finalized = 0; +} + +/* These are the four functions used in the four steps of the MD5 algorithm + and defined in the RFC 1321. The first function is a little bit optimized + (as found in Colin Plumbs public domain implementation). */ +/* #define FF(b, c, d) ((b & c) | (~b & d)) */ +#define FF(b, c, d) (d ^ (b & (c ^ d))) +#define FG(b, c, d) FF (d, b, c) +#define FH(b, c, d) (b ^ c ^ d) +#define FI(b, c, d) (c ^ (b | ~d)) + + +/**************** + * transform n*64 bytes + */ +static void +transform(MD5_CONTEXT *ctx, const unsigned char *data) +{ + u32 correct_words[16]; + u32 A = ctx->A; + u32 B = ctx->B; + u32 C = ctx->C; + u32 D = ctx->D; + u32 *cwp = correct_words; + +#ifdef BIG_ENDIAN_HOST + { + int i; + unsigned char *p2; + const unsigned char *p1; + + for (i = 0, p1 = data, p2 = (unsigned char*)correct_words; + i < 16; i++, p2 += 4) { + p2[3] = *p1++; + p2[2] = *p1++; + p2[1] = *p1++; + p2[0] = *p1++; + } + } +#else + memcpy(correct_words, data, 64); +#endif + + +#define OP(a, b, c, d, s, T) \ + do { \ + a += FF (b, c, d) + (*cwp++) + T; \ + a = rol(a, s); \ + a += b; \ + } while (0) + + /* Before we start, one word about the strange constants. + They are defined in RFC 1321 as + + T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 + */ + + /* Round 1. */ + OP (A, B, C, D, 7, 0xd76aa478); + OP (D, A, B, C, 12, 0xe8c7b756); + OP (C, D, A, B, 17, 0x242070db); + OP (B, C, D, A, 22, 0xc1bdceee); + OP (A, B, C, D, 7, 0xf57c0faf); + OP (D, A, B, C, 12, 0x4787c62a); + OP (C, D, A, B, 17, 0xa8304613); + OP (B, C, D, A, 22, 0xfd469501); + OP (A, B, C, D, 7, 0x698098d8); + OP (D, A, B, C, 12, 0x8b44f7af); + OP (C, D, A, B, 17, 0xffff5bb1); + OP (B, C, D, A, 22, 0x895cd7be); + OP (A, B, C, D, 7, 0x6b901122); + OP (D, A, B, C, 12, 0xfd987193); + OP (C, D, A, B, 17, 0xa679438e); + OP (B, C, D, A, 22, 0x49b40821); + +#undef OP +#define OP(f, a, b, c, d, k, s, T) \ + do { \ + a += f (b, c, d) + correct_words[k] + T; \ + a = rol(a, s); \ + a += b; \ + } while (0) + + /* Round 2. */ + OP (FG, A, B, C, D, 1, 5, 0xf61e2562); + OP (FG, D, A, B, C, 6, 9, 0xc040b340); + OP (FG, C, D, A, B, 11, 14, 0x265e5a51); + OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); + OP (FG, A, B, C, D, 5, 5, 0xd62f105d); + OP (FG, D, A, B, C, 10, 9, 0x02441453); + OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); + OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); + OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); + OP (FG, D, A, B, C, 14, 9, 0xc33707d6); + OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); + OP (FG, B, C, D, A, 8, 20, 0x455a14ed); + OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); + OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); + OP (FG, C, D, A, B, 7, 14, 0x676f02d9); + OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); + + /* Round 3. */ + OP (FH, A, B, C, D, 5, 4, 0xfffa3942); + OP (FH, D, A, B, C, 8, 11, 0x8771f681); + OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); + OP (FH, B, C, D, A, 14, 23, 0xfde5380c); + OP (FH, A, B, C, D, 1, 4, 0xa4beea44); + OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); + OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); + OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); + OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); + OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); + OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); + OP (FH, B, C, D, A, 6, 23, 0x04881d05); + OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); + OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); + OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); + OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); + + /* Round 4. */ + OP (FI, A, B, C, D, 0, 6, 0xf4292244); + OP (FI, D, A, B, C, 7, 10, 0x432aff97); + OP (FI, C, D, A, B, 14, 15, 0xab9423a7); + OP (FI, B, C, D, A, 5, 21, 0xfc93a039); + OP (FI, A, B, C, D, 12, 6, 0x655b59c3); + OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); + OP (FI, C, D, A, B, 10, 15, 0xffeff47d); + OP (FI, B, C, D, A, 1, 21, 0x85845dd1); + OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); + OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); + OP (FI, C, D, A, B, 6, 15, 0xa3014314); + OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); + OP (FI, A, B, C, D, 4, 6, 0xf7537e82); + OP (FI, D, A, B, C, 11, 10, 0xbd3af235); + OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); + OP (FI, B, C, D, A, 9, 21, 0xeb86d391); + + /* Put checksum in context given as argument. */ + ctx->A += A; + ctx->B += B; + ctx->C += C; + ctx->D += D; +} + + + +/* The routine updates the message-digest context to + * account for the presence of each of the characters inBuf[0..inLen-1] + * in the message whose digest is being computed. + */ +static void +md5_update(MD5_CONTEXT *hd, const unsigned char *inbuf, size_t inlen) +{ + if (hd->count == 64) { /* flush the buffer */ + transform( hd, hd->buf ); + hd->count = 0; + hd->nblocks++; + } + if (!inbuf) + return; + if (hd->count) { + for (; inlen && hd->count < 64; inlen--) + hd->buf[hd->count++] = *inbuf++; + md5_update(hd, NULL, 0); + if (!inlen) + return; + } + + while (inlen >= 64) { + transform(hd, inbuf); + hd->count = 0; + hd->nblocks++; + inlen -= 64; + inbuf += 64; + } + + for (; inlen && hd->count < 64; inlen--) + hd->buf[hd->count++] = *inbuf++; +} + + + +/* The routine final terminates the message-digest computation and + * ends with the desired message digest in mdContext->digest[0...15]. + * The handle is prepared for a new MD5 cycle. + * Returns 16 bytes representing the digest. + */ + +static void +do_final(MD5_CONTEXT *hd) +{ + u32 t, msb, lsb; + unsigned char *p; + + md5_update(hd, NULL, 0); /* flush */ + + msb = 0; + t = hd->nblocks; + if ((lsb = t << 6) < t) /* multiply by 64 to make a byte count */ + msb++; + msb += t >> 26; + t = lsb; + if ((lsb = t + hd->count) < t) /* add the count */ + msb++; + t = lsb; + if ((lsb = t << 3) < t) /* multiply by 8 to make a bit count */ + msb++; + msb += t >> 29; + + if (hd->count < 56) { /* enough room */ + hd->buf[hd->count++] = 0x80; /* pad */ + while(hd->count < 56) + hd->buf[hd->count++] = 0; /* pad */ + } else { /* need one extra block */ + hd->buf[hd->count++] = 0x80; /* pad character */ + while (hd->count < 64) + hd->buf[hd->count++] = 0; + md5_update(hd, NULL, 0); /* flush */ + memset(hd->buf, 0, 56); /* fill next block with zeroes */ + } + + /* append the 64 bit count */ + hd->buf[56] = lsb ; + hd->buf[57] = lsb >> 8; + hd->buf[58] = lsb >> 16; + hd->buf[59] = lsb >> 24; + hd->buf[60] = msb ; + hd->buf[61] = msb >> 8; + hd->buf[62] = msb >> 16; + hd->buf[63] = msb >> 24; + transform(hd, hd->buf); + + p = hd->buf; +#ifdef BIG_ENDIAN_HOST +#define X(a) do { *p++ = hd->a ; *p++ = hd->a >> 8; \ + *p++ = hd->a >> 16; *p++ = hd->a >> 24; } while(0) +#else /* little endian */ + /*#define X(a) do { *(u32*)p = hd->##a ; p += 4; } while(0)*/ + /* Unixware's cpp doesn't like the above construct so we do it his way: + * (reported by Allan Clark) */ +#define X(a) do { *(u32*)p = (*hd).a ; p += 4; } while(0) +#endif + X(A); + X(B); + X(C); + X(D); +#undef X + hd->finalized = 1; +} + +static void +md5_final(unsigned char *digest, MD5_CONTEXT *ctx) +{ + if (!ctx->finalized) + do_final(ctx); + memcpy(digest, ctx->buf, 16); +} + +/* + * Creates a MD5 digest in hex fomrat (lowercase letters) from the + * string S. hextdigest but be buffer of at lease 33 bytes! + */ +static void +md5_hex_digest(char *hexdigest, const unsigned char *s) +{ + int i; + MD5_CONTEXT context; + unsigned char digest[16]; + + md5_init(&context); + md5_update(&context, s, strlen((gchar *) s)); + md5_final(digest, &context); + + for (i = 0; i < 16; i++) + sprintf(hexdigest + 2 * i, "%02x", digest[i]); +} + + +/* +** Function: md5_hmac +** taken from the file rfc2104.txt +** written by Martin Schaaf +*/ +static void +md5_hmac(unsigned char *digest, + const unsigned char* text, int text_len, + const unsigned char* key, int key_len) +{ + MD5_CONTEXT context; + unsigned char k_ipad[64]; /* inner padding - + * key XORd with ipad + */ + unsigned char k_opad[64]; /* outer padding - + * key XORd with opad + */ + /* unsigned char tk[16]; */ + int i; + + /* start out by storing key in pads */ + memset(k_ipad, 0, sizeof k_ipad); + memset(k_opad, 0, sizeof k_opad); + if (key_len > 64) { + /* if key is longer than 64 bytes reset it to key=MD5(key) */ + MD5_CONTEXT tctx; + + md5_init(&tctx); + md5_update(&tctx, key, key_len); + md5_final(k_ipad, &tctx); + md5_final(k_opad, &tctx); + } else { + memcpy(k_ipad, key, key_len); + memcpy(k_opad, key, key_len); + } + + /* + * the HMAC_MD5 transform looks like: + * + * MD5(K XOR opad, MD5(K XOR ipad, text)) + * + * where K is an n byte key + * ipad is the byte 0x36 repeated 64 times + * opad is the byte 0x5c repeated 64 times + * and text is the data being protected + */ + + + /* XOR key with ipad and opad values */ + for (i = 0; i < 64; i++) { + k_ipad[i] ^= 0x36; + k_opad[i] ^= 0x5c; + } + + /* + * perform inner MD5 + */ + md5_init(&context); /* init context for 1st + * pass */ + md5_update(&context, k_ipad, 64); /* start with inner pad */ + md5_update(&context, text, text_len); /* then text of datagram */ + md5_final(digest, &context); /* finish up 1st pass */ + /* + * perform outer MD5 + */ + md5_init(&context); /* init context for 2nd + * pass */ + md5_update(&context, k_opad, 64); /* start with outer pad */ + md5_update(&context, digest, 16); /* then results of 1st + * hash */ + md5_final(digest, &context); /* finish up 2nd pass */ +} + + +static void +md5_hex_hmac(char *hexdigest, + const unsigned char* text, int text_len, + const unsigned char* key, int key_len) +{ + unsigned char digest[16]; + int i; + + md5_hmac(digest, text, text_len, key, key_len); + for (i = 0; i < 16; i++) + sprintf(hexdigest + 2 * i, "%02x", digest[i]); +} + +void caldav_md5_hex_digest(char *hexdigest, const unsigned char *s) { + md5_hex_digest(hexdigest, s); +} + +void caldav_md5_hex_hmac(char *hexdigest, + const unsigned char* text, int text_len, + const unsigned char* key, int key_len) { + md5_hex_hmac(hexdigest, text, text_len, key, key_len); +} diff --git a/src/md5.h b/src/md5.h new file mode 100644 index 0000000..7605214 --- /dev/null +++ b/src/md5.h @@ -0,0 +1,52 @@ +/** + * md5.h - MD5 Message-Digest Algorithm + * Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc. + * + * according to the definition of MD5 in RFC 1321 from April 1992. + * NOTE: This is *not* the same file as the one from glibc + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 3, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _MD5_HDR_ +#define _MD5_HDR_ + +#include + +/** + * @typedef u32 + * Kept this typedef for compatibility reasons + */ +#ifndef HAVE_U32_TYPEDEF + #undef u32 + typedef guint32 u32; + #define HAVE_U32_TYPEDEF +#endif + +typedef struct { /* Hmm, should be private */ + u32 A,B,C,D; + u32 nblocks; + unsigned char buf[64]; + int count; + int finalized; +} MD5_CONTEXT; + +void caldav_md5_hex_digest(char *hexdigest, const unsigned char *s); + +void caldav_md5_hex_hmac(char *hexdigest, + const unsigned char* text, int text_len, + const unsigned char* key, int key_len); + +#endif /* _MD5_HDR_ */ + diff --git a/src/modify-caldav-object.c b/src/modify-caldav-object.c new file mode 100644 index 0000000..fb3a4d0 --- /dev/null +++ b/src/modify-caldav-object.c @@ -0,0 +1,555 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "modify-caldav-object.h" +#include "lock-caldav-object.h" +#include +#include +#include +#include +#include + +/** + * A static literal string containing the first part of the calendar query. + * The actual UID to use for the query is added at runtime. + */ +static char* search_head = +"" +"" +" " +" " +" " +" " +" " +" " +" " +" "; + +/** + * A static literal string containing the first part of the calendar query. + * The actual UID to use for the query is added at runtime. + */ +static char* search_tasks_head = +"" +"" +" " +" " +" " +" " +" " +" " +" " +" "; + +/** + * A static literal string containing the last part of the calendar query + */ +static char* search_tail = +"" +" " +" " +" " +""; + +/** + * Function for modifying an event. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_modify(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gchar* search; + gchar* uid; + gboolean result = FALSE; + gboolean LOCKSUPPORT = FALSE; + gchar* lock_token = NULL; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: 1"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + gchar* file = g_strdup(settings->file); + if ((uid = get_response_header("uid", file, FALSE)) == NULL) { + g_free(file); + error->code = 1; + error->str = g_strdup("Error: Missing required UID for object"); + return TRUE; + } + g_free(file); + /* + * collation is not supported by ICalendar. + * %s + */ + search = g_strdup_printf( + "%s\r\n%s\r\n%s", + search_head, uid, search_tail); + g_free(uid); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, search); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(search)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + curl_slist_free_all(http_header); + http_header = NULL; + g_free(search); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 207) { + error->code = code; + error->str = g_strdup(chunk.memory); + result = TRUE; + } + else { + /* enable uploading */ + gchar* url = NULL; + gchar* etag = NULL; + url = get_url(chunk.memory); + if (url) { + etag = get_etag(chunk.memory); + if (etag) { + gchar* host = get_host(settings->url); + if (host) { + file = g_strdup(url); + g_free(url); + url = g_strdup_printf("%s%s", host, file); + g_free(file); + g_free(host); + } + else { + g_free(etag); + g_free(url); + url = NULL; + } + } + else { + g_free(url); + url = NULL; + } + if (url) { + int lock = 0; + caldav_error lock_error; + + file = g_strdup(etag); + g_free(etag); + etag = g_strdup_printf("If-Match: %s", file); + g_free(file); + http_header = curl_slist_append(http_header, etag); + g_free(etag); + http_header = curl_slist_append(http_header, + "Content-Type: text/calendar; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append( + http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + if (settings->use_locking) + LOCKSUPPORT = caldav_lock_support(settings, &lock_error); + else + LOCKSUPPORT = FALSE; + if (LOCKSUPPORT) { + lock_token = caldav_lock_object(url, settings, &lock_error); + if (lock_token) { + http_header = curl_slist_append( + http_header, g_strdup_printf( + "If: (%s)", lock_token)); + } + /* + * If error code is 423 (Resource is LOCKED) bail out + */ + else if (lock_error.code == 423) { + lock = -1; + } + /* + * If error code is 501 (Not implemented) we continue + * hoping for the best. + */ + else if (lock_error.code == 501) { + lock_token = g_strdup(""); + } + else { + lock = -1; + } + } + if (! LOCKSUPPORT || (LOCKSUPPORT && lock_token && lock_error.code != 423)) { + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + curl_easy_setopt(curl, CURLOPT_URL, rebuild_url(settings, url)); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, settings->file); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, + strlen(settings->file)); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); + res = curl_easy_perform(curl); + if (LOCKSUPPORT && lock_token) { + caldav_unlock_object( + lock_token, url, settings, &lock_error); + } + } + g_free(url); + g_free(lock_token); + if (res != 0 || lock < 0) { + /* Is this a lock_error don't change error*/ + if (lock == 0 || lock_error.code == 423) { + error->code = code; + error->str = g_strdup(chunk.memory); + } + else { + error->code = lock_error.code; + error->str = g_strdup(lock_error.str); + } + result = TRUE; + g_free(settings->file); + settings->file = NULL; + } + else { + long code; + res = curl_easy_getinfo( + curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 204) { + error->code = code; + error->str = g_strdup(chunk.memory); + result = TRUE; + } + } + curl_slist_free_all(http_header); + } + else { + error->code = code; + if (chunk.memory) + error->str = g_strdup(chunk.memory); + else + error->str = g_strdup("No object found"); + result = TRUE; + } + } + else { + /* + * No object found on server. Posible synchronization + * problem or a server side race condition + */ + error->code = 409; + error->str = g_strdup("No object found"); + result = TRUE; + } + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_easy_cleanup(curl); + return result; +} + +/** + * Function for modifying a task. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_tasks_modify(caldav_settings* settings, caldav_error* error) { + CURL* curl; + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct config_data data; + struct MemoryStruct chunk; + struct MemoryStruct headers; + struct curl_slist *http_header = NULL; + gchar* search; + gchar* uid; + gboolean result = FALSE; + gboolean LOCKSUPPORT = FALSE; + gchar* lock_token = NULL; + + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + curl = get_curl(settings); + if (!curl) { + error->code = -1; + error->str = g_strdup("Could not initialize libcurl"); + g_free(settings->file); + settings->file = NULL; + return TRUE; + } + + http_header = curl_slist_append(http_header, + "Content-Type: application/xml; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Depth: 1"); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append(http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + data.trace_ascii = settings->trace_ascii; + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'headers' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + if (settings->debug) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); + } + gchar* file = g_strdup(settings->file); + if ((uid = get_response_header("uid", file, FALSE)) == NULL) { + g_free(file); + error->code = 1; + error->str = g_strdup("Error: Missing required UID for object"); + return TRUE; + } + g_free(file); + /* + * collation is not supported by ICalendar. + * %s + */ + search = g_strdup_printf( + "%s\r\n%s\r\n%s", + search_tasks_head, uid, search_tail); + g_free(uid); + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, search); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen(search)); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + curl_slist_free_all(http_header); + http_header = NULL; + g_free(search); + if (res != 0) { + error->code = -1; + error->str = g_strdup_printf("%s", error_buf); + g_free(settings->file); + settings->file = NULL; + result = TRUE; + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 207) { + error->code = code; + error->str = g_strdup(chunk.memory); + result = TRUE; + } + else { + /* enable uploading */ + gchar* url = NULL; + gchar* etag = NULL; + url = get_url(chunk.memory); + if (url) { + etag = get_etag(chunk.memory); + if (etag) { + gchar* host = get_host(settings->url); + if (host) { + file = g_strdup(url); + g_free(url); + url = g_strdup_printf("%s%s", host, file); + g_free(file); + g_free(host); + } + else { + g_free(etag); + g_free(url); + url = NULL; + } + } + else { + g_free(url); + url = NULL; + } + if (url) { + int lock = 0; + caldav_error lock_error; + + file = g_strdup(etag); + g_free(etag); + etag = g_strdup_printf("If-Match: %s", file); + g_free(file); + http_header = curl_slist_append(http_header, etag); + g_free(etag); + http_header = curl_slist_append(http_header, + "Content-Type: text/calendar; charset=\"utf-8\""); + http_header = curl_slist_append(http_header, "Expect:"); + http_header = curl_slist_append( + http_header, "Transfer-Encoding:"); + http_header = curl_slist_append(http_header, "Connection: close"); + if (settings->use_locking) + LOCKSUPPORT = caldav_lock_support(settings, &lock_error); + else + LOCKSUPPORT = FALSE; + if (LOCKSUPPORT) { + lock_token = caldav_lock_object(url, settings, &lock_error); + if (lock_token) { + http_header = curl_slist_append( + http_header, g_strdup_printf( + "If: (%s)", lock_token)); + } + /* + * If error code is 423 (Resource is LOCKED) bail out + */ + else if (lock_error.code == 423) { + lock = -1; + } + /* + * If error code is 501 (Not implemented) we continue + * hoping for the best. + */ + else if (lock_error.code == 501) { + lock_token = g_strdup(""); + } + else { + lock = -1; + } + } + if (! LOCKSUPPORT || (LOCKSUPPORT && lock_token && lock_error.code != 423)) { + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header); + curl_easy_setopt(curl, CURLOPT_URL, rebuild_url(settings, url)); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, settings->file); + curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, + strlen(settings->file)); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); + res = curl_easy_perform(curl); + if (LOCKSUPPORT && lock_token) { + caldav_unlock_object( + lock_token, url, settings, &lock_error); + } + } + g_free(url); + g_free(lock_token); + if (res != 0 || lock < 0) { + /* Is this a lock_error don't change error*/ + if (lock == 0 || lock_error.code == 423) { + error->code = code; + error->str = g_strdup(chunk.memory); + } + else { + error->code = lock_error.code; + error->str = g_strdup(lock_error.str); + } + result = TRUE; + g_free(settings->file); + settings->file = NULL; + } + else { + long code; + res = curl_easy_getinfo( + curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 204) { + error->code = code; + error->str = g_strdup(chunk.memory); + result = TRUE; + } + } + curl_slist_free_all(http_header); + } + else { + error->code = code; + if (chunk.memory) + error->str = g_strdup(chunk.memory); + else + error->str = g_strdup("No object found"); + result = TRUE; + } + } + else { + /* + * No object found on server. Posible synchronization + * problem or a server side race condition + */ + error->code = 409; + error->str = g_strdup("No object found"); + result = TRUE; + } + } + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_easy_cleanup(curl); + return result; +} + diff --git a/src/modify-caldav-object.h b/src/modify-caldav-object.h new file mode 100644 index 0000000..4171f91 --- /dev/null +++ b/src/modify-caldav-object.h @@ -0,0 +1,42 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __MODIFY_CALDAV_OBJECT_H__ +#define __MODIFY_CALDAV_OBJECT_H__ + +#include "caldav-utils.h" +#include "caldav.h" + +/** + * Function for modifying an event. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_modify(caldav_settings* settings, caldav_error* error); + +/** + * Function for modifying a task. + * @param settings A pointer to caldav_settings. @see caldav_settings + * @param error A pointer to caldav_error. @see caldav_error + * @return TRUE in case of error, FALSE otherwise. + */ +gboolean caldav_tasks_modify(caldav_settings* settings, caldav_error* error); + +#endif diff --git a/src/options-caldav-server.c b/src/options-caldav-server.c new file mode 100644 index 0000000..1d97d04 --- /dev/null +++ b/src/options-caldav-server.c @@ -0,0 +1,135 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "options-caldav-server.h" +#include +#include +#include +#include +#include + +/** + * Function for getting supported options from a server. + * @param curl A pointer to an initialized CURL instance + * @param settings struct containing the URL to the server. If authentication + * is required prior to making the call the credentials must be available + * via CURLOPT_USERPWD before calling. + * @param result A pointer to a struct _response. If test is true + * this variable can be NULL. Caller is responsible for freeing associated + * memory. + * @param error A pointer to caldav_error. @see caldav_error + * @param test if this is true response will be whether the server + * represented by the URL is a CalDAV collection or not. + * @return FALSE in case of error, TRUE otherwise. + */ +gboolean caldav_getoptions(CURL* curl, caldav_settings* settings, response* result, + caldav_error* error, gboolean test) { + CURLcode res = 0; + char error_buf[CURL_ERROR_SIZE]; + struct MemoryStruct chunk; + struct MemoryStruct headers; + gboolean enabled = FALSE; + + if (! curl) + return FALSE; + + if (!error) { + error = (caldav_error *) malloc(sizeof(struct _caldav_error)); + memset(error, '\0', sizeof(struct _caldav_error)); + } + chunk.memory = NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + headers.memory = NULL; + headers.size = 0; + + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)&headers); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *) &error_buf); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "OPTIONS"); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1); + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + res = curl_easy_perform(curl); + if (res == 0) { + gchar* head; + head = get_response_header("DAV", headers.memory, TRUE); + if (head && strstr(head, "calendar-access") != NULL) { + enabled = TRUE; + if (! test) { + result->msg = g_strdup( + get_response_header("Allow", headers.memory, FALSE)); + } + } + else { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code == 200) { + error->code = -1; + error->str = g_strdup("URL is not a CalDAV resource"); + } + else { + error->code = -1 * code; + error->str = g_strdup(headers.memory); + } + } + g_free(head); + } + else if ( + (res == CURLE_SSL_CONNECT_ERROR || + CURLE_PEER_FAILED_VERIFICATION || + CURLE_SSL_ENGINE_NOTFOUND || + CURLE_SSL_ENGINE_SETFAILED || + CURLE_SSL_CERTPROBLEM || + CURLE_SSL_CIPHER || + CURLE_SSL_CACERT || + CURLE_SSL_CACERT_BADFILE || + CURLE_SSL_CRL_BADFILE || + CURLE_SSL_ISSUER_ERROR) && settings->usehttps) { + error->code = -2; + error->str = g_strdup(error_buf); + } + else if (res == CURLE_COULDNT_RESOLVE_HOST) { + error->code = -3; + error->str = g_strdup("Could not resolve host"); + } + else if (res == CURLE_COULDNT_CONNECT) { + error->code = -4; + error->str = g_strdup("Unable to connect"); + } + else { + error->code = -1; + error->str = g_strdup("URL is not a CalDAV resource"); + } + if (chunk.memory) + free(chunk.memory); + if (headers.memory) + free(headers.memory); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET"); + return enabled; +} diff --git a/src/options-caldav-server.h b/src/options-caldav-server.h new file mode 100644 index 0000000..d17cba2 --- /dev/null +++ b/src/options-caldav-server.h @@ -0,0 +1,43 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __OPTIONS_CALDAV_SERVER_H__ +#define __OPTIONS_CALDAV_SERVER_H__ + +#include "caldav-utils.h" +#include "caldav.h" + +/** + * Function for getting supported options from a server. + * @param curl A pointer to an initialized CURL instance + * @param settings struct containing the URL to the server. If authentication + * is required prior to making the call the credentials must be available + * via CURLOPT_USERPWD before calling. + * @param result A pointer to a struct _response. If test is true + * this variable can be NULL. Caller is responsible for freeing associated + * memory. + * @param error A pointer to caldav_error. @see caldav_error + * @param test if this is true response will be whether the server + * represented by the URL is a CalDAV collection or not. + * @return FALSE in case of error, TRUE otherwise. + */ +gboolean caldav_getoptions(CURL* curl, caldav_settings* settings, response* result, + caldav_error* error, gboolean test); + +#endif diff --git a/test/.svn/all-wcprops b/test/.svn/all-wcprops new file mode 100644 index 0000000..0465f4b --- /dev/null +++ b/test/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 41 +/svnroot/libcaldav/!svn/ver/42/trunk/test +END +Makefile.in +K 25 +svn:wc:ra_dav:version-url +V 53 +/svnroot/libcaldav/!svn/ver/42/trunk/test/Makefile.in +END +Makefile.am +K 25 +svn:wc:ra_dav:version-url +V 53 +/svnroot/libcaldav/!svn/ver/30/trunk/test/Makefile.am +END diff --git a/test/.svn/entries b/test/.svn/entries new file mode 100644 index 0000000..26cb911 --- /dev/null +++ b/test/.svn/entries @@ -0,0 +1,105 @@ +10 + +dir +42 +https://libcaldav.svn.sourceforge.net/svnroot/libcaldav/trunk/test +https://libcaldav.svn.sourceforge.net/svnroot/libcaldav + + + +2010-05-29T15:45:56.236020Z +42 +miras + + + + + + + + + + + + + + +6bb92309-7149-0410-b568-bc30dfd0a1d5 + +unittest +dir + +Makefile.in +file + + + + +2010-05-31T07:07:58.000000Z +fa74e0a0a67b25662dfd0dd6ed1f78a3 +2010-05-29T15:45:56.236020Z +42 +miras + + + + + + + + + + + + + + + + + + + + + +17836 + +src +dir + +Makefile.am +file + + + + +2010-05-31T07:07:58.000000Z +49c7239729ed3197c7e08cb1f51b4545 +2010-04-04T20:17:57.156621Z +30 +miras + + + + + + + + + + + + + + + + + + + + + +82 + +ics +dir + diff --git a/test/.svn/text-base/Makefile.am.svn-base b/test/.svn/text-base/Makefile.am.svn-base new file mode 100644 index 0000000..8cd5e9c --- /dev/null +++ b/test/.svn/text-base/Makefile.am.svn-base @@ -0,0 +1,8 @@ +AUTOMAKE_OPTIONS = gnu + +SUBDIRS = \ + ics \ + src \ + unittest + +EXTRA_DIST = diff --git a/test/.svn/text-base/Makefile.in.svn-base b/test/.svn/text-base/Makefile.in.svn-base new file mode 100644 index 0000000..600fbf0 --- /dev/null +++ b/test/.svn/text-base/Makefile.in.svn-base @@ -0,0 +1,597 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = test +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURL_CFLAGS = @CURL_CFLAGS@ +CURL_LIBS = @CURL_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DX_CONFIG = @DX_CONFIG@ +DX_DOCDIR = @DX_DOCDIR@ +DX_DOT = @DX_DOT@ +DX_DOXYGEN = @DX_DOXYGEN@ +DX_DVIPS = @DX_DVIPS@ +DX_EGREP = @DX_EGREP@ +DX_ENV = @DX_ENV@ +DX_FLAG_chi = @DX_FLAG_chi@ +DX_FLAG_chm = @DX_FLAG_chm@ +DX_FLAG_doc = @DX_FLAG_doc@ +DX_FLAG_dot = @DX_FLAG_dot@ +DX_FLAG_html = @DX_FLAG_html@ +DX_FLAG_man = @DX_FLAG_man@ +DX_FLAG_pdf = @DX_FLAG_pdf@ +DX_FLAG_ps = @DX_FLAG_ps@ +DX_FLAG_rtf = @DX_FLAG_rtf@ +DX_FLAG_xml = @DX_FLAG_xml@ +DX_HHC = @DX_HHC@ +DX_LATEX = @DX_LATEX@ +DX_MAKEINDEX = @DX_MAKEINDEX@ +DX_PDFLATEX = @DX_PDFLATEX@ +DX_PERL = @DX_PERL@ +DX_PROJECT = @DX_PROJECT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBVERSION = @LIBVERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = gnu +SUBDIRS = \ + ics \ + src \ + unittest + +EXTRA_DIST = +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu test/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/test/Makefile.am b/test/Makefile.am new file mode 100644 index 0000000..8cd5e9c --- /dev/null +++ b/test/Makefile.am @@ -0,0 +1,8 @@ +AUTOMAKE_OPTIONS = gnu + +SUBDIRS = \ + ics \ + src \ + unittest + +EXTRA_DIST = diff --git a/test/Makefile.in b/test/Makefile.in new file mode 100644 index 0000000..600fbf0 --- /dev/null +++ b/test/Makefile.in @@ -0,0 +1,597 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = test +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURL_CFLAGS = @CURL_CFLAGS@ +CURL_LIBS = @CURL_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DX_CONFIG = @DX_CONFIG@ +DX_DOCDIR = @DX_DOCDIR@ +DX_DOT = @DX_DOT@ +DX_DOXYGEN = @DX_DOXYGEN@ +DX_DVIPS = @DX_DVIPS@ +DX_EGREP = @DX_EGREP@ +DX_ENV = @DX_ENV@ +DX_FLAG_chi = @DX_FLAG_chi@ +DX_FLAG_chm = @DX_FLAG_chm@ +DX_FLAG_doc = @DX_FLAG_doc@ +DX_FLAG_dot = @DX_FLAG_dot@ +DX_FLAG_html = @DX_FLAG_html@ +DX_FLAG_man = @DX_FLAG_man@ +DX_FLAG_pdf = @DX_FLAG_pdf@ +DX_FLAG_ps = @DX_FLAG_ps@ +DX_FLAG_rtf = @DX_FLAG_rtf@ +DX_FLAG_xml = @DX_FLAG_xml@ +DX_HHC = @DX_HHC@ +DX_LATEX = @DX_LATEX@ +DX_MAKEINDEX = @DX_MAKEINDEX@ +DX_PDFLATEX = @DX_PDFLATEX@ +DX_PERL = @DX_PERL@ +DX_PROJECT = @DX_PROJECT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBVERSION = @LIBVERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = gnu +SUBDIRS = \ + ics \ + src \ + unittest + +EXTRA_DIST = +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu test/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/test/ics/.svn/all-wcprops b/test/ics/.svn/all-wcprops new file mode 100644 index 0000000..7f8fcfe --- /dev/null +++ b/test/ics/.svn/all-wcprops @@ -0,0 +1,35 @@ +K 25 +svn:wc:ra_dav:version-url +V 45 +/svnroot/libcaldav/!svn/ver/42/trunk/test/ics +END +delete.ics +K 25 +svn:wc:ra_dav:version-url +V 55 +/svnroot/libcaldav/!svn/ver/1/trunk/test/ics/delete.ics +END +Makefile.in +K 25 +svn:wc:ra_dav:version-url +V 57 +/svnroot/libcaldav/!svn/ver/42/trunk/test/ics/Makefile.in +END +modify.ics +K 25 +svn:wc:ra_dav:version-url +V 55 +/svnroot/libcaldav/!svn/ver/1/trunk/test/ics/modify.ics +END +add.ics +K 25 +svn:wc:ra_dav:version-url +V 52 +/svnroot/libcaldav/!svn/ver/1/trunk/test/ics/add.ics +END +Makefile.am +K 25 +svn:wc:ra_dav:version-url +V 56 +/svnroot/libcaldav/!svn/ver/1/trunk/test/ics/Makefile.am +END diff --git a/test/ics/.svn/entries b/test/ics/.svn/entries new file mode 100644 index 0000000..9372897 --- /dev/null +++ b/test/ics/.svn/entries @@ -0,0 +1,198 @@ +10 + +dir +42 +https://libcaldav.svn.sourceforge.net/svnroot/libcaldav/trunk/test/ics +https://libcaldav.svn.sourceforge.net/svnroot/libcaldav + + + +2010-05-29T15:45:56.236020Z +42 +miras + + + + + + + + + + + + + + +6bb92309-7149-0410-b568-bc30dfd0a1d5 + +delete.ics +file + + + + +2010-05-31T07:07:58.000000Z +5081183482b5b610c7c8c4ffe84e0f72 +2008-03-29T18:04:01.076545Z +1 +miras + + + + + + + + + + + + + + + + + + + + + +271 + +Makefile.in +file + + + + +2010-05-31T07:07:58.000000Z +f9ecb7d37044b61240ac8b781e8bf925 +2010-05-29T15:45:56.236020Z +42 +miras + + + + + + + + + + + + + + + + + + + + + +12899 + +modify.ics +file + + + + +2010-05-31T07:07:58.000000Z +c3d6c42b35a2e21843eeb0a704b6ae65 +2008-03-29T18:04:01.076545Z +1 +miras + + + + + + + + + + + + + + + + + + + + + +271 + +add.ics +file + + + + +2010-05-31T07:07:58.000000Z +5081183482b5b610c7c8c4ffe84e0f72 +2008-03-29T18:04:01.076545Z +1 +miras + + + + + + + + + + + + + + + + + + + + + +271 + +Makefile.am +file + + + + +2010-05-31T07:07:58.000000Z +0e5c15655892d36373113fec8da66120 +2008-03-29T18:04:01.076545Z +1 +miras + + + + + + + + + + + + + + + + + + + + + +192 + diff --git a/test/ics/.svn/text-base/Makefile.am.svn-base b/test/ics/.svn/text-base/Makefile.am.svn-base new file mode 100644 index 0000000..abcaa36 --- /dev/null +++ b/test/ics/.svn/text-base/Makefile.am.svn-base @@ -0,0 +1,13 @@ +AUTOMAKE_OPTIONS = gnu + +caldav_test_filedir = $(docdir)/ics +caldav_test_file_DATA = \ + add.ics \ + delete.ics \ + modify.ics + +EXTRA_DIST = \ + add.ics \ + delete.ics \ + modify.ics + diff --git a/test/ics/.svn/text-base/Makefile.in.svn-base b/test/ics/.svn/text-base/Makefile.in.svn-base new file mode 100644 index 0000000..b13e227 --- /dev/null +++ b/test/ics/.svn/text-base/Makefile.in.svn-base @@ -0,0 +1,448 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = test/ics +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(caldav_test_filedir)" +DATA = $(caldav_test_file_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURL_CFLAGS = @CURL_CFLAGS@ +CURL_LIBS = @CURL_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DX_CONFIG = @DX_CONFIG@ +DX_DOCDIR = @DX_DOCDIR@ +DX_DOT = @DX_DOT@ +DX_DOXYGEN = @DX_DOXYGEN@ +DX_DVIPS = @DX_DVIPS@ +DX_EGREP = @DX_EGREP@ +DX_ENV = @DX_ENV@ +DX_FLAG_chi = @DX_FLAG_chi@ +DX_FLAG_chm = @DX_FLAG_chm@ +DX_FLAG_doc = @DX_FLAG_doc@ +DX_FLAG_dot = @DX_FLAG_dot@ +DX_FLAG_html = @DX_FLAG_html@ +DX_FLAG_man = @DX_FLAG_man@ +DX_FLAG_pdf = @DX_FLAG_pdf@ +DX_FLAG_ps = @DX_FLAG_ps@ +DX_FLAG_rtf = @DX_FLAG_rtf@ +DX_FLAG_xml = @DX_FLAG_xml@ +DX_HHC = @DX_HHC@ +DX_LATEX = @DX_LATEX@ +DX_MAKEINDEX = @DX_MAKEINDEX@ +DX_PDFLATEX = @DX_PDFLATEX@ +DX_PERL = @DX_PERL@ +DX_PROJECT = @DX_PROJECT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBVERSION = @LIBVERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = gnu +caldav_test_filedir = $(docdir)/ics +caldav_test_file_DATA = \ + add.ics \ + delete.ics \ + modify.ics + +EXTRA_DIST = \ + add.ics \ + delete.ics \ + modify.ics + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/ics/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu test/ics/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-caldav_test_fileDATA: $(caldav_test_file_DATA) + @$(NORMAL_INSTALL) + test -z "$(caldav_test_filedir)" || $(MKDIR_P) "$(DESTDIR)$(caldav_test_filedir)" + @list='$(caldav_test_file_DATA)'; test -n "$(caldav_test_filedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(caldav_test_filedir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(caldav_test_filedir)" || exit $$?; \ + done + +uninstall-caldav_test_fileDATA: + @$(NORMAL_UNINSTALL) + @list='$(caldav_test_file_DATA)'; test -n "$(caldav_test_filedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(caldav_test_filedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(caldav_test_filedir)" && rm -f $$files +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(caldav_test_filedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-caldav_test_fileDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-caldav_test_fileDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-caldav_test_fileDATA install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am uninstall uninstall-am uninstall-caldav_test_fileDATA + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/test/ics/.svn/text-base/add.ics.svn-base b/test/ics/.svn/text-base/add.ics.svn-base new file mode 100644 index 0000000..3ea6868 --- /dev/null +++ b/test/ics/.svn/text-base/add.ics.svn-base @@ -0,0 +1,12 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Example Corp.//CalDAV Client//EN +BEGIN:VEVENT +DTSTAMP:20080404T182145Z +DTSTART:20080415T151500Z +DTEND:20080415T162500Z +SUMMARY:Frodo's birthday party. Please respond. +UID:20080404T182145Z-123401@example.com +END:VEVENT +END:VCALENDAR + diff --git a/test/ics/.svn/text-base/delete.ics.svn-base b/test/ics/.svn/text-base/delete.ics.svn-base new file mode 100644 index 0000000..3ea6868 --- /dev/null +++ b/test/ics/.svn/text-base/delete.ics.svn-base @@ -0,0 +1,12 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Example Corp.//CalDAV Client//EN +BEGIN:VEVENT +DTSTAMP:20080404T182145Z +DTSTART:20080415T151500Z +DTEND:20080415T162500Z +SUMMARY:Frodo's birthday party. Please respond. +UID:20080404T182145Z-123401@example.com +END:VEVENT +END:VCALENDAR + diff --git a/test/ics/.svn/text-base/modify.ics.svn-base b/test/ics/.svn/text-base/modify.ics.svn-base new file mode 100644 index 0000000..6f861d3 --- /dev/null +++ b/test/ics/.svn/text-base/modify.ics.svn-base @@ -0,0 +1,12 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Example Corp.//CalDAV Client//EN +BEGIN:VEVENT +DTSTAMP:20080404T182145Z +DTSTART:20080416T151500Z +DTEND:20080416T162500Z +SUMMARY:Frodo's birthday party. Please respond. +UID:20080404T182145Z-123401@example.com +END:VEVENT +END:VCALENDAR + diff --git a/test/ics/Makefile.am b/test/ics/Makefile.am new file mode 100644 index 0000000..abcaa36 --- /dev/null +++ b/test/ics/Makefile.am @@ -0,0 +1,13 @@ +AUTOMAKE_OPTIONS = gnu + +caldav_test_filedir = $(docdir)/ics +caldav_test_file_DATA = \ + add.ics \ + delete.ics \ + modify.ics + +EXTRA_DIST = \ + add.ics \ + delete.ics \ + modify.ics + diff --git a/test/ics/Makefile.in b/test/ics/Makefile.in new file mode 100644 index 0000000..b13e227 --- /dev/null +++ b/test/ics/Makefile.in @@ -0,0 +1,448 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = test/ics +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(caldav_test_filedir)" +DATA = $(caldav_test_file_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURL_CFLAGS = @CURL_CFLAGS@ +CURL_LIBS = @CURL_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DX_CONFIG = @DX_CONFIG@ +DX_DOCDIR = @DX_DOCDIR@ +DX_DOT = @DX_DOT@ +DX_DOXYGEN = @DX_DOXYGEN@ +DX_DVIPS = @DX_DVIPS@ +DX_EGREP = @DX_EGREP@ +DX_ENV = @DX_ENV@ +DX_FLAG_chi = @DX_FLAG_chi@ +DX_FLAG_chm = @DX_FLAG_chm@ +DX_FLAG_doc = @DX_FLAG_doc@ +DX_FLAG_dot = @DX_FLAG_dot@ +DX_FLAG_html = @DX_FLAG_html@ +DX_FLAG_man = @DX_FLAG_man@ +DX_FLAG_pdf = @DX_FLAG_pdf@ +DX_FLAG_ps = @DX_FLAG_ps@ +DX_FLAG_rtf = @DX_FLAG_rtf@ +DX_FLAG_xml = @DX_FLAG_xml@ +DX_HHC = @DX_HHC@ +DX_LATEX = @DX_LATEX@ +DX_MAKEINDEX = @DX_MAKEINDEX@ +DX_PDFLATEX = @DX_PDFLATEX@ +DX_PERL = @DX_PERL@ +DX_PROJECT = @DX_PROJECT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBVERSION = @LIBVERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = gnu +caldav_test_filedir = $(docdir)/ics +caldav_test_file_DATA = \ + add.ics \ + delete.ics \ + modify.ics + +EXTRA_DIST = \ + add.ics \ + delete.ics \ + modify.ics + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/ics/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu test/ics/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-caldav_test_fileDATA: $(caldav_test_file_DATA) + @$(NORMAL_INSTALL) + test -z "$(caldav_test_filedir)" || $(MKDIR_P) "$(DESTDIR)$(caldav_test_filedir)" + @list='$(caldav_test_file_DATA)'; test -n "$(caldav_test_filedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(caldav_test_filedir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(caldav_test_filedir)" || exit $$?; \ + done + +uninstall-caldav_test_fileDATA: + @$(NORMAL_UNINSTALL) + @list='$(caldav_test_file_DATA)'; test -n "$(caldav_test_filedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(caldav_test_filedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(caldav_test_filedir)" && rm -f $$files +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(caldav_test_filedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-caldav_test_fileDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-caldav_test_fileDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-caldav_test_fileDATA install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am uninstall uninstall-am uninstall-caldav_test_fileDATA + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/test/ics/add.ics b/test/ics/add.ics new file mode 100644 index 0000000..3ea6868 --- /dev/null +++ b/test/ics/add.ics @@ -0,0 +1,12 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Example Corp.//CalDAV Client//EN +BEGIN:VEVENT +DTSTAMP:20080404T182145Z +DTSTART:20080415T151500Z +DTEND:20080415T162500Z +SUMMARY:Frodo's birthday party. Please respond. +UID:20080404T182145Z-123401@example.com +END:VEVENT +END:VCALENDAR + diff --git a/test/ics/delete.ics b/test/ics/delete.ics new file mode 100644 index 0000000..3ea6868 --- /dev/null +++ b/test/ics/delete.ics @@ -0,0 +1,12 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Example Corp.//CalDAV Client//EN +BEGIN:VEVENT +DTSTAMP:20080404T182145Z +DTSTART:20080415T151500Z +DTEND:20080415T162500Z +SUMMARY:Frodo's birthday party. Please respond. +UID:20080404T182145Z-123401@example.com +END:VEVENT +END:VCALENDAR + diff --git a/test/ics/modify.ics b/test/ics/modify.ics new file mode 100644 index 0000000..6f861d3 --- /dev/null +++ b/test/ics/modify.ics @@ -0,0 +1,12 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Example Corp.//CalDAV Client//EN +BEGIN:VEVENT +DTSTAMP:20080404T182145Z +DTSTART:20080416T151500Z +DTEND:20080416T162500Z +SUMMARY:Frodo's birthday party. Please respond. +UID:20080404T182145Z-123401@example.com +END:VEVENT +END:VCALENDAR + diff --git a/test/src/.svn/all-wcprops b/test/src/.svn/all-wcprops new file mode 100644 index 0000000..35dbbb1 --- /dev/null +++ b/test/src/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 45 +/svnroot/libcaldav/!svn/ver/42/trunk/test/src +END +Makefile.in +K 25 +svn:wc:ra_dav:version-url +V 57 +/svnroot/libcaldav/!svn/ver/42/trunk/test/src/Makefile.in +END +caldav-test.c +K 25 +svn:wc:ra_dav:version-url +V 59 +/svnroot/libcaldav/!svn/ver/40/trunk/test/src/caldav-test.c +END +Makefile.am +K 25 +svn:wc:ra_dav:version-url +V 57 +/svnroot/libcaldav/!svn/ver/30/trunk/test/src/Makefile.am +END diff --git a/test/src/.svn/entries b/test/src/.svn/entries new file mode 100644 index 0000000..d1fc176 --- /dev/null +++ b/test/src/.svn/entries @@ -0,0 +1,130 @@ +10 + +dir +42 +https://libcaldav.svn.sourceforge.net/svnroot/libcaldav/trunk/test/src +https://libcaldav.svn.sourceforge.net/svnroot/libcaldav + + + +2010-05-29T15:45:56.236020Z +42 +miras + + + + + + + + + + + + + + +6bb92309-7149-0410-b568-bc30dfd0a1d5 + +Makefile.in +file + + + + +2010-05-31T07:07:58.000000Z +5623db3c1b01fb5c13cd1e15ea763355 +2010-05-29T15:45:56.236020Z +42 +miras + + + + + + + + + + + + + + + + + + + + + +17789 + +caldav-test.c +file + + + + +2010-05-31T07:07:58.000000Z +438a9b64b6a8b95695cfdf79b94f33b1 +2010-05-23T21:46:08.944313Z +40 +miras + + + + + + + + + + + + + + + + + + + + + +10238 + +Makefile.am +file + + + + +2010-05-31T07:07:58.000000Z +edfdb9dbb873f21664df8048fa441106 +2010-04-04T20:17:57.156621Z +30 +miras + + + + + + + + + + + + + + + + + + + + + +372 + diff --git a/test/src/.svn/text-base/Makefile.am.svn-base b/test/src/.svn/text-base/Makefile.am.svn-base new file mode 100644 index 0000000..9ede9ce --- /dev/null +++ b/test/src/.svn/text-base/Makefile.am.svn-base @@ -0,0 +1,24 @@ +AUTOMAKE_OPTIONS = gnu + +if BUILD_CALDAV +INCLUDES = \ + @CURL_CFLAGS@ \ + @GLIB_CFLAGS@ \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src + +bin_PROGRAMS = caldav-test + +caldav_test_SOURCES = \ + caldav-test.c + +noinst_HEADERS = + +caldav_test_LDFLAGS = \ + -L$(top_builddir)/src + +caldav_test_LDADD = \ + @CURL_LIBS@ \ + @GLIB_LIBS@ \ + -lcaldav +endif diff --git a/test/src/.svn/text-base/Makefile.in.svn-base b/test/src/.svn/text-base/Makefile.in.svn-base new file mode 100644 index 0000000..12baa48 --- /dev/null +++ b/test/src/.svn/text-base/Makefile.in.svn-base @@ -0,0 +1,568 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@BUILD_CALDAV_TRUE@bin_PROGRAMS = caldav-test$(EXEEXT) +subdir = test/src +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am__caldav_test_SOURCES_DIST = caldav-test.c +@BUILD_CALDAV_TRUE@am_caldav_test_OBJECTS = caldav-test.$(OBJEXT) +caldav_test_OBJECTS = $(am_caldav_test_OBJECTS) +caldav_test_DEPENDENCIES = +caldav_test_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(caldav_test_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(caldav_test_SOURCES) +DIST_SOURCES = $(am__caldav_test_SOURCES_DIST) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURL_CFLAGS = @CURL_CFLAGS@ +CURL_LIBS = @CURL_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DX_CONFIG = @DX_CONFIG@ +DX_DOCDIR = @DX_DOCDIR@ +DX_DOT = @DX_DOT@ +DX_DOXYGEN = @DX_DOXYGEN@ +DX_DVIPS = @DX_DVIPS@ +DX_EGREP = @DX_EGREP@ +DX_ENV = @DX_ENV@ +DX_FLAG_chi = @DX_FLAG_chi@ +DX_FLAG_chm = @DX_FLAG_chm@ +DX_FLAG_doc = @DX_FLAG_doc@ +DX_FLAG_dot = @DX_FLAG_dot@ +DX_FLAG_html = @DX_FLAG_html@ +DX_FLAG_man = @DX_FLAG_man@ +DX_FLAG_pdf = @DX_FLAG_pdf@ +DX_FLAG_ps = @DX_FLAG_ps@ +DX_FLAG_rtf = @DX_FLAG_rtf@ +DX_FLAG_xml = @DX_FLAG_xml@ +DX_HHC = @DX_HHC@ +DX_LATEX = @DX_LATEX@ +DX_MAKEINDEX = @DX_MAKEINDEX@ +DX_PDFLATEX = @DX_PDFLATEX@ +DX_PERL = @DX_PERL@ +DX_PROJECT = @DX_PROJECT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBVERSION = @LIBVERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = gnu +@BUILD_CALDAV_TRUE@INCLUDES = \ +@BUILD_CALDAV_TRUE@ @CURL_CFLAGS@ \ +@BUILD_CALDAV_TRUE@ @GLIB_CFLAGS@ \ +@BUILD_CALDAV_TRUE@ -I$(top_srcdir) \ +@BUILD_CALDAV_TRUE@ -I$(top_srcdir)/src + +@BUILD_CALDAV_TRUE@caldav_test_SOURCES = \ +@BUILD_CALDAV_TRUE@ caldav-test.c + +@BUILD_CALDAV_TRUE@noinst_HEADERS = +@BUILD_CALDAV_TRUE@caldav_test_LDFLAGS = \ +@BUILD_CALDAV_TRUE@ -L$(top_builddir)/src + +@BUILD_CALDAV_TRUE@caldav_test_LDADD = \ +@BUILD_CALDAV_TRUE@ @CURL_LIBS@ \ +@BUILD_CALDAV_TRUE@ @GLIB_LIBS@ \ +@BUILD_CALDAV_TRUE@ -lcaldav + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu test/src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +caldav-test$(EXEEXT): $(caldav_test_OBJECTS) $(caldav_test_DEPENDENCIES) + @rm -f caldav-test$(EXEEXT) + $(caldav_test_LINK) $(caldav_test_OBJECTS) $(caldav_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caldav-test.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/test/src/.svn/text-base/caldav-test.c.svn-base b/test/src/.svn/text-base/caldav-test.c.svn-base new file mode 100644 index 0000000..6e287ad --- /dev/null +++ b/test/src/.svn/text-base/caldav-test.c.svn-base @@ -0,0 +1,383 @@ +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "caldav.h" +#include +#include +#include +#include +#include +#include +#include + +gchar* make_url(gchar* uid, gchar* pwd, gchar* url) { + char* pos; + char* protocol = NULL; + char* uri = NULL; + char* newurl = NULL; + + if (!uid) + return g_strdup(url); + if ((pos = strstr(url, "//")) != NULL) { + uri = g_strdup(&(*(pos + 2))); + protocol = g_strndup(url, pos + 2 - url); + } + else { + protocol = g_strdup("http://"); + } + if (!pwd) + newurl = g_strdup_printf("%s%s@%s", protocol, uid, uri); + else + newurl = g_strdup_printf("%s%s:%s@%s", protocol, uid, pwd, uri); + g_free(uri); + g_free(protocol); + return newurl; +} + +#define BUFFER 1000 +gchar* read_stream(FILE* stream, gchar* mem) { + int len, fd; + char buf[BUFFER]; + struct stat sb; + + fd = fileno(stream); + fstat(fd, &sb); + while ((len = read(fd, &buf, sizeof(buf))) > 0) { + mem = (char *) realloc(mem, sizeof(buf) + 1); + strncat(mem, buf, sizeof(buf)); + } + mem[sb.st_size] = '\0'; + fclose(stream); + return mem; +} + +time_t make_time_t(const char* time_elem) { + struct tm datetime = {0,0,0,0,0,0,0,0,0,0,NULL}; + //struct tm* tmp; + gchar** elem; + time_t t; + + //t = time(NULL); + //tmp = localtime(&t); + elem = g_strsplit(time_elem, "/", 3); + if (g_strv_length(elem) == 3) { + datetime.tm_year = atoi(elem[0]) - 1900; + datetime.tm_mon = atoi(elem[1]) - 1; + datetime.tm_mday = atoi(elem[2]); + t = mktime(&datetime); + } + g_strfreev(elem); + return t; +} + +/* [yyyy/mm/dd[ hh/mm[/ss[/z]]] */ +time_t make_fbtime_t(const char* time_elem) { + struct tm datetime = {0,0,0,0,0,0,0,0,0,0,NULL}; + gboolean utc = FALSE; + gchar** elem; + gchar** dt; + time_t t; + guint length; + + dt = g_strsplit(time_elem, " ", 2); + length = g_strv_length(dt); + if (length > 1) { + elem = g_strsplit(dt[1], "/", 4); + length = g_strv_length(elem); + datetime.tm_hour = atoi(elem[0]); + datetime.tm_min = atoi(elem[1]); + if (length > 2) + datetime.tm_sec = atoi(elem[2]); + if (length > 3 && strcasecmp(elem[3], "z") == 0) + utc = TRUE; + g_strfreev(elem); + } + elem = g_strsplit(time_elem, "/", 3); + datetime.tm_year = atoi(elem[0]) - 1900; + datetime.tm_mon = atoi(elem[1]) - 1; + datetime.tm_mday = atoi(elem[2]); + g_strfreev(elem); + if (utc) { + t = mktime(&datetime); + struct tm* utc_time = gmtime(&t); + t = mktime(utc_time); + //g_free(utc_time); + } + else + t = mktime(&datetime); + return t; +} + +static const char* usage[] = { +"caldav-test is part of libcaldav for claws-mails " +"vcalendar plugin.\nCopyright (C) Michael Rasmussen, 2008.\n" +"This program is free software; you can redistribute it and/or modify\n" +"it under the terms of the GNU General Public License as published by\n" +"the Free Software Foundation; either version 3 of the License, or\n" +"(at your option) any later version.\n" +"\nusage:\n\tcaldav-test [Options] URL\n" +"\n\tOptions:\n\t\t-a\taction [is-caldav|add|delete|modify|get|get-all|displayname|options|freebusy]\n" +"\t\t-c\tprovide custom cacert (path to cert)\n" +"\t\t-d\tdebug (show request/response)\n" +"\t\t-e\tend [yyyy/mm/dd]. For FREEBUSY [yyyy/mm/dd[ hh/mm[/ss[/z]]]\n" +"\t\t-f\tfile. Alternative is to use IO redirection (<)\n" +"\t\t-p\tpassword\n" +"\t\t-s\tstart [yyyy/mm/dd]. For FREEBUSY [yyyy/mm/dd[ hh/mm[/ss[/z]]]\n" +"\t\t-u\tusername\n" +"\t\t-v\tdisable certificate verification\n" +"\t\t-h|-?\tusage\n" +}; + +int main(int argc, char **argv) { + int c; + CALDAV_ACTION ACTION = UNKNOWN; + gboolean debug = FALSE; + gboolean verify_ssl_certificate = TRUE; + FILE* stream = NULL; + gchar* username = NULL; + gchar* password = NULL; + gchar* url = NULL; + gchar* start = NULL; + gchar* end = NULL; + response* result; + CALDAV_RESPONSE res = UNKNOWN; + gchar* input = NULL; + char** options = NULL; + runtime_info* opt; + gchar* custom_cacert = NULL; + + opt = caldav_get_runtime_info(); + while ((c = getopt(argc, argv, "a:c:de:f:hp:s:u:v?")) != -1) { + switch (c) { + case 'h': + case '?': + fprintf(stdout, "%s", usage[0]); + return 0; + case 'a': + if (strcmp("add", optarg) == 0) { + ACTION = ADD; + } + else if (strcmp("delete", optarg) == 0) { + ACTION = DELETE; + } + else if (strcmp("modify", optarg) == 0) { + ACTION = MODIFY; + } + else if (strcmp("get", optarg) == 0) { + ACTION = GET; + } + else if (strcmp("get-all", optarg) == 0) { + ACTION = GETALL; + } + else if (strcmp("displayname", optarg) == 0) { + ACTION = GETCALNAME; + } + else if (strcmp("is-caldav", optarg) == 0) { + ACTION = ISCALDAV; + } + else if (strcmp("options", optarg) == 0) { + ACTION = OPTIONS; + } + else if (strcmp("freebusy", optarg) == 0) { + ACTION = FREEBUSY; + } + else { + fprintf(stderr, "Unknown action: %s\n", optarg); + fprintf(stderr, "%s", usage[0]); + return 1; + } + break; + case 'c': + custom_cacert = g_strdup(optarg); + break; + case 'd': + debug = TRUE; + break; + case 'e': + end = optarg; + break; + case 'f': + stream = fopen(optarg, "r"); + if (!stream) { + perror("File"); + caldav_free_runtime_info(&opt); + return 1; + } + case 'p': + password = optarg; + break; + case 's': + start = optarg; + break; + case 'u': + username = optarg; + break; + case 'v': + verify_ssl_certificate = FALSE; + break; + default: + return 1; + } + } + if (optind < argc - 1) { + fprintf(stderr, "Error: Only enter one URL\n"); + fprintf(stderr, "%s", usage[0]); + caldav_free_runtime_info(&opt); + return 1; + } + if (optind == argc) { + fprintf(stderr, "Error: Missing URL\n"); + fprintf(stderr, "%s", usage[0]); + caldav_free_runtime_info(&opt); + return 1; + } + if (ACTION == UNKNOWN) { + fprintf(stderr, "Error: Missing action\n"); + fprintf(stderr, "%s", usage[0]); + caldav_free_runtime_info(&opt); + return 1; + } + if (ACTION != GETALL && ACTION != GET && ACTION != GETCALNAME && + ACTION != ISCALDAV && ACTION != OPTIONS && ACTION != FREEBUSY) { + struct stat sb; + if (fstat(fileno(stdin), &sb) == -1) { + if (!stream) { + perror("stat"); + caldav_free_runtime_info(&opt); + return 1; + } + } + else { + if (stream && sb.st_size > 0) { + fprintf(stderr, "Error: Option -f is in use. Cannot redirect stdin\n"); + caldav_free_runtime_info(&opt); + return 1; + } + else + stream = (stream) ? stream : stdin; + } + input = read_stream(stream, input); + if (!input) { + fprintf(stderr, "Error: Could not read from file\n"); + caldav_free_runtime_info(&opt); + return 1; + } + } + if (ACTION == GET || ACTION == FREEBUSY) { + if (start == NULL || end == NULL) { + fprintf(stderr, "Error: Option '-a get' or '-a freebusy' requires option e and s\n"); + fprintf(stderr, "%s", usage[0]); + caldav_free_runtime_info(&opt); + return 1; + } + } + url = make_url(username, password, argv[optind]); + if (debug) { + opt->options->debug = 1; + opt->options->trace_ascii = 1; + } + opt->options->verify_ssl_certificate = verify_ssl_certificate; + opt->options->custom_cacert = g_strdup(custom_cacert); + g_free(custom_cacert); + result = caldav_get_response(); + switch (ACTION) { + case GETALL: res = caldav_getall_object(result, url, opt); break; + case GET: res = caldav_get_object( + result, make_time_t(start), make_time_t(end), url, opt); break; + case FREEBUSY: res = caldav_get_freebusy( + result, make_fbtime_t(start), make_fbtime_t(end), url, opt); break; + case ADD: res = caldav_add_object(input, url, opt); break; + case DELETE: res = caldav_delete_object(input, url, opt); break; + case MODIFY: res = caldav_modify_object(input, url, opt); break; + case GETCALNAME: res = caldav_get_displayname(result, url, opt); break; + case ISCALDAV: + res = caldav_enabled_resource(url, opt); + if (res) + res = OK; + else { + if (opt->error->code > 0) { + switch (opt->error->code) { + case 401: + case 403: res = FORBIDDEN; break; + case 409: res = CONFLICT; break; + case 423: res = LOCKED; break; + case 501: res = NOTIMPLEMENTED; break; + default: res = CONFLICT; break; + } + } + else + res = CONFLICT; + } + break; + case OPTIONS: + options = caldav_get_server_options(url, opt); + if (options) + res = OK; + else { + if (opt->error->code > 0) { + switch (opt->error->code) { + case 401: + case 403: res = FORBIDDEN; break; + case 409: res = CONFLICT; break; + case 423: res = LOCKED; break; + case 501: res = NOTIMPLEMENTED; break; + default: res = CONFLICT; break; + } + } + else + res = CONFLICT; + } + break; + default: break; + } + g_free(url); + g_free(input); + if (res != OK) { + fprintf(stderr, "Error\nCode: %ld\n%s\n", opt->error->code, opt->error->str); + caldav_free_runtime_info(&opt); + caldav_free_response(&result); + return 1; + } + if (result->msg && ACTION != OPTIONS) { + fprintf(stdout, "%s", result->msg); + gchar* endline = strrchr(result->msg, '\n'); + if (endline) { + if (strlen(endline) != 1) + fprintf(stdout, "\n"); + } + else + fprintf(stdout, "\n"); + } + else if (ACTION == OPTIONS) { + char** tmp = options; + while (*options) { + fprintf(stdout, "%s\n", *options++); + } + g_strfreev(tmp); + } + else if (ACTION == GET || ACTION == GETALL || ACTION == GETCALNAME || ACTION == FREEBUSY) { + fprintf(stdout, "empty collection\n"); + } + fprintf(stdout, "OK\n"); + caldav_free_response(&result); + caldav_free_runtime_info(&opt); + return 0; +} diff --git a/test/src/Makefile.am b/test/src/Makefile.am new file mode 100644 index 0000000..9ede9ce --- /dev/null +++ b/test/src/Makefile.am @@ -0,0 +1,24 @@ +AUTOMAKE_OPTIONS = gnu + +if BUILD_CALDAV +INCLUDES = \ + @CURL_CFLAGS@ \ + @GLIB_CFLAGS@ \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src + +bin_PROGRAMS = caldav-test + +caldav_test_SOURCES = \ + caldav-test.c + +noinst_HEADERS = + +caldav_test_LDFLAGS = \ + -L$(top_builddir)/src + +caldav_test_LDADD = \ + @CURL_LIBS@ \ + @GLIB_LIBS@ \ + -lcaldav +endif diff --git a/test/src/Makefile.in b/test/src/Makefile.in new file mode 100644 index 0000000..12baa48 --- /dev/null +++ b/test/src/Makefile.in @@ -0,0 +1,568 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@BUILD_CALDAV_TRUE@bin_PROGRAMS = caldav-test$(EXEEXT) +subdir = test/src +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am__caldav_test_SOURCES_DIST = caldav-test.c +@BUILD_CALDAV_TRUE@am_caldav_test_OBJECTS = caldav-test.$(OBJEXT) +caldav_test_OBJECTS = $(am_caldav_test_OBJECTS) +caldav_test_DEPENDENCIES = +caldav_test_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(caldav_test_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(caldav_test_SOURCES) +DIST_SOURCES = $(am__caldav_test_SOURCES_DIST) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURL_CFLAGS = @CURL_CFLAGS@ +CURL_LIBS = @CURL_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DX_CONFIG = @DX_CONFIG@ +DX_DOCDIR = @DX_DOCDIR@ +DX_DOT = @DX_DOT@ +DX_DOXYGEN = @DX_DOXYGEN@ +DX_DVIPS = @DX_DVIPS@ +DX_EGREP = @DX_EGREP@ +DX_ENV = @DX_ENV@ +DX_FLAG_chi = @DX_FLAG_chi@ +DX_FLAG_chm = @DX_FLAG_chm@ +DX_FLAG_doc = @DX_FLAG_doc@ +DX_FLAG_dot = @DX_FLAG_dot@ +DX_FLAG_html = @DX_FLAG_html@ +DX_FLAG_man = @DX_FLAG_man@ +DX_FLAG_pdf = @DX_FLAG_pdf@ +DX_FLAG_ps = @DX_FLAG_ps@ +DX_FLAG_rtf = @DX_FLAG_rtf@ +DX_FLAG_xml = @DX_FLAG_xml@ +DX_HHC = @DX_HHC@ +DX_LATEX = @DX_LATEX@ +DX_MAKEINDEX = @DX_MAKEINDEX@ +DX_PDFLATEX = @DX_PDFLATEX@ +DX_PERL = @DX_PERL@ +DX_PROJECT = @DX_PROJECT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBVERSION = @LIBVERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = gnu +@BUILD_CALDAV_TRUE@INCLUDES = \ +@BUILD_CALDAV_TRUE@ @CURL_CFLAGS@ \ +@BUILD_CALDAV_TRUE@ @GLIB_CFLAGS@ \ +@BUILD_CALDAV_TRUE@ -I$(top_srcdir) \ +@BUILD_CALDAV_TRUE@ -I$(top_srcdir)/src + +@BUILD_CALDAV_TRUE@caldav_test_SOURCES = \ +@BUILD_CALDAV_TRUE@ caldav-test.c + +@BUILD_CALDAV_TRUE@noinst_HEADERS = +@BUILD_CALDAV_TRUE@caldav_test_LDFLAGS = \ +@BUILD_CALDAV_TRUE@ -L$(top_builddir)/src + +@BUILD_CALDAV_TRUE@caldav_test_LDADD = \ +@BUILD_CALDAV_TRUE@ @CURL_LIBS@ \ +@BUILD_CALDAV_TRUE@ @GLIB_LIBS@ \ +@BUILD_CALDAV_TRUE@ -lcaldav + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu test/src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +caldav-test$(EXEEXT): $(caldav_test_OBJECTS) $(caldav_test_DEPENDENCIES) + @rm -f caldav-test$(EXEEXT) + $(caldav_test_LINK) $(caldav_test_OBJECTS) $(caldav_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caldav-test.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/test/src/caldav-test.c b/test/src/caldav-test.c new file mode 100644 index 0000000..6e287ad --- /dev/null +++ b/test/src/caldav-test.c @@ -0,0 +1,383 @@ +/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "caldav.h" +#include +#include +#include +#include +#include +#include +#include + +gchar* make_url(gchar* uid, gchar* pwd, gchar* url) { + char* pos; + char* protocol = NULL; + char* uri = NULL; + char* newurl = NULL; + + if (!uid) + return g_strdup(url); + if ((pos = strstr(url, "//")) != NULL) { + uri = g_strdup(&(*(pos + 2))); + protocol = g_strndup(url, pos + 2 - url); + } + else { + protocol = g_strdup("http://"); + } + if (!pwd) + newurl = g_strdup_printf("%s%s@%s", protocol, uid, uri); + else + newurl = g_strdup_printf("%s%s:%s@%s", protocol, uid, pwd, uri); + g_free(uri); + g_free(protocol); + return newurl; +} + +#define BUFFER 1000 +gchar* read_stream(FILE* stream, gchar* mem) { + int len, fd; + char buf[BUFFER]; + struct stat sb; + + fd = fileno(stream); + fstat(fd, &sb); + while ((len = read(fd, &buf, sizeof(buf))) > 0) { + mem = (char *) realloc(mem, sizeof(buf) + 1); + strncat(mem, buf, sizeof(buf)); + } + mem[sb.st_size] = '\0'; + fclose(stream); + return mem; +} + +time_t make_time_t(const char* time_elem) { + struct tm datetime = {0,0,0,0,0,0,0,0,0,0,NULL}; + //struct tm* tmp; + gchar** elem; + time_t t; + + //t = time(NULL); + //tmp = localtime(&t); + elem = g_strsplit(time_elem, "/", 3); + if (g_strv_length(elem) == 3) { + datetime.tm_year = atoi(elem[0]) - 1900; + datetime.tm_mon = atoi(elem[1]) - 1; + datetime.tm_mday = atoi(elem[2]); + t = mktime(&datetime); + } + g_strfreev(elem); + return t; +} + +/* [yyyy/mm/dd[ hh/mm[/ss[/z]]] */ +time_t make_fbtime_t(const char* time_elem) { + struct tm datetime = {0,0,0,0,0,0,0,0,0,0,NULL}; + gboolean utc = FALSE; + gchar** elem; + gchar** dt; + time_t t; + guint length; + + dt = g_strsplit(time_elem, " ", 2); + length = g_strv_length(dt); + if (length > 1) { + elem = g_strsplit(dt[1], "/", 4); + length = g_strv_length(elem); + datetime.tm_hour = atoi(elem[0]); + datetime.tm_min = atoi(elem[1]); + if (length > 2) + datetime.tm_sec = atoi(elem[2]); + if (length > 3 && strcasecmp(elem[3], "z") == 0) + utc = TRUE; + g_strfreev(elem); + } + elem = g_strsplit(time_elem, "/", 3); + datetime.tm_year = atoi(elem[0]) - 1900; + datetime.tm_mon = atoi(elem[1]) - 1; + datetime.tm_mday = atoi(elem[2]); + g_strfreev(elem); + if (utc) { + t = mktime(&datetime); + struct tm* utc_time = gmtime(&t); + t = mktime(utc_time); + //g_free(utc_time); + } + else + t = mktime(&datetime); + return t; +} + +static const char* usage[] = { +"caldav-test is part of libcaldav for claws-mails " +"vcalendar plugin.\nCopyright (C) Michael Rasmussen, 2008.\n" +"This program is free software; you can redistribute it and/or modify\n" +"it under the terms of the GNU General Public License as published by\n" +"the Free Software Foundation; either version 3 of the License, or\n" +"(at your option) any later version.\n" +"\nusage:\n\tcaldav-test [Options] URL\n" +"\n\tOptions:\n\t\t-a\taction [is-caldav|add|delete|modify|get|get-all|displayname|options|freebusy]\n" +"\t\t-c\tprovide custom cacert (path to cert)\n" +"\t\t-d\tdebug (show request/response)\n" +"\t\t-e\tend [yyyy/mm/dd]. For FREEBUSY [yyyy/mm/dd[ hh/mm[/ss[/z]]]\n" +"\t\t-f\tfile. Alternative is to use IO redirection (<)\n" +"\t\t-p\tpassword\n" +"\t\t-s\tstart [yyyy/mm/dd]. For FREEBUSY [yyyy/mm/dd[ hh/mm[/ss[/z]]]\n" +"\t\t-u\tusername\n" +"\t\t-v\tdisable certificate verification\n" +"\t\t-h|-?\tusage\n" +}; + +int main(int argc, char **argv) { + int c; + CALDAV_ACTION ACTION = UNKNOWN; + gboolean debug = FALSE; + gboolean verify_ssl_certificate = TRUE; + FILE* stream = NULL; + gchar* username = NULL; + gchar* password = NULL; + gchar* url = NULL; + gchar* start = NULL; + gchar* end = NULL; + response* result; + CALDAV_RESPONSE res = UNKNOWN; + gchar* input = NULL; + char** options = NULL; + runtime_info* opt; + gchar* custom_cacert = NULL; + + opt = caldav_get_runtime_info(); + while ((c = getopt(argc, argv, "a:c:de:f:hp:s:u:v?")) != -1) { + switch (c) { + case 'h': + case '?': + fprintf(stdout, "%s", usage[0]); + return 0; + case 'a': + if (strcmp("add", optarg) == 0) { + ACTION = ADD; + } + else if (strcmp("delete", optarg) == 0) { + ACTION = DELETE; + } + else if (strcmp("modify", optarg) == 0) { + ACTION = MODIFY; + } + else if (strcmp("get", optarg) == 0) { + ACTION = GET; + } + else if (strcmp("get-all", optarg) == 0) { + ACTION = GETALL; + } + else if (strcmp("displayname", optarg) == 0) { + ACTION = GETCALNAME; + } + else if (strcmp("is-caldav", optarg) == 0) { + ACTION = ISCALDAV; + } + else if (strcmp("options", optarg) == 0) { + ACTION = OPTIONS; + } + else if (strcmp("freebusy", optarg) == 0) { + ACTION = FREEBUSY; + } + else { + fprintf(stderr, "Unknown action: %s\n", optarg); + fprintf(stderr, "%s", usage[0]); + return 1; + } + break; + case 'c': + custom_cacert = g_strdup(optarg); + break; + case 'd': + debug = TRUE; + break; + case 'e': + end = optarg; + break; + case 'f': + stream = fopen(optarg, "r"); + if (!stream) { + perror("File"); + caldav_free_runtime_info(&opt); + return 1; + } + case 'p': + password = optarg; + break; + case 's': + start = optarg; + break; + case 'u': + username = optarg; + break; + case 'v': + verify_ssl_certificate = FALSE; + break; + default: + return 1; + } + } + if (optind < argc - 1) { + fprintf(stderr, "Error: Only enter one URL\n"); + fprintf(stderr, "%s", usage[0]); + caldav_free_runtime_info(&opt); + return 1; + } + if (optind == argc) { + fprintf(stderr, "Error: Missing URL\n"); + fprintf(stderr, "%s", usage[0]); + caldav_free_runtime_info(&opt); + return 1; + } + if (ACTION == UNKNOWN) { + fprintf(stderr, "Error: Missing action\n"); + fprintf(stderr, "%s", usage[0]); + caldav_free_runtime_info(&opt); + return 1; + } + if (ACTION != GETALL && ACTION != GET && ACTION != GETCALNAME && + ACTION != ISCALDAV && ACTION != OPTIONS && ACTION != FREEBUSY) { + struct stat sb; + if (fstat(fileno(stdin), &sb) == -1) { + if (!stream) { + perror("stat"); + caldav_free_runtime_info(&opt); + return 1; + } + } + else { + if (stream && sb.st_size > 0) { + fprintf(stderr, "Error: Option -f is in use. Cannot redirect stdin\n"); + caldav_free_runtime_info(&opt); + return 1; + } + else + stream = (stream) ? stream : stdin; + } + input = read_stream(stream, input); + if (!input) { + fprintf(stderr, "Error: Could not read from file\n"); + caldav_free_runtime_info(&opt); + return 1; + } + } + if (ACTION == GET || ACTION == FREEBUSY) { + if (start == NULL || end == NULL) { + fprintf(stderr, "Error: Option '-a get' or '-a freebusy' requires option e and s\n"); + fprintf(stderr, "%s", usage[0]); + caldav_free_runtime_info(&opt); + return 1; + } + } + url = make_url(username, password, argv[optind]); + if (debug) { + opt->options->debug = 1; + opt->options->trace_ascii = 1; + } + opt->options->verify_ssl_certificate = verify_ssl_certificate; + opt->options->custom_cacert = g_strdup(custom_cacert); + g_free(custom_cacert); + result = caldav_get_response(); + switch (ACTION) { + case GETALL: res = caldav_getall_object(result, url, opt); break; + case GET: res = caldav_get_object( + result, make_time_t(start), make_time_t(end), url, opt); break; + case FREEBUSY: res = caldav_get_freebusy( + result, make_fbtime_t(start), make_fbtime_t(end), url, opt); break; + case ADD: res = caldav_add_object(input, url, opt); break; + case DELETE: res = caldav_delete_object(input, url, opt); break; + case MODIFY: res = caldav_modify_object(input, url, opt); break; + case GETCALNAME: res = caldav_get_displayname(result, url, opt); break; + case ISCALDAV: + res = caldav_enabled_resource(url, opt); + if (res) + res = OK; + else { + if (opt->error->code > 0) { + switch (opt->error->code) { + case 401: + case 403: res = FORBIDDEN; break; + case 409: res = CONFLICT; break; + case 423: res = LOCKED; break; + case 501: res = NOTIMPLEMENTED; break; + default: res = CONFLICT; break; + } + } + else + res = CONFLICT; + } + break; + case OPTIONS: + options = caldav_get_server_options(url, opt); + if (options) + res = OK; + else { + if (opt->error->code > 0) { + switch (opt->error->code) { + case 401: + case 403: res = FORBIDDEN; break; + case 409: res = CONFLICT; break; + case 423: res = LOCKED; break; + case 501: res = NOTIMPLEMENTED; break; + default: res = CONFLICT; break; + } + } + else + res = CONFLICT; + } + break; + default: break; + } + g_free(url); + g_free(input); + if (res != OK) { + fprintf(stderr, "Error\nCode: %ld\n%s\n", opt->error->code, opt->error->str); + caldav_free_runtime_info(&opt); + caldav_free_response(&result); + return 1; + } + if (result->msg && ACTION != OPTIONS) { + fprintf(stdout, "%s", result->msg); + gchar* endline = strrchr(result->msg, '\n'); + if (endline) { + if (strlen(endline) != 1) + fprintf(stdout, "\n"); + } + else + fprintf(stdout, "\n"); + } + else if (ACTION == OPTIONS) { + char** tmp = options; + while (*options) { + fprintf(stdout, "%s\n", *options++); + } + g_strfreev(tmp); + } + else if (ACTION == GET || ACTION == GETALL || ACTION == GETCALNAME || ACTION == FREEBUSY) { + fprintf(stdout, "empty collection\n"); + } + fprintf(stdout, "OK\n"); + caldav_free_response(&result); + caldav_free_runtime_info(&opt); + return 0; +} diff --git a/test/unittest/.svn/all-wcprops b/test/unittest/.svn/all-wcprops new file mode 100644 index 0000000..3036c48 --- /dev/null +++ b/test/unittest/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 50 +/svnroot/libcaldav/!svn/ver/42/trunk/test/unittest +END +Makefile.in +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/libcaldav/!svn/ver/42/trunk/test/unittest/Makefile.in +END +libunit.c +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/libcaldav/!svn/ver/40/trunk/test/unittest/libunit.c +END +Makefile.am +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/libcaldav/!svn/ver/30/trunk/test/unittest/Makefile.am +END diff --git a/test/unittest/.svn/entries b/test/unittest/.svn/entries new file mode 100644 index 0000000..3756817 --- /dev/null +++ b/test/unittest/.svn/entries @@ -0,0 +1,130 @@ +10 + +dir +42 +https://libcaldav.svn.sourceforge.net/svnroot/libcaldav/trunk/test/unittest +https://libcaldav.svn.sourceforge.net/svnroot/libcaldav + + + +2010-05-29T15:45:56.236020Z +42 +miras + + + + + + + + + + + + + + +6bb92309-7149-0410-b568-bc30dfd0a1d5 + +Makefile.in +file + + + + +2010-05-31T07:07:58.000000Z +b1273950d94bccb8c4248fdd8c4b7a89 +2010-05-29T15:45:56.236020Z +42 +miras +has-props + + + + + + + + + + + + + + + + + + + + +17653 + +libunit.c +file + + + + +2010-05-31T07:07:58.000000Z +6d177ca8a47a1b2aa5d05b3aa65f9df5 +2010-05-23T21:46:08.944313Z +40 +miras +has-props + + + + + + + + + + + + + + + + + + + + +16563 + +Makefile.am +file + + + + +2010-05-31T07:07:58.000000Z +60502f8e62676b65dc3e97abff162887 +2010-04-04T20:17:57.156621Z +30 +miras +has-props + + + + + + + + + + + + + + + + + + + + +337 + diff --git a/test/unittest/.svn/prop-base/Makefile.am.svn-base b/test/unittest/.svn/prop-base/Makefile.am.svn-base new file mode 100644 index 0000000..74fda45 --- /dev/null +++ b/test/unittest/.svn/prop-base/Makefile.am.svn-base @@ -0,0 +1,5 @@ +K 12 +svn:keywords +V 22 +Author Date Id Rev URL +END diff --git a/test/unittest/.svn/prop-base/Makefile.in.svn-base b/test/unittest/.svn/prop-base/Makefile.in.svn-base new file mode 100644 index 0000000..74fda45 --- /dev/null +++ b/test/unittest/.svn/prop-base/Makefile.in.svn-base @@ -0,0 +1,5 @@ +K 12 +svn:keywords +V 22 +Author Date Id Rev URL +END diff --git a/test/unittest/.svn/prop-base/libunit.c.svn-base b/test/unittest/.svn/prop-base/libunit.c.svn-base new file mode 100644 index 0000000..514d003 --- /dev/null +++ b/test/unittest/.svn/prop-base/libunit.c.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 22 +Author Date Id Rev URL +END diff --git a/test/unittest/.svn/text-base/Makefile.am.svn-base b/test/unittest/.svn/text-base/Makefile.am.svn-base new file mode 100644 index 0000000..6d09609 --- /dev/null +++ b/test/unittest/.svn/text-base/Makefile.am.svn-base @@ -0,0 +1,22 @@ +AUTOMAKE_OPTIONS = gnu + +if BUILD_UNITTEST +INCLUDES = \ + @CURL_CFLAGS@ \ + @GLIB_CFLAGS@ \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src + +bin_PROGRAMS = unittest + +unittest_SOURCES = \ + libunit.c + +unittest_LDFLAGS = \ + -L$(top_builddir)/src + +unittest_LDADD = \ + @CURL_LIBS@ \ + @GLIB_LIBS@ \ + -lcaldav +endif diff --git a/test/unittest/.svn/text-base/Makefile.in.svn-base b/test/unittest/.svn/text-base/Makefile.in.svn-base new file mode 100644 index 0000000..353f818 --- /dev/null +++ b/test/unittest/.svn/text-base/Makefile.in.svn-base @@ -0,0 +1,564 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@BUILD_UNITTEST_TRUE@bin_PROGRAMS = unittest$(EXEEXT) +subdir = test/unittest +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am__unittest_SOURCES_DIST = libunit.c +@BUILD_UNITTEST_TRUE@am_unittest_OBJECTS = libunit.$(OBJEXT) +unittest_OBJECTS = $(am_unittest_OBJECTS) +unittest_DEPENDENCIES = +unittest_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(unittest_LDFLAGS) \ + $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(unittest_SOURCES) +DIST_SOURCES = $(am__unittest_SOURCES_DIST) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURL_CFLAGS = @CURL_CFLAGS@ +CURL_LIBS = @CURL_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DX_CONFIG = @DX_CONFIG@ +DX_DOCDIR = @DX_DOCDIR@ +DX_DOT = @DX_DOT@ +DX_DOXYGEN = @DX_DOXYGEN@ +DX_DVIPS = @DX_DVIPS@ +DX_EGREP = @DX_EGREP@ +DX_ENV = @DX_ENV@ +DX_FLAG_chi = @DX_FLAG_chi@ +DX_FLAG_chm = @DX_FLAG_chm@ +DX_FLAG_doc = @DX_FLAG_doc@ +DX_FLAG_dot = @DX_FLAG_dot@ +DX_FLAG_html = @DX_FLAG_html@ +DX_FLAG_man = @DX_FLAG_man@ +DX_FLAG_pdf = @DX_FLAG_pdf@ +DX_FLAG_ps = @DX_FLAG_ps@ +DX_FLAG_rtf = @DX_FLAG_rtf@ +DX_FLAG_xml = @DX_FLAG_xml@ +DX_HHC = @DX_HHC@ +DX_LATEX = @DX_LATEX@ +DX_MAKEINDEX = @DX_MAKEINDEX@ +DX_PDFLATEX = @DX_PDFLATEX@ +DX_PERL = @DX_PERL@ +DX_PROJECT = @DX_PROJECT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBVERSION = @LIBVERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = gnu +@BUILD_UNITTEST_TRUE@INCLUDES = \ +@BUILD_UNITTEST_TRUE@ @CURL_CFLAGS@ \ +@BUILD_UNITTEST_TRUE@ @GLIB_CFLAGS@ \ +@BUILD_UNITTEST_TRUE@ -I$(top_srcdir) \ +@BUILD_UNITTEST_TRUE@ -I$(top_srcdir)/src + +@BUILD_UNITTEST_TRUE@unittest_SOURCES = \ +@BUILD_UNITTEST_TRUE@ libunit.c + +@BUILD_UNITTEST_TRUE@unittest_LDFLAGS = \ +@BUILD_UNITTEST_TRUE@ -L$(top_builddir)/src + +@BUILD_UNITTEST_TRUE@unittest_LDADD = \ +@BUILD_UNITTEST_TRUE@ @CURL_LIBS@ \ +@BUILD_UNITTEST_TRUE@ @GLIB_LIBS@ \ +@BUILD_UNITTEST_TRUE@ -lcaldav + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/unittest/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu test/unittest/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +unittest$(EXEEXT): $(unittest_OBJECTS) $(unittest_DEPENDENCIES) + @rm -f unittest$(EXEEXT) + $(unittest_LINK) $(unittest_OBJECTS) $(unittest_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunit.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/test/unittest/.svn/text-base/libunit.c.svn-base b/test/unittest/.svn/text-base/libunit.c.svn-base new file mode 100644 index 0000000..b0be673 --- /dev/null +++ b/test/unittest/.svn/text-base/libunit.c.svn-base @@ -0,0 +1,615 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* +// libunit.c +// +// Copyright 2010 Michael Rasmussen +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "caldav.h" +#include +#include +#include +#include +#include +#include +#include + +static const char* usage[] = { +"unittest is part of libcaldav for claws-mails " +"vcalendar plugin.\nCopyright (C) Michael Rasmussen, 2008.\n" +"This program is free software; you can redistribute it and/or modify\n" +"it under the terms of the GNU General Public License as published by\n" +"the Free Software Foundation; either version 3 of the License, or\n" +"(at your option) any later version.\n" +"\nusage:\n\tunittest [Options]\n" +"\n\tOptions:\n" +"\t\t-h|-?\tusage\n" +"\t\t-a\tURL\n" +"\t\t-d\tEnable debug\n" +"\t\t-l\tDebug library\n" +"\t\t-p\tpassword\n" +"\t\t-u\tusername\n" +}; + +/* + * Options can be given in one of three ways: + * 1) Entered as options on the command line + * 2) Stored in environment variables: + * - LIBCALDAV_UID -> username to use when connection to server + * - LIBCALDAV_PWD -> password, if any, to use when connection to server + * - LIBCALDAV_URL -> complete URL to server. prefixed with either + * http:// or https:// + * 3) Stored in a file found in the same directory as the program: + * [server] + * password=Big secret + * username=username + * url=http[s]://bar.tld/foo + */ + +#define CONFFILE "caldav-unit-settings.conf" + +typedef struct { + gchar* uid; + gchar* pwd; + gchar* url; +} settings; + +typedef enum { + PWD, + UID, + URL +} CONFIG; + +static settings* SETTING = NULL; +gboolean DEBUG = FALSE; +gboolean DEBUG_LIB = FALSE; + +void settings_free(settings** setting) { + settings* s; + + if (! *setting) + return; + s = *setting; + g_free(s->url); + g_free(s->uid); + g_free(s->pwd); + g_free(s); + *setting = s = NULL; +} + +settings* parse_cmdline(int argc, char** argv) { + char c; + settings* setting; + + setting = g_new0(settings, 1); + while ((c = getopt(argc, argv, "ha:dlp:u:?")) != -1) { + switch (c) { + case 'h': + case '?': + fprintf(stdout, "%s", usage[0]); + return 0; + case 'a': + setting->url = g_strdup(optarg); + break; + case 'd': + DEBUG = TRUE; + break; + case 'l': + DEBUG_LIB = TRUE; + break; + case 'p': + setting->pwd = g_strdup(optarg); + break; + case 'u': + setting->uid = g_strdup(optarg); + break; + } + } + if (argv[optind]) { + fprintf(stderr, "No arguments after options expected\n"); + fprintf(stderr, "%s", usage[0]); + settings_free(&setting); + return NULL; + } + + return setting; +} + +void read_file(const gchar* file) { + GKeyFile* keyfile; + + if (! SETTING) { + SETTING = g_new0(settings, 1); + keyfile = g_key_file_new(); + if (g_key_file_load_from_file(keyfile, + file, + G_KEY_FILE_KEEP_COMMENTS, + NULL)) { + SETTING->pwd = g_key_file_get_string(keyfile, + "server", + "password", + NULL); + SETTING->uid = g_key_file_get_string(keyfile, + "server", + "username", + NULL); + SETTING->url = g_key_file_get_string(keyfile, + "server", + "url", + NULL); + } + g_key_file_free(keyfile); + } +} + +const gchar* get_setting_from_file(CONFIG config) { + gchar* cwd; + gchar* path; + gchar* pos; + gchar* setting = NULL; + int step; + + gchar* filename = g_get_prgname(); + if (filename[0] == '/') { + /* absolute path */ + cwd = g_path_get_dirname(filename); + } + else if ((pos = strchr(filename, '/')) != NULL) { + /* relative path */ + if (filename[0] == '.') { + char* tmp = pos; + while (tmp) { + if (strncmp(tmp, "..", 2) == 0) + step = 2; + else + step = 1; + tmp = strchr(pos + step, '/'); + if (tmp) + pos = tmp; + } + if (pos == NULL) { + pos = strchr(filename, '/'); + } + } + path = g_get_current_dir(); + cwd = g_build_filename(path, pos + 1, NULL); + g_free(path); + if (g_file_test(cwd, G_FILE_TEST_IS_REGULAR)) { + pos = strrchr(cwd, '/'); + if (pos) { + path = g_strndup(cwd, pos - cwd); + g_free(cwd); + cwd = g_strdup(path); + g_free(path); + } + } + } + else { + /* find cwd in PATH */ + cwd = g_find_program_in_path(filename); + } + path = g_build_filename(cwd, CONFFILE, NULL); + g_free(cwd); + if (g_file_test(path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) { + read_file(path); + switch (config) { + case UID: setting = SETTING->uid; break; + case PWD: setting = SETTING->pwd; break; + case URL: setting = SETTING->url; break; + } + } + g_free(path); + return setting; +} + +gboolean find_missing(settings** setting) { + settings* s = *setting; + const char* env; + gboolean error = FALSE; + + if (! s) + return TRUE; + + if (! s->uid) { + if ((env = getenv("LIBCALDAV_UID")) == NULL) { + env = get_setting_from_file(UID); + if (env == NULL) + error = TRUE; + } + s->uid = g_strdup(env); + } + if (! s->pwd) { + if ((env = getenv("LIBCALDAV_PWD")) == NULL) { + env = get_setting_from_file(PWD); + if (env == NULL) + error = TRUE; + } + s->pwd = g_strdup(env); + } + if (! s->url) { + if ((env = getenv("LIBCALDAV_URL")) == NULL) { + env = get_setting_from_file(URL); + if (env == NULL) + error = TRUE; + } + s->url = g_strdup(env); + } + settings_free(&SETTING); + return error; +} + +time_t make_time_t(const char* time_elem) { + struct tm datetime = {0,0,0,0,0,0,0,0,0,0,NULL}; + struct tm* tmp; + gchar** elem; + time_t t; + + t = time(NULL); + tmp = localtime(&t); + elem = g_strsplit(time_elem, "/", 3); + datetime.tm_year = atoi(elem[0]) - 1900; + datetime.tm_mon = atoi(elem[1]) - 1; + datetime.tm_mday = atoi(elem[2]); + g_strfreev(elem); + t = mktime(&datetime); + return t; +} + +gboolean compare_freebusy(const gchar* s1, const gchar* s2) { + const char* TOKEN = "FREEBUSY:"; + gchar* pos1; + gchar* pos2; + gchar* id1; + + if (! s1 && ! s2) + return TRUE; + if (! s1 || ! s2) + return FALSE; + pos1 = strstr(s2, TOKEN); + if (! pos1) + return FALSE; + pos1 += strlen(TOKEN); + pos2 = strchr(pos1, '\n'); + if (! pos2) + return FALSE; + if (*(pos2 - 1) == '\r') + pos2--; + id1 = g_strndup(pos1, pos2 - pos1); + int res = strcmp(s1, id1); + g_free(id1); + return (res == 0); +} + +gboolean compare_object(const gchar* TOKEN, const gchar* s1, const gchar* s2) { + gchar* pos1; + gchar* pos2; + gchar* id1; + gchar* id2; + + if (! s1 && ! s2) + return TRUE; + if (! s1 || ! s2) + return FALSE; + pos1 = strstr(s1, TOKEN); + if (! pos1) + return FALSE; + pos1 += strlen(TOKEN) + 1; + pos2 = strchr(pos1, '\n'); + if (! pos2) + return FALSE; + if (*(pos2 - 1) == '\r') + pos2--; + id1 = g_strndup(pos1, pos2 - pos1); + pos2 = strstr(s2, TOKEN); + if (! pos2) { + g_free(id1); + return FALSE; + } + pos2 += strlen(TOKEN) + 1; + pos1 = strchr(pos2, '\n'); + if (! pos1) { + g_free(id1); + return FALSE; + } + if (*(pos1 - 1) == '\r') + pos1--; + id2 = g_strndup(pos2, pos1 - pos2); + int res = strcmp(id1, id2); + g_free(id1); + g_free(id2); + return (res == 0); +} + +void run_tests(settings* s) { + runtime_info* info = caldav_get_runtime_info(); + response* resp = caldav_get_response(); + gchar** parts; + gchar* url; + gchar* object; + + if (DEBUG_LIB) { + info->options->debug = 1; + info->options->trace_ascii = 1; + } + parts = g_strsplit(s->url, "//", 2); + url = g_strconcat( + parts[0], "//", s->uid, ":", s->pwd, "@", parts[1], NULL); + g_strfreev(parts); + fprintf(stdout, "Test caldav_enabled_resource:\t\t\t"); + if (caldav_enabled_resource(url, info)) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "caldav enabled server\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test caldav_get_displayname:\t\t\t"); + if (caldav_get_displayname(resp, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Display Name: %s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL; + fprintf(stdout, "Test caldav_get_server_options:\t\t\t"); + if ((parts = caldav_get_server_options(url, info)) != NULL) { + fprintf(stdout, "OK\n"); + if (DEBUG) { + char** tmp = parts; + while (*tmp) { + fprintf(stdout, "--> %s\n", *tmp++); + } + } + g_strfreev(parts); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_file_get_contents("../ics/add.ics", &object, NULL, NULL); + fprintf(stdout, "Test caldav_add_object:\t\t\t\t"); + if (caldav_add_object(object, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Added successfully\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object was added:\t\t\t"); + if (caldav_get_object(resp, make_time_t("2008/04/15"), + make_time_t("2008/04/16"), url, info) == OK) { + if (compare_object("UID", object, resp->msg)) + fprintf(stdout, "OK\n"); + else + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL; + g_free(object); + fprintf(stdout, "Test FREEBUSY search the same day:\t\t"); + if (caldav_get_freebusy(resp, make_time_t("2008/04/15"), + make_time_t("2008/04/16"), url, info) == OK) { + if (compare_freebusy("20080415T151500Z/20080415T162500", resp->msg)) + fprintf(stdout, "OK\n"); + else + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL; + g_file_get_contents("../ics/modify.ics", &object, NULL, NULL); + fprintf(stdout, "Test caldav_modify_object:\t\t\t"); + if (caldav_modify_object(object, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Modified successfully\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object was modified:\t\t\t"); + if (caldav_get_object(resp, make_time_t("2008/04/16"), + make_time_t("2008/04/17"), url, info) == OK) { + if (compare_object("DTEND", object, resp->msg)) + fprintf(stdout, "OK\n"); + else + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL; + fprintf(stdout, "Test caldav_getall_object:\t\t\t"); + if (caldav_getall_object(resp, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object exists:\t\t\t\t"); + if (compare_object("UID", object, resp->msg)) + fprintf(stdout, "FAIL\n"); + else + fprintf(stdout, "OK\n"); + g_free(resp->msg); + resp->msg = NULL; + g_free(object); + g_file_get_contents("../ics/delete.ics", &object, NULL, NULL); + fprintf(stdout, "Test caldav_delete_object:\t\t\t"); + if (caldav_delete_object(object, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Deleted successfully\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object was deleted:\t\t\t"); + if (caldav_get_object(resp, make_time_t("2008/04/16"), + make_time_t("2008/04/17"), url, info) == OK) { + if (compare_object("UID", object, resp->msg)) + fprintf(stdout, "FAIL\n"); + else + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "%s\n", (resp->msg) ? resp->msg : "No object found"); + g_free(resp->msg); + resp->msg = NULL; + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(object); + fprintf(stdout, "\nTesting without using locks\n"); + info->options->use_locking = 0; + g_file_get_contents("../ics/add.ics", &object, NULL, NULL); + fprintf(stdout, "Test caldav_add_object:\t\t\t\t"); + if (caldav_add_object(object, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Added successfully\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object was added:\t\t\t"); + if (caldav_get_object(resp, make_time_t("2008/04/15"), + make_time_t("2008/04/16"), url, info) == OK) { + if (compare_object("UID", object, resp->msg)) + fprintf(stdout, "OK\n"); + else + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL; + g_free(object); +/* fprintf(stdout, "Test FREEBUSY search the same day:\t\t"); + if (caldav_get_freebusy(resp, make_time_t("2008/04/15"), + make_time_t("2008/04/16"), url, info) == OK) { + if (compare_freebusy("20080415T151500Z/20080415T162500", resp->msg)) + fprintf(stdout, "OK\n"); + else + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL;*/ + g_file_get_contents("../ics/modify.ics", &object, NULL, NULL); + fprintf(stdout, "Test caldav_modify_object:\t\t\t"); + if (caldav_modify_object(object, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Modified successfully\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object was modified:\t\t\t"); + if (caldav_get_object(resp, make_time_t("2008/04/16"), + make_time_t("2008/04/17"), url, info) == OK) { + if (compare_object("DTEND", object, resp->msg)) + fprintf(stdout, "OK\n"); + else + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL; + g_free(object); + g_file_get_contents("../ics/delete.ics", &object, NULL, NULL); + fprintf(stdout, "Test caldav_delete_object:\t\t\t"); + if (caldav_delete_object(object, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Deleted successfully\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object was deleted:\t\t\t"); + if (caldav_get_object(resp, make_time_t("2008/04/16"), + make_time_t("2008/04/17"), url, info) == OK) { + if (compare_object("UID", object, resp->msg)) + fprintf(stdout, "FAIL\n"); + else + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "%s\n", (resp->msg) ? resp->msg : "No object found"); + g_free(resp->msg); + resp->msg = NULL; + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(url); + caldav_free_response(&resp); + caldav_free_runtime_info(&info); +} + +int main(int argc, char** argv) { + settings* setting; + + g_set_prgname(argv[0]); + setting = parse_cmdline(argc, argv); + if (find_missing(&setting)) { + fprintf(stderr, "missing required information\n"); + fprintf(stdout, "%s", usage[0]); + settings_free(&setting); + return 1; + } + run_tests(setting); + settings_free(&setting); + return 0; +} diff --git a/test/unittest/Makefile.am b/test/unittest/Makefile.am new file mode 100644 index 0000000..6d09609 --- /dev/null +++ b/test/unittest/Makefile.am @@ -0,0 +1,22 @@ +AUTOMAKE_OPTIONS = gnu + +if BUILD_UNITTEST +INCLUDES = \ + @CURL_CFLAGS@ \ + @GLIB_CFLAGS@ \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src + +bin_PROGRAMS = unittest + +unittest_SOURCES = \ + libunit.c + +unittest_LDFLAGS = \ + -L$(top_builddir)/src + +unittest_LDADD = \ + @CURL_LIBS@ \ + @GLIB_LIBS@ \ + -lcaldav +endif diff --git a/test/unittest/Makefile.in b/test/unittest/Makefile.in new file mode 100644 index 0000000..353f818 --- /dev/null +++ b/test/unittest/Makefile.in @@ -0,0 +1,564 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@BUILD_UNITTEST_TRUE@bin_PROGRAMS = unittest$(EXEEXT) +subdir = test/unittest +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am__unittest_SOURCES_DIST = libunit.c +@BUILD_UNITTEST_TRUE@am_unittest_OBJECTS = libunit.$(OBJEXT) +unittest_OBJECTS = $(am_unittest_OBJECTS) +unittest_DEPENDENCIES = +unittest_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(unittest_LDFLAGS) \ + $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(unittest_SOURCES) +DIST_SOURCES = $(am__unittest_SOURCES_DIST) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURL_CFLAGS = @CURL_CFLAGS@ +CURL_LIBS = @CURL_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DX_CONFIG = @DX_CONFIG@ +DX_DOCDIR = @DX_DOCDIR@ +DX_DOT = @DX_DOT@ +DX_DOXYGEN = @DX_DOXYGEN@ +DX_DVIPS = @DX_DVIPS@ +DX_EGREP = @DX_EGREP@ +DX_ENV = @DX_ENV@ +DX_FLAG_chi = @DX_FLAG_chi@ +DX_FLAG_chm = @DX_FLAG_chm@ +DX_FLAG_doc = @DX_FLAG_doc@ +DX_FLAG_dot = @DX_FLAG_dot@ +DX_FLAG_html = @DX_FLAG_html@ +DX_FLAG_man = @DX_FLAG_man@ +DX_FLAG_pdf = @DX_FLAG_pdf@ +DX_FLAG_ps = @DX_FLAG_ps@ +DX_FLAG_rtf = @DX_FLAG_rtf@ +DX_FLAG_xml = @DX_FLAG_xml@ +DX_HHC = @DX_HHC@ +DX_LATEX = @DX_LATEX@ +DX_MAKEINDEX = @DX_MAKEINDEX@ +DX_PDFLATEX = @DX_PDFLATEX@ +DX_PERL = @DX_PERL@ +DX_PROJECT = @DX_PROJECT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBVERSION = @LIBVERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = gnu +@BUILD_UNITTEST_TRUE@INCLUDES = \ +@BUILD_UNITTEST_TRUE@ @CURL_CFLAGS@ \ +@BUILD_UNITTEST_TRUE@ @GLIB_CFLAGS@ \ +@BUILD_UNITTEST_TRUE@ -I$(top_srcdir) \ +@BUILD_UNITTEST_TRUE@ -I$(top_srcdir)/src + +@BUILD_UNITTEST_TRUE@unittest_SOURCES = \ +@BUILD_UNITTEST_TRUE@ libunit.c + +@BUILD_UNITTEST_TRUE@unittest_LDFLAGS = \ +@BUILD_UNITTEST_TRUE@ -L$(top_builddir)/src + +@BUILD_UNITTEST_TRUE@unittest_LDADD = \ +@BUILD_UNITTEST_TRUE@ @CURL_LIBS@ \ +@BUILD_UNITTEST_TRUE@ @GLIB_LIBS@ \ +@BUILD_UNITTEST_TRUE@ -lcaldav + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/unittest/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu test/unittest/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +unittest$(EXEEXT): $(unittest_OBJECTS) $(unittest_DEPENDENCIES) + @rm -f unittest$(EXEEXT) + $(unittest_LINK) $(unittest_OBJECTS) $(unittest_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunit.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/test/unittest/libunit.c b/test/unittest/libunit.c new file mode 100644 index 0000000..b0be673 --- /dev/null +++ b/test/unittest/libunit.c @@ -0,0 +1,615 @@ +/* vim: set textwidth=80 tabstop=4: */ + +/* +// libunit.c +// +// Copyright 2010 Michael Rasmussen +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "caldav.h" +#include +#include +#include +#include +#include +#include +#include + +static const char* usage[] = { +"unittest is part of libcaldav for claws-mails " +"vcalendar plugin.\nCopyright (C) Michael Rasmussen, 2008.\n" +"This program is free software; you can redistribute it and/or modify\n" +"it under the terms of the GNU General Public License as published by\n" +"the Free Software Foundation; either version 3 of the License, or\n" +"(at your option) any later version.\n" +"\nusage:\n\tunittest [Options]\n" +"\n\tOptions:\n" +"\t\t-h|-?\tusage\n" +"\t\t-a\tURL\n" +"\t\t-d\tEnable debug\n" +"\t\t-l\tDebug library\n" +"\t\t-p\tpassword\n" +"\t\t-u\tusername\n" +}; + +/* + * Options can be given in one of three ways: + * 1) Entered as options on the command line + * 2) Stored in environment variables: + * - LIBCALDAV_UID -> username to use when connection to server + * - LIBCALDAV_PWD -> password, if any, to use when connection to server + * - LIBCALDAV_URL -> complete URL to server. prefixed with either + * http:// or https:// + * 3) Stored in a file found in the same directory as the program: + * [server] + * password=Big secret + * username=username + * url=http[s]://bar.tld/foo + */ + +#define CONFFILE "caldav-unit-settings.conf" + +typedef struct { + gchar* uid; + gchar* pwd; + gchar* url; +} settings; + +typedef enum { + PWD, + UID, + URL +} CONFIG; + +static settings* SETTING = NULL; +gboolean DEBUG = FALSE; +gboolean DEBUG_LIB = FALSE; + +void settings_free(settings** setting) { + settings* s; + + if (! *setting) + return; + s = *setting; + g_free(s->url); + g_free(s->uid); + g_free(s->pwd); + g_free(s); + *setting = s = NULL; +} + +settings* parse_cmdline(int argc, char** argv) { + char c; + settings* setting; + + setting = g_new0(settings, 1); + while ((c = getopt(argc, argv, "ha:dlp:u:?")) != -1) { + switch (c) { + case 'h': + case '?': + fprintf(stdout, "%s", usage[0]); + return 0; + case 'a': + setting->url = g_strdup(optarg); + break; + case 'd': + DEBUG = TRUE; + break; + case 'l': + DEBUG_LIB = TRUE; + break; + case 'p': + setting->pwd = g_strdup(optarg); + break; + case 'u': + setting->uid = g_strdup(optarg); + break; + } + } + if (argv[optind]) { + fprintf(stderr, "No arguments after options expected\n"); + fprintf(stderr, "%s", usage[0]); + settings_free(&setting); + return NULL; + } + + return setting; +} + +void read_file(const gchar* file) { + GKeyFile* keyfile; + + if (! SETTING) { + SETTING = g_new0(settings, 1); + keyfile = g_key_file_new(); + if (g_key_file_load_from_file(keyfile, + file, + G_KEY_FILE_KEEP_COMMENTS, + NULL)) { + SETTING->pwd = g_key_file_get_string(keyfile, + "server", + "password", + NULL); + SETTING->uid = g_key_file_get_string(keyfile, + "server", + "username", + NULL); + SETTING->url = g_key_file_get_string(keyfile, + "server", + "url", + NULL); + } + g_key_file_free(keyfile); + } +} + +const gchar* get_setting_from_file(CONFIG config) { + gchar* cwd; + gchar* path; + gchar* pos; + gchar* setting = NULL; + int step; + + gchar* filename = g_get_prgname(); + if (filename[0] == '/') { + /* absolute path */ + cwd = g_path_get_dirname(filename); + } + else if ((pos = strchr(filename, '/')) != NULL) { + /* relative path */ + if (filename[0] == '.') { + char* tmp = pos; + while (tmp) { + if (strncmp(tmp, "..", 2) == 0) + step = 2; + else + step = 1; + tmp = strchr(pos + step, '/'); + if (tmp) + pos = tmp; + } + if (pos == NULL) { + pos = strchr(filename, '/'); + } + } + path = g_get_current_dir(); + cwd = g_build_filename(path, pos + 1, NULL); + g_free(path); + if (g_file_test(cwd, G_FILE_TEST_IS_REGULAR)) { + pos = strrchr(cwd, '/'); + if (pos) { + path = g_strndup(cwd, pos - cwd); + g_free(cwd); + cwd = g_strdup(path); + g_free(path); + } + } + } + else { + /* find cwd in PATH */ + cwd = g_find_program_in_path(filename); + } + path = g_build_filename(cwd, CONFFILE, NULL); + g_free(cwd); + if (g_file_test(path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) { + read_file(path); + switch (config) { + case UID: setting = SETTING->uid; break; + case PWD: setting = SETTING->pwd; break; + case URL: setting = SETTING->url; break; + } + } + g_free(path); + return setting; +} + +gboolean find_missing(settings** setting) { + settings* s = *setting; + const char* env; + gboolean error = FALSE; + + if (! s) + return TRUE; + + if (! s->uid) { + if ((env = getenv("LIBCALDAV_UID")) == NULL) { + env = get_setting_from_file(UID); + if (env == NULL) + error = TRUE; + } + s->uid = g_strdup(env); + } + if (! s->pwd) { + if ((env = getenv("LIBCALDAV_PWD")) == NULL) { + env = get_setting_from_file(PWD); + if (env == NULL) + error = TRUE; + } + s->pwd = g_strdup(env); + } + if (! s->url) { + if ((env = getenv("LIBCALDAV_URL")) == NULL) { + env = get_setting_from_file(URL); + if (env == NULL) + error = TRUE; + } + s->url = g_strdup(env); + } + settings_free(&SETTING); + return error; +} + +time_t make_time_t(const char* time_elem) { + struct tm datetime = {0,0,0,0,0,0,0,0,0,0,NULL}; + struct tm* tmp; + gchar** elem; + time_t t; + + t = time(NULL); + tmp = localtime(&t); + elem = g_strsplit(time_elem, "/", 3); + datetime.tm_year = atoi(elem[0]) - 1900; + datetime.tm_mon = atoi(elem[1]) - 1; + datetime.tm_mday = atoi(elem[2]); + g_strfreev(elem); + t = mktime(&datetime); + return t; +} + +gboolean compare_freebusy(const gchar* s1, const gchar* s2) { + const char* TOKEN = "FREEBUSY:"; + gchar* pos1; + gchar* pos2; + gchar* id1; + + if (! s1 && ! s2) + return TRUE; + if (! s1 || ! s2) + return FALSE; + pos1 = strstr(s2, TOKEN); + if (! pos1) + return FALSE; + pos1 += strlen(TOKEN); + pos2 = strchr(pos1, '\n'); + if (! pos2) + return FALSE; + if (*(pos2 - 1) == '\r') + pos2--; + id1 = g_strndup(pos1, pos2 - pos1); + int res = strcmp(s1, id1); + g_free(id1); + return (res == 0); +} + +gboolean compare_object(const gchar* TOKEN, const gchar* s1, const gchar* s2) { + gchar* pos1; + gchar* pos2; + gchar* id1; + gchar* id2; + + if (! s1 && ! s2) + return TRUE; + if (! s1 || ! s2) + return FALSE; + pos1 = strstr(s1, TOKEN); + if (! pos1) + return FALSE; + pos1 += strlen(TOKEN) + 1; + pos2 = strchr(pos1, '\n'); + if (! pos2) + return FALSE; + if (*(pos2 - 1) == '\r') + pos2--; + id1 = g_strndup(pos1, pos2 - pos1); + pos2 = strstr(s2, TOKEN); + if (! pos2) { + g_free(id1); + return FALSE; + } + pos2 += strlen(TOKEN) + 1; + pos1 = strchr(pos2, '\n'); + if (! pos1) { + g_free(id1); + return FALSE; + } + if (*(pos1 - 1) == '\r') + pos1--; + id2 = g_strndup(pos2, pos1 - pos2); + int res = strcmp(id1, id2); + g_free(id1); + g_free(id2); + return (res == 0); +} + +void run_tests(settings* s) { + runtime_info* info = caldav_get_runtime_info(); + response* resp = caldav_get_response(); + gchar** parts; + gchar* url; + gchar* object; + + if (DEBUG_LIB) { + info->options->debug = 1; + info->options->trace_ascii = 1; + } + parts = g_strsplit(s->url, "//", 2); + url = g_strconcat( + parts[0], "//", s->uid, ":", s->pwd, "@", parts[1], NULL); + g_strfreev(parts); + fprintf(stdout, "Test caldav_enabled_resource:\t\t\t"); + if (caldav_enabled_resource(url, info)) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "caldav enabled server\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test caldav_get_displayname:\t\t\t"); + if (caldav_get_displayname(resp, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Display Name: %s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL; + fprintf(stdout, "Test caldav_get_server_options:\t\t\t"); + if ((parts = caldav_get_server_options(url, info)) != NULL) { + fprintf(stdout, "OK\n"); + if (DEBUG) { + char** tmp = parts; + while (*tmp) { + fprintf(stdout, "--> %s\n", *tmp++); + } + } + g_strfreev(parts); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_file_get_contents("../ics/add.ics", &object, NULL, NULL); + fprintf(stdout, "Test caldav_add_object:\t\t\t\t"); + if (caldav_add_object(object, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Added successfully\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object was added:\t\t\t"); + if (caldav_get_object(resp, make_time_t("2008/04/15"), + make_time_t("2008/04/16"), url, info) == OK) { + if (compare_object("UID", object, resp->msg)) + fprintf(stdout, "OK\n"); + else + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL; + g_free(object); + fprintf(stdout, "Test FREEBUSY search the same day:\t\t"); + if (caldav_get_freebusy(resp, make_time_t("2008/04/15"), + make_time_t("2008/04/16"), url, info) == OK) { + if (compare_freebusy("20080415T151500Z/20080415T162500", resp->msg)) + fprintf(stdout, "OK\n"); + else + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL; + g_file_get_contents("../ics/modify.ics", &object, NULL, NULL); + fprintf(stdout, "Test caldav_modify_object:\t\t\t"); + if (caldav_modify_object(object, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Modified successfully\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object was modified:\t\t\t"); + if (caldav_get_object(resp, make_time_t("2008/04/16"), + make_time_t("2008/04/17"), url, info) == OK) { + if (compare_object("DTEND", object, resp->msg)) + fprintf(stdout, "OK\n"); + else + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL; + fprintf(stdout, "Test caldav_getall_object:\t\t\t"); + if (caldav_getall_object(resp, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object exists:\t\t\t\t"); + if (compare_object("UID", object, resp->msg)) + fprintf(stdout, "FAIL\n"); + else + fprintf(stdout, "OK\n"); + g_free(resp->msg); + resp->msg = NULL; + g_free(object); + g_file_get_contents("../ics/delete.ics", &object, NULL, NULL); + fprintf(stdout, "Test caldav_delete_object:\t\t\t"); + if (caldav_delete_object(object, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Deleted successfully\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object was deleted:\t\t\t"); + if (caldav_get_object(resp, make_time_t("2008/04/16"), + make_time_t("2008/04/17"), url, info) == OK) { + if (compare_object("UID", object, resp->msg)) + fprintf(stdout, "FAIL\n"); + else + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "%s\n", (resp->msg) ? resp->msg : "No object found"); + g_free(resp->msg); + resp->msg = NULL; + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(object); + fprintf(stdout, "\nTesting without using locks\n"); + info->options->use_locking = 0; + g_file_get_contents("../ics/add.ics", &object, NULL, NULL); + fprintf(stdout, "Test caldav_add_object:\t\t\t\t"); + if (caldav_add_object(object, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Added successfully\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object was added:\t\t\t"); + if (caldav_get_object(resp, make_time_t("2008/04/15"), + make_time_t("2008/04/16"), url, info) == OK) { + if (compare_object("UID", object, resp->msg)) + fprintf(stdout, "OK\n"); + else + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL; + g_free(object); +/* fprintf(stdout, "Test FREEBUSY search the same day:\t\t"); + if (caldav_get_freebusy(resp, make_time_t("2008/04/15"), + make_time_t("2008/04/16"), url, info) == OK) { + if (compare_freebusy("20080415T151500Z/20080415T162500", resp->msg)) + fprintf(stdout, "OK\n"); + else + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL;*/ + g_file_get_contents("../ics/modify.ics", &object, NULL, NULL); + fprintf(stdout, "Test caldav_modify_object:\t\t\t"); + if (caldav_modify_object(object, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Modified successfully\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object was modified:\t\t\t"); + if (caldav_get_object(resp, make_time_t("2008/04/16"), + make_time_t("2008/04/17"), url, info) == OK) { + if (compare_object("DTEND", object, resp->msg)) + fprintf(stdout, "OK\n"); + else + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%s\n", resp->msg); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(resp->msg); + resp->msg = NULL; + g_free(object); + g_file_get_contents("../ics/delete.ics", &object, NULL, NULL); + fprintf(stdout, "Test caldav_delete_object:\t\t\t"); + if (caldav_delete_object(object, url, info) == OK) { + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "Deleted successfully\n"); + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + fprintf(stdout, "Test if object was deleted:\t\t\t"); + if (caldav_get_object(resp, make_time_t("2008/04/16"), + make_time_t("2008/04/17"), url, info) == OK) { + if (compare_object("UID", object, resp->msg)) + fprintf(stdout, "FAIL\n"); + else + fprintf(stdout, "OK\n"); + if (DEBUG) fprintf(stdout, "%s\n", (resp->msg) ? resp->msg : "No object found"); + g_free(resp->msg); + resp->msg = NULL; + } + else { + fprintf(stdout, "FAIL\n"); + if (DEBUG) fprintf(stdout, "%ld: %s\n", info->error->code, info->error->str); + } + g_free(url); + caldav_free_response(&resp); + caldav_free_runtime_info(&info); +} + +int main(int argc, char** argv) { + settings* setting; + + g_set_prgname(argv[0]); + setting = parse_cmdline(argc, argv); + if (find_missing(&setting)) { + fprintf(stderr, "missing required information\n"); + fprintf(stdout, "%s", usage[0]); + settings_free(&setting); + return 1; + } + run_tests(setting); + settings_free(&setting); + return 0; +} diff --git a/version.sh b/version.sh new file mode 100644 index 0000000..5f6c91d --- /dev/null +++ b/version.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +if [ "x$1" = "xLIBTOOL" ]; then + grep -m 1 libcaldav ChangeLog | awk '{print $2}' | \ + cut -c2-4 | sed 's/\./:/g' +else + grep -m 1 libcaldav ChangeLog | awk '{print $2}' | cut -c2-6 +fi + +exit 0