Compare commits

...
273 Commits
Author SHA1 Message Date
Ludovic Marcotte efff32e44d Update ChangeLog 2014-11-21 09:13:11 -05:00
Francis Lachapelle f7f78eaba6 Update CKEditor to version 4.4.5 2014-11-21 09:08:36 -05:00
Francis Lachapelle 78ea147383 Update translations 2014-11-21 08:53:12 -05:00
Ludovic Marcotte f7935c6084 Bumped version numbers for the releasex 2014-11-21 08:29:25 -05:00
Ludovic Marcotte 327147f716 Fixed typo 2014-11-19 12:07:50 -05:00
Ludovic Marcotte b4718f363b More documentation fixes for v2.2.10 2014-11-19 12:06:44 -05:00
Ludovic Marcotte 95e3c7ca88 More doc fixes for v2.2.10 2014-11-18 18:36:59 -05:00
Ludovic Marcotte 6bbaf58d43 Initial pass of the doc for v2.2.10 on Debian/Ubuntu 2014-11-18 16:56:45 -05:00
Ludovic Marcotte ac55509aea Updated NEWS file regarding the SOPE commit for bug #2957 2014-11-18 12:45:15 -05:00
Francis Lachapelle 2781fbe0b3 Merge pull request #64 from JensErat/SOGo-asciidoc
Removed erroneous backslash in documentation
2014-11-18 06:17:32 -05:00
Jens Erat 19221beb1f Removed erroneous backslash in documentation 2014-11-18 11:32:12 +01:00
Francis Lachapelle 3d18c94789 Fix extraction of email addresses in some cases
Fixes #2945
2014-11-17 14:33:28 -05:00
Ludovic Marcotte 1f167d9e82 Fixed IMAP searches with non-ASCII folder names 2014-11-17 11:49:56 -05:00
Ludovic Marcotte 3872341a85 Added required patch for previous commit 2014-11-14 10:34:36 -05:00
Ludovic Marcotte b3cd609ae7 Added WindowSize support for GCS collections 2014-11-14 09:13:14 -05:00
Ludovic Marcotte c0f0f2023c added NEWS entry for BSON goodie 2014-11-12 15:09:26 -05:00
Ludovic Marcotte ea43f4a635 Comment improvement 2014-11-12 15:05:05 -05:00
Ludovic Marcotte d25fe1a58b Dramatically improved BSON deserialization speed by avoiding tz name lookups 2014-11-12 14:57:54 -05:00
Ludovic Marcotte 8e1dc0ecb0 Typo in previous commit 2014-11-12 12:56:34 -05:00
Ludovic Marcotte 715999edc8 Avoid compilation failures on non-RHEL 7 distros 2014-11-12 12:54:07 -05:00
Ludovic Marcotte c159d5461b disable rpm-check-build for now 2014-11-12 10:02:04 -05:00
Ludovic Marcotte 5284b57340 More EL7 fixes 2014-11-10 16:19:10 -05:00
Ludovic Marcotte d8e6447fcc More disable lasso 2014-11-10 16:17:06 -05:00
Ludovic Marcotte cb8b0b028e Disable lasso for RHEL7 for now 2014-11-10 16:15:05 -05:00
Francis Lachapelle df648c9204 Add 'zip' to packages dependencies
Fixes #2963
2014-11-10 13:51:38 -05:00
Ludovic Marcotte 624af1c0fb Fixed test 2014-11-10 08:58:30 -05:00
Ludovic Marcotte 395a8ddcfe Updated once more the tz and added missing zones 2014-11-07 10:36:11 -05:00
Ludovic Marcotte 8cd72a8fda Fix borken ORGANIZER fields during the PUT action 2014-11-07 10:06:53 -05:00
Ludovic Marcotte 11a4c1358d Fixed corrupted PNG files (#2975) 2014-11-06 11:23:34 -05:00
Ludovic Marcotte 54d8aa8887 Added new zone files 2014-11-06 11:10:31 -05:00
Ludovic Marcotte 49da494260 Fix for bug #2968 2014-11-06 11:09:16 -05:00
Ludovic Marcotte e08dd3f9eb Fix for bug #2978 2014-11-06 10:16:47 -05:00
Ludovic Marcotte 6de70e4043 sanitize strings before encoding them when using EAS 2014-11-06 09:35:58 -05:00
Francis Lachapelle 7052daa1c8 Fix rename of subscribed addressbooks 2014-11-05 10:05:25 -05:00
Francis Lachapelle 15be4861b6 Fix support for SieveFolderEncoding default
Fixes #2622
2014-11-05 08:44:52 -05:00
Ludovic Marcotte 4b9958336c Handle base64-encoded command parameters in EAS 2014-11-04 13:50:10 -05:00
Ludovic Marcotte 52fdcc34de Fixed typo 2014-10-31 06:46:03 -04:00
Ludovic Marcotte 08427e0bfb set userTimeZone if event has no tz 2014-10-30 18:58:52 -04:00
Ludovic Marcotte d76a4361a0 Added one more sanitization pass on decoded content 2014-10-30 09:20:21 -04:00
Ludovic Marcotte 70cd24e111 Fix for bug #2965 2014-10-29 16:42:52 -04:00
Ludovic Marcotte b5023eeb24 Fix for bug #2940 2014-10-29 14:56:03 -04:00
Ludovic Marcotte da962aed01 Added support for multiple calendars/addressbooks over ActiveSync 2014-10-29 14:20:03 -04:00
Ludovic Marcotte 395545ca51 WP fails to sync if an event is changed on the sever and the client sends a modification of another event 2014-10-29 11:13:18 -04:00
Ludovic Marcotte b53c726766 TZ fixes on WP devices all day events 2014-10-29 10:46:45 -04:00
Francis Lachapelle 6695aa083f Fix crash when opening a mailbox with empty filter
Fixes #2959
2014-10-17 15:22:38 -04:00
Ludovic Marcotte 42ef0bfc3f Added doc around IMAP word size vs. ActiveSync on large mail folders 2014-10-16 11:49:07 -04:00
Ludovic Marcotte fb95d84a3a Handle base64 encoded query strings, popular on Windows devices 2014-10-16 09:35:15 -04:00
Ludovic Marcotte 231987242b Handle empty Attendees tag 2014-10-16 09:10:54 -04:00
Ludovic Marcotte b4f7ec3708 Don't send empty <Responses> tag 2014-10-16 09:08:50 -04:00
Ludovic Marcotte b2cab02d70 Handle empty categories 2014-10-16 09:03:34 -04:00
Ludovic Marcotte d6ff9038ce Disable timezone in AS for now 2014-10-16 09:02:18 -04:00
Ludovic Marcotte c43ad37850 Disable OpenChange for now on RHEL 7 2014-10-15 15:21:20 -04:00
Ludovic Marcotte 096a0ef8e4 Disabled openchange builds on all i386 arch 2014-10-15 11:35:59 -04:00
Francis Lachapelle e2136e0413 Don't leak database passwords in the logs
Fixes #2953
2014-10-14 12:54:04 -04:00
Ludovic Marcotte 3264458f4b Added back -L directives to properly compile teststrings 2014-10-14 11:27:08 -04:00
Alexandre Cloutier 0327a42c9c Update NEWS file 2014-10-14 10:45:30 -04:00
Ludovic Marcotte 5f811e1a4e Added rpath for integration tests 2014-10-14 10:43:52 -04:00
Alexandre Cloutier 923aa5d9b6 bugfix #2952, default sorting for new user 2014-10-14 10:31:11 -04:00
Ludovic Marcotte 3416bfea94 Adjusted rpath and removed unusued -L directives 2014-10-14 10:00:05 -04:00
Ludovic Marcotte f663950808 Adjusted the rpath, removed unnecessary variables/values 2014-10-14 09:51:04 -04:00
Ludovic Marcotte ccabd93ff2 moved system lib dirs to additional lib dirs 2014-10-14 09:21:12 -04:00
Ludovic Marcotte c5a7bcf2aa Fixed the system lib dir to point to the sogo lib dir 2014-10-14 09:17:00 -04:00
Ludovic Marcotte 81ff6bebfe Removed dependancies when openchange is disabled 2014-10-14 09:02:15 -04:00
Ludovic Marcotte 1a8aa5a587 Fixed spec file to not build sogo-openchange if disabled 2014-10-14 09:00:14 -04:00
Ludovic Marcotte 4b76e2b933 Added lib64 in the search path 2014-10-14 08:43:28 -04:00
Francis Lachapelle 27ac9e3904 Cleanup of unused parameters 2014-10-09 15:51:30 -04:00
Francis Lachapelle f8a371e351 Fix folder's name when subscribing to a folder 2014-10-09 15:12:24 -04:00
Francis Lachapelle 460ed2e7bc Fix JavaScript warning on undefined variable 2014-10-09 15:11:06 -04:00
Francis Lachapelle 6cc8f17c86 Fix display name of subscribed folders 2014-10-09 15:10:20 -04:00
Ludovic Marcotte ff9d49be71 Dropped rpath since it seems to be ignored on el5 2014-10-08 10:25:46 -04:00
Ludovic Marcotte f1919d10ed Flag for conditional openchange build 2014-10-08 09:35:50 -04:00
Ludovic Marcotte 3e2de9701c Fixes 2014-10-08 09:29:08 -04:00
Ludovic Marcotte 435ebb9eb4 Fixes 2014-10-08 09:25:40 -04:00
Ludovic Marcotte ab9ba66b36 More fixes 2014-10-08 09:22:14 -04:00
Ludovic Marcotte 29295f93c5 Fixed again the spec file 2014-10-08 09:17:26 -04:00
Ludovic Marcotte 20e0cd6234 Fixed RHEL packaging with lib move to "sogo" app directory 2014-10-08 09:10:02 -04:00
extrafu 2208d5d4a7 Merge pull request #58 from JensErat/SOGo-asciidoc
Minor documentation issues and missing IMAP pooling option description
2014-10-08 07:37:44 -04:00
Jens Erat 25f68c7eb5 Added missing NGImap4DisableIMAP4Pooling option to documentation 2014-10-08 10:07:48 +02:00
Jens Erat 22844a5742 Minor fixes in documentation 2014-10-08 10:01:17 +02:00
Ludovic Marcotte e3837188fd Updated spec file for SOGo's private libraries move 2014-10-06 14:45:30 -04:00
Francis Lachapelle a0317046ba Card view: don't escape <br>'s in note field 2014-10-06 08:42:59 -04:00
extrafu f353b6d1c0 Merge pull request #57 from dekkers/make-png-non-executable
Make png files non-executable
2014-10-05 09:58:29 -04:00
Jeroen Dekkers 4cc6b72cfb Make png files non-executable 2014-10-05 15:47:00 +02:00
Francis Lachapelle d7f8427623 Improve XSL for documentation 2014-10-03 13:13:42 -04:00
Ludovic Marcotte 7f49dcb2fa Avoid using SOGO_SYSLIBDIR when testing since it's undefined 2014-10-02 13:10:54 -04:00
Ludovic Marcotte f29a47d443 Added rpath 2014-10-02 12:42:06 -04:00
Ludovic Marcotte f88cfae611 Improved and simplified rpath 2014-10-02 12:36:22 -04:00
Ludovic Marcotte fb3ddca9e8 Improved makefiles 2014-10-02 11:17:45 -04:00
Ludovic Marcotte ba4a50e778 Added rpath kungfu 2014-10-02 11:05:19 -04:00
Ludovic Marcotte 8875c42d25 Fixed makefile 2014-10-02 11:00:43 -04:00
Ludovic Marcotte 18431922ab Fixed makefile 2014-10-02 10:55:05 -04:00
Ludovic Marcotte f93c06e6a9 Fixed include 2014-10-02 10:50:34 -04:00
Ludovic Marcotte 68d79472a5 Fixed makefile for teststrings due to sogo lib change 2014-10-02 10:46:47 -04:00
Ludovic Marcotte 51ed371796 Adjusted debian install files regarding sogo lib move 2014-10-02 10:21:36 -04:00
extrafu 641b6a3174 Merge pull request #3 from dekkers/put-private-library-in-usr-lib-sogo
Put private SOGo libraries in /usr/lib/sogo
2014-10-01 14:39:18 -04:00
Jeroen Dekkers 6ded9e95b3 Put private libraries in /usr/lib/sogo 2014-10-01 20:36:42 +02:00
Ludovic Marcotte 25b7fffb00 Fix for bug #2930 2014-10-01 14:08:29 -04:00
Francis Lachapelle 89284d558c Add missing translation 2014-10-01 09:02:03 -04:00
Ludovic Marcotte 9610fcc5ca Bumped version 2014-09-29 15:30:02 -04:00
Ludovic Marcotte 9cdcfd1d4a Updated for the 2.2.9a release 2014-09-29 15:29:49 -04:00
Ludovic Marcotte 95b122c912 Simplified even more -safeString 2014-09-29 15:04:40 -04:00
Ludovic Marcotte aa0499dbac Fixed sanitization char skipping and #2936 2014-09-29 14:28:13 -04:00
extrafu a263939d8a Merge pull request #49 from Zentyal/Contrib
Several patches for the OpenChange integration
2014-09-29 09:07:36 -04:00
Francis Lachapelle 80acafadd3 Fix URL in documentation 2014-09-26 14:49:36 -04:00
Ludovic Marcotte 4c5be2fd97 Update ChangeLog 2014-09-26 14:31:57 -04:00
Ludovic Marcotte a5af5da259 Merge branch 'master' of https://github.com/inverse-inc/sogo 2014-09-26 14:30:30 -04:00
Ludovic Marcotte c0e8eb6ce3 Adjusted the doc for TB31 2014-09-26 14:29:20 -04:00
Francis Lachapelle 4be2ddb793 Update translations 2014-09-26 14:23:58 -04:00
Ludovic Marcotte 5744d18474 Updated scripts for TB31 2014-09-26 14:15:32 -04:00
Francis Lachapelle 9e1423cd4a New font for asciidoc documentation
We now use Lato.
2014-09-26 14:14:54 -04:00
Ludovic Marcotte 275eebde0f Updated NEWS file for the release 2014-09-26 10:53:01 -04:00
Ludovic Marcotte 0b6e3dc22d Fix for bug #589 2014-09-25 09:25:13 -04:00
Ludovic Marcotte 3675220756 Refactored code to be more rigorous Unicode-wise. 2014-09-24 14:14:25 -04:00
Ludovic Marcotte 1c60ab2337 Fix for bug #2889 2014-09-24 12:02:12 -04:00
Ludovic Marcotte f4372af16d Add over DAV a PARTSTAT if none is defined 2014-09-23 13:46:44 -04:00
Ludovic Marcotte 6ba85ee43a Added some comments in the code 2014-09-22 11:38:07 -04:00
Ludovic Marcotte ae6afedc92 Fixed potential exception when Calendar module is disabled 2014-09-22 08:38:01 -04:00
Ludovic Marcotte d572f2af02 get rid of control chars before returning the response 2014-09-19 14:34:20 -04:00
Ludovic Marcotte a338b193ba Fix for bug #2838 2014-09-17 19:45:44 -04:00
Ludovic Marcotte 11adf388cf Cleaned the code and fixed #2894 while at it ... 2014-09-17 11:51:46 -04:00
Ludovic Marcotte a4ab2942e8 Fix for bugs #2878, #2879 2014-09-17 11:35:09 -04:00
Francis Lachapelle 7e281dca99 Fix encoding of calendar names in Web interface 2014-09-17 09:45:44 -04:00
Ludovic Marcotte ce1896b627 Fixed typo 2014-09-17 09:36:35 -04:00
Ludovic Marcotte f52a083326 fixed sending mails to multiple recipients over AS 2014-09-17 09:34:36 -04:00
Ludovic Marcotte 8ba031d6ec Consider 0x0C as "unsafe" 2014-09-15 19:54:07 -04:00
Ludovic Marcotte c5c2bfb7a6 Fixed iCal detection for 10.9 (and perhaps even 10.8) 2014-09-15 14:10:05 -04:00
Alexandre Cloutier 6ec79f7792 bugfix with threads collapsing for a nested folder 2014-09-15 10:38:02 -04:00
Francis Lachapelle 4b9db66f8b Fix warning when generating docbook 2014-09-15 10:33:44 -04:00
Ludovic Marcotte 02b3de6465 Fix for bug #2326 2014-09-15 09:32:36 -04:00
extrafu e0fee3b0e0 Merge pull request #56 from JensErat/SOGo-asciidoc
Converted documentation to ASCIIdoc
2014-09-15 09:08:25 -04:00
Jens Erat 4b49fc33b2 Updated for 2.2.8 2014-09-15 02:48:44 +02:00
Jens Erat 19b313e6c4 Updated some copyright lines from PacketFence to SOGo 2014-09-15 02:48:44 +02:00
Jens Erat 397d8d7574 Remove old documentation files 2014-09-15 02:48:44 +02:00
Jens Erat 8a564975c8 Added makefile for asciidoc-conversion, included docbook-templates 2014-09-15 02:47:36 +02:00
Jens Erat 95191cb29b Added other documentation files as asciidoc 2014-09-15 02:47:36 +02:00
Jens Erat 8d4c0ff694 Converted Installation Guide to asciidoc 2014-09-15 02:47:36 +02:00
Ludovic Marcotte 8b4a16df4e NEWS entry for previous commit 2014-09-12 14:10:22 -04:00
Ludovic Marcotte b8b3519a40 Initial support for multiple alarms and better iCal compatibility 2014-09-12 14:09:28 -04:00
Ludovic Marcotte 12a4fd05a2 Support for repetitive alarms and tasks 2014-09-12 08:34:15 -04:00
extrafu 8cdaac6300 Merge pull request #35 from dekkers/link-libraries-correctly
Link correctly against libraries used
2014-09-11 21:02:08 -04:00
extrafu 0e21904c03 Merge pull request #10 from dekkers/link-libsogo-with-libdl
Link libSOGo with libdl on systems with glibc
2014-09-11 21:01:30 -04:00
extrafu 496fa73d36 Merge pull request #26 from Skrupellos/master
ModulesConstraints tests all values of a multi-valued attributes
2014-09-11 16:09:06 -04:00
Francis Lachapelle 0825a810e3 Add missing localization string 2014-09-11 11:58:39 -04:00
Francis Lachapelle ed85a09ff0 Allow alarms to be snoozed for 1 day 2014-09-11 11:55:20 -04:00
Ludovic Marcotte 38cb86bdb1 Update ChangeLog 2014-09-10 14:15:34 -04:00
Alexandre Cloutier 69c8aa0743 quickfix for IE for searchInbox 2014-09-10 13:22:36 -04:00
Alexandre Cloutier 60e3c1c822 Merge branch 'master' of https://github.com/inverse-inc/sogo 2014-09-10 13:02:45 -04:00
Alexandre Cloutier 36b833ccb5 bugFix InboxSearch IMAP query keywords 2014-09-10 13:02:13 -04:00
Francis Lachapelle 9d6bcb00bc Fix compilation warning 2014-09-10 11:58:47 -04:00
Francis Lachapelle 1dd3dbacb5 Various fixes and improvements to the Mail module 2014-09-10 11:37:52 -04:00
Francis Lachapelle c441fa5b80 Various fix and improvements to Scheduler module 2014-09-10 10:58:58 -04:00
Francis Lachapelle 7e297ad56c Remove spaces 2014-09-10 10:58:46 -04:00
Francis Lachapelle 8eb4212f5d Various fix and improvements to Mail module 2014-09-10 10:49:54 -04:00
Luc Charland 3ad9327d17 putting test-prevent-invitations back in 2014-09-10 10:25:42 -04:00
Ludovic Marcotte 0483794f45 Updated the documentation for the release 2014-09-10 09:20:47 -04:00
Alexandre Cloutier 3c1d6d7d89 bugfix; UserSettings was not refresh properly after toggling threads 2014-09-09 16:05:12 -04:00
Francis Lachapelle 1dcf631ad6 Update translations 2014-09-09 15:50:39 -04:00
Ludovic Marcotte cbc53b3a52 Updated NEWS file 2014-09-09 15:38:15 -04:00
Alexandre Cloutier 574c245758 bugfix PreventInvitation; fix object parsing on a blank user 2014-09-09 15:36:14 -04:00
Alexandre Cloutier f3ca4ea7fc bugfix foldingThread; Renaming a foldername with a space was not correctly handled 2014-09-09 15:36:14 -04:00
Ludovic Marcotte e542ff5646 Fix for bug #1240 2014-09-09 15:15:56 -04:00
Francis Lachapelle bbe1e09ab9 Merge pull request #52 from alexcloutier/feature/RefreshViewCheck
All modules can now be automatically refreshed
2014-09-09 15:12:21 -04:00
Alexandre Cloutier 9daab5a9a1 update NEWS file 2014-09-09 14:28:05 -04:00
Alexandre Cloutier 1fb3198dbc applied comments 2014-09-09 14:27:05 -04:00
Alexandre Cloutier d62c504763 Changed the configurable variable SOGoMailMessageCheck to a general refresh associated to the current view 2014-09-09 14:27:05 -04:00
extrafu 126a05d391 Merge pull request #54 from alexcloutier/feature/FoldingThreads
Feature/folding threads
2014-09-09 14:06:30 -04:00
extrafu 42ffe14052 Merge pull request #55 from alexcloutier/bugfix/LabelsTagging
Bugfix/labels tagging
2014-09-09 14:06:19 -04:00
Alexandre Cloutier 7db526a5d9 bugfix for new user without userSettings.mail 2014-09-09 13:51:02 -04:00
Alexandre Cloutier 06f81a032c applied comments 2014-09-09 13:51:02 -04:00
Alexandre Cloutier df42c31618 Update NEWS file 2014-09-09 13:51:02 -04:00
Alexandre Cloutier e6002c9b2a applied comments 2014-09-09 13:51:02 -04:00
Alexandre Cloutier 0c88edc61b bugfix where an exception was raised if threadsCollapsed is undefined 2014-09-09 13:51:02 -04:00
Alexandre Cloutier 267a689683 Applied comments 2014-09-09 13:51:02 -04:00
Alexandre Cloutier c9d1294a8a Manage the collapse UIDs save in the user settings 2014-09-09 13:51:02 -04:00
Alexandre Cloutier 59023da7f0 applied comments and fix bug where the folded threads were saved only after refreshing the entire page 2014-09-09 13:51:02 -04:00
Alexandre Cloutier c5f9dd086b Possibility to collapsed threads with persistance 2014-09-09 13:51:02 -04:00
Alexandre Cloutier 0bfaceb398 applied comments 2014-09-09 12:51:59 -04:00
Alexandre Cloutier 9a380f711c bugfix PreventInvitation 2014-09-09 11:30:00 -04:00
Ludovic Marcotte 8c8e7d24a7 Modified Apache's config file to handle Apache > 2.3 2014-09-08 15:25:21 -04:00
Alexandre Cloutier 77c50e5232 applied comments; fix errors from merge and update NEWS file 2014-09-08 14:11:42 -04:00
Francis Lachapelle 56ef00661c Merge pull request #50 from alexcloutier/feature/SearchInbox
New feature to search multiple mailboxes
2014-09-05 16:09:59 -04:00
Francis Lachapelle b639c2d251 Fixes for IE 2014-09-05 16:04:29 -04:00
Alexandre Cloutier 984e208dd9 IE bugfixes 2014-09-05 11:01:57 -04:00
Luc Charland 606ee9780e dont test prevent invitations 2014-09-04 22:36:02 -04:00
Luc Charland c6f82dac01 catch specific exception 2014-09-04 22:24:32 -04:00
Luc Charland e37a603632 should help some builds that might timeout 2014-09-04 21:59:36 -04:00
Alexandre Cloutier ca8351d1f9 fix IE7, IE8, IE9, IE10, IE11 GUI 2014-09-04 10:50:03 -04:00
Luc Charland 031e4c9409 more of the same 2014-09-03 22:43:49 -04:00
Luc Charland c621bbcd56 Those need the same adjustments 2014-09-03 22:32:46 -04:00
Luc Charland 4b94a183be urllib.quote needs a string 2014-09-03 13:50:13 -04:00
Alexandre Cloutier 32476b16cc applied comments and fix bug when tagging msgs already tagged 2014-09-02 14:31:46 -04:00
Alexandre Cloutier 3b65eaea0b Tagging labels with 1 AJAX request 2014-09-02 13:42:04 -04:00
Alexandre Cloutier 7e26d80c77 merge conflicts 2014-09-02 10:11:27 -04:00
Francis Lachapelle 1af52e6d6b Fix message labels handling
Selecting "none" from the label submenu on a multiple selection of
messages is now working. When changing the label of multiple messages,
the display is now properly updated.

Fixes #2902
2014-08-29 15:39:06 -04:00
Alexandre Cloutier eaf815eae6 update NEWS file 2014-08-29 14:55:21 -04:00
Alexandre Cloutier 9bd09cc55d add the location column 2014-08-28 13:20:43 -04:00
Luc Charland ced0962894 Added white_listed_attendee to the config file 2014-08-28 10:43:32 -04:00
Francis Lachapelle dadad3df2a Fix some compilation warnings 2014-08-28 09:38:09 -04:00
Alexandre Cloutier da184f8459 bugfix#2864 2014-08-27 16:50:45 -04:00
Alexandre Cloutier 03152ea3d4 bugfix with DND from calendar view to calendar list 2014-08-27 16:01:35 -04:00
Alexandre Cloutier 8fbd2384a4 Merge branch 'master' of https://github.com/inverse-inc/sogo 2014-08-27 13:55:02 -04:00
Alexandre Cloutier 84a08659ec bugfix where it is not possible to delete msg when mailbox is full 2014-08-27 13:50:56 -04:00
Luc Charland d749d5c2fb Added tests for prevent invitation and whitelist 2014-08-27 13:31:49 -04:00
Alexandre Cloutier 07a138e0d6 applied comments and add the possibility to resize the search inbox window 2014-08-27 12:30:33 -04:00
Alexandre Cloutier 76c9b45fd0 update Localizable.strings
Update the print window options strings
2014-08-26 14:25:27 -04:00
Alexandre Cloutier 1ab3a588f3 Merge branch 'master' of https://github.com/inverse-inc/sogo 2014-08-26 13:41:58 -04:00
Alexandre Cloutier 38a3b7bb4f print calendars events&Tasks with colors - either borders or backgrounds 2014-08-26 13:36:42 -04:00
Francis Lachapelle b2b77c65d3 Fix folders paths of "sogo-tool restore -l" 2014-08-26 09:00:13 -04:00
Alexandre Cloutier 6aecccf6ca indentations 2014-08-25 13:46:35 -04:00
Francis Lachapelle e4a84d4920 Fix usage of SOGoSubscriptionFolderFormat default 2014-08-25 12:15:05 -04:00
Francis Lachapelle 28f26ec08e Fix display of users with no possible subscription 2014-08-25 10:16:10 -04:00
Francis Lachapelle 74bd96e5a6 Fix encoding of new calendars + new subscriptions 2014-08-25 10:12:09 -04:00
Alexandre Cloutier e044476772 bugFix #2827 2014-08-15 13:41:30 -04:00
Alexandre Cloutier c76cb36461 Disable the search button on toolbar once it is opened 2014-08-15 13:06:46 -04:00
Alexandre Cloutier 73fcdc2306 adjust css for other browser, fix display bug 2014-08-15 11:41:37 -04:00
Ludovic Marcotte b9dd1ddc5a Fix for bug #2892 2014-08-15 09:57:19 -04:00
Alexandre Cloutier 8783f09a4a fix leak 2014-08-14 15:01:40 -04:00
Alexandre Cloutier 52476251b8 applied comments, fix bug and add sortable results 2014-08-14 14:49:44 -04:00
Alexandre Cloutier f6c7ca3379 applied comments 2014-08-13 17:41:58 -04:00
Alexandre Cloutier c3e46e4baf code refactoring and GUI improvement 2014-08-11 09:25:09 -04:00
Alexandre Cloutier 7794d716b9 version 1 of the inbox search 2014-08-06 14:49:36 -04:00
Francis Lachapelle 5b886e5c4d Fix issue with DnD of tasks with FireFox 2014-08-01 12:26:53 -04:00
Jesús García Sáez 1a2fe8908b Revert "Merge pull request #2 from Zentyal/jgarcia/fix-encoding-of-mapistoreuris" 2014-08-01 15:50:17 +02:00
Ludovic Marcotte cde1db9324 Refactored GCSFolder: -writeContent and fixed sogo-tool restore 2014-08-01 09:40:45 -04:00
Ludovic Marcotte f43341c100 Fixed JSON'ification of the admin module 2014-07-31 16:19:49 -04:00
Ludovic Marcotte b05fcc7d82 Fat commit to refactor the quick record generation 2014-07-30 14:51:00 -04:00
Carlos Pérez-Aradros Herce f76a6cfc96 Fix mysql cleanup log message 2014-07-29 18:27:20 +02:00
Kamen Mazdrashki 2b3bc10f78 Scripts/openchange_user_cleanup: Don't hardcode samba private dir, use samba LoadParm()
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-29 18:26:30 +02:00
Jesús García Sáez 3eba5f940e increase log level of debug message 2014-07-29 18:25:46 +02:00
Jesús García Sáez 7f2ee7be89 Error message only when initialization hadn't been done
In a multithread environment, sogo_backend_init is registering the thread
only for the first one that calls this function, then the others threads
(even if they call sogo_backend_init) won't be registered because
moduleInitialized was YES.

We just want to ensure sogo_backend_init is called at least once (per process,
not per thread).
2014-07-29 18:25:28 +02:00
Miguel Julián 41f2e917e7 Removed development tip comment 2014-07-29 18:22:34 +02:00
Miguel Julián 65ece61273 Removing some trail characters at event description
* They are sometimes present after a \r\n\n
2014-07-29 18:22:32 +02:00
Kamen Mazdrashki 1846e1ee5d oc/TallocWrapper: don't handle Threading initialization here
It is SOGo backend module responsibility to setup/teardonw all
ObjC specific initialization

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 15:20:51 +02:00
Kamen Mazdrashki 1fc3a57210 oc: Protect backend initialization to happen only once 2014-07-02 15:20:31 +02:00
Kamen Mazdrashki 5b75c817e2 oc: Log when mapistore backend is successfully initialized 2014-07-02 15:20:19 +02:00
Kamen Mazdrashki c91741ad1f oc/dbmsgreader: Fix to work again this time basen on BSON format for msg data
Also, implement reading for message data in case only 1 param is passed.
This could be usefull when have msg data by other means than by
reading it directly from DB

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 15:19:59 +02:00
Kamen Mazdrashki 86e54989fb oc/utils: Make "plext" category publicly visible
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 15:19:47 +02:00
Kamen Mazdrashki 116e738e63 oc/utils: Move OCDumpPListData() function into plreader - this is the only user for this function
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 15:19:31 +02:00
Kamen Mazdrashki bf0f2a76d5 oc/MAPIStoreSOGo: Do not destroy current thread context after any API call
We have thread context already in place during *_init() function.
Thus guarding every API call with TreadInit/Destroy is:
- a bit redundand
- makes SOGo backend not reentrant even on single thread and leads
  to hard to find use-after-free crashes

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 15:19:19 +02:00
Kamen Mazdrashki 6de298d202 oc/MAPIStoreMapping: Split the check for existing entry so we have better error message
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 15:18:49 +02:00
Kamen Mazdrashki 98505c1b6b oc/MAPIStoreContext: Fix log messages to actually print 64bit FMIDs
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>

Conflicts:
	OpenChange/MAPIStoreContext.m
2014-07-02 15:18:33 +02:00
Miguel Julián 51df0adb79 Removed development tip comment 2014-07-02 15:00:24 +02:00
Miguel Julián 5d43513dd9 Removing some trail characters at event description
* They are sometimes present after a \r\n\n
2014-07-02 14:59:16 +02:00
Miguel Julián 2458af1a43 All day events deladyed one day if user timezone is +XX:XX
* Those events were not shown properly in SOGo web UI
2014-07-02 14:59:06 +02:00
Kamen Mazdrashki 2792baac02 openchange: don't overflow possible recipient type while creating message headers
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:58:57 +02:00
Kamen Mazdrashki 4b383705ff openchange: Fix submitWithFlags to submit to BCC-ed recipients also
this reintroduces commit 7efb263c659451d2c781547a5b38cb5d01ed837f

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:58:47 +02:00
Kamen Mazdrashki dd7200e00f openchange/MAPIStoreFolder: Add private selector for actual folder delete action
Usually, it is a bad idea for an object to call its own public methods
(just like in this case). Thus separating impelementation for deleteFolder:
would allow MAPIStoreFolder to call only private implementation when needed

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:58:33 +02:00
Kamen Mazdrashki 27851ef428 openchange: FillMessageHeadersFromProperties fix skipping of last value in
possible range of recepients

IMHO, this fixes a bug, that when saving a meessage, it  is saved
without BCC fields.

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:58:16 +02:00
Kamen Mazdrashki 7da8885190 openchange: getMessageData - replace int literals with ulRecipClass values
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:58:06 +02:00
Kamen Mazdrashki fc9dc08045 oc-sogo: pretty print Exceptions in sogo_backend_handle_objc_exception()
Now we have a nice stack trace printed out from [NSException callStackSymbols]

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:53:34 +02:00
Kamen Mazdrashki bcfb674cd1 oc-sogo: Print both [NSException callStackSymbols] and execinfo.h stack trace
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:53:24 +02:00
Kamen Mazdrashki 6be768af42 oc-sogo: Move memory clean up *after* handling the exception
Otherwise the mess is full :)

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:53:10 +02:00
Kamen Mazdrashki 2c94d21f3e oc-sogo: Use [e name] and [e reason] selectors
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:52:59 +02:00
Kamen Mazdrashki cbe616358d oc-sogo: Clean up AutoRelease pool and unregister threads in Catch handler
Most of the time we have "not yet implemented" kind of exceptions,
so it is better to clean up allocated resources

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:52:34 +02:00
Kamen Mazdrashki 09e6fcc3ff oc-sogo: try/catch to guard only the actual impelementation rather than *everything*
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:52:20 +02:00
Jesús García Sáez 3b2174eeec if there is no password file for specific user, try to read global password file
This way we can have a master password for imap access
2014-07-02 14:51:08 +02:00
Jesús García Sáez c6b8be742d use execinfo.h to get backtrace
Really poor backtrace because it will only have the frames from oc side,
I don't know why callStackSymbols is returning null, compilation flags?
2014-07-02 14:50:54 +02:00
Jesús García Sáez a77863947f add try catch to all functions on struct mapistore_backend 2014-07-02 14:50:41 +02:00
Jesús García Sáez d1f54298d2 stringByDecodingImap4FolderName is not neccesary
For russian locale and characters nonexistent in latin1 sogo crashes
2014-07-02 14:48:45 +02:00
Kamen Mazdrashki f8028b5a94 OpenChange: Avoid crashing when creating embedded message in attachment
Signed-off-by: Kamen Mazdrashki <kamenim@samba.org>
(cherry picked from commit 15a55f9f707247c9164e8fa7a102639744f686e5)
2014-07-02 14:48:27 +02:00
Jesús García Sáez 6bef678114 fix format logging uint64_t 2014-07-02 14:47:57 +02:00
Jesús García Sáez c81476bd04 no need to modify url 2014-07-02 14:47:45 +02:00
Jesús García Sáez a24f009cfe mapistoreURI encoding should be done the same way as listContextForUser
stringByEncodingImap4FolderName is used inside [newFolder create] where is needed
2014-07-02 14:47:31 +02:00
Jesús García Sáez 95298de9f1 avoid infinite loop when trying to update a folder id 2014-07-02 14:45:52 +02:00
Jesús García Sáez f6d1a37127 use properly get_uri function and check ret value 2014-07-02 14:44:23 +02:00
Jesús García Sáez 2aa71cc8a3 check ret value properly 2014-07-02 14:43:42 +02:00
Jesús García Sáez 34b98a563d get_new_folderID functions are now on mapistore_indexing 2014-07-02 14:42:17 +02:00
Carlos Pérez-Aradros Herce fd308b592f Converted all the indexing code to indexing backends 2014-07-02 14:41:51 +02:00
Carlos Pérez-Aradros Herce a6bfb9d5c5 Use indexing generic code instead of tdb private funtions 2014-07-02 14:41:40 +02:00
Carlos Pérez-Aradros Herce 33b353b974 Moved to abstract index_context instead of tdb_wrap 2014-07-02 14:41:25 +02:00
Jeroen Dekkers b5dc2e264d Link correctly against libraries used
Link the mapistore backend against libgnustep-base, libobjc,
libNGObjWeb. Link the SAML code against gobject-2.0.
2014-04-12 20:32:20 +02:00
Skruppy 1c3f1af662 ModulesConstraints tests all values of a multi-valued attributes 2014-03-15 15:10:26 +01:00
Jeroen Dekkers 4d8bff5130 Link libSOGo with libdl on systems with glibc 2013-04-14 11:50:28 +02:00
862 changed files with 16932 additions and 6204 deletions

No files matched your search

+2
View File
@@ -14,3 +14,5 @@ SoObjects/SOGo/derived_src/
Tests/*/config.py
*.pyc
._*
Documentation/*.docbook
Documentation/*.pdf
+16 -3
View File
@@ -33,14 +33,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSString.h>
#import <NGMail/NGMailAddress.h>
#import <NGMail/NGMailAddressParser.h>
#import <SOGo/NSString+Utilities.h>
@implementation NGMimeMessage (ActiveSync)
- (NSArray *) allRecipients
{
NSEnumerator *enumerator, *addressList;
NSMutableArray *recipients;
NSEnumerator *enumerator;
NGMailAddressParser *parser;
NGMailAddress *address;
NSString *s;
recipients = [NSMutableArray array];
@@ -48,13 +53,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
enumerator = [[self headersForKey: @"to"] objectEnumerator];
while ((s = [enumerator nextObject]))
{
[recipients addObject: [s pureEMailAddress]];
parser = [NGMailAddressParser mailAddressParserWithString: s];
addressList = [[parser parseAddressList] objectEnumerator];
while ((address = [addressList nextObject]))
[recipients addObject: [address address]];
}
enumerator = [[self headersForKey: @"cc"] objectEnumerator];
while ((s = [enumerator nextObject]))
{
[recipients addObject: [s pureEMailAddress]];
parser = [NGMailAddressParser mailAddressParserWithString: s];
addressList = [[parser parseAddressList] objectEnumerator];
while ((address = [addressList nextObject]))
[recipients addObject: [address address]];
}
return recipients;
+1 -1
View File
@@ -222,7 +222,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[self setNote: o];
// Categories
if ((o = [theValues objectForKey: @"Categories"]))
if ((o = [theValues objectForKey: @"Categories"]) && [o length])
[self setCategories: o];
// Birthday
+76 -5
View File
@@ -35,9 +35,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <Foundation/NSDate.h>
#include <SOGo/NSString+Utilities.h>
#include <SOGo/NSData+Crypto.h>
#include <NGExtensions/NGBase64Coding.h>
#include <NGExtensions/NSString+misc.h>
static NSArray *easCommandCodes = nil;
static NSArray *easCommandParameters = nil;
@implementation NSString (ActiveSync)
- (NSString *) sanitizedServerIdWithType: (SOGoMicrosoftActiveSyncFolderType) folderType
@@ -61,10 +66,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
NSString *s;
s = [self stringByEscapingHTMLString];
s = [self safeString];
return [[s componentsSeparatedByCharactersInSet: [self safeCharacterSet]]
componentsJoinedByString: @""];
return [s stringByEscapingHTMLString];
}
- (int) activeSyncFolderType
@@ -135,11 +139,78 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- (NSString *) _valueForParameter: (NSString *) theParameter
{
NSArray *components;
NSMutableArray *components;
NSString *s;
int i;
components = [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"];
components = [NSMutableArray arrayWithArray: [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"]];
// We handle BASE64 encoded queryStrings. See http://msdn.microsoft.com/en-us/library/ee160227%28v=exchg.80%29.aspx for details.
if ([components count] == 1)
{
NSString *deviceType, *parameterValue;
NSData *queryString;
int cmd_code, deviceid_length, policy_length, devicetype_length, parameter_code, parameter_length, i;
const char* qs_bytes;
queryString = [[components objectAtIndex: 0] dataByDecodingBase64];
qs_bytes = (const char*)[queryString bytes];
if (!easCommandCodes)
{
easCommandCodes = [NSArray arrayWithObjects:@"Sync", @"SendMail", @"SmartForward", @"SmartReply", @"GetAttachment", @"na", @"na", @"na", @"na",
@"FolderSync", @"FolderCreate", @"FolderDelete", @"FolderUpdate", @"MoveItems", @"GetItemEstimate", @"MeetingResponse",
@"Search", @"Settings", @"Ping", @"ItemOperations", @"Provision", @"ResolveRecipients", @"ValidateCert", nil];
RETAIN(easCommandCodes);
}
if (!easCommandParameters)
{
easCommandParameters = [NSArray arrayWithObjects:@"AttachmentName", @"CollectionId", @"na", @"ItemId", @"LongId", @"na", @"Occurrence", @"Options", @"User", nil];
RETAIN(easCommandParameters);
}
// Command code, 1 byte, ie.: cmd=
cmd_code = qs_bytes[1];
[components addObject: [NSString stringWithFormat: @"cmd=%@", [easCommandCodes objectAtIndex: cmd_code]]];
// Device ID length and Device ID (variable)
deviceid_length = qs_bytes[4];
[components addObject: [NSString stringWithFormat: @"deviceId=%@", [[NSData encodeDataAsHexString: [queryString subdataWithRange: NSMakeRange(5, deviceid_length)]] uppercaseString]]];
// Device type length and type (variable)
policy_length = qs_bytes[5+deviceid_length];
devicetype_length = qs_bytes[5+deviceid_length+1+policy_length];
deviceType = [[NSString alloc] initWithData: [queryString subdataWithRange: NSMakeRange(5+deviceid_length+1+policy_length+1, devicetype_length)]
encoding: NSASCIIStringEncoding];
AUTORELEASE(deviceType);
[components addObject: [NSString stringWithFormat: @"deviceType=%@", deviceType]];
// Command Parameters
i = 5+deviceid_length+1+policy_length+1+devicetype_length;
while (i < [queryString length])
{
parameter_code = qs_bytes[i];
parameter_length = qs_bytes[i+1];
parameterValue = [[NSString alloc] initWithData: [queryString subdataWithRange: NSMakeRange(i+1+1, parameter_length)]
encoding: NSASCIIStringEncoding];
AUTORELEASE(parameterValue);
// parameter_code 7 == Options
// http://msdn.microsoft.com/en-us/library/ee237789(v=exchg.80).aspx
if (parameter_code == 7)
[components addObject: [NSString stringWithFormat: @"%@=%@", [easCommandParameters objectAtIndex: parameter_code],
([parameterValue isEqualToString: @"\001"]) ? @"SaveInSent" : @"AcceptMultiPart"]];
else
[components addObject: [NSString stringWithFormat: @"%@=%@", [easCommandParameters objectAtIndex: parameter_code], parameterValue]];
i = i + 1 + 1 + parameter_length;
}
}
for (i = 0; i < [components count]; i++)
{
+180 -61
View File
@@ -29,11 +29,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "SOGoActiveSyncDispatcher+Sync.h"
#import <Foundation/NSArray.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSNull.h>
#import <Foundation/NSProcessInfo.h>
#import <Foundation/NSSortDescriptor.h>
#import <Foundation/NSTimeZone.h>
#import <Foundation/NSURL.h>
#import <Foundation/NSValue.h>
@@ -122,7 +122,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[o setObjectType: ActiveSyncFolderCacheObject];
[o setTableUrl: [self folderTableURL]];
[o reloadIfNeeded];
[[o properties] removeObjectForKey: @"SyncKey"];
[[o properties] removeObjectForKey: @"SyncCache"];
[[o properties] removeObjectForKey: @"DateCache"];
@@ -147,6 +147,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
return [o properties];
}
- (NSString *) _getNameInCache: (id) theCollection withType: (SOGoMicrosoftActiveSyncFolderType) theFolderType
{
NSString *nameInCache;
if (theFolderType == ActiveSyncMailFolder)
nameInCache= [[[theCollection mailAccountFolder] imapFolderGUIDs] objectForKey: [theCollection nameInContainer]];
else
{
NSString *component_name;
if (theFolderType == ActiveSyncContactFolder)
component_name = @"vcard";
else if (theFolderType == ActiveSyncEventFolder)
component_name = @"vevent";
else
component_name = @"vtodo";
nameInCache= [NSString stringWithFormat: @"%@/%@", component_name, [theCollection nameInContainer]];
}
return nameInCache;
}
//
// <?xml version="1.0"?>
@@ -190,7 +213,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
withType: (SOGoMicrosoftActiveSyncFolderType) theFolderType
inBuffer: (NSMutableString *) theBuffer
{
NSMutableDictionary *allValues;
NSMutableDictionary *folderMetadata, *dateCache, *syncCache, *allValues;
NSString *clientId, *serverId;
NSArray *additions;
@@ -276,6 +299,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId];
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
[theBuffer appendString: @"</Add>"];
// Update syncCache
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
syncCache = [folderMetadata objectForKey: @"SyncCache"];
dateCache = [folderMetadata objectForKey: @"DateCache"];
[syncCache setObject: [folderMetadata objectForKey: @"SyncKey"] forKey: serverId];
[dateCache setObject: [NSCalendarDate date] forKey: serverId];
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
}
}
}
@@ -375,6 +409,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
}
[theBuffer appendString: @"<Change>"];
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId];
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
[theBuffer appendString: @"</Change>"];
}
}
}
@@ -431,6 +469,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if (![sogoObject isKindOfClass: [NSException class]])
[sogoObject delete];
[theBuffer appendString: @"<Delete>"];
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId];
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
[theBuffer appendString: @"</Delete>"];
// update syncCache
NSMutableDictionary *folderMetadata, *dateCache, *syncCache;
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
syncCache = [folderMetadata objectForKey: @"SyncCache"];
dateCache = [folderMetadata objectForKey: @"DateCache"];
[syncCache removeObjectForKey: serverId];
[dateCache removeObjectForKey: serverId];
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
}
}
}
@@ -488,18 +543,30 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
more_available = NO;
if (theFolderType == ActiveSyncMailFolder && !([theSyncKey isEqualToString: @"-1"]) && theFilterType)
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
// If this is a new sync operation, DateCache and SyncCache needs to be deleted
if ([theSyncKey isEqualToString: @"-1"])
{
[folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"SyncCache"];
[folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"DateCache"];
}
syncCache = [folderMetadata objectForKey: @"SyncCache"];
dateCache = [folderMetadata objectForKey: @"DateCache"];
if ((theFolderType == ActiveSyncMailFolder || theFolderType == ActiveSyncEventFolder || theFolderType == ActiveSyncTaskFolder) &&
!([folderMetadata objectForKey: @"MoreAvailable"]) && // previous sync operation reached the windowSize
!([theSyncKey isEqualToString: @"-1"]) && // new sync operation
theFilterType)
{
NSArray *allKeys;
NSString *key;
int softdelete_count;
softdelete_count = 0;
folderMetadata = [self _folderMetadataForKey: [theCollection nameInContainer]];
dateCache = [folderMetadata objectForKey: @"DateCache"];
syncCache = [folderMetadata objectForKey: @"SyncCache"];
allKeys = [dateCache allKeys];
for (i = 0; i < [allKeys count]; i++)
{
@@ -510,7 +577,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[s appendString: @"<SoftDelete xmlns=\"AirSync:\">"];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", key];
[s appendString: @"</SoftDelete>"];
[syncCache removeObjectForKey: key];
[dateCache removeObjectForKey: key];
@@ -520,7 +587,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if (softdelete_count >= theWindowSize)
{
[folderMetadata setObject: [NSNumber numberWithBool: YES] forKey: @"MoreAvailable"];
[self _setFolderMetadata: folderMetadata forKey: [theCollection nameInContainer]];
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
more_available = YES;
*theLastServerKey = theSyncKey;
@@ -532,7 +599,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
[folderMetadata removeObjectForKey: @"MoreAvailable"];
[self _setFolderMetadata: folderMetadata forKey: [theCollection nameInContainer]];
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
}
//
@@ -557,7 +624,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NSArray *allComponents;
BOOL updated;
int deleted;
int deleted, return_count;
if (theFolderType == ActiveSyncContactFolder)
component_name = @"vcard";
@@ -567,19 +634,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
component_name = @"vtodo";
allComponents = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType];
allComponents = [allComponents sortedArrayUsingDescriptors: [NSArray arrayWithObjects: [[NSSortDescriptor alloc] initWithKey: @"c_lastmodified" ascending:YES], nil]];
// Check for the WindowSize
max = [allComponents count];
// Disabled for now for GCS folders.
// if (max > theWindowSize)
// {
// max = theWindowSize;
// more_available = YES;
// }
return_count = 0;
for (i = 0; i < max; i++)
{
// Check for the WindowSize and slice accordingly
if (return_count >= theWindowSize)
{
more_available = YES;
// -1 to make sure that we miss no event in case there are more with the same c_lastmodified
*theLastServerKey = [NSString stringWithFormat: @"%d", [[component objectForKey: @"c_lastmodified"] intValue] - 1];
break;
}
component = [allComponents objectAtIndex: i];
deleted = [[component objectForKey: @"c_deleted"] intValue];
@@ -590,17 +664,28 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if (deleted)
{
[s appendString: @"<Delete xmlns=\"AirSync:\">"];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", uid];
[s appendString: @"</Delete>"];
if ([syncCache objectForKey: uid])
{
[s appendString: @"<Delete xmlns=\"AirSync:\">"];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", uid];
[s appendString: @"</Delete>"];
[syncCache removeObjectForKey: uid];
[dateCache removeObjectForKey: uid];
return_count++;
}
}
else
{
updated = YES;
if ([[component objectForKey: @"c_creationdate"] intValue] > [theSyncKey intValue])
if (![syncCache objectForKey: uid])
updated = NO;
else if ([[component objectForKey: @"c_lastmodified"] intValue] == [[syncCache objectForKey: uid] intValue])
continue;
return_count++;
sogoObject = [theCollection lookupName: [uid sanitizedServerIdWithType: theFolderType]
inContext: context
acquire: 0];
@@ -635,11 +720,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
continue;
}
}
[syncCache setObject: [component objectForKey: @"c_lastmodified"] forKey: uid];
if (updated)
[s appendString: @"<Change xmlns=\"AirSync:\">"];
else
{
// no need to set dateCache for Contacts
if ((theFolderType == ActiveSyncEventFolder || theFolderType == ActiveSyncTaskFolder))
[dateCache setObject: [componentObject startDate] ? [componentObject startDate] : [NSCalendarDate date] forKey: uid]; // FIXME: need to set proper date for recurring events - softDelete
[s appendString: @"<Add xmlns=\"AirSync:\">"];
}
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", uid];
[s appendString: @"<ApplicationData xmlns=\"AirSync:\">"];
@@ -652,11 +745,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[s appendString: @"</Change>"];
else
[s appendString: @"</Add>"];
return_count++;
}
} // for ...
folderMetadata = [NSDictionary dictionaryWithObject: [theCollection davCollectionTag]
forKey: @"SyncKey"];
if (more_available)
{
[folderMetadata setObject: [NSNumber numberWithBool: YES] forKey: @"MoreAvailable"];
[folderMetadata setObject: *theLastServerKey forKey: @"SyncKey"];
}
else
{
[folderMetadata removeObjectForKey: @"MoreAvailable"];
[folderMetadata setObject: [theCollection davCollectionTag] forKey: @"SyncKey"];
}
[self _setFolderMetadata: folderMetadata
forKey: [NSString stringWithFormat: @"%@/%@", component_name, [theCollection nameInContainer]]];
}
@@ -685,27 +789,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
sequence: [[[allMessages objectAtIndex: i] allValues] lastObject]]];
}
// If it's a new Sync operation, DateCache and SyncCache need to be deleted
// but GUID stored by folderSync shouldn't be touched
folderMetadata = [self _folderMetadataForKey: [theCollection nameInContainer]];
if ([theSyncKey isEqualToString: @"-1"])
{
[folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"SyncCache"];
[folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"DateCache"];
}
// Check whether GUID in cache is equal to the GUID from imap - this is to avoid cache corruptions if a folder has been renamed and a new folder
// with the same name has been created but folderSync has not yet updated the cache
if (!([[theCollection nameInContainer] isEqualToString:
[NSString stringWithFormat: @"folder%@", [self globallyUniqueIDToIMAPFolderName: [folderMetadata objectForKey: @"GUID"] type: theFolderType]]]))
{
NSLog(@"GUID mismatch don't sync now!");
return;
}
syncCache = [folderMetadata objectForKey: @"SyncCache"];
dateCache = [folderMetadata objectForKey: @"DateCache"];
sortedBySequence = [[NSMutableArray alloc] initWithDictionary: syncCache];
[sortedBySequence sortUsingSelector: @selector(compareSequence:)];
[sortedBySequence autorelease];
@@ -849,8 +932,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[folderMetadata setObject: [theCollection davCollectionTag] forKey: @"SyncKey"];
}
[self _setFolderMetadata: folderMetadata
forKey: [theCollection nameInContainer]];
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
} // default:
break;
} // switch (folderType) ...
@@ -862,9 +944,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[theBuffer appendString: @"<Commands>"];
[theBuffer appendString: s];
[theBuffer appendString: @"</Commands>"];
if (more_available)
[theBuffer appendString: @"<MoreAvailable/>"];
}
}
@@ -926,6 +1005,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
inCollection: theCollection
withType: theFolderType
inBuffer: theBuffer];
*processed = YES;
}
else if ([[element tagName] isEqualToString: @"Fetch"])
{
@@ -954,7 +1034,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NSMutableString *changeBuffer, *commandsBuffer;
BOOL getChanges, first_sync;
unsigned int windowSize, v;
unsigned int windowSize, v, status;
changeBuffer = [NSMutableString string];
commandsBuffer = [NSMutableString string];
@@ -965,6 +1045,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
collection = [self collectionFromId: realCollectionId type: folderType];
syncKey = davCollectionTag = [[(id)[theDocumentElement getElementsByTagName: @"SyncKey"] lastObject] textValue];
if (collection == nil)
{
// Collection not found - next folderSync will do the cleanup
//NSLog(@"Sync Collection not found %@ %@", collectionId, realCollectionId);
[theBuffer appendString: @"<Collection>"];
[theBuffer appendFormat: @"<SyncKey>%@</SyncKey>", syncKey];
[theBuffer appendFormat: @"<CollectionId>%@</CollectionId>", collectionId];
[theBuffer appendFormat: @"<Status>%d</Status>", 8];
[theBuffer appendString: @"</Collection>"];
return;
}
// We check for a window size, default to 100 if not specfied or out of bounds
windowSize = [[[(id)[theDocumentElement getElementsByTagName: @"WindowSize"] lastObject] textValue] intValue];
@@ -978,6 +1071,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
windowSize = v;
lastServerKey = nil;
status = 1;
// From the documention, if GetChanges is missing, we must assume it's a YES.
// See http://msdn.microsoft.com/en-us/library/gg675447(v=exchg.80).aspx for all details.
@@ -995,6 +1089,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
first_sync = YES;
*changeDetected = YES;
}
else if ((![syncKey isEqualToString: @"-1"]) && !([[self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]] objectForKey: @"SyncCache"]))
{
//NSLog(@"Reset folder: %@", [collection nameInContainer]);
davCollectionTag = @"0";
first_sync = YES;
*changeDetected = YES;
if (!([[self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]] objectForKey: @"displayName"]))
status = 13; // need folderSync
else
status = 3; // do a complete resync
}
// We check our sync preferences and we stash them
bodyPreferenceType = [[(id)[[(id)[theDocumentElement getElementsByTagName: @"BodyPreference"] lastObject] getElementsByTagName: @"Type"] lastObject] textValue];
@@ -1004,7 +1110,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"];
// We generate the commands, if any, for the response. We might also have
// generated some in processSyncCommand:inResponse: as we could have
// received a Fetch command
@@ -1013,9 +1118,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[self processSyncGetChanges: theDocumentElement
inCollection: collection
withWindowSize: windowSize
//withWindowSize: 5
withSyncKey: syncKey
withFolderType: folderType
withFilterType: [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]]
//withFilterType: [NSCalendarDate dateFromFilterType: @"7"]
inBuffer: changeBuffer
lastServerKey: &lastServerKey];
}
@@ -1037,10 +1144,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
inBuffer: s
processed: &processed];
if (processed)
// Windows phons don't empty Responses tags - such as: <Responses></Responses>.
// We onnly generate this tag when the command has generated a response.
if (processed && [s length])
[commandsBuffer appendFormat: @"<Responses>%@</Responses>", s];
else
[commandsBuffer appendString: s];
}
// If we got any changes or if we have applied any commands
@@ -1049,9 +1156,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
if (lastServerKey)
davCollectionTag = lastServerKey;
else if (![[self _folderMetadataForKey: [collection nameInContainer]] objectForKey: @"MoreAvailable"])
davCollectionTag = [collection davCollectionTag];
else
{
// Use the SyncKey saved by processSyncGetChanges - if processSyncGetChanges is not called (because of getChanges=false)
// SyncKey has the value of the previous sync operation.
davCollectionTag = [[self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]] objectForKey: @"SyncKey"];
if (!davCollectionTag)
davCollectionTag = [collection davCollectionTag];
}
*changeDetected = YES;
}
else
@@ -1074,10 +1188,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[theBuffer appendFormat: @"<SyncKey>%@</SyncKey>", davCollectionTag];
[theBuffer appendFormat: @"<CollectionId>%@</CollectionId>", collectionId];
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
[theBuffer appendFormat: @"<Status>%d</Status>", status];
// MoreAvailable breaks Windows Mobile devices if not between <Status> and <Commands>
// https://social.msdn.microsoft.com/Forums/en-US/040b254e-f47e-4cc1-a397-6d8393cdb819/airsyncmoreavailable-breaks-windows-mobile-devices-what-am-i-doing-wrong?forum=os_exchangeprotocols
if ([[self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]] objectForKey: @"MoreAvailable"])
[theBuffer appendString: @"<MoreAvailable/>"];
[theBuffer appendString: changeBuffer];
[theBuffer appendString: commandsBuffer];
[theBuffer appendString: changeBuffer];
[theBuffer appendString: @"</Collection>"];
}
File diff suppressed because it is too large. Load diff
+6 -1
View File
@@ -67,8 +67,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <Appointments/iCalPerson+SOGo.h>
#include <Mailer/NSString+Mail.h>
#include <Mailer/SOGoMailBodyPart.h>
#include <SOGo/SOGoUser.h>
#include <SOGo/NSString+Utilities.h>
typedef struct {
uint32_t dwLowDateTime;
@@ -323,6 +323,11 @@ struct GlobalObjectId {
if (s)
{
// We sanitize the content immediately, in case we have non-UNICODE safe
// characters that would be re-encoded later in HTML entities and thus,
// ignore afterwards.
s = [s safeString];
body = [s dataUsingEncoding: NSUTF8StringEncoding];
}
+3 -3
View File
@@ -16,11 +16,11 @@ ADDITIONAL_INCLUDE_DIRS += \
-I../../SOPE
ADDITIONAL_LIB_DIRS += \
-L../SoObjects/SOGo/SOGo.framework/ \
-L../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo \
-L../SoObjects/SOGo/$(GNUSTEP_OBJ_DIR)/ \
-L../OGoContentStore/$(GNUSTEP_OBJ_DIR)/ \
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \
-L/usr/local/lib
-L/usr/local/lib \
-Wl,-rpath,$(GNUSTEP_SYSTEM_LIBRARIES)/sogo
BUNDLE_LIBS += \
-lSOGo \
+34 -19
View File
@@ -127,7 +127,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
tz = [(iCalDateTime *)[self firstChildWithTag: @"dtstart"] timeZone];
if (!tz)
tz = [iCalTimeZone timeZoneForName: @"Europe/London"];
tz = [iCalTimeZone timeZoneForName: [userTimeZone name]];
[s appendFormat: @"<TimeZone xmlns=\"Calendar:\">%@</TimeZone>", [tz activeSyncRepresentationInContext: context]];
@@ -236,7 +236,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
iCalAlarm *alarm;
alarm = [[self alarms] objectAtIndex: 0];
alarm = [self firstDisplayOrAudioAlarm];
[s appendString: [alarm activeSyncRepresentationInContext: context]];
}
@@ -334,14 +334,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[o intValue];
}
//
//
//
if ((o = [theValues objectForKey: @"MeetingStatus"]))
{
[o intValue];
}
//
// 0- normal, 1- personal, 2- private and 3-confidential
//
@@ -361,14 +353,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[self setAccessClass: @"PUBLIC"];
}
}
if ((o = [theValues objectForKey: @"TimeZone"]))
{
// Ugh, we ignore it for now.
userTimeZone = [[[context activeUser] userDefaults] timeZone];
tz = [iCalTimeZone timeZoneForName: [userTimeZone name]];
[(iCalCalendar *) parent addTimeZone: tz];
}
// We ignore TimeZone sent by mobile devices for now.
// Some Windows devices don't send during event updates.
//if ((o = [theValues objectForKey: @"TimeZone"]))
// {
userTimeZone = [[[context activeUser] userDefaults] timeZone];
tz = [iCalTimeZone timeZoneForName: [userTimeZone name]];
[(iCalCalendar *) parent addTimeZone: tz];
//}
// FIXME: merge with iCalToDo
if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"]))
@@ -481,11 +474,33 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[self setOrganizer: person];
}
//
// iOS is plain stupid here. It seends event invitations with no Organizer.
// We check this corner-case and if MeetingStatus == 1 (see http://msdn.microsoft.com/en-us/library/ee219342(v=exchg.80).aspx or details)
// and there's no organizer, we fake one.
//
if ((o = [theValues objectForKey: @"MeetingStatus"]))
{
if ([o intValue] == 1 && ![theValues objectForKey: @"Organizer_Email"])
{
iCalPerson *person;
person = [iCalPerson elementWithTag: @"organizer"];
[person setEmail: [[[context activeUser] primaryIdentity] objectForKey: @"email"]];
[person setCn: [[context activeUser] cn]];
[person setPartStat: @"ACCEPTED"];
[self setOrganizer: person];
}
}
// Attendees - we don't touch the values if we're an attendee. This is gonna
// be done automatically by the ActiveSync client when invoking MeetingResponse.
if (![self userIsAttendee: [context activeUser]])
{
if ((o = [theValues objectForKey: @"Attendees"]))
// Windows phones sens sometimes an empty Attendees tag.
// We check it's an array before processing it.
if ((o = [theValues objectForKey: @"Attendees"])&& [o isKindOfClass: [NSArray class]])
{
NSMutableArray *attendees;
NSDictionary *attendee;
+3 -1
View File
@@ -76,15 +76,17 @@ struct SYSTEMTIME {
byMonth = [rrule byMonth];
if ([byMonth count] > 0)
{
tzData->wYear = 0;
tzData->wMonth = [[byMonth objectAtIndex: 0] intValue];
mask = [rrule byDayMask];
tzData->wDayOfWeek = [mask firstDay];
tzData->wDay = [mask firstOccurrence];
tzData->wDay = ([mask firstOccurrence] == -1) ? 5 : [mask firstOccurrence];
dateValue = [self startDate];
tzData->wHour = [dateValue hourOfDay];
tzData->wMinute = [dateValue minuteOfHour];
tzData->wSecond = [dateValue secondOfMinute];
tzData->wMilliseconds = 0;
}
}
+7 -2
View File
@@ -28,8 +28,13 @@
ProxyPass /SOGo http://127.0.0.1:20000/SOGo interpolate
ProxyPass / http://127.0.0.1:20000/SOGo/dav/ interpolate
<Location />
Order allow,deny
Allow from all
<IfVersion < 2.4>
Order deny,allow
Allow from all
</IfVersion>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
</Location>
<Proxy http://127.0.0.1:20000>
+8 -2
View File
@@ -5,8 +5,14 @@ Alias /SOGo/WebServerResources/ \
<Directory /usr/lib/GNUstep/SOGo/>
AllowOverride None
Order deny,allow
Allow from all
<IfVersion < 2.4>
Order deny,allow
Allow from all
</IfVersion>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
# Explicitly allow caching of static content to avoid browser specific behavior.
# A resource's URL MUST change in order to have the client load the new version.
+3257
View File
File diff suppressed because it is too large. Load diff
+8
View File
@@ -0,0 +1,8 @@
all: $(patsubst %.asciidoc,%.pdf,$(wildcard *.asciidoc))
%.pdf : %.asciidoc
asciidoc -a docinfo1 -b docbook -d book -o $<.docbook $<
fop -c fonts/fop-config.xml -xsl docbook/xsl/sogo-fo.xsl -xml $<.docbook -pdf $@
clean:
rm *.asciidoc.docbook *.pdf
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,330 @@
Mobile Devices Configuration Guide
==================================
////
This file is part of the SOGo project.
See SOGo Mobile Devices Configuration-docinfo.xml for authors,
copyright and license information.
////
include::includes/global-attributes.asciidoc[]
About this Guide
----------------
This guide will walk you through the installation and configuration of
popular SyncML clients to be used with the SOGo solution.
This guide also include instructions for configuring Apple iPhone OS
devices (iPhone, iPod touch, and iPad).
The instructions are based on version {release_version} of SOGo.
The latest version of this guide is available at
http://www.sogo.nu/downloads/documentation.html.
Introduction
------------
SOGo is a free and modern scalable groupware server. It offers shared
calendars, address books, and emails through your favourite Web browser
and by using a native client such as Mozilla Thunderbird and Lightning.
SOGo is standard-compliant. It supports CalDAV, CardDAV, GroupDAV, iMIP
and iTIP and reuses existing IMAP, SMTP and database servers - making
the solution easy to deploy and interoperable with many applications.
SOGo features:
* Scalable architecture suitable for deployments from dozen to many
thousand users
* Rich Web-based interface that shares the look and feel, the features
and the data of Mozilla Thunderbird and Lightning
* Improved integration with Mozilla Thunderbird and Lighthing by using
the SOGo Connector and the SOGo Integrator
* Two-way synchronization support with any Microsoft ActiveSync-capable
device, or Outlook 2013
SOGo is developed by a community of developers located mainly in North
America and Europe. More information can be found on
http://www.sogo.nu/.
Installation
------------
This section will guide you through the installation of popular SyncML
clients on various devices.
Funambol SyncML Client
~~~~~~~~~~~~~~~~~~~~~~
The recommended SyncML client for BlackBerry, Apple iPhone (for
contacts), mobile devices based on Microsoft Windows Mobile Smartphone
or Windows Mobile PocketPC, is the one provided directly by Funambol,
which is free and open source.
For Microsoft Window Mobile, you must identify which kind of device you
have ("Smartphone" vs. "PocketPC").
Once you've identified what kind of device you have, download the
appropriate client from:
http://www.funambol.com/opensource/downloads.php
The version 8.5 GA or later is required. 
NextHaus SyncJe
~~~~~~~~~~~~~~~
For BlackBerry and Apple iPhone devices, you can also use the
SyncJe SyncML client from NextHaus (http://www.nexthaus.com/). This
client allows one to synchronize contacts, event and tasks with SOGo.
The version 2.43 or later is required. For BlackBerry 7XXX devices, the
required version is 2.25 but isn't officially supported. You can install
SyncJe on your BlackBerry device, over the air, by opening the following
link from your BlackBerry device:
http://www.nexthaus.com/bb/syncjebb.jad
This will download and install the application on your mobile device.
It's important to use the Web browser application and not the WAP
browser to perform this operation. Once installed, restart the device.
This procedure can also be used to update the SyncJe application. Note
that an update of SyncJe will not affect the state of previous
synchronizations. It's not necessary to perform a "slow sync" after an
update of SyncJe. 
Synthesis SyncML Client
~~~~~~~~~~~~~~~~~~~~~~~
The Synthesis (http://www.synthesis.ch/) company provides a SyncML
client for Palm OS-based devices.
"Over The Air" synchronization is possible, as well as synchronization
through a cradle. For the latter, you must install Softick PPP using the
Palm Desktop software. The version 3.01 or later is required and you can
download it from http://www.softick.com/ppp/. Once installed, the
desktop computer must be restarted.
Once completed, you must download the Synthesis client for Palm OS. The
version 3.0.2.9 or later is required. Either the standard or the
professional version can be used.
Once downloaded, uncompress the archive and install the `.prc` file on
your Palm OS-based device. After, you should see a "SyncML" icon on your
device.
Configuration
-------------
In this section, you'll learn how to configure the popular SyncML
clients in order to fully synchronize your mobile device with SOGo.
Instructions for Apple iPhone OS based devices are also included. Note
that those devices do not require a SyncML client for synchronizing
calendars.
Funambol SyncML Client
~~~~~~~~~~~~~~~~~~~~~~
Once the Funambol SyncML client is installed, start the application from
your mobile device to configure it using the following steps:
From the _Tools_ menu, choose _Options..._:
* Specify the _Location_. If your SOGo server is `sogo.domain.com`, the
location should be `http://sogo.domain.com/funambol/ds`.
* Specify your username and password
* Check the _Contacts_ check box and click on the _Details_ button.
The synchronization type is _two-way_ and the _Remote name_ is
`sogo-card`. The data format is vCard.
* Check the _Calendar_ check box and click on the _Details_ button. The
synchronization type is _two-way_ and the _Remote name_ is `sogo-cal`.
The data format is vCalendar.
* Check the _Tasks_ check box and click on the _Details_ button. The
synchronization type is _two-way_ and the _Remote name_ is
`sogo-todo`. The data format is SIF.
* Save the preferences.
To prevent the BlackBerry to automatically add a new event in the
calendar when an invitation is received by email (IMIP message) on the
BlackBerry device, you should delete the CICAL service from the Service
Book. To do so, proceed with the following steps:
From the _Options_ menu:
* Choose _Advanced Options_
* Choose _Service Book_
* Identify the line that mentions the email address of the BlackBerry
user followed by the `[CICAL]` string. For example, `user@domain.com
[CICAL]`.
* Delete this entry.
Once completed, you must restart the device by removing its battery for
a couple of seconds. If you ever want to reactivate the CICAL service,
follow those instructions:
http://support.appriver.com/KB/a205/how-to-resend-service-books-on-blackberry.aspx
Once complete, the client is ready for an initial synchronization.
Ideally, you should *delete* all data from the mobile device before the
initial synchronization. To do so:
* From the _Tools_ menu, choose _Recover..._
* Choose _Replace with data from server_
* Check the _Contacts_, _Calendar_ and _Tasks_ check boxes
Finally, click on the _Sync All_ button to proceed with the
synchronization.
NextHaus SyncJe
~~~~~~~~~~~~~~~
Once NextHaus SyncJe is installed, proceed with the following steps,
from your BlackBerry device, to configure it:
* Open the _SyncJe Client_
From the _Settings_ menu:
* Specify the _Server URL_. If your SOGo server is `sogo.domain.com`,
the URL should be `http://sogo.domain.com/funambol/ds`.
* Specify your user name and password
* Check the _Contacts_ check box and specify `sogo-card` as the
_Foldername_
* Check the _Calendar_ check box and specify `sogo-cal` as the
_Foldername_
* Check the _ToDo_ check box and specify `sogo-todo` as the _Foldername_
* Check the _Auto Sync_ check box if you wish to automatically
synchronize contacts, events and tasks at a predefined time interval
* Do *not* check the _Sync events between_ check box
* Check the _Skip saving attendees_ - this will prevent the BlackBerry
device from sending emails to meeting participants for events
downloaded from the SOGo server
* Check the _BIS_ check box (for _BlackBerry Internet Services_)
* Leave the other fields to the their default value
* Then choose _Save_ from the menu to save the preferences 
To prevent the BlackBerry to automatically add a new event in the
calendar when an invitation is received by email (IMIP message) on the
BlackBerry device, you should delete the CICAL service from the Service
Book. To do so, proceed with the following steps:
From the _Options_ menu:
* Choose _Advanced Options_
* Choose _Service Book_
* Identify the line that mentions the email address of the BlackBerry
user followed by the `[CICAL]` string. For example, `user@domain.com
[CICAL]`.
* Delete this entry
Once completed, you must restart the device by removing its battery for
a couple of seconds. If you ever want to reactivate the CICAL service,
follow those instructions:
http://support.appriver.com/KB/a205/how-to-resend-service-books-on-blackberry.aspx
Once done, you're now ready for your first synchronization.
Ideally, you must delete all data on the BlackBerry before proceeding
with the initial synchronization. To do so, proceed with the following
steps:
* Open the _SyncJe Client_
From the _Settings_ menu:
* Choose the _Clear databases_ option
* Respond _Yes_ to all questions. This will delete all contacts, events
and tasks from your BlackBerry device. 
* Go back in the previous menu
* Choose the _Force Slow Sync_ option
* Choose the _Start Sync_ option to start the synchronization. This
could take a few minutes if you have many contacts, events or tasks.
Subsequent synchronizations should be much faster. 
After the initial _Slow Sync_, you can simply chose the _Start Sync_
option if you do a manual synchronization to synchronize all changes. 
Synthesis SyncML Client
~~~~~~~~~~~~~~~~~~~~~~~
Once the Synthesis SyncML client is installed, proceed with the
following steps to configure it:
* Open the _Synthesis SyncML Standard Edition_ application
From the _Settings..._ menu:
* Specify the _Server URL_. If your SOGo server is `sogo.domain.com`,
the URL should be `http://sogo.domain.com/funambol/ds`.
* Specify your user name and password
* Check the _Contacts_, _Events_ and _Task_ check boxes
* Click on the _more..._ button
* For the _Contacts_, choose _reload device_ and specify `sogo-card` as
the _Server Path_.
* For the _Events_, choose _reload device_ and specify `sogo-cal` as
the _Server Path_. Do *not* check the _Only from..._ check box.
* For the _Tasks_, choose _reload device_ and specify `sogo-todo` as
the _Server Path_.
* Once completed, click on the _Done_ button
The _reload device_ value will *delete* all entries on the device during
the initial synchronization and obtain contacts, events and tasks from
the server. If you do not want to delete everything from the device,
please choose _normal_ instead of _reload device_.
Once ready, click on the _Start_ button to proceed with the initial
synchronization.
During the initial synchronization, the Palm device will ask you how to
connect to the desktop system. From the Palm device, choose _Windows
RAS_ without specifying an user name or a password. This will allow the
Palm device to establish a PPP connection between itself and Softick PPP
and then communicate using its TCP/IP stack to the Funambol server.
Apple iOS — Calendars
~~~~~~~~~~~~~~~~~~~~~
Starting from iOS 3, Apple has added CalDAV support to the calendar
application included in the iPhone/iPod/iPad.
To add a CalDAV account, follow those instructions:
* From the _Settings_ menu, choose _Mail, Contacts, Calendars_
* Choose _Add Account..._
* Choose _Other_
* Choose _Add CalDAV Account_
* Specify the _Server_, the URL should be
`http://sogo.domain.com/SOGo/dav/<username>`
On iOS 3.1.2 and later, you must also specify the range of events you
want to have. 
* From the _Settings_ menu, choose _Mail, Contacts, Calendars_
* From the _Sync_ menu, choose _All Events_
Note that other options (_Events 2 Weeks Back_, etc.) do not work right
now.
Apple iOS — Contacts
~~~~~~~~~~~~~~~~~~~~
If you want to synchronize contacts with your Apple mobile device, use
the native address book application with SOGo using the CardDAV
protocol. To configure the address book application so it works with
SOGo, create a new CardDAV account and specify your server name. In
the _Advanced Settings_, set the port to `8800`.
On iOS prior to version 4, you must install the Funambol client and
configure the `sogo-card` source.
include::includes/additional-info.asciidoc[]
include::includes/commercial-support.asciidoc[]
@@ -0,0 +1,358 @@
Mozilla Thunderbird Configuration Guide
=======================================
////
This file is part of the SOGo project.
See SOGo Mozilla Thunderbird Configuration Guide-docinfo.xml for
authors, copyright and license information.
////
include::includes/global-attributes.asciidoc[]
About this Guide
----------------
This guide will walk you through the installation and configuration of
Mozilla Thunderbird and its associated extensions so it can be used with
the SOGo solution.
The instructions are based on version {release_version} of SOGo.
The latest version of this guide is available
at http://www.sogo.nu/downloads/documentation.html.
Introduction
------------
SOGo is a free and modern scalable groupware server. It offers shared
calendars, address books, and emails through your favourite Web browser
and by using a native client such as Mozilla Thunderbird and Lightning.
SOGo is standard-compliant. It supports CalDAV, CardDAV, GroupDAV, iMIP
and iTIP and reuses existing IMAP, SMTP and database servers - making
the solution easy to deploy and interoperable with many applications.
SOGo features:
* Scalable architecture suitable for deployments from dozen to many
thousand users
* Rich Web-based interface that shares the look and feel, the features
and the data of Mozilla Thunderbird and Lightning
* Improved integration with Mozilla Thunderbird and Lightning by using
the SOGo Connector and the SOGo Integrator extensions
* Two-way synchronization support with any Microsoft ActiveSync-capable
device, or Outlook 2013
SOGo is developed by a community of developers located mainly in North
America and Europe. More information can be found on
http://www.sogo.nu/.
Installation
------------
This section will guide you through the installation of Thunderbird and
its associated extensions.
Mozilla Thunderbird
~~~~~~~~~~~~~~~~~~~
Mozilla Thunderbird is the official front end client of SOGo.
Mozilla Thunderbird version 2, 3.1, 10 ESR (Extended Support Release),
17 ESR, 24 and 31 are supported and it is recommended to use version 31 of
Thunderbird.
In order to download and install Mozilla Thunderbird, please visit:
https://www.mozilla.org/en-US/thunderbird/organizations/all-esr.html
Mozilla Lightning
~~~~~~~~~~~~~~~~~
When using version 24 or 31 of Thunderbird, you can use the latest version of
Mozilla Lightning. Use the Add-ons manager of Thunderbird or visit:
https://addons.mozilla.org/en-US/thunderbird/addon/lightning/
When using version 17 ESR of Thunderbird, you can use Mozilla Lightning
version 1.9.1. In order to download the extension, please visit:
https://addons.mozilla.org/en-US/thunderbird/addon/lightning/versions/1.9.1
For Thunderbird 2 and 3.1, you need the _Inverse Edition_of Mozilla
Lightning. It provides back ported features, bug fixes and security
fixes from the current development version of Mozilla Lightning. For
Thunderbird 2, it is based on release version 0.9 of Lightning. For
Thunderbird 3.1, it is based on 1.0b2.
In order to download and install Mozilla Lightning – Inverse Edition for
Thunderbird 2 or 3.1, please visit:
http://www.sogo.nu/downloads/frontends.html
SOGo Connector and SOGo Integrator
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The SOGo Connector and Integrator extensions are provided to perfect the
integration of Mozilla Thunderbird 2, 3.1, 10 ESR, 17 ESR, 24 and 31 with
the SOGo groupware solution.
First of all, the SOGo Connector extension transforms Thunderbird into a
full DAV client for groupware servers such as SOGo, eGroupware or
Citadel. It does this by adding support for remote DAV address books and
by adding features to be used along with the Lightning calendar
extension.
Among supported features of the SOGo Connector extension, we have:
* Free / Busy URL field in the address book
* Free / Busy functionality through HTTP
* Event organizers
* Synchronization of the address book using GroupDAV
* CardDAV implementation for the address book
* Support for WebDAV ACL
On the other hand, the SOGo Integrator extension transforms Thunderbird
into a pure "heavy" client for SOGo. Whereas the SOGo Connector is meant
for portability (horizontal integration), the SOGo Integrator makes use
of the features and layout only available from SOGo (vertical
integration).
Among the supported features of the SOGo Integrator extension, we have :
* Remote administration of folder subscriptions
* Remote administration of folder access control lists (ACL)
* Automatic replication of your local and subscribed folders
* When correctly configured, it handles the propagation of updates to
chosen extensions from a local update server
* Automatic propagation of default settings
In order to download and install the SOGo Connector and Integrator
extensions, please visit:
http://www.sogo.nu/downloads/frontends.html
Prior to installing the SOGo Integrator extension, you should read the
following chapter – _SOGo Integrator Customization_.
SOGo Integrator Customization
-----------------------------
In this section, you'll learn how to customize the SOGo Integrator
extension so it can be used alongside your SOGo server.
Customization
~~~~~~~~~~~~~
The customization steps described here involves understanding of XML and
of text file edition. If you do not have those skills, it is recommended
that you don't try to use this extension.
There are actually two steps in the configuration of a working
environment for SOGo Integrator. First of all, the Integrator will use
the same user name used to connect to the first email server configured
in Thunderbird. It is a current limitation but it will fit nearly all
configurations out there.
For testing purpose, you are strongly recommended to create and
configure an additional user profile for Thunderbird. This is for two
reasons. The first is because of the limitation mentioned above. The
second is because the Integrator will synchronize your personal address
book onto the SOGo server and then remove it so that only your personal
address book on SOGo will be available. If you are not able to do that,
you may want to make a copy of that address book beforehand.
The second part requires editing one file in the extension file sub tree
to specify where the SOGo server is located. This is done by hand. In an
enterprise environment, this step is only required once per release
since the updates are expected to propagate automatically. 
Uncompress (using a ZIP or jar tool) the SOGo Integrator XPI and locate
the following file:
extensions.rdf
This file is used for locating the extension update server and the SOGo
server, which we consider to be the same for the moment. There is a line
starting with a "Seq" tag and with an attribute named "isi:updateURL".
Replace the host part of that url with the SOGo server you want to
connect to.
For example, one would replace:
<Seq about="http://inverse.ca/sogo-integrator/extensions" isi:updateURL="http://sogo-demo.inverse.ca/plugins/updates.php?plugin=%ITEM_ID%&amp;version=%ITEM_VERSION%&amp;platform=%PLATFORM%">
by:
<Seq about="http://inverse.ca/sogo-integrator/extensions" isi:updateURL="https://sogo.acme.com/plugins/updates.php?plugin=%ITEM_ID%&amp;version=%ITEM_VERSION%&amp;platform=%PLATFORM%">
if the SOGo server is accessible from the following URL:
https://sogo.acme.com/SOGo
Note that if you changed the `x-webobjects-server-url` configuration
setting from your HTTP server configuration file for SOGo, the
value *must* match the one you specify in `isi:updateURL` – even the
port number.
Moreover, you *must* change the value of the
`sogo-integrator.autocomplete.server.urlid` preference from
`defaults/preferences/site.js` to match the identifier of your
_SOGoUserSources_. This source will be used by Thunderbird for
autocompletion.
Once you're done modifying the configuration file, save your changes and
reconstruct the XPI file. 
Now start Thunderbird and install your newly modified extension.
SOGo Update Server
------------------
In this section, you will learn how to install and configure the SOGo
Update Server.
The SOGo Update Server can be used to automatically install or uninstall
Mozilla Thunderbird extensions, push user settings and more – all from a
central place managed by system administrators.
Installation
~~~~~~~~~~~~
Installation is relatively straightforward. You need to make
the `updates.php` script available through your HTTP server at the URL
you've specified from the `extensions.rdf` file. The `updates.php`
script can be found in the SOGo sources, under the `Scripts` directory.
The `updateLink` section of the XML payload returned to sogo-integrator
is built dynamically using the `SCRIPT_URI` variable, which is only
available when running with mod_rewrite. It should work out of the box
as long as the script is placed in the same directory as the xpi files.
If it is not the case, then the link should be adjusted to fit the
actual file layout:
<em:updateLink><?php echo dirname(getenv('SCRIPT_URI')) . '/relative/path/to/' . $plugin["filename"] ?></em:updateLink>
An http request similar to the following can be used to make sure that
the generated link is correct:
http://sogo.host/path/to/updates.php?plugin=sogo-integrator@inverse.ca&version=0.00
Please refer to your HTTP server documentation for the installation and
configuration of PHP.
Configuration
~~~~~~~~~~~~~
To configure the SOGo update server, you need to modify the
`updates.php` script directly.
Adding an extension to be pushed automatically by the update server
require you to modify the `$plugins` array from updates.php and also
adjust accordingly SOGo Integrator's `extensions.rdf` file.
For example, to automatically install SOGo Connector, SOGo Integrator
and Lightning, you would have:
----
$plugins
= array( "sogo-connector@inverse.ca"
=> array( "application" => "thunderbird",
"version" => "31.0.0",
"filename" => "sogo-connector-31.0.0.xpi" ),
"sogo-integrator@inverse.ca"
=> array( "application" => "thunderbird",
"version" => "31.0.0",
"filename" => "sogo-integrator-31.0.0-sogo-demo.xpi" ),
"{e2fda1a4-762b-4020-b5ad-a41df1933103}"
=> array( "application" => "thunderbird",
"version" => "3.3.1",
"filename" => "lightning.xpi" ));
----
The syntax is:
----
"<extension ID>"
=> array( "application" => "thunderbird",
"version" => "<exact version found in the extension's install.rdf file>",
"filename" => "<exact filename on the filesystem>" )
----
The path of the filename, specified in the `filename` parameter, is
relative to the location of the `updates.php` script. For extensions
that are dependant on the architecture and operating system (Microsoft
Windows, Apple Mac OS X, etc.), they can be placed in subdirectories
relative again to the `updates.php` script (but the filename must be
identical in all subdirectories). For exemple, for Mozilla Lightning, we
could have:
----
Darwin_x86-gcc3/lightning.xpi
Linux_x86-gcc3/lightning.xpi
Linux_x86_64-gcc3/lightning.xpi
WINNT_x86-msvc/lightning.xpi
----
If you eventually want to disable an extension, that is, without
removing it from your users' computers, you can specify `disabled` as
the version number.
Next is to modify the `extensions.rdf` file. Again, to automatically
install SOGo Connector, SOGo Integrator and Lightning, you would have:
----
<li>
<Description
em:id="{e2fda1a4-762b-4020-b5ad-a41df1933103}"
em:name="Lightning"/>
</li>
<li>
<Description
em:id="sogo-integrator@inverse.ca"
em:name="SOGo Integrator"/>
</li>
<li>
<Description
em:id="sogo-connector@inverse.ca"
em:name="SOGo Connector"/>
</li>
----
Using SOGo Integrator, you can also push user-settings for any part of
Thunderbird or its extensions. There are two kind of user-settings
push:
* Settings that are pushed during the initial configuration of
Thunderbird
* Settings that are pushed upon every restart (ie., forced) of
Thunderbird
Settings that pushed are pushed during initial configuration are
controlled by the `./defaults/preferences/site.js` file from SOGo
Integrator. Here is an example:
----
pref("calendar.alarms.showmissed", false);
pref("calendar.caldav.sched.enabled", true);
----
Preferences that are forced upon every restart of Thunderbird are
controlled from the `./chrome/content/general/custom-preferences.js`
configuration file.
Here is an example:
----
force_int_pref("changequote.replyformat.format", 0);
force_bool_pref("changequote.headers.withcc", true);
force_char_pref(“foo.bar”, “zot”);
----
include::includes/additional-info.asciidoc[]
include::includes/commercial-support.asciidoc[]
@@ -0,0 +1,758 @@
Native Microsoft Outlook Configuration Guide
============================================
////
This file is part of the SOGo project.
See SOGo Native Microsoft Outlook Configuration-docinfo.xml for
authors, copyright and license information.
////
include::includes/global-attributes.asciidoc[]
About this Guide
----------------
This guide will walk you through the installation and configuration of
the native Microsoft Outlook compatibility layer SOGo offers.
Prior going over this guide, you should have a working SOGo
installation. Please refer to the _SOGo Installation and Configuration
Guide_ for more information on installing and configuring SOGo.
This guide also includes instructions for configuring Microsoft Outlook
with SOGo.
The instructions are based on version {release_version} of SOGo.
The latest version of this guide is available
at http://www.sogo.nu/downloads/documentation.html.
Introduction
------------
SOGo is a free and modern scalable groupware server. It offers shared
calendars, address books, and emails through your favourite Web browser
and by using a native client such as Mozilla Thunderbird and Lightning.
SOGo is standard-compliant. It supports CalDAV, CardDAV, GroupDAV, iMIP
and iTIP and reuses existing IMAP, SMTP and database servers — making
the solution easy to deploy and interoperable with many applications.
SOGo features:
* Scalable architecture suitable for deployments from dozen to many
thousand users
* Rich Web-based interface that shares the look and feel, the features
and the data of Mozilla Thunderbird and Lightning
* Improved integration with Mozilla Thunderbird and Lightning by using
the SOGo Connector and the SOGo Integrator
* Native compatibility for Microsoft Outlook 2003, 2007, 2010, and 2013
* Two-way synchronization support with any Microsoft ActiveSync-capable
device, and Outlook 2013
SOGo is developed by a community of developers located mainly in North
America and Europe. More information can be found
on http://www.sogo.nu/.
Architecture
------------
The following diagram demonstrates the architecture of the native
Outlook compatibility layer of SOGo.
image::images/openchange.png[]
With Samba 4 and OpenChange, Microsoft Outlook clients can communicate
natively with SOGo using the Microsoft Exchange protocol, without
requiring costly and hard-to-maintain third-party MAPI connectors for
Microsoft Outlook.
Requirements
------------
Organizations generally have solutions to authenticate users such as
LDAP servers or Microsoft Active Directory servers.
The solution being used will influence how users are provisioned in
Samba 4, a key component for native Outlook compatibility in SOGo.
LDAP Server
~~~~~~~~~~~
If your organization uses a LDAP server such OpenLDAP, Novell
eDirectory, Apache Directory or any other solution, you must use
Samba 4's internal directory server and synchronize the data between
both.
Synchronization scripts are not provided and unless you have clear-text
passwords of your existing users, they will have to be changed during
your initial synchronization so that your LDAP's server passwords are
identical to the ones from Samba 4.
Any modifications to your existing LDAP server (password change, user
addition or deletion, etc.) will have to be replicated to Samba 4's
internal directory server.
Note that if you install Samba 4 on a server that is already running a
LDAP service, you will have to change to TCP port on which your LDAP
server listens to. Samba 4 will use the TCP port 389 and it can't be
changed.
For example, with OpenLDAP, you can use the `-h` parameter for `slapd`
to make it listen on an other TCP port.
Microsoft Active Directory
~~~~~~~~~~~~~~~~~~~~~~~~~~
If your organization uses Microsoft Active Directory, Samba 4 will need
to be joined to your Active Directory domain, as a DC.
Samba 4 will be able to reuse all the information contained in Microsoft
Active Directory and no synchronization process needs to be put in place
as information will get replicated to Samba 4 automatically.
For more information on joining Samba 4 to an existing Microsoft Active
Directory domain, please refer to the Samba 4 documentation available at
the following URL:
http://wiki.samba.org/index.php/Samba4
More specifically, have a look at the `samba-tool domain join` command.
Note that joining Samba 4 to your Active Directory domain as a member
will currently not work. An authentication bug is present in Samba 4
which then prevents all Outlook users to successfully authenticate
through Samba 4. This issue has been reported to the Samba team and is
being worked on.
Other or No Solution
~~~~~~~~~~~~~~~~~~~~
If your organization neither uses a LDAP server or Microsoft Active
Directory, you can start using Samba 4 as your directory server.
Samba 4's directory can be queried over LDAP just like Microsoft Active
Directory and can also serve as a domain controller for Windows-based
environments.
For example, SOGo can very well use Samba 4's built-in directory server
to authenticate users. A SOGoUserSources entry to achieve this wold look
like this:
----
su – sogo
defaults write sogod SOGoUserSources '(
{
CNFieldName = displayName;
IDFieldName = cn;
UIDFieldName = sAMAccountName;
baseDN = "cn=Users,dc=example,dc=com";
bindDN = "cn=Administrator,cn=Users,dc=example,dc=com";
bindFields = (
sAMAccountName
);
bindPassword = "%1OpenChange";
canAuthenticate = YES;
displayName = "Shared Addresses";
hostname = "127.0.0.1";
id = samba;
isAddressBook = YES;
port = 389;
}
)'
----
Please refer to the _SOGo Installation and Configuration Guide_ for more
information regarding `SOGoUserSources`.
IMAP Server and Trust
~~~~~~~~~~~~~~~~~~~~~
An IMAP server supporting the ACL, UIDPLUS and QRESYNC IMAP extensions
is required, such as Cyrus IMAP version 2.4 or later, or Dovecot version
2.1 or later. If your current IMAP server does not support these
extensions, you can use Dovecot's proxying capabilities. The follow
configuration example makes Dovecot proxy all IMAP request to an
existing server:
----
auth_mechanisms = plain login
imapc_host = inverse.ca
imapc_port = 993
imapc_ssl = imaps
imapc_ssl_verify = no
mail_gid = imapproxy
mail_home = /home/imapproxy/%u
mail_location = imapc:~/imapc
mail_uid = imapproxy
passdb {
args = host=inverse.ca ssl=imaps port=993 ssl_ca_dir=/etc/pki/tls/certs
default_fields = userdb_imapc_user=%u userdb_imapc_password=%w
driver = imap
}
protocols = imap
ssl = no
userdb {
driver = prefetch
}
----
SOGo would then be configured to use Dovecot's proxy as the IMAP server.
Moreover, the authentication mode in use by Windows with Samba and
Exchange servers prevent the backend from knowing the real password
being used by the user. This implies that the IMAP server must accept
any passwords from the host on which Samba is running.
To accomplish this with Cyrus IMAP Server, set `sasl_pwcheck_method`
to `alwaystrue` in `/etc/imapd.conf`. You should restrain this to
an `imapd` instance dedicated to SOGo.
For Dovecot, use an authentication source similar to:
----
passdb {
driver = static
args = nopassword=y allow_nets=127.0.0.1/32
}
----
You should also make sure that you restrain this only to the SOGo
processes.
For any other IMAP server, refer to the product's documentation. If such
capability is not offered, you can alternatively define the cleartext
password for each user. Please refer to the _Adding Users_ section from
this document.
Installation
------------
This section will guide you through the installation of the native
Microsoft Outlook compatibility layer SOGo offers.
Red Hat Enterprise Linux v6 x86_64
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you are using Red Hat Enterprise Linux version 6 x86_64, packages
for Samba 4, OpenChange and SOGo and the SOGo OpenChange backend are
available from SOGo's web site. Please follow the instructions from
http://www.sogo.nu/english/downloads/backend_nightly.html.
In order to satisfy certain dependencies, you should also add the EPEL
source corresponding to your distribution and architecture. More
information on this is available here:
http://fedoraproject.org/wiki/EPEL – or more specifically,
http://fedoraproject.org/wiki/EPEL/FAQ#How_can_I_install_the_packages_from_the_EPEL_software_repository.3F.
Once ready, install the OpenChange packages on top of an existing SOGo
installation:
----
yum clean all && yum makecache
yum install samba \
openchange \
sogo-openchange-backend \
openchange-ocsmanager \
openchange-rpcproxy \
mysql-server \
MySQL-python
----
Once the packages are installed, refer to the _Configuration_ chapter
from this guide.
[NOTE]
Samba4/OpenChange are not available for now on CentOS 5 i386/x86_64,
CentOS 6 i386 and CentOS 7.
Debian 7.0 (Wheezy) and Ubuntu 12.04 (Precise Pangolin)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SOGo, OpenChange and the SOGo OpenChange backend are now
available from SOGo's web site. Please follow the instructions from
http://www.sogo.nu/english/downloads/backend.html to setup your
apt sources.
For Samba 4, you need to use the _wheezy-backports_ repository. To do so, create
`/etc/apt/sources.list.d/backports.list`:
deb http://http.debian.net/debian wheezy-backports main
On Ubuntu 12.04, you will also have to add the Wheezy sources:
deb http://ftp.us.debian.org/debian wheezy main
deb http://security.debian.org/ wheezy/updates main
Then install Samba 4 on top of an existing SOGo
installation:
----
apt-get update
apt-get -t wheezy-backports install samba samba-dev
----
Once completed, install the packages related to OpenChange and the SOGo
provider:
----
apt-get install openchangeserver \
sogo-openchange \
openchangeproxy \
python-ocsmanager \
mysql-server \
python-mysqldb
----
Once the packages are installed, refer to the _Configuration_ chapter
from this guide.
[NOTE]
On Ubuntu 12.04, the Samba init scripts need to be modified to
disable the upstart check. For more details, refer to:
https://wiki.samba.org/index.php/Samba4/InitScript
Ubuntu 14.04 (Trusty Tahr)
~~~~~~~~~~~~~~~~~~~~~~~~~~
For Ubuntu 14.04, you must not use the Debian Wheezy backports.
Please follow the instructions from
http://www.sogo.nu/english/downloads/backend.html to setup your
apt sources.
Then install Samba 4 on top of an existing SOGo
installation:
----
apt-get update
apt-get install samba samba-dev
----
Once completed, install the packages related to OpenChange and the SOGo
provider:
----
apt-get install openchangeserver \
sogo-openchange \
openchangeproxy \
python-ocsmanager \
mysql-server \
python-mysqldb
----
Once the packages are installed, refer to the _Configuration_ chapter
from this guide.
Configuration
-------------
In this section, you'll learn how to configure the native Microsoft
Outlook compatibility layer that SOGo offers.
SOGo Configuration
~~~~~~~~~~~~~~~~~~
First thing to do is to configure SOGo to use your current services,
which are your IMAP, SMTP and SQL database servers. The configuration
instructions for this are available in the SOGo Installation and
Configuration Guide available from http://www.sogo.nu/.
Please refer to that documentation before continuing with the
instructions included in this guide.
Samba 4 Configuration
~~~~~~~~~~~~~~~~~~~~~
Run the following commands as root: 
----
samba-tool domain provision --realm=example.com \
--domain=OPENCHANGE \
--adminpass='%1OpenChange' \
--server-role='domain controller'
samba-tool user setexpiry administrator --noexpiry
----
You might consider changing the realm and domain used, to suit your
enviroment.
You might also have to
remove `/etc/samba/smb.conf` prior running this command.
Add the following parameters to the `[global]` section of the
`/etc/samba/smb.conf` configuration file:
----
### Configuration required by OpenChange server ###
dcerpc endpoint servers = epmapper, mapiproxy, dnsserver
dcerpc_mapiproxy:server = true
dcerpc_mapiproxy:interfaces = exchange_emsmdb, exchange_nsp, exchange_ds_rfr
### Configuration required by OpenChange server ###
----
Your Samba 4 configuration file should look like this:
----
# Global parameters
[global]
server role = active directory domain controller
workgroup = EXAMPLE
realm = example.com
netbios name = sogo
passdb backend = samba4
### Configuration required by OpenChange server ###
dcerpc endpoint servers = +epmapper, +mapiproxy
dcerpc_mapiproxy:server = true
dcerpc_mapiproxy:interfaces = exchange_emsmdb, exchange_nsp, exchange_ds_rfr
### Configuration required by OpenChange server ###
[netlogon]
path = /var/lib/samba/sysvol/example.com/scripts
read only = No
[sysvol]
path = /var/lib/samba/sysvol
read only = No
----
OpenChange Configuration
~~~~~~~~~~~~~~~~~~~~~~~~
OpenChange 2.2 stores its metadata in MySQL so you need to have it installed.
First, create the OpenChange MySQL user:
----
$ mysql -u root -p
mysql> CREATE USER 'openchange-user'@'localhost' IDENTIFIED BY 'openchange$123';
mysql> GRANT ALL PRIVILEGES ON `openchange`.* TO 'openchange-user'@'localhost' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
----
The Samba AD schema needs to be filled with additional object
definitions by running the following commands: 
----
openchange_provision --standalone
NOTE: This operation can take several minutes
[+] Step 1: Register Exchange OIDs
[+] Step 2: Add Exchange attributes to Samba schema
[+] Step 3: Add Exchange auxiliary classes to Samba schema
[+] Step 4: Add Exchange objectCategory to Samba schema
[+] Step 5: Add Exchange containers to Samba schema
[+] Step 6: Add Exchange *sub* containers to Samba schema
[+] Step 7: Add Exchange CfgProtocol subcontainers to Samba schema
[+] Step 8: Add Exchange mailGateway subcontainers to Samba schema
[+] Step 9: Add Exchange classes to Samba schema
[+] Step 10: Add possSuperior attributes to Exchange classes
[+] Step 11: Extend existing Samba classes and attributes
[+] Step 12: Generic Exchange configuration objects
[+] Step 13: Finalize generic Exchange configuration objects
[SUCCESS] Done!
[+] Step 1: Exchange Samba registration
[SUCCESS] Done!
[+] Step 1: Register Exchange Samba as the main server
[SUCCESS] Done!
----
Create the OpenChange database: 
----
openchange_provision --openchangedb --openchangedb-uri 'mysql://openchange-user:openchange$123@localhost/openchange'
Setting up openchange db
[+] Public Folders
===================
* Public Folder Root : 0x0100000000000001 (72057594037927937)
* IPM_SUBTREE : 0x0200000000000001 (144115188075855873)
* NON_IPM_SUBTREE : 0x0300000000000001 (216172782113783809)
* EFORMS REGISTRY : 0x0400000000000001 (288230376151711745)
* OFFLINE ADDRESS BOOK : 0x0500000000000001 (360287970189639681)
* /o=First Organization/cn=addrlists/cn=oabs/cn=Default Offline Address Book: 0x0600000000000001 (432345564227567617)
* SCHEDULE+ FREE BUSY : 0x0700000000000001 (504403158265495553)
* EX:/o=first organization/ou=first administrative group: 0x0800000000000001 (576460752303423489)
* Events Root : 0x0900000000000001 (648518346341351425)
----
Finally, modify `/etc/samba/smb.conf` to specify OpenChange connection information
for its indexing database. Add the following at the end of the `[global]` section:
----
mapistore:namedproperties = mysql
namedproperties:mysql_user = openchange-user
namedproperties:mysql_pass = openchange$123
namedproperties:mysql_host = localhost
namedproperties:mysql_db = openchange
mapistore:indexing_backend = mysql://openchange-user:openchange$123@localhost/openchange
mapiproxy:openchangedb = mysql://openchange-user:openchange$123@localhost/openchange
----
On RHEL, make sure SELinux is disabled:
setenforce 0
Next, you can start Samba using the usual command:
/etc/init.d/samba start
On upstart-based distributions, use:
start samba-ad-dc
You can also launch the OpenChange web services:
/etc/init.d/openchange-ocsmanager start
Apache Configuration for Web Services
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The OpenChange web services consist of two components:
1. *OCS Manager* which is used for autodiscovery and freebusy lookups on
Outlook 2007 and 2010. This service runs in its own application server
which listens on `127.0.0.1:5000` by default. Apache needs to be
configured to forward certain requests to it to make it accessible from
the outside.
Note that this service *MUST* be accessible over*HTTPS*, otherwise Outlook
won't use it.
2. *RPC Proxy* which is used for RPC over HTTP ("Outlook Anywhere").
This service runs as a WSGI application under apache (mod_wsgi).
While HTTPS is not required to access this service, it is strongly
recommended.
On RHEL-based distributions, the apache configuration required by these
services can be found in `/etc/httpd/conf.d/ocsmanager.conf` and
`/etc/httpd/conf.d/rpcproxy.conf`.
For Debian-based distributions, these files can be found
in `/etc/apache2/conf.d/`.
The configuration requires three Apache modules:  _mod_proxy_,
_mod_proxy_http_ and _mod_wsgi_. These are usually already installed but
might need to be activated on Debian-based installations:
a2enmod proxy proxy_http wsgi
On RHEL-based distributions, make sure the `LoadModule` directive is
uncommented in `/etc/httpd/conf.d/wsgi.conf` (or
`python26-mod_wsgi.conf` on RHELv5).
The _reqtimeout_ apache module is known to cause problems when using the
default configuration shipped with Debian-based systems. On such
distributions, apache will close (HTTP/1.1 500) any HTTP request for
which the HTTP body hasn't arrived in 10 seconds.
While this is arguably good practice with regular HTTP, it will disrupt
the RPC over HTTP protocol implemented by RPC Proxy: Outlook will
continuously disconnect and reconnect leading to suboptimal performance.
To avoid this problem, use a much higher timeout or disable the module:
a2dismod reqtimeout
You should now restart the Apache service and make sure it will start on
boot. On RHEL-based distributions, do:
chkconfig httpd on && /etc/init.d/httpd restart
On Debian-based distributions, do:
update-rc.d apache2 defaults && /etc/init.d/apache2 restart
[NOTE]
Debian-based distributions are not supported anymore for
OCSManager/rpcproxy. Support will soon resume.
Name Service Configuration for Web Services
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The autodiscovery service must be made accessible in order to advertise
the web services provided by OpenChange. This can be done in two ways.
1. The first is to associate the FQDN `autodiscover.example.com.` with
the machine that hosts Samba 4 / OpenChange, by adding a `CNAME` entry
in your DNS configuration. Note that, instead or changing your DNS
server configuration, you can simply add a similar entry to the _hosts_
file of the Windows machine from where you'll run Outlook, which is
handy for testing purposes.
2. The second option is to add a `SRV` entry to your DNS configuration
where the `_service` value would be `Autodiscover` and the `_protocol`
would be `_tcp`.
For example:
_autodiscover._tcp.example.com. IN SRV 0 0 443 sogo.example.com.
Again, the autodiscovery service must be accessible over HTTPS.
Adding Users
------------
Users that wish to connect natively to SOGo must be provisioned in
Samba 4 and in OpenChange – even if they already exist in your current
LDAP or Microsoft Active Directory server.
To add a user, execute the following commands: 
----
# add user to samba
samba-tool domain passwordsettings set --complexity=off
samba-tool domain passwordsettings set --min-pwd-length=1
samba-tool user add <username>
samba-tool user setexpiry <username> --noexpiry
# create user in openchange
openchange_newuser --create <username>
----
If you don't have a trust between your IMAP server and SOGo, you must at
this point set the cleartext password of the newly created user in
`/var/lib/samba/private/mapistore/<username/password`.
This per-user file contains the cleartext password of the user as a
UTF-8 string, on a single line. This password will be used to
authenticate SOGo/OpenChange storage provider to your IMAP server.
Microsoft Outlook Configuration
-------------------------------
To connect Microsoft Outlook, you can either use the IP address of the
server or its DNS name. If you prefer using the DNS name, add an entry
like the following to the `c:\windows\system32\drivers\etc\hosts` file
in order to associate the IP address with the right DNS names:
192.168.1.1 sogo.example.com autodiscover.example.com
Next, you must configure Microsoft Outlook.
* Open the Control Panel => Mail => Email Accounts.
* Select _Add a new e-mail account_
* Choose _Microsoft Exchange Server_
* Fill the required information. Enter the DNS name or the IP address of
your SOGo server in the _Microsoft Exchange Server_ field
* Leave the _Use Cached Exchange Mode_ checkbox enabled
* Enter your username in the _User Name_ field
* Click on _More Settings_ and ignore the warning, if any, about
Exchange being offline by clicking on Cancel
* From the Security tab, enable Always prompt for user name and password
* From the _Connection_ tab, enable _"Outlook Anywhere"_ if you plan to
use Outlook outside of your LAN. Moreover, click on the _Exchange Proxy
Settings..._ button to enable it for slow and fast networks. Specify
also the host, which should be the same value you specified in the
Microsoft Exchange Server field.
* Finally, click on Check Name and confirm your username and password
Start Microsoft Outlook and enter your username and password. It will
start to synchronize your mailbox. This could take a long time if you
have many emails, events, tasks and contacts. Once this step is
completed, check the autodiscovery service with Outlook 2007 or 2010 by
simultaneously holding the CTRL key on your keyboard and right-clicking
on the Outlook icon in the notification toolbar. A special entry named
"Test E-mail AutoConfiguration..." will appear and will enable you to
check the service.
Known Issues or Limitations
---------------------------
* Make sure you periodically backup all your data regarding SOGo.
* Make sure you have no firewalls activated between your Microsoft
Outlook clients and the SOGo server with Native Outlook Compatibility
module. If you do, use "Outlook Anywhere" to connect Outlook to
SOGo/OpenChange.
Current Limitations
~~~~~~~~~~~~~~~~~~~
The current version of the Native Microsoft Outlook compatibility layer
has some limitations.
Those limitations will be overcome in the upcoming releases. If you are
interested in having those limitations fixed more rapidly, please
contact Inverse by sending an email to support@inverse.ca.
General
^^^^^^^
* If you can't see any email's content with Microsoft Outlook 2007,
install the latest Service Pack available from Microsoft's website for
this specific version. Microsoft Outlook 2007 (12.0.6423.100) SP2 MSO
(12.0.6425.1000) is known to work.
* When you create a new Microsoft Outlook profile, not all folders might
be synchronized during the first start. Simply select the appropriate
folder and click "Send and Receive". Synchronizing a folder may take
some time. For example, a folder with 1000 email messages might take
around 5 minutes based on the underlying hardware.
* Errors when synchronizing the "Offline Address Book" are normal and
can be ignored for now. This feature is currently not supported.
* If you face strange issues from Microsoft Outlook, you might want to
remove any data associated with the user from the SOGo server and
recreate a Microsoft Outlook profile.
To remove any data associated to a user, use
the `openchange_user_cleanup` script distributed with SOGo. The script
can be found in `/usr/share/doc/sogo/` (`/usr/share/sogo-VERSION/` on
RHEL).
To reset a user, run the script as root:
`python openchange_user_cleanup username`. See the usage output for additional options.
* The "Out of Office Assistant" will not currently work. This feature
has not been implemented.
* Creating folders below INBOX (when not normally permitted by the IMAP
server), below the Personal Calendar or Personal Address Book will work
in Outlook cached mode but the server-side operation will fail and these
folders will never be created. Potentially data loss can occur if the
Outlook profile is destroyed. If you wan to create additional top-level
mail folders, calendars or address books, open Outlook's folder list,
select the top level node (usually, "email@example.com") and choose "New
Folder..." from the contextual menu. Choose the relevant item types.
Mail
^^^^
* Sharing mail folders is not supported.
* To avoid possibly lossy conversion from RTF to HTML, Outlook should be
configured to send all mails as HTML (or plaintext) instead of _Outlook
Rich Text Format_.
Calendar
^^^^^^^^
* Labels will not work.
* It might be impossible to view event details from a shared calendar.
This issue is being worked on.
Tasks
^^^^^
* Tasks with start/due dates created from Outlook might not appear
correctly in SOGo due to a timezone issue.
* Reminders are not yet supported.
* Assigning tasks will not work.
Contacts
^^^^^^^^
* Categories will not work.
* Distribution lists will not work.
* Under Microsoft Outlook 2010, the special folder "Suggested Contacts"
will not work.
* The "Offline Address Book" will not work. This feature is not yet
supported.
Notes
^^^^^
* Notes are not synchronized in any ways with SOGo. The current version
of SOGo lacks support for notes.
If you notice anything else, please send contact Inverse by sending an
email to support@inverse.ca.
include::includes/additional-info.asciidoc[]
include::includes/commercial-support.asciidoc[]
Binary file not shown.

Before

Width:  |  Height:  |  Size: 401 KiB

+16
View File
@@ -0,0 +1,16 @@
#
# fop fix to build our documentation on CentOS 6
#
# Inverse inc. <info@inverse.ca>
#
--- /usr/bin/fop.orig 2012-01-17 21:25:50.000000000 -0500
+++ /usr/bin/fop 2012-01-17 21:26:04.000000000 -0500
@@ -26,7 +26,7 @@
# Set parameters
set_jvm
set_classpath commons-io batik-all avalon-framework xmlgraphics-commons \
- commons-logging fop
+ commons-logging fop xalan-j2
set_flags $BASE_FLAGS
set_options $BASE_OPTIONS
@@ -0,0 +1,17 @@
#
# xmlgraphics-fop fix to build our documentation on CentOS 5
# taken from https://build.opensuse.org/request/show/68994
#
# Inverse inc. <info@inverse.ca>
#
--- /usr/bin/xmlgraphics-fop.orig 2012-01-17 18:42:08.000000000 -0500
+++ /usr/bin/xmlgraphics-fop 2012-01-17 18:42:18.000000000 -0500
@@ -24,7 +24,7 @@
# Rest of the configuration
MAIN_CLASS=org.apache.fop.cli.Main
-BASE_JARS="xmlgraphics-fop xmlgraphics-batik/util xml-commons-jaxp-1.3-apis excalibur/avalon-framework-api xerces-j2 xalan-j2 xalan-j2-serializer"
+BASE_JARS="xmlgraphics-fop batik-all xml-commons-jaxp-1.3-apis excalibur/avalon-framework-impl excalibur/avalon-framework-api xerces-j2 xalan-j2 xalan-j2-serializer"
# Set parameters
set_jvm
@@ -0,0 +1,107 @@
<?xml version='1.0'?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
version="1.0">
<!-- ********************************************************************
Header / Footer customizations
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2011-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
******************************************************************** -->
<!--
Here we are re-defining docbook-xsl/fo/pagesetup.xsl to fit our needs.
- top: chapter number on the left
- bottom: copyright, chapter name, page
-->
<xsl:param name="header.rule" select="0"/>
<xsl:template name="header.content">
<xsl:param name="pageclass" select="''"/>
<xsl:param name="sequence" select="''"/>
<xsl:param name="position" select="''"/>
<xsl:param name="gentext-key" select="''"/>
<fo:block>
<!-- sequence can be odd, even, first, blank -->
<!-- position can be left, center, right -->
<xsl:choose>
<xsl:when test="$sequence = 'blank'">
<!-- nothing -->
</xsl:when>
<xsl:when test="($sequence='first' or $sequence='odd' or $sequence='even') and $position='left'">
<xsl:if test="$pageclass != 'titlepage' and $pageclass != 'lot'">
<xsl:call-template name="gentext">
<xsl:with-param name="key" select="'chapter'"/>
</xsl:call-template>
<xsl:call-template name="gentext.space"/>
<xsl:number count="chapter" from="book" level="any"/>
</xsl:if>
</xsl:when>
<!-- draft -->
<xsl:when test="$position='right'">
<xsl:call-template name="draft.text"/>
</xsl:when>
<xsl:otherwise>
<!-- nop -->
</xsl:otherwise>
</xsl:choose>
</fo:block>
</xsl:template>
<xsl:param name="footer.rule" select="0"/>
<xsl:template name="footer.content">
<xsl:param name="pageclass" select="''"/>
<xsl:param name="sequence" select="''"/>
<xsl:param name="position" select="''"/>
<xsl:param name="gentext-key" select="''"/>
<fo:block>
<!-- pageclass can be front, body, back -->
<!-- sequence can be odd, even, first, blank -->
<!-- position can be left, center, right -->
<xsl:choose>
<xsl:when test="$pageclass = 'titlepage'">
<!-- nop; no footer on title pages -->
</xsl:when>
<xsl:when test="$double.sided = 0 and $position='left'">
<xsl:apply-templates select="//copyright[1]" mode="titlepage.mode"/>
</xsl:when>
<xsl:when test="($sequence='first' or $sequence='odd' or $sequence='even') and $position='center'">
<xsl:if test="$pageclass != 'titlepage' and $pageclass != 'lot'">
<xsl:apply-templates select="." mode="titleabbrev.markup"/>
</xsl:if>
</xsl:when>
<xsl:when test="$double.sided = 0 and $position='right'">
<fo:page-number/>
</xsl:when>
<xsl:when test="$sequence='blank'">
<!-- nop -->
</xsl:when>
<xsl:otherwise>
<!-- nop -->
</xsl:otherwise>
</xsl:choose>
</fo:block>
</xsl:template>
</xsl:stylesheet>
<!-- vim: set shiftwidth=2 tabstop=2 expandtab: -->
+182
View File
@@ -0,0 +1,182 @@
<?xml version='1.0'?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
version="1.0">
<!-- ********************************************************************
SOGo Documentation Docbook FO Parameters
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2011-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
******************************************************************** -->
<!--
Global Tasks
TODO prettier revhistory
TODO prettier Table of Contents
TODO generate PDF table of contents (like OSX's Preview shows on the right hand side)
TODO title 2
- align with text?
- more above whitespace
TODO change the bullet for a prettier one
TODO title 3 and 4
- align with text?
- should be easier to differentiate (check network guide)
TODO icon on line wrap in monospace boxes
TODO caution, notes, warnings, etc.
- box around it
- sexy icon
TODO -> is converted into an arrow but it's not pretty (is it font or docbook-thingy?)
-->
<!--
Load default values
Real upstream schema is at:
<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
but we decided to load all sensible local xsd since it only produce a warning on missing imports.
-->
<!-- CentOS / RHEL -->
<xsl:import href="/usr/share/sgml/docbook/xsl-stylesheets/fo/docbook.xsl"/>
<!-- Debian / Ubuntu -->
<xsl:import href="/usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl"/>
<!-- OSX through mac ports -->
<xsl:import href="/opt/local/share/xsl/docbook-xsl/fo/docbook.xsl"/>
<!-- title page extra styling -->
<xsl:import href="titlepage-fo.xsl"/>
<!-- header / footer extra styling -->
<xsl:import href="headerfooter-fo.xsl"/>
<!-- attaching an image to the verso legalnotice component -->
<xsl:template match="legalnotice" mode="book.titlepage.verso.mode">
<xsl:apply-templates mode="titlepage.mode"/>
<fo:block text-align="right">
<fo:external-graphic src="url('images/inverse-logo.jpg')" width="3in" content-width="scale-to-fit"/>
</fo:block>
</xsl:template>
<!-- stylesheet options -->
<xsl:param name="title.font.family">Lato-Medium</xsl:param>
<xsl:param name="chapter.autolabel" select="0"/>
<xsl:attribute-set name="component.title.properties">
<xsl:attribute name="padding-bottom">2.5em</xsl:attribute>
<xsl:attribute name="border-bottom">solid 2px</xsl:attribute>
<xsl:attribute name="margin-bottom">1em</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="section.title.level1.properties">
<xsl:attribute name="border-bottom">solid 1px</xsl:attribute>
<xsl:attribute name="margin-top">2em</xsl:attribute>
<xsl:attribute name="margin-bottom">1em</xsl:attribute>
</xsl:attribute-set>
<!-- titles spacing -->
<xsl:attribute-set name="section.title.level2.properties">
<xsl:attribute name="margin-top">1em</xsl:attribute>
</xsl:attribute-set>
<!-- default fonts -->
<xsl:param name="body.font.family">Lato-Light</xsl:param>
<xsl:param name="body.font.master">10</xsl:param>
<xsl:param name="monospace.font.family">Incosolata</xsl:param>
<!-- revision table layout -->
<xsl:attribute-set name="revhistory.title.properties">
<xsl:attribute name="font-size">12pt</xsl:attribute>
<xsl:attribute name="font-weight">bold</xsl:attribute>
<xsl:attribute name="text-align">center</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="revhistory.table.properties">
<xsl:attribute name="break-before">page</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="revhistory.table.cell.properties">
<xsl:attribute name="border-bottom">1px solid</xsl:attribute>
</xsl:attribute-set>
<!-- Table Of Contents (TOC) options -->
<!-- We only want 2 level of ToC depth -->
<xsl:param name="toc.section.depth" select="1"/>
<!-- titles left margin -->
<xsl:attribute-set name="section.title.properties">
<xsl:attribute name="start-indent"><xsl:value-of select="$body.start.indent"/></xsl:attribute>
</xsl:attribute-set>
<!-- lists type -->
<xsl:template name="itemizedlist.label.markup">
<xsl:param name="itemsymbol" select="'square'"/>
<xsl:choose>
<xsl:when test="$itemsymbol='square'"><fo:inline font-family="Lato-Light">&#x25aa;</fo:inline></xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="next.itemsymbol">
<xsl:param name="itemsymbol" select="'default'"/>
<xsl:choose>
<xsl:otherwise>square</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- admonition -->
<xsl:param name="admon.graphics" select="1"></xsl:param>
<xsl:param name="admon.graphics.path">images/</xsl:param>
<xsl:param name="admon.graphics.extension">.png</xsl:param>
<xsl:attribute-set name="graphical.admonition.properties">
<xsl:attribute name="border-top">1px solid</xsl:attribute>
<xsl:attribute name="border-bottom">1px solid</xsl:attribute>
<xsl:attribute name="padding-top">0.5em</xsl:attribute>
<xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
<xsl:attribute name="margin-left">2em</xsl:attribute>
</xsl:attribute-set>
<!-- grey boxes around code (screen, programlisting) -->
<xsl:param name="shade.verbatim" select="1"/>
<xsl:attribute-set name="shade.verbatim.style">
<xsl:attribute name="background-color">#E0E0E0</xsl:attribute>
<xsl:attribute name="border">thin #9F9F9F solid</xsl:attribute>
<xsl:attribute name="margin">0pt</xsl:attribute>
<xsl:attribute name="padding">0.5em</xsl:attribute>
<!-- prevent page breaks in screen and programlisting tags -->
<xsl:attribute name="keep-together.within-column">always</xsl:attribute>
</xsl:attribute-set>
<!-- breaking long lines in code (screen, programlisting) -->
<xsl:attribute-set name="monospace.verbatim.properties">
<xsl:attribute name="wrap-option">wrap</xsl:attribute>
</xsl:attribute-set>
<!-- don't show raw links in [ .. ] after a link -->
<xsl:param name="ulink.show" select="0"/>
<!-- blue underlined hyperlink -->
<xsl:attribute-set name="xref.properties">
<xsl:attribute name="color">blue</xsl:attribute>
<xsl:attribute name="text-decoration">underline</xsl:attribute>
</xsl:attribute-set>
<!-- strong emphasis in bold -->
<xsl:template match="emphasis[@role='strong']">
<fo:inline font-family="Lato" font-weight="normal">
<xsl:apply-templates/>
</fo:inline>
</xsl:template>
<!-- copyright in range instead of seperated years -->
<xsl:param name="make.year.ranges" select="1" />
<!-- variablelist behavior (asciidoc's term:: lists) -->
<!-- <xsl:param name="variablelist.term.break.after" select="1" /> -->
</xsl:stylesheet>
<!-- vim: set shiftwidth=2 tabstop=2 expandtab: -->
@@ -0,0 +1,96 @@
<!DOCTYPE t:templates [
<!ENTITY hsize0 "10pt">
<!ENTITY hsize1 "12pt">
<!ENTITY hsize2 "14.4pt">
<!ENTITY hsize3 "17.28pt">
<!ENTITY hsize4 "20.736pt">
<!ENTITY hsize5 "24.8832pt">
<!ENTITY hsize0space "7.5pt"> <!-- 0.75 * hsize0 -->
<!ENTITY hsize1space "9pt"> <!-- 0.75 * hsize1 -->
<!ENTITY hsize2space "10.8pt"> <!-- 0.75 * hsize2 -->
<!ENTITY hsize3space "12.96pt"> <!-- 0.75 * hsize3 -->
<!ENTITY hsize4space "15.552pt"> <!-- 0.75 * hsize4 -->
<!ENTITY hsize5space "18.6624pt"> <!-- 0.75 * hsize5 -->
]>
<t:templates xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0"
xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- ********************************************************************
SOGo title page
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2011-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
******************************************************************** -->
<!--
If you make changes you need to rebuild XSL:
xsltproc -o docs/docbook/xsl/titlepage-fo.xsl \
/usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl \
docs/docbook/xsl/titlepage-fo.xml
On some platforms the titlepage.xsl is located elsewhere:
* OSX: /opt/local/share/xsl/docbook-xsl/template/titlepage.xsl
This is a customized version of docbook-xsl/fo/titlepage.templates.xml.
I removed every section except the book one. Feel free to add more if more
customization are required.
-->
<t:titlepage t:element="book" t:wrapper="fo:block">
<t:titlepage-content t:side="recto">
<mediaobject/>
<title
t:named-template="division.title"
param:node="ancestor-or-self::book[1]"
text-align="right"
font-size="&hsize5;"
space-before="&hsize5space;"
font-weight="bold"
font-family="{$title.fontset}"
margin-top="8em"/>
<subtitle
text-align="right"
font-size="&hsize4;"
space-before="&hsize4space;"
font-family="{$title.fontset}"
border-bottom="solid"/>
</t:titlepage-content>
<t:titlepage-content t:side="verso">
<title
font-size="&hsize2;"
font-weight="bold"
font-family="{$title.fontset}"/>
<corpauthor/>
<authorgroup t:named-template="verso.authorgroup"/>
<author/>
<othercredit/>
<releaseinfo space-before="0.5em"/>
<pubdate space-before="1em"/>
<copyright/>
<abstract/>
<legalnotice font-size="8pt"/>
</t:titlepage-content>
<t:titlepage-separator>
<fo:block break-after="page"/>
</t:titlepage-separator>
<t:titlepage-before t:side="recto">
</t:titlepage-before>
<t:titlepage-before t:side="verso">
<fo:block break-after="page"/>
</t:titlepage-before>
</t:titlepage>
</t:templates>
+208
View File
@@ -0,0 +1,208 @@
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="exsl">
<!-- This stylesheet was created by template/titlepage.xsl-->
<xsl:template name="book.titlepage.recto">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/mediaobject"/>
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/mediaobject"/>
<xsl:choose>
<xsl:when test="bookinfo/title">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/title"/>
</xsl:when>
<xsl:when test="info/title">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/title"/>
</xsl:when>
<xsl:when test="title">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="title"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="bookinfo/subtitle">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/subtitle"/>
</xsl:when>
<xsl:when test="info/subtitle">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/subtitle"/>
</xsl:when>
<xsl:when test="subtitle">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="subtitle"/>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="book.titlepage.verso">
<xsl:choose>
<xsl:when test="bookinfo/title">
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/title"/>
</xsl:when>
<xsl:when test="info/title">
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/title"/>
</xsl:when>
<xsl:when test="title">
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="title"/>
</xsl:when>
</xsl:choose>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/corpauthor"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/corpauthor"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/authorgroup"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/authorgroup"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/author"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/author"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/othercredit"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/othercredit"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/releaseinfo"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/releaseinfo"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/pubdate"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/pubdate"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/copyright"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/copyright"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/abstract"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/abstract"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/legalnotice"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/legalnotice"/>
</xsl:template>
<xsl:template name="book.titlepage.separator"><fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" break-after="page"/>
</xsl:template>
<xsl:template name="book.titlepage.before.recto">
</xsl:template>
<xsl:template name="book.titlepage.before.verso"><fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" break-after="page"/>
</xsl:template>
<xsl:template name="book.titlepage">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:variable name="recto.content">
<xsl:call-template name="book.titlepage.before.recto"/>
<xsl:call-template name="book.titlepage.recto"/>
</xsl:variable>
<xsl:variable name="recto.elements.count">
<xsl:choose>
<xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
<xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
<!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
<fo:block><xsl:copy-of select="$recto.content"/></fo:block>
</xsl:if>
<xsl:variable name="verso.content">
<xsl:call-template name="book.titlepage.before.verso"/>
<xsl:call-template name="book.titlepage.verso"/>
</xsl:variable>
<xsl:variable name="verso.elements.count">
<xsl:choose>
<xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
<xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
<!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
<fo:block><xsl:copy-of select="$verso.content"/></fo:block>
</xsl:if>
<xsl:call-template name="book.titlepage.separator"/>
</fo:block>
</xsl:template>
<xsl:template match="*" mode="book.titlepage.recto.mode">
<!-- if an element isn't found in this mode, -->
<!-- try the generic titlepage.mode -->
<xsl:apply-templates select="." mode="titlepage.mode"/>
</xsl:template>
<xsl:template match="*" mode="book.titlepage.verso.mode">
<!-- if an element isn't found in this mode, -->
<!-- try the generic titlepage.mode -->
<xsl:apply-templates select="." mode="titlepage.mode"/>
</xsl:template>
<xsl:template match="mediaobject" mode="book.titlepage.recto.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style">
<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="title" mode="book.titlepage.recto.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" text-align="right" font-size="24.8832pt" space-before="18.6624pt" font-weight="bold" font-family="{$title.fontset}" margin-top="8em">
<xsl:call-template name="division.title">
<xsl:with-param name="node" select="ancestor-or-self::book[1]"/>
</xsl:call-template>
</fo:block>
</xsl:template>
<xsl:template match="subtitle" mode="book.titlepage.recto.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" text-align="right" font-size="20.736pt" space-before="15.552pt" font-family="{$title.fontset}" border-bottom="solid">
<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="title" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" font-size="14.4pt" font-weight="bold" font-family="{$title.fontset}">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="corpauthor" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="authorgroup" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
<xsl:call-template name="verso.authorgroup">
</xsl:call-template>
</fo:block>
</xsl:template>
<xsl:template match="author" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="othercredit" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="releaseinfo" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" space-before="0.5em">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="pubdate" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" space-before="1em">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="copyright" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="abstract" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="legalnotice" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" font-size="8pt">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
</xsl:stylesheet>
+24
View File
@@ -0,0 +1,24 @@
<!-- TODO have the build system take care of this -->
<releaseinfo>Version 2.2.10 - November 2014</releaseinfo>
<subtitle>for version 2.2.10</subtitle>
<date>2014-11-21</date>
<legalnotice>
<para>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. A copy of the license is included in the section entitled "GNU Free Documentation License".</para>
<!-- font licenses -->
<para>The fonts used in this guide are licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: <ulink url="http://scripts.sil.org/OFL">http://scripts.sil.org/OFL</ulink></para>
<para>Copyright © Łukasz Dziedzic, <ulink url="http://www.latofonts.com/">http://www.latofonts.com</ulink>, with Reserved Font Name: "Lato".</para>
<para>Copyright © Raph Levien, <ulink url="http://levien.com/">http://levien.com/</ulink>, with Reserved Font Name: "Inconsolata".</para>
</legalnotice>
<mediaobject>
<objectinfo>
<corpname>Inverse inc.</corpname>
</objectinfo>
<textobject>
<phrase>SOGo logo</phrase>
</textobject>
<imageobject>
<imagedata align="left" width="4in" format="PNG" fileref="images/sogo-logo.png" />
</imageobject>
</mediaobject>
+32
View File
@@ -0,0 +1,32 @@
<fop version="1.0">
<renderers>
<renderer mime="application/pdf">
<fonts>
<font metrics-url="fonts/inconsolata.xml" kerning="yes" embed-url="fonts/inconsolata.ttf">
<font-triplet name="Incosolata" style="normal" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-Regular.xml" kerning="yes" embed-url="fonts/lato/Lato-Regular.ttf">
<font-triplet name="Lato" style="normal" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-Italic.xml" kerning="yes" embed-url="fonts/lato/Lato-Italic.ttf">
<font-triplet name="Lato" style="italic" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-Light.xml" kerning="yes" embed-url="fonts/lato/Lato-Light.ttf">
<font-triplet name="Lato-Light" style="normal" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-LightItalic.xml" kerning="yes" embed-url="fonts/lato/Lato-LightItalic.ttf">
<font-triplet name="Lato-Light" style="italic" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-Medium.xml" kerning="yes" embed-url="fonts/lato/Lato-Medium.ttf">
<font-triplet name="Lato-Medium" style="normal" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-MediumItalic.xml" kerning="yes" embed-url="fonts/lato/Lato-MediumItalic.ttf">
<font-triplet name="Lato-Medium" style="italic" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-Semibold.xml" kerning="yes" embed-url="fonts/lato/Lato-Semibold.ttf">
<font-triplet name="Lato-Semibold" style="normal" weight="normal"/>
</font>
</fonts>
</renderer>
</renderers>
</fop>
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Inconsolata</font-name><full-name>Inconsolata</full-name><family-name>Inconsolata</family-name><embed/><cap-height>624</cap-height><x-height>458</x-height><ascender>820</ascender><descender>-180</descender><bbox><left>-1</left><bottom>-177</bottom><right>510</right><top>835</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="3" ue="126" us="32"/><bf gi="98" ue="255" us="160"/><bf gi="194" ue="263" us="258"/><bf gi="200" ue="273" us="268"/><bf gi="206" ue="283" us="280"/><bf gi="210" ue="287" us="286"/><bf gi="212" ue="305" us="304"/><bf gi="214" ue="314" us="312"/><bf gi="217" ue="318" us="317"/><bf gi="219" ue="324" us="321"/><bf gi="223" ue="328" us="327"/><bf gi="225" ue="331" us="330"/><bf gi="227" ue="333" us="333"/><bf gi="228" ue="341" us="336"/><bf gi="234" ue="347" us="344"/><bf gi="238" ue="357" us="350"/><bf gi="246" ue="369" us="366"/><bf gi="250" ue="382" us="376"/><bf gi="257" ue="402" us="402"/><bf gi="258" ue="567" us="567"/><bf gi="259" ue="711" us="710"/><bf gi="261" ue="713" us="713"/><bf gi="262" ue="715" us="715"/><bf gi="263" ue="733" us="728"/><bf gi="269" ue="8218" us="8216"/><bf gi="272" ue="8222" us="8220"/><bf gi="275" ue="8226" us="8224"/><bf gi="278" ue="8230" us="8230"/><bf gi="279" ue="8250" us="8249"/><bf gi="281" ue="8260" us="8260"/><bf gi="282" ue="8308" us="8308"/><bf gi="283" ue="8364" us="8364"/><bf gi="284" ue="8482" us="8482"/><bf gi="285" ue="8593" us="8593"/><bf gi="286" ue="8595" us="8595"/><bf gi="287" ue="8722" us="8722"/><bf gi="288" ue="9251" us="9251"/><bf gi="0" ue="65535" us="65535"/></bfranges><cid-widths start-index="0"><wx w="500"/><wx w="0"/><wx w="333"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wLine truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Black</font-name><full-name>Lato Black</full-name><family-name>Lato</family-name><embed/><cap-height>728</cap-height><x-height>518</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-654</left><bottom>-299</bottom><right>1356</right><top>1116</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us=Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-BlackItalic</font-name><full-name>Lato Black Italic</full-name><family-name>Lato</family-name><embed/><cap-height>728</cap-height><x-height>518</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-537</left><bottom>-297</bottom><right>1295</right><top>1114</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276Line truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Bold</font-name><full-name>Lato Bold</full-name><family-name>Lato</family-name><embed/><cap-height>723</cap-height><x-height>513</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-603</left><bottom>-285</bottom><right>1344</right><top>1099</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us="2Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-BoldItalic</font-name><full-name>Lato Bold Italic</full-name><family-name>Lato</family-name><embed/><cap-height>723</cap-height><x-height>513</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-520</left><bottom>-283</bottom><right>1293</right><top>1097</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276" Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Hairline</font-name><full-name>Lato Hairline</full-name><family-name>Lato</family-name><embed/><cap-height>700</cap-height><x-height>490</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-459</left><bottom>-259</bottom><right>1340</right><top>1034</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="29Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-HairlineItalic</font-name><full-name>Lato Hairline Italic</full-name><family-name>Lato</family-name><embed/><cap-height>700</cap-height><x-height>490</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-459</left><bottom>-259</bottom><right>1286</right><top>1034</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gLine truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Heavy</font-name><full-name>Lato Heavy</full-name><family-name>Lato</family-name><embed/><cap-height>725</cap-height><x-height>515</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-626</left><bottom>-291</bottom><right>1345</right><top>1107</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us=Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-HeavyItalic</font-name><full-name>Lato Heavy Italic</full-name><family-name>Lato</family-name><embed/><cap-height>725</cap-height><x-height>515</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-528</left><bottom>-289</bottom><right>1294</right><top>1105</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276Line truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Italic</font-name><full-name>Lato Italic</full-name><family-name>Lato</family-name><embed/><cap-height>716</cap-height><x-height>506</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-501</left><bottom>-268</bottom><right>1290</right><top>1077</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276" ue="293" Line truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Light</font-name><full-name>Lato Light</full-name><family-name>Lato</family-name><embed/><cap-height>707</cap-height><x-height>497</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-479</left><bottom>-263</bottom><right>1341</right><top>1055</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us=Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-LightItalic</font-name><full-name>Lato Light Italic</full-name><family-name>Lato</family-name><embed/><cap-height>707</cap-height><x-height>497</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-479</left><bottom>-263</bottom><right>1288</right><top>1054</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276Line truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Medium</font-name><full-name>Lato Medium</full-name><family-name>Lato</family-name><embed/><cap-height>717</cap-height><x-height>507</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-556</left><bottom>-270</bottom><right>1343</right><top>1082</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" uLine truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-MediumItalic</font-name><full-name>Lato Medium Italic</full-name><family-name>Lato</family-name><embed/><cap-height>717</cap-height><x-height>507</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-504</left><bottom>-269</bottom><right>1291</right><top>1080</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="2Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Regular</font-name><full-name>Lato Regular</full-name><family-name>Lato</family-name><embed/><cap-height>716</cap-height><x-height>506</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-546</left><bottom>-268</bottom><right>1342</right><top>1078</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293"Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Semibold</font-name><full-name>Lato Semibold</full-name><family-name>Lato</family-name><embed/><cap-height>720</cap-height><x-height>510</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-576</left><bottom>-277</bottom><right>1343</right><top>1090</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="29Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-SemiboldItalic</font-name><full-name>Lato Semibold Italic</full-name><family-name>Lato</family-name><embed/><cap-height>720</cap-height><x-height>510</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-511</left><bottom>-275</bottom><right>1291</right><top>1088</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gLine truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Thin</font-name><full-name>Lato Thin</full-name><family-name>Lato</family-name><embed/><cap-height>703</cap-height><x-height>493</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-467</left><bottom>-261</bottom><right>1340</right><top>1042</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us="2Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-ThinItalic</font-name><full-name>Lato Thin Italic</full-name><family-name>Lato</family-name><embed/><cap-height>703</cap-height><x-height>493</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-467</left><bottom>-261</bottom><right>1287</right><top>1042</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276" Line truncated
+41
View File
@@ -0,0 +1,41 @@
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the copyright statement(s).
"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

File renamed without changes.
File renamed without changes.
@@ -0,0 +1,27 @@
////
Additional information section
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2008-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
////
Additional Information
----------------------
For more information, please consult the online FAQs (Frequently Asked
Questions) :
http://www.sogo.nu/english/support/faq.html
You can also read the mailing archives or post your questions to it. For
details, see :
https://lists.inverse.ca/sogo
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
@@ -0,0 +1,26 @@
////
Commercial support section
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2008-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
////
Commercial Support and Contact Information
------------------------------------------
For any questions or comments, do not hesitate to contact us by writing
an email to :
mailto:support@inverse.ca[support@inverse.ca]
Inverse (http://inverse.ca/[http://inverse.ca]) offers professional
services around SOGo to help organizations deploy the solution and
migrate from their legacy systems.
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
@@ -0,0 +1,18 @@
////
Global Attributes for our documentation
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2008-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
////
// TODO have the build system take care of this
:release_version: 2.2.10
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
+19
View File
@@ -0,0 +1,19 @@
////
License section
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2008-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
////
GNU Free Documentation License
------------------------------
Please refer to http://www.gnu.org/licenses/fdl-1.2.txt for the full license.
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

-1
View File
@@ -6,7 +6,6 @@ include $(GNUSTEP_MAKEFILES)/common.make
SUBPROJECTS = \
SOPE/NGCards \
SOPE/GDLContentStore \
OGoContentStore \
SoObjects \
Main \
UI \
+1 -2
View File
@@ -6,8 +6,7 @@ include ../Version
ADDITIONAL_OBJCFLAGS += -fPIE
ADDITIONAL_INCLUDE_DIRS +=
ADDITIONAL_LIB_DIRS += -L../SOPE/GDLContentStore/obj/
ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -fPIE -pie
ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -fPIE -pie -Wl,--rpath,$(GNUSTEP_SYSTEM_LIBRARIES)/sogo
SOGOD = sogod
TOOL_NAME = $(SOGOD)
+3 -6
View File
@@ -9,15 +9,12 @@ ADDITIONAL_INCLUDE_DIRS += \
-I..
ADDITIONAL_LIB_DIRS += \
-L../SoObjects/SOGo/SOGo.framework \
-L../OGoContentStore/$(GNUSTEP_OBJ_DIR)/ \
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/
SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib
-L../SoObjects/SOGo/SOGo.framework/sogo \
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \
-L../SOPE/GDLContentStore/$(GNUSTEP_OBJ_DIR)/
$(SOGOD)_TOOL_LIBS += \
-lSOGo \
-lOGoContentStore \
-lGDLContentStore \
-lGDLAccess \
-lWEExtensions \
+93
View File
@@ -1,3 +1,96 @@
2.2.10 (2014-11-21)
-------------------
Enhancements
- no longer leaking database passwords in the logs (#2953)
- added support for multiple calendars and address books over ActiveSync
- updated timezone information (#2968)
- updated Brazilian Portuguese, Czech, Dutch, Finnish, French, German, Hungarian, Polish,
Russian, Spanish (Argentina), and Spanish (Spain) translations
- updated CKEditor to version 4.4.5
Bug fixes
- fixed freebusy lookup with "Show time as busy" (#2930)
- don't escape <br>'s in a card's note field
- fixed folder's display name when subscribing to a folder
- fixed folder's display name when the active user subscribes another user to one of her/his folders
- fixed error with new user default sorting value for the mailer module (#2952)
- fixed ActiveSync PING command flooding the server (#2940)
- fixed many interop issues with Windows Phones over ActiveSync
- fixed automatic return receipts crash when not in the recepient list (#2965)
- fixed support for Sieve folder encoding parameter (#2622)
- fixed rename of subscribed addressbooks
- sanitize strings before escaping them when using EAS
- fixed handling of event invitations on iOS/EAS with no organizer (#2978)
- fixed corrupted png files (#2975)
- improved dramatically the BSON decoding speed
- added WindowSize support for GCS collections when using EAS
- fixed IMAP search with non-ASCII folder names
- fixed extraction of email addresses when pasting text with tabs (#2945)
- fixed Outlook attachment corruption issues when using AES (#2957)
2.2.9a (2014-09-29)
-------------------
Bug fixes
- correctly skip unallowed characters (#2936)
2.2.9 (2014-09-26)
------------------
New features
- support for recurrent tasks (#2160)
- support for alarms on recurrent events / tasks
Enhancements
- alarms can now be snoozed for 1 day
- better iOS/Mac OS X Calendar compability regarding alarms (#1920)
- force default classification over CalDAV if none is set (#2326)
- now compliant when handling completed tasks (#589)
- better iOS invitations handling regarding part state (#2852)
- fixed Mac OS X Calendar delegation issue (#2837)
- converted ODT documentation to AsciiDoc format
- updated Czech, Dutch, Finnish, French, German, Hungarian, Norwegian (Bokmal), Polish, Russian, and
Spanish (Spain) translations
Bug fixes
- fixed sending mails to multiple recipients over AS
- fixed freebusy support in iCal 7 and free/busy state changes (#2878, #2879)
- we now get rid of all potential control characters before sending the DAV response
- sync-token can now be returned during PROPFIND (#2493)
- fixed calendar deletion on iOS/Mac OS Calendar (#2838)
2.2.8 (2014-09-10)
------------------
New features
- new user settings for threads collapsing
- IMAP global search support (#2670)
Enhancements
- major refactoring of the GCS component saving code (dropped OGoContentStore)
- printing calendars in colors is now possible in all views; list, daily, weekly and multicolumns
- new option to print calendars events and tasks with a background color or with a border color
- labels tagging only make one AJAX call for all the selected messages instead of one AJAX call per message
- new option to print calendars events and tasks with a background color or with a border color
- all modules can now be automatically refreshed
- new configurable user defaults variables; SOGoRefreshViewCheck & SOGoRefreshViewIntervals. SOGoMailMessageCheck has
been replaced by SOGoRefreshViewCheck and SOGoMailPollingIntervals has been replaced by SOGoRefreshViewIntervals
- updated Catalan, Czech, Dutch, Finnish, French, Hungarian, Norwegian, and Polish translations
Bug fixes
- fixed crasher when subscribing users to resources (#2892)
- fixed encoding of new calendars and new subscriptions (JavaScript only)
- fixed display of users with no possible subscription
- fixed usage of SOGoSubscriptionFolderFormat domain default when the folder's name hasn't been changed
- fixed "sogo-tool restore -l" that was returning incorrect folder IDs
- fixed Can not delete mail when over quota (#2812)
- fixed Events and tasks cannot be moved to other calendars using drag&drop (#2759)
- fixed In "Multicolumn Day View" mouse position is not honored when creating an event (#2864)
- fixed handling of messages labels (#2902)
- fixed Apache > 2.3 configuration
- fixed freebusy retrieval during timezone changes (#1240)
2.2.7 (2014-07-30)
------------------
-482
View File
@@ -1,482 +0,0 @@
GNU LIBRARY GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the library GPL. It is
numbered 2 because it goes with version 2 of the ordinary GPL.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Library General Public License, applies to some
specially designated Free Software Foundation software, and to any
other libraries whose authors decide to use it. You can use it for
your libraries, 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
this service 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 make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if
you distribute copies of the library, or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link a program with the library, you must provide
complete object files to the recipients so that they can relink them
with the library, after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
Our method of protecting your rights has two steps: (1) copyright
the library, and (2) offer you this license which gives you legal
permission to copy, distribute and/or modify the library.
Also, for each distributor's protection, we want to make certain
that everyone understands that there is no warranty for this free
library. If the library is modified by someone else and passed on, we
want its recipients to know that what they have is not the original
version, so that any problems introduced by others will not reflect on
the original authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that companies distributing free
software will individually obtain patent licenses, thus in effect
transforming the program into proprietary software. To prevent this,
we have made it clear that any patent must be licensed for everyone's
free use or not licensed at all.
Most GNU software, including some libraries, is covered by the ordinary
GNU General Public License, which was designed for utility programs. This
license, the GNU Library General Public License, applies to certain
designated libraries. This license is quite different from the ordinary
one; be sure to read it in full, and don't assume that anything in it is
the same as in the ordinary license.
The reason we have a separate public license for some libraries is that
they blur the distinction we usually make between modifying or adding to a
program and simply using it. Linking a program with a library, without
changing the library, is in some sense simply using the library, and is
analogous to running a utility program or application program. However, in
a textual and legal sense, the linked executable is a combined work, a
derivative of the original library, and the ordinary General Public License
treats it as such.
Because of this blurred distinction, using the ordinary General
Public License for libraries did not effectively promote software
sharing, because most developers did not use the libraries. We
concluded that weaker conditions might promote sharing better.
However, unrestricted linking of non-free programs would deprive the
users of those programs of all benefit from the free status of the
libraries themselves. This Library General Public License is intended to
permit developers of non-free programs to use free libraries, while
preserving your freedom as a user of such programs to change the free
libraries that are incorporated in them. (We have not seen how to achieve
this as regards changes in header files, but we have achieved it as regards
changes in the actual functions of the Library.) The hope is that this
will lead to faster development of free libraries.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, while the latter only
works together with the library.
Note that it is possible for a library to be covered by the ordinary
General Public License rather than by this special one.
GNU LIBRARY GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library which
contains a notice placed by the copyright holder or other authorized
party saying it may be distributed under the terms of this Library
General Public License (also called "this License"). Each licensee is
addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also compile or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
c) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
d) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the source code distributed need not include anything that is normally
distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
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
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Library 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 Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "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
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY 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
LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
-34
View File
@@ -1,34 +0,0 @@
# GNUstep makefile
include ../config.make
include $(GNUSTEP_MAKEFILES)/common.make
include ./Version
LIBRARY_NAME = libOGoContentStore
TYPEMODELS_DIR = $(SOGO_TYPEMODELS)
libOGoContentStore_HEADER_FILES_DIR = .
libOGoContentStore_HEADER_FILES_INSTALL_DIR = /OGoContentStore
libOGoContentStore_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION)
ADDITIONAL_INCLUDE_DIRS += -I../SOPE
ADDITIONAL_LIB_DIRS += -L../SOPE/GDLContentStore/obj
libOGoContentStore_OBJC_FILES += \
OCSiCalFieldExtractor.m \
OCSContactFieldExtractor.m \
libOGoContentStore_TYPEMODELS += \
appointment.ocs \
contact.ocs \
appointment-oracle.ocs \
contact-oracle.ocs
-include GNUmakefile.preamble
ifneq ($(FHS_INSTALL_ROOT),)
GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include
endif
include $(GNUSTEP_MAKEFILES)/library.make
include $(GNUSTEP_MAKEFILES)/tool.make
-include GNUmakefile.postamble
-32
View File
@@ -1,32 +0,0 @@
# compilation settings
libOGoContentStore_LIBRARIES_DEPEND_UPON += \
-lGDLContentStore \
-lGDLAccess \
-lNGCards \
-lNGExtensions \
-lEOControl \
-lSaxObjC \
$(BASE_LIBS)
ADDITIONAL_INCLUDE_DIRS += -I. -I.. -I../SOPE -I../SoObjects
ADDITIONAL_LIB_DIRS += -L./$(GNUSTEP_OBJ_DIR) -L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ -L../SoObjects/SOGo/SOGo.framework/
SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib
ifeq ($(FOUNDATION_LIB),apple)
libOGoContentStore_PREBIND_ADDR="0xC7700000"
libOGoContentStore_LDFLAGS += -seg1addr $(libOGoContentStore_PREBIND_ADDR)
endif
test_quick_extract_TOOL_LIBS += \
-lEOControl \
-lSaxObjC \
-lDOM \
-lNGExtensions \
-lNGCards \
-lGDLContentStore \
-lGDLAccess \
-lOGoContentStore \
$(BASE_LIBS)
-136
View File
@@ -1,136 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSDictionary.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <GDLContentStore/GCSFieldExtractor.h>
#import <NGCards/NGVCard.h>
#import <NGCards/NGVList.h>
#import <SOGo/NSArray+Utilities.h>
@interface OCSContactFieldExtractor : GCSFieldExtractor
@end
@implementation OCSContactFieldExtractor
- (NSMutableDictionary *) extractQuickFieldsFromVCard: (NGVCard *) vCard
{
NSMutableDictionary *fields;
NSArray *values;
CardElement *element;
NSString *value;
fields = [NSMutableDictionary dictionaryWithCapacity: 16];
value = [vCard fn];
if (value)
[fields setObject: value forKey: @"c_cn"];
element = [vCard n];
[fields setObject: [element flattenedValueAtIndex: 0 forKey: @""]
forKey: @"c_sn"];
[fields setObject: [element flattenedValueAtIndex: 1 forKey: @""]
forKey: @"c_givenName"];
value = [vCard preferredTel];
if (value)
[fields setObject: value forKey: @"c_telephonenumber"];
value = [vCard preferredEMail];
if (![value isNotNull])
value = @"";
[fields setObject: value forKey: @"c_mail"];
element = [vCard org];
[fields setObject: [element flattenedValueAtIndex: 0 forKey: @""]
forKey: @"c_o"];
[fields setObject: [element flattenedValueAtIndex: 1 forKey: @""]
forKey: @"c_ou"];
element = [vCard preferredAdr];
if (element && ![element isVoid])
[fields setObject: [element flattenedValueAtIndex: 3
forKey: @""]
forKey: @"c_l"];
value = [[vCard uniqueChildWithTag: @"X-AIM"] flattenedValuesForKey: @""];
[fields setObject: value forKey: @"c_screenname"];
values = [[vCard categories] trimmedComponents];
if ([values count] > 0)
[fields setObject: [values componentsJoinedByString: @","]
forKey: @"c_categories"];
else
[fields setObject: [NSNull null] forKey: @"c_categories"];
[fields setObject: @"vcard" forKey: @"c_component"];
return fields;
}
- (NSMutableDictionary *) extractQuickFieldsFromVList: (NGVList *) vList
{
NSMutableDictionary *fields;
NSString *value;
fields = [NSMutableDictionary dictionaryWithCapacity: 1];
value = [vList fn];
if (value)
[fields setObject: value forKey: @"c_cn"];
[fields setObject: @"vlist" forKey: @"c_component"];
return fields;
}
- (NSMutableDictionary *) extractQuickFieldsFromContent: (NSString *) content
{
NSMutableDictionary *fields;
NGVCard *vCard;
NGVList *vList;
NSString *upperContent;
fields = nil;
if ([content length] > 0)
{
upperContent = [content uppercaseString];
if ([upperContent hasPrefix: @"BEGIN:VCARD"])
{
vCard = [NGVCard parseSingleFromSource: content];
if (vCard)
fields = [self extractQuickFieldsFromVCard: vCard];
else
[self errorWithFormat: @"Could not parse VCARD content."];
}
else if ([upperContent hasPrefix: @"BEGIN:VLIST"])
{
vList = [NGVList parseSingleFromSource: content];
if (vList)
fields = [self extractQuickFieldsFromVList: vList];
else
[self errorWithFormat: @"Could not parse VLIST content."];
}
else
[self errorWithFormat: @"Content is unknown."];
}
else
[self errorWithFormat: @"Content is empty."];
return fields;
}
@end /* OCSContactFieldExtractor */
-35
View File
@@ -1,35 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#ifndef __OGoContentStore_OCSiCalFieldExtractor_H__
#define __OGoContentStore_OCSiCalFieldExtractor_H__
#include <GDLContentStore/GCSFieldExtractor.h>
@interface OCSiCalFieldExtractor : GCSFieldExtractor
{
}
+ (id)sharedICalFieldExtractor;
@end
#endif /* __OGoContentStore_OCSiCalFieldExtractor_H__ */
-96
View File
@@ -1,96 +0,0 @@
/*
Copyright (C) 2004 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with SOGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSString.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGCards/iCalCalendar.h>
#import <SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.h>
#import "OCSiCalFieldExtractor.h"
@implementation OCSiCalFieldExtractor
+ (id) sharedICalFieldExtractor
{
static OCSiCalFieldExtractor *extractor = nil;
if (!extractor)
extractor = [self new];
return extractor;
}
/* operations */
- (CardGroup *) firstElementFromCalendar: (iCalCalendar *) ical
{
NSArray *elements;
CardGroup *element;
unsigned int count;
elements = [ical allObjects];
count = [elements count];
if (count)
element = [elements objectAtIndex: 0];
else
{
[self logWithFormat: @"ERROR: given calendar contains no elements: %@", ical];
element = nil;
}
return element;
}
- (NSMutableDictionary *) extractQuickFieldsFromContent: (NSString *) _content
{
NSMutableDictionary *fields;
id cal;
fields = nil;
if ([_content length])
{
cal = [iCalCalendar parseSingleFromSource: _content];
if (cal)
{
if ([cal isKindOfClass: [iCalCalendar class]])
cal = [self firstElementFromCalendar: cal];
if ([cal isKindOfClass: [iCalRepeatableEntityObject class]])
fields = [cal quickRecord];
else if ([cal isNotNull])
[self logWithFormat: @"ERROR: unexpected iCalendar parse result: %@",
cal];
}
else
[self logWithFormat: @"ERROR: parsing source didn't return anything"];
}
return fields;
}
@end /* OCSiCalFieldExtractor */
-144
View File
@@ -1,144 +0,0 @@
Storage Backend
===============
The storage backend implements the "low level" folder abstraction, which is
basically an arbitary "BLOB" containing some document. The feature is that
we extract "quick access" / "searchable" attributes from the document content.
Further it contains the "folder management" API, as named folders can be stored
in different databases.
Note: we need a way to tell where "new" folders should be created
Note: to sync with LDAP we need to periodically delete or archive old folders
Folders have associated a type (like 'calendar') which defines the query
attributes and serialization format.
TODO
====
- hierarchies deeper than 4 (properly filter on path in OCS)
Open Questions
==============
System-meta-data in the blob-table or in the quick-table?
- master data belongs into the blob table
- could be regular 'NSxxx' keys to differentiate meta data from
Class Hierarchy
===============
[NSObject]
OCSContext - tracking context
OCSFolder - represents a single folder
OCSFolderManager - manages folders
OCSFolderType - the mapping info for a specific folder-type
OCSFieldInfo - mapping info for one 'quick field'
OCSChannelManager - maintains EOAdaptorChannel objects
TBD:
- field 'extractor'
- field 'value' (eg array values for participants?)
- BLOB archiver/unarchiver
Defaults
========
OCSFolderInfoURL - the DB URL where the folder-info table is located
eg: http://OGo:OGo@localhost/test/folder_info
OCSFolderManagerDebugEnabled - enable folder-manager debug logs
OCSFolderManagerSQLDebugEnabled - enable folder-manager SQL gen debug logs
OCSChannelManagerDebugEnabled - enable channel debug pooling logs
OCSChannelManagerPoolDebugEnabled - debug pool handle allocation
OCSChannelExpireAge - if that age in seconds is exceeded, a channel
will be removed from the pool
OCSChannelCollectionTimer - time in seconds. each n-seconds the pool will be
checked for channels too old
[PGDebugEnabled] - enable PostgreSQL adaptor debugging
URLs
====
"Database URLs"
We use the schema:
postgresql://[user]:[password]@[host]:[port]/[dbname]/[tablename]
BLOB Formats
============
- TBD
- iCal, XML
- problem with iCal is that a complete and valid iCal file is different from
just the vevent. so we basically need to parse those files in any case.
- XML: the iCal SaxDriver reports XML events, so we can easily store that as
XML
- we need to parse the BLOB for different clients anyway (iCal != iCal ...)
- XML: we could use some XML query extension to PG in the future?
Update: we now have OCSiCalFieldExtractor
- it parses the BLOB as an iCalendar file and extracts a set of fixed
keys:
- title - plain copy of "summary"
- uid - plain copy
- startdate - date as utime
- enddate - date as utime
- participants - CNs of attendees separated by comma ", "
- location
- partmails
- sequence
- TBD: iscyclic
- TBD: isallday
- TBD: cycles - I guess the client should fetch the BLOB to resolve
- the field extractor is accessed by OCSFolder using the folderinfo:
extractor = [self->folderInfo quickExtractor];
quickRow = [extractor extractQuickFieldsFromContent:_content];
Support Tools
=============
- tools we need:
- one to recreate a quick table based on the blob table
Notes
=====
- need to use http:// URLs for connect info, until generic URLs in
libFoundation are fixed (the parses breaks on the login/password parts)
QA
==
Q: Why do we use two tables, we could store the quick columns in the blob?
==
They could be in the same table. I considered using separate tables since the
quick table is likely to be recreated now and then if BLOB indexing
requirements change.
Actually one could even use different _quick tables which share a common BLOB
table.
(a quick table is nothing more than a database index and like with DB indexes
multiple ones for different requirements can make sense).
Further it might improve caching behaviour for row based caches (the quick
table is going to be queried much more often) - not sure whether this is
relevant with PostgreSQL, probably not?
Q: Can we use a VARCHAR primary key?
==
I asked in the postgres IRC channel and apparently the performance penalty of
string primary keys isn't big.
We could also use an 'internal' int sequence in addition (might be useful for
supporting ZideLook)
Motivation: the 'iCalendar' ID is a string and usually looks like a GUID.
Q: Why using VARCHAR instead of TEXT in the BLOB?
==
To quote PostgreSQL documentation:
"There are no performance differences between these three types, apart from
the increased storage size when using the blank-padded type."
So varchar(xx) is just a large TEXT. Since we intend to store mostly small
snippets of data (tiny XML fragments), I considered VARCHAR the more
appropriate type.
-14
View File
@@ -1,14 +0,0 @@
# Version file
MAJOR_VERSION=0
MINOR_VERSION=9
SUBMINOR_VERSION:=33
# v0.9.30 requires libNGiCal v4.5.48
# v0.9.26 requires libGDLContentStore v4.5.26
# v0.9.19 requires libNGiCal v4.5.40
# v0.9.18 requires libNGiCal v4.5.38
# v0.9.17 requires libNGiCal v4.5.37
# v0.9.11 requires libFoundation v1.0.63
# v0.9.11 requires libNGExtensions v4.3.125
# v0.9.7 requires libGDLAccess v1.1.35
@@ -1,35 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
// $Id: iCalRepeatableEntityObject+OCS.h 617 2005-03-01 17:08:11Z znek $
#ifndef __OGoContentStore_iCalRepeatableEntityObject_OCS_H_
#define __OGoContentStore_iCalRepeatableEntityObject_OCS_H_
#include <NGCards/NGCards.h>
@interface iCalRepeatableEntityObject (OCS)
- (NSString *)cycleInfo;
@end
#endif /* __OGoContentStore_iCalRepeatableEntityObject_OCS_H_ */
@@ -1,29 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSDictionary.h>
#import "iCalRepeatableEntityObject+OCS.h"
@implementation iCalRepeatableEntityObject (OCS)
@end
-108
View File
@@ -1,108 +0,0 @@
http://www.faqs.org/rfcs/rfc2798.html
Class
NAME 'inetOrgPerson'
SUP organizationalPerson
STRUCTURAL
MAY (
audio $ businessCategory $ carLicense $ departmentNumber $
displayName $ employeeNumber $ employeeType $ givenName $
homePhone $ homePostalAddress $ initials $ jpegPhoto $
labeledURI $ mail $ manager $ mobile $ o $ pager $
photo $ roomNumber $ secretary $ uid $ userCertificate $
x500uniqueIdentifier $ preferredLanguage $
userSMIMECertificate $ userPKCS12
)
MUST (
cn $ objectClass $ sn
)
MAY (
description $ destinationIndicator $ facsimileTelephoneNumber $
internationaliSDNNumber $ l $ ou $ physicalDeliveryOfficeName $
postalAddress $ postalCode $ postOfficeBox $
preferredDeliveryMethod $ registeredAddress $ seeAlso $
st $ street $ telephoneNumber $ teletexTerminalIdentifier $
telexNumber $ title $ userPassword $ x121Address
)
Properties (inetOrgPerson + organizationalPerson)
businessCategory
carLicense
departmentNumber
destinationIndicator
employeeNumber
employeeType
facsimileTelephoneNumber
givenName
homePostalAddress
initials
jpegPhoto
l
mail
manager
mobile
o
objectClass
ou
pager
physicalDeliveryOfficeName
postOfficeBox
postalCode
preferredLanguage
registeredAddress
roomNumber
secretary
seeAlso
sn
street
telephoneNumber
teletexTerminalIdentifier
title
uid
userCertificate
userPKCS12
userPassword
x121Address
audio
cn
description
displayName
homePhone
internationaliSDNNumber
labeledURI
photo
postalAddress
preferredDeliveryMethod
st
telexNumber
userSMIMECertificate
x500uniqueIdentifier
Sample:
version: 1
dn: cn=Barbara Jensen,ou=Product Development,dc=siroe,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: Barbara Jensen
cn: Babs Jensen
displayName: Babs Jensen
sn: Jensen
givenName: Barbara
initials: BJJ
title: manager, product development
uid: bjensen
mail: bjensen@siroe.com
telephoneNumber: +1 408 555 1862
facsimileTelephoneNumber: +1 408 555 1992
mobile: +1 408 555 1941
roomNumber: 0209
carLicense: 6ABC246
o: Siroe
ou: Product Development
departmentNumber: 2604
employeeNumber: 42
employeeType: full time
preferredLanguage: fr, en-gb;q=0.8, en;q=0.7
labeledURI: http://www.siroe.com/users/bjensen My Home Page
-30
View File
@@ -1,30 +0,0 @@
BEGIN:VEVENT
DURATION:PT1H
ATTENDEE;CN="Elke Bethke";DIR="addressbook://B156F3F0-9CFD-11D8-8561-000
D93C1A604:ABPerson":mailto:E.Bethke@Sachsen-Anhalt-Lotto.de
ATTENDEE;CN="Erik Doernenburg";DIR="addressbook://B15FCB0F-9CFD-11D8-8561
-000D93C1A604:ABPerson":mailto:erik@x101.net
ATTENDEE;CN="Christian Schnelle";DIR="addressbook://B1418D4E-9CFD-11D8-8
561-000D93C1A604:ABPerson":mailto:cs@enervation.de
ATTENDEE;CN="Chris Herrenberger";DIR="addressbook://B14A390C-9CFD-11D8-8
561-000D93C1A604:ABPerson":invalid:nomail
ATTENDEE;CN="Horst Parplies";DIR="addressbook://B19B47E5-9CFD-11D8-8561-
000D93C1A604:ABPerson":mailto:horst.parplies@freenet.de
ATTENDEE;CN="Imdat Solak";DIR="addressbook://B19EDB62-9CFD-11D8-8561-000
D93C1A604:ABPerson":mailto:imdat@solak.de
ATTENDEE;CN="Jens Enders";DIR="addressbook://B1B6819F-9CFD-11D8-8561-000
D93C1A604:ABPerson":mailto:jens.enders@skyrix.com
ATTENDEE;CN="Jens Muenster";DIR="addressbook://B1BBA42E-9CFD-11D8-8561-00
0D93C1A604:ABPerson":mailto:jens.muenster@skyrix.com
ATTENDEE;CN="Laurent Pierre";DIR="addressbook://9337C270-A825-11D8-B930-
000D93C1A604:ABPerson":mailto:laurent.pierre@linagora.com
ATTENDEE;CN="Marcel Weiher";DIR="addressbook://B1F9BB12-9CFD-11D8-8561-0
00D93C1A604:ABPerson":mailto:marcel@metaobject.co
DTSTAMP:20040520T140002Z
UID:BD91C454-AA65-11D8-84CA-000D93C1A604
SEQUENCE:3
STATUS:CONFIRMED
DTSTART;TZID=Europe/Berlin:20040618T160000
SUMMARY:SIZE EVENT
X-WR-ITIPSTATUSML:UNCLEAN
END:VEVENT
-15
View File
@@ -1,15 +0,0 @@
# $Id$
include $(GNUSTEP_MAKEFILES)/common.make
TOOL_NAME = test
test_OBJC_FILES += test1.m
ADDITIONAL_TOOL_LIBS += -lOGoContentStore
ADDITIONAL_LIB_DIRS += -L../../$(GNUSTEP_OBJ_DIR)
-include GNUmakefile.preamble
include $(GNUSTEP_MAKEFILES)/tool.make
-include GNUmakefile.postamble
-3
View File
@@ -1,3 +0,0 @@
// $Id$
#import <Foundation/Foundation.h>
-31
View File
@@ -1,31 +0,0 @@
// $Id$
#include "common.h"
static void testurl(NSString *s) {
NSURL *url;
url = [NSURL URLWithString:s];
NSLog(@"url: %@", url);
NSLog(@" login: %@", [url user]);
NSLog(@" pwd: %@", [url password]);
}
static void test(void) {
testurl(@"http://OGoUser:OGoPwd@localhost/OGo");
testurl(@"postgresql://OGoUser:OGoPwd@localhost/OGo");
}
int main(int argc, char **argv, char **env) {
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
#if LIB_FOUNDATION_LIBRARY
[NSProcessInfo initializeWithArguments:argv count:argc environment:env];
#endif
test();
[pool release];
return 0;
}
Loaded 100 of 862 files, more files were not shown because too many files have changed in this diff. Show more