From 4c9227e077fbdf55b55ec97945afc631f6a9db55 Mon Sep 17 00:00:00 2001 From: Andrei Hajdukewycz Date: Fri, 20 Dec 2013 04:56:46 -0500 Subject: [PATCH 01/23] [Bug 952429] Add holiday calendar .ics files and json metadata --- media/caldata/AlbanianHolidays.ics | 166 + media/caldata/AlgeriaHolidays.ics | 74 + media/caldata/ArgentinaHolidays.ics | 386 + media/caldata/ArmeniaHolidays.ics | 339 + media/caldata/AustraliaHolidays.ics | 433 + media/caldata/AustrianHolidays.ics | 1278 +++ media/caldata/BasqueHolidays.ics | 549 ++ media/caldata/BelgianDutchHolidays.ics | 422 + media/caldata/BelgianFrenchHolidays.ics | 422 + media/caldata/BelgianHolidays.ics | 894 ++ media/caldata/BoliviaHolidays.ics | 696 ++ media/caldata/BrazilHolidays.ics | 1149 +++ media/caldata/BulgarianHolidays.ics | 160 + media/caldata/CanadaHolidays.ics | 2073 +++++ media/caldata/CatalanHolidays.ics | 723 ++ media/caldata/ChileHolidays.ics | 416 + media/caldata/ChinaHolidays.ics | 611 ++ media/caldata/ColombianHolidays.ics | 5298 +++++++++++ media/caldata/CostaRicaHolidays.ics | 310 + media/caldata/CroatiaHolidays.ics | 409 + media/caldata/CzechHolidays.ics | 216 + media/caldata/DanishHolidays.ics | 5636 ++++++++++++ media/caldata/DutchHolidays.ics | 632 ++ media/caldata/EnglishHolidays.ics | 1155 +++ media/caldata/EstoniaHolidays.ics | 1830 ++++ media/caldata/FinlandHolidays.ics | 1445 +++ media/caldata/FinlandHolidaysSwedish.ics | 1454 +++ media/caldata/FlandersHolidays.ics | 1337 +++ media/caldata/FrenchHolidays.ics | 382 + media/caldata/FrisianHolidays.ics | 927 ++ media/caldata/GermanHolidays.ics | 1507 ++++ media/caldata/GreeceHolidays.ics | 7533 ++++++++++++++++ media/caldata/GuyanaHolidays.ics | 411 + media/caldata/HongKongHolidays.ics | 1306 +++ media/caldata/HungarianHolidays.ics | 270 + media/caldata/IcelandHolidays.ics | 2621 ++++++ media/caldata/IndiaHolidays.ics | 1309 +++ media/caldata/IndonesianHolidays.ics | 213 + media/caldata/IndonesianHolidaysEnglish.ics | 186 + media/caldata/IranHolidays_English.ics | 1558 ++++ media/caldata/IranHolidays_Persian.ics | 8351 ++++++++++++++++++ media/caldata/IrishHolidays2003-2011.ics | 1852 ++++ media/caldata/IsraelHolidays.ics | 809 ++ media/caldata/ItalianHolidays.ics | 826 ++ media/caldata/JapanHolidays.ics | 527 ++ media/caldata/JewishHolidaysEnglish.ics | 495 ++ media/caldata/JewishHolidaysHebrew.ics | 470 + media/caldata/KazakhstanHolidays.ics | 237 + media/caldata/KenyaHolidays.ics | 878 ++ media/caldata/LatviaHolidays.ics | 664 ++ media/caldata/LebanonHolidays.ics | 772 ++ media/caldata/LithuanianHolidays.ics | 181 + media/caldata/LuxembourgHolidays.ics | 408 + media/caldata/MalaysiaHolidays.ics | 584 ++ media/caldata/MaltaHolidays.ics | 289 + media/caldata/MexicanHolidays.ics | 362 + media/caldata/NamibiaHolidays.ics | 196 + media/caldata/NewZealandHolidays.ics | 840 ++ media/caldata/NorwegianHolidays.ics | 531 ++ media/caldata/PakistanHolidays.ics | 134 + media/caldata/PeruHolidays.ics | 604 ++ media/caldata/PolishHolidays.ics | 833 ++ media/caldata/PortugalHolidays.ics | 1314 +++ media/caldata/PuertoRicoHolidays.ics | 473 + media/caldata/QueenslandHolidays.ics | 474 + media/caldata/RomaniaHolidays.ics | 138 + media/caldata/RussiaHolidays.ics | 111 + media/caldata/SingaporeHolidays.ics | 122 + media/caldata/SlovakHolidays.ics | 375 + media/caldata/SlovenianHolidays.ics | 781 ++ media/caldata/SlovenianHolidays2003-2011.ics | 1150 +++ media/caldata/SouthAfricaHolidays.ics | 300 + media/caldata/SouthKoreaHolidays.ics | 603 ++ media/caldata/SpanishHolidays.ics | 1892 ++++ media/caldata/SriLankaHolidays.ics | 2525 ++++++ media/caldata/SwedishHolidays.ics | 3783 ++++++++ media/caldata/SwissHolidays.ics | 2777 ++++++ media/caldata/TaiwanHolidays.ics | 1987 +++++ media/caldata/ThaiHolidays.ics | 1396 +++ media/caldata/TurkeyHolidays.ics | 310 + media/caldata/UKHolidays.ics | 817 ++ media/caldata/USHolidays.ics | 3323 +++++++ media/caldata/UruguayHolidays.ics | 177 + media/caldata/VanuatuHolidays.ics | 158 + media/caldata/VietnamHolidays.ics | 137 + media/caldata/calendars.json | 404 + 86 files changed, 95106 insertions(+) create mode 100644 media/caldata/AlbanianHolidays.ics create mode 100644 media/caldata/AlgeriaHolidays.ics create mode 100644 media/caldata/ArgentinaHolidays.ics create mode 100644 media/caldata/ArmeniaHolidays.ics create mode 100644 media/caldata/AustraliaHolidays.ics create mode 100644 media/caldata/AustrianHolidays.ics create mode 100644 media/caldata/BasqueHolidays.ics create mode 100644 media/caldata/BelgianDutchHolidays.ics create mode 100644 media/caldata/BelgianFrenchHolidays.ics create mode 100644 media/caldata/BelgianHolidays.ics create mode 100644 media/caldata/BoliviaHolidays.ics create mode 100644 media/caldata/BrazilHolidays.ics create mode 100644 media/caldata/BulgarianHolidays.ics create mode 100644 media/caldata/CanadaHolidays.ics create mode 100644 media/caldata/CatalanHolidays.ics create mode 100644 media/caldata/ChileHolidays.ics create mode 100644 media/caldata/ChinaHolidays.ics create mode 100644 media/caldata/ColombianHolidays.ics create mode 100644 media/caldata/CostaRicaHolidays.ics create mode 100644 media/caldata/CroatiaHolidays.ics create mode 100644 media/caldata/CzechHolidays.ics create mode 100644 media/caldata/DanishHolidays.ics create mode 100644 media/caldata/DutchHolidays.ics create mode 100644 media/caldata/EnglishHolidays.ics create mode 100644 media/caldata/EstoniaHolidays.ics create mode 100644 media/caldata/FinlandHolidays.ics create mode 100644 media/caldata/FinlandHolidaysSwedish.ics create mode 100644 media/caldata/FlandersHolidays.ics create mode 100644 media/caldata/FrenchHolidays.ics create mode 100644 media/caldata/FrisianHolidays.ics create mode 100644 media/caldata/GermanHolidays.ics create mode 100644 media/caldata/GreeceHolidays.ics create mode 100644 media/caldata/GuyanaHolidays.ics create mode 100644 media/caldata/HongKongHolidays.ics create mode 100644 media/caldata/HungarianHolidays.ics create mode 100644 media/caldata/IcelandHolidays.ics create mode 100644 media/caldata/IndiaHolidays.ics create mode 100644 media/caldata/IndonesianHolidays.ics create mode 100644 media/caldata/IndonesianHolidaysEnglish.ics create mode 100644 media/caldata/IranHolidays_English.ics create mode 100644 media/caldata/IranHolidays_Persian.ics create mode 100644 media/caldata/IrishHolidays2003-2011.ics create mode 100644 media/caldata/IsraelHolidays.ics create mode 100644 media/caldata/ItalianHolidays.ics create mode 100644 media/caldata/JapanHolidays.ics create mode 100644 media/caldata/JewishHolidaysEnglish.ics create mode 100644 media/caldata/JewishHolidaysHebrew.ics create mode 100644 media/caldata/KazakhstanHolidays.ics create mode 100644 media/caldata/KenyaHolidays.ics create mode 100644 media/caldata/LatviaHolidays.ics create mode 100644 media/caldata/LebanonHolidays.ics create mode 100644 media/caldata/LithuanianHolidays.ics create mode 100644 media/caldata/LuxembourgHolidays.ics create mode 100644 media/caldata/MalaysiaHolidays.ics create mode 100644 media/caldata/MaltaHolidays.ics create mode 100644 media/caldata/MexicanHolidays.ics create mode 100644 media/caldata/NamibiaHolidays.ics create mode 100644 media/caldata/NewZealandHolidays.ics create mode 100644 media/caldata/NorwegianHolidays.ics create mode 100644 media/caldata/PakistanHolidays.ics create mode 100644 media/caldata/PeruHolidays.ics create mode 100644 media/caldata/PolishHolidays.ics create mode 100644 media/caldata/PortugalHolidays.ics create mode 100644 media/caldata/PuertoRicoHolidays.ics create mode 100644 media/caldata/QueenslandHolidays.ics create mode 100644 media/caldata/RomaniaHolidays.ics create mode 100644 media/caldata/RussiaHolidays.ics create mode 100644 media/caldata/SingaporeHolidays.ics create mode 100644 media/caldata/SlovakHolidays.ics create mode 100644 media/caldata/SlovenianHolidays.ics create mode 100644 media/caldata/SlovenianHolidays2003-2011.ics create mode 100644 media/caldata/SouthAfricaHolidays.ics create mode 100644 media/caldata/SouthKoreaHolidays.ics create mode 100644 media/caldata/SpanishHolidays.ics create mode 100644 media/caldata/SriLankaHolidays.ics create mode 100644 media/caldata/SwedishHolidays.ics create mode 100644 media/caldata/SwissHolidays.ics create mode 100644 media/caldata/TaiwanHolidays.ics create mode 100644 media/caldata/ThaiHolidays.ics create mode 100644 media/caldata/TurkeyHolidays.ics create mode 100644 media/caldata/UKHolidays.ics create mode 100644 media/caldata/USHolidays.ics create mode 100644 media/caldata/UruguayHolidays.ics create mode 100644 media/caldata/VanuatuHolidays.ics create mode 100644 media/caldata/VietnamHolidays.ics create mode 100644 media/caldata/calendars.json diff --git a/media/caldata/AlbanianHolidays.ics b/media/caldata/AlbanianHolidays.ics new file mode 100644 index 00000000000..f8bc410a347 --- /dev/null +++ b/media/caldata/AlbanianHolidays.ics @@ -0,0 +1,166 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Europe/Athens +X-LIC-LOCATION:Europe/Athens +BEGIN:DAYLIGHT +TZOFFSETFROM:+0200 +TZOFFSETTO:+0300 +TZNAME:EEST +DTSTART:19700329T030000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0300 +TZOFFSETTO:+0200 +TZNAME:EET +DTSTART:19701025T040000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20101219T170923Z +LAST-MODIFIED:20101219T171208Z +DTSTAMP:20101219T171208Z +UID:4352e5c2-dd7a-4296-8adf-c759743b950e +SUMMARY:Dita e Pashkëve Ortodokse\, Dita e Pashkës Katolike +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20110424T200000 +DTEND;TZID=Europe/Athens:20110424T210000 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T171316Z +LAST-MODIFIED:20101219T171339Z +DTSTAMP:20101219T171339Z +UID:1f1d5444-af5f-4c53-8079-d0c6f7d1e832 +SUMMARY:Dita e Bajramit të Madh +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20110830T200000 +DTEND;TZID=Europe/Athens:20110830T210000 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T171505Z +LAST-MODIFIED:20101219T171522Z +DTSTAMP:20101219T171522Z +UID:469d0be0-453d-466d-b0f6-5f9df234537b +SUMMARY:Dita e Kurban Bajramit +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20111106T200000 +DTEND;TZID=Europe/Athens:20111106T210000 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T165357Z +LAST-MODIFIED:20101219T165426Z +DTSTAMP:20101219T165426Z +UID:efe5aee8-7f1e-4d26-905a-b5218b060760 +SUMMARY:Festa e Vitit të Ri +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20110101T190000 +DTEND;TZID=Europe/Athens:20110101T200000 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T165429Z +LAST-MODIFIED:20101219T165452Z +DTSTAMP:20101219T165452Z +UID:87163834-5386-437a-ae87-a8c55dba90d1 +SUMMARY:Festa e Vitit të Ri +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20110102T190000 +DTEND;TZID=Europe/Athens:20110102T200000 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T165507Z +LAST-MODIFIED:20101219T165523Z +DTSTAMP:20101219T165523Z +UID:cb6f5daa-8b44-4b05-8624-619d52ed5062 +SUMMARY:Dita e Verës +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20110314T190000 +DTEND;TZID=Europe/Athens:20110314T200000 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T165714Z +LAST-MODIFIED:20101219T165730Z +DTSTAMP:20101219T165730Z +UID:aa893581-e76c-48e3-9f05-8775dfeb67b8 +SUMMARY:Dita e Pavarësisë +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20111128T190000 +DTEND;TZID=Europe/Athens:20111128T200000 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T165733Z +LAST-MODIFIED:20101219T165748Z +DTSTAMP:20101219T165748Z +UID:f7672e19-9f85-425b-88fe-60de0ff83256 +SUMMARY:Dita e Çlirimit +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20111129T190000 +DTEND;TZID=Europe/Athens:20111129T200000 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T165808Z +LAST-MODIFIED:20101219T165838Z +DTSTAMP:20101219T165838Z +UID:c3ed1117-4037-40ae-a972-1375c1981ebd +SUMMARY:Krishtlindjet +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20111225T190000 +DTEND;TZID=Europe/Athens:20111225T200000 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T165538Z +LAST-MODIFIED:20101219T171226Z +DTSTAMP:20101219T171226Z +UID:2169ee57-cf37-46d8-a8d9-178e8be75655 +SUMMARY:Dita e Nevruzit +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20110322T190000 +DTEND;TZID=Europe/Athens:20110322T200000 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T165613Z +LAST-MODIFIED:20101219T171301Z +DTSTAMP:20101219T171301Z +UID:f971fec3-18bc-4753-909b-255ad2d4a6df +SUMMARY:Dita Ndërkombëtare e Punës +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20110501T190000 +DTEND;TZID=Europe/Athens:20110501T200000 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T165644Z +LAST-MODIFIED:20101219T171448Z +DTSTAMP:20101219T171448Z +UID:a645493b-ee5d-4184-ac34-7f80d5d46b7f +SUMMARY:Dita e Lumnimit të Nënë Terezës +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20111019T190000 +DTEND;TZID=Europe/Athens:20111019T200000 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T171536Z +LAST-MODIFIED:20101219T171553Z +DTSTAMP:20101219T171553Z +UID:a80d6c08-281a-4d63-8539-d1e8faa3f0a8 +SUMMARY:Dita Kombëtare e Rinisë +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;TZID=Europe/Athens:20111208T200000 +DTEND;TZID=Europe/Athens:20111208T210000 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/AlgeriaHolidays.ics b/media/caldata/AlgeriaHolidays.ics new file mode 100644 index 00000000000..21325be22df --- /dev/null +++ b/media/caldata/AlgeriaHolidays.ics @@ -0,0 +1,74 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +BEGIN:VTIMEZONE +TZID:/mozilla.org/20070129_1/America/Montreal +X-LIC-LOCATION:America/Montreal +BEGIN:DAYLIGHT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +TZNAME:EDT +DTSTART:19700308T020000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0400 +TZOFFSETTO:-0500 +TZNAME:EST +DTSTART:19701101T020000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20070910T202308Z +LAST-MODIFIED:20070911T025222Z +DTSTAMP:20070911T140603Z +UID:15f94b62-fc7e-4328-9455-5b910e1b00e4 +SUMMARY:Independence Day +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/America/Montreal:19620705 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/America/Montreal:19620706 +DESCRIPTION:Fête de l'indépendance et de la jeunesse\; 05 Juillet 1962 +END:VEVENT +BEGIN:VEVENT +CREATED:20070910T202500Z +LAST-MODIFIED:20070911T025304Z +DTSTAMP:20070911T140603Z +UID:c01410fe-c524-46bd-853e-5e0f396cd735 +SUMMARY:Revolutionary Day +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/America/Montreal:19541101 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/America/Montreal:19541102 +DESCRIPTION:Anniversaire de la révolution\; 1er Novembre 1954 +END:VEVENT +BEGIN:VEVENT +CREATED:20070910T200402Z +LAST-MODIFIED:20070911T025820Z +DTSTAMP:20070911T140603Z +UID:25a90d5e-8bcc-4c4f-b759-c57ad5d6a8f3 +SUMMARY:New Year's Day +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/America/Montreal:20070101 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/America/Montreal:20070102 +DESCRIPTION:Jour de l'an +END:VEVENT +BEGIN:VEVENT +CREATED:20070910T201417Z +LAST-MODIFIED:20070911T025839Z +DTSTAMP:20070911T140603Z +UID:8a873eed-fb68-4397-ae3d-24729443f8db +SUMMARY:Labor Day +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/America/Montreal:20070501 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/America/Montreal:20070502 +DESCRIPTION:Fête du travail +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/ArgentinaHolidays.ics b/media/caldata/ArgentinaHolidays.ics new file mode 100644 index 00000000000..e690a87db73 --- /dev/null +++ b/media/caldata/ArgentinaHolidays.ics @@ -0,0 +1,386 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:America/Argentina/Buenos_Aires +X-LIC-LOCATION:America/Argentina/Buenos_Aires +BEGIN:STANDARD +TZOFFSETFROM:-0300 +TZOFFSETTO:-0300 +TZNAME:ART +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20110728T014515Z +LAST-MODIFIED:20110728T023417Z +DTSTAMP:20110728T023417Z +UID:9c25833c-1815-4c26-b653-a9ff376d51cd +SUMMARY:Carnaval +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110307T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110308T010000 +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:4 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T023251Z +LAST-MODIFIED:20110728T023653Z +DTSTAMP:20110728T023653Z +UID:68e60bf2-b949-4ef7-8b88-84d248fd84f5 +SUMMARY:Feriado puente (turistico) +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110325T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110325T010000 +DESCRIPTION:Fuente www.mininterior.gov.ar +TRANSP:OPAQUE +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T023707Z +LAST-MODIFIED:20110728T023749Z +DTSTAMP:20110728T023749Z +UID:b640896e-f687-49c7-999f-1dda5830d4ba +SUMMARY:Viernes Santo +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110422T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110422T010000 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T033907Z +LAST-MODIFIED:20110728T033949Z +DTSTAMP:20110728T033949Z +UID:904dc3c7-5ba4-497b-a679-1bc87922b3ed +SUMMARY:Feriado puente (turistico) +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20111209T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20111209T235900 +TRANSP:OPAQUE +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T040337Z +LAST-MODIFIED:20110728T040504Z +DTSTAMP:20110728T040504Z +UID:3f87b42c-2afd-47fc-9d92-bf58af5a8dd8 +SUMMARY:Jueves Santo +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110421T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110421T235900 +DESCRIPTION:Dia no laborable\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T040610Z +LAST-MODIFIED:20110728T040754Z +DTSTAMP:20110728T040754Z +UID:afd02009-5f91-42a6-b543-08c9553f42dc +SUMMARY:Carnaval +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20120220T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20120221T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T040829Z +LAST-MODIFIED:20110728T040924Z +DTSTAMP:20110728T040924Z +UID:01baa4ce-bf38-4d76-9331-9c9b66ad8e0d +SUMMARY:Viernes Santo +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20120406T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20120406T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +SEQUENCE:1 +X-MOZ-GENERATION:1 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T040938Z +LAST-MODIFIED:20110728T041012Z +DTSTAMP:20110728T041012Z +UID:63a78283-ec5d-455c-9447-9960eda4e14c +SUMMARY:Feriado Puente (turistico) +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20120430T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20120430T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T041212Z +LAST-MODIFIED:20110728T041243Z +DTSTAMP:20110728T041243Z +UID:669d9069-145b-4ac9-a55d-0a2074122aa8 +SUMMARY:Feriado Puente (turistico) +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20121224T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20121224T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T041355Z +LAST-MODIFIED:20110728T041452Z +DTSTAMP:20110728T041452Z +UID:96c1ca91-afb3-44ff-a3b6-28d1077454a5 +SUMMARY:Jueves Santo +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20120405T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20120405T235900 +DESCRIPTION:Dia no laborable\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T041534Z +LAST-MODIFIED:20110728T041611Z +DTSTAMP:20110728T041611Z +UID:5871c43f-5803-4024-85ff-3eae4e6e237c +SUMMARY:Carnaval +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20130211T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20130212T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T041628Z +LAST-MODIFIED:20110728T041703Z +DTSTAMP:20110728T041703Z +UID:91403877-6626-459f-8f99-c6b6edecd9b1 +SUMMARY:Viernes Santo +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20130329T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20130329T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T041705Z +LAST-MODIFIED:20110728T041745Z +DTSTAMP:20110728T041745Z +UID:76f97c19-e807-43ec-8f34-4401cfce3aaf +SUMMARY:Jueves Santo +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20130328T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20130328T235900 +DESCRIPTION:Dia no laborable\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T041801Z +LAST-MODIFIED:20110728T041833Z +DTSTAMP:20110728T041833Z +UID:e4a6b04a-abc6-4134-8c04-a7116b251acd +SUMMARY:Feriado Puente (turistico) +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20130401T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20130401T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T041912Z +LAST-MODIFIED:20110728T041944Z +DTSTAMP:20110728T041944Z +UID:428a2264-57bc-494d-878f-ecdb52d00346 +SUMMARY:Feriado Puente (turistico) +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20130621T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20130621T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T014409Z +LAST-MODIFIED:20110728T014450Z +DTSTAMP:20110728T014450Z +UID:cbbcba23-7726-477f-bee2-b1dc580f9e19 +SUMMARY:Año Nuevo +RRULE:FREQ=YEARLY +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110101T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110101T235900 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T023058Z +LAST-MODIFIED:20110728T023227Z +DTSTAMP:20110728T023227Z +UID:5856e6e2-9ec6-463a-97d1-fcb4f64123aa +SUMMARY:Dia Nacional de la Memoria por la Verdad y la Justicia +RRULE:FREQ=YEARLY +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110324T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110324T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T023444Z +LAST-MODIFIED:20110728T023639Z +DTSTAMP:20110728T023639Z +UID:4bb5c856-b984-4b23-b077-c5e65d662f23 +SUMMARY:Día del Veterano y de los Caídos en la Guerra de Malvinas +RRULE:FREQ=YEARLY +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110402T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110402T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T023803Z +LAST-MODIFIED:20110728T023837Z +DTSTAMP:20110728T023837Z +UID:44881718-89f0-4655-a636-8f0ab1085267 +SUMMARY:Dia del Trabajador +RRULE:FREQ=YEARLY +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110501T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110501T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T023847Z +LAST-MODIFIED:20110728T023932Z +DTSTAMP:20110728T023932Z +UID:eb87531c-086a-4a99-a1f1-6f0deea42445 +SUMMARY:Dia de la Revolucion de Mayo +RRULE:FREQ=YEARLY +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110525T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110525T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T024049Z +LAST-MODIFIED:20110728T024126Z +DTSTAMP:20110728T024126Z +UID:c15e20e4-e8f7-45c5-9229-2b58541787e8 +SUMMARY:Dia de la Independencia +RRULE:FREQ=YEARLY +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110709T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110709T235900 +TRANSP:OPAQUE +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T033754Z +LAST-MODIFIED:20110728T033853Z +DTSTAMP:20110728T033853Z +UID:90c8abc9-ccb4-4be5-8fcf-952d524886f6 +SUMMARY:Inmaculada Concepción de Maria +RRULE:FREQ=YEARLY +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20111208T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20111208T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T033959Z +LAST-MODIFIED:20110728T034028Z +DTSTAMP:20110728T034028Z +UID:3bd85685-da05-43a2-b62b-d90e949cb2c9 +SUMMARY:Navidad +RRULE:FREQ=YEARLY +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20111225T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20111225T235900 +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T034206Z +LAST-MODIFIED:20110728T035640Z +DTSTAMP:20110728T035640Z +UID:08fb52b1-86de-4a99-a94c-93f579e91dd1 +SUMMARY:Paso a la Inmortalidad de Jose de San Martín +RRULE:FREQ=YEARLY;BYDAY=3MO;BYMONTH=8 +EXDATE:20110815T030000Z +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110722T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110722T235900 +DESCRIPTION:Feriado Nacional Trasladable\nEstos Feriados se rige por el De + creto 1584 y 1585/2010.\n* Fecha modificada por Decreto 521/2011\nFuente w + ww.mininterior.gov.ar +TRANSP:OPAQUE +X-MOZ-GENERATION:4 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T034800Z +LAST-MODIFIED:20110728T035630Z +DTSTAMP:20110728T035630Z +UID:08fb52b1-86de-4a99-a94c-93f579e91dd1 +SUMMARY:Paso a la Inmortalidad de Jose de San Martín +RECURRENCE-ID;TZID=America/Argentina/Buenos_Aires:20110722T000000 +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110822T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110822T235900 +SEQUENCE:5 +DESCRIPTION:Feriado Nacional Trasladable\nEstos Feriados se rige por el De + creto 1584 y 1585/2010.\n* Fecha modificada por Decreto 521/2011\nFuente w + ww.mininterior.gov.ar +TRANSP:OPAQUE +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T035822Z +LAST-MODIFIED:20110728T040048Z +DTSTAMP:20110728T040048Z +UID:0e38a735-7dc5-42b3-b4b4-efdb7ae3c9bf +SUMMARY:Dia del respeto a la diversidad cultural +RRULE:FREQ=YEARLY;BYDAY=2MO;BYMONTH=10 +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20111010T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20111010T235900 +DESCRIPTION:Feriado Nacional Trasladable\nEstos Feriados se rige por el De + creto 1584 y 1585/2010.\nFuente www.mininterior.gov.ar +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T040123Z +LAST-MODIFIED:20110728T040252Z +DTSTAMP:20110728T040252Z +UID:89693b97-4aab-41c3-95dd-98b9b1a7a576 +SUMMARY:Dia de la Soberanía Nacional +RRULE:FREQ=YEARLY;BYDAY=4MO;BYMONTH=11 +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20111128T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20111128T235900 +TRANSP:OPAQUE +DESCRIPTION:Feriado Nacional Trasladable\nEstos Feriados se rige por el De + creto 1584 y 1585/2010.\nFuente www.mininterior.gov.ar +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110728T023944Z +LAST-MODIFIED:20110728T041104Z +DTSTAMP:20110728T041104Z +UID:ce654e9f-1fb9-4bbe-97a0-3ed52748a2fe +SUMMARY:Paso a la Inmortalidad del Gral Manuel Belgrano +RRULE:FREQ=YEARLY +CATEGORIES:Feriados +DTSTART;TZID=America/Argentina/Buenos_Aires:20110620T000000 +DTEND;TZID=America/Argentina/Buenos_Aires:20110620T010000 +TRANSP:OPAQUE +DESCRIPTION:Feriado Nacional Inamovible\nFuente www.mininterior.gov.ar +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/ArmeniaHolidays.ics b/media/caldata/ArmeniaHolidays.ics new file mode 100644 index 00000000000..2692ff567d4 --- /dev/null +++ b/media/caldata/ArmeniaHolidays.ics @@ -0,0 +1,339 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20090313T103003Z +LAST-MODIFIED:20090313T104104Z +DTSTAMP:20090313T103003Z +UID:3a6ad8d8-8258-4117-9cf2-604c21dbe9a4 +SUMMARY:Ամանոր +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090103 +X-MOZ-GENERATION:6 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103032Z +LAST-MODIFIED:20090313T104110Z +DTSTAMP:20090313T103032Z +UID:4133e183-ecfc-4863-a5e3-5dde7c81ad63 +SUMMARY:Սուրբ Ծնունդ և Հայտնություն +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090106 +DTEND;VALUE=DATE:20090107 +X-MOZ-GENERATION:3 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T102903Z +LAST-MODIFIED:20090313T104116Z +DTSTAMP:20090313T102903Z +UID:6b2eaac7-03e9-4877-91cc-7a761de3bce7 +SUMMARY:Բանակի Օր +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090128 +DTEND;VALUE=DATE:20090129 +X-MOZ-GENERATION:3 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103059Z +LAST-MODIFIED:20090313T104348Z +DTSTAMP:20090313T103059Z +UID:1d18b6fb-def0-442f-9a29-a2ca235f66c5 +SUMMARY:Կանանց տոն +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090308 +DTEND;VALUE=DATE:20090309 +X-MOZ-GENERATION:3 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103125Z +LAST-MODIFIED:20090313T104355Z +DTSTAMP:20090313T103125Z +UID:05d68cbb-85bd-4d73-b8cf-92b2e7cf619b +SUMMARY:Երգիծանքի և հումորի օր +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090401 +DTEND;VALUE=DATE:20090402 +X-MOZ-GENERATION:4 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103141Z +LAST-MODIFIED:20090313T104407Z +DTSTAMP:20090313T103141Z +UID:a5883961-cb19-490d-93b8-c5cf4999982f +SUMMARY:Մայրության\, գեղեցկության և սիրո տոն +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090407 +DTEND;VALUE=DATE:20090408 +X-MOZ-GENERATION:3 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103302Z +LAST-MODIFIED:20090313T104413Z +DTSTAMP:20090313T103302Z +UID:ebd5716f-c027-4328-b02b-59f40f73f9a7 +SUMMARY:Ցեղասպանության զոհերի հիշատակի օր +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Годовщины +DTSTART;VALUE=DATE:20090424 +DTEND;VALUE=DATE:20090425 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103351Z +LAST-MODIFIED:20090313T104419Z +DTSTAMP:20090313T103351Z +UID:7e86362c-f4d9-42a1-8568-b010059e29b7 +SUMMARY:Աշխատանքի օր +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103429Z +LAST-MODIFIED:20090313T104431Z +DTSTAMP:20090313T103429Z +UID:0408e8f0-362f-4a40-93bf-0c2688644487 +SUMMARY:Հաղթանակի և խաղաղության տոն +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090509 +DTEND;VALUE=DATE:20090510 +X-MOZ-GENERATION:3 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103459Z +LAST-MODIFIED:20090313T104436Z +DTSTAMP:20090313T103459Z +UID:a2d2efc6-c139-40e4-bc4e-1a68c239c9c4 +SUMMARY:Հանրապետության տոն +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090528 +DTEND;VALUE=DATE:20090529 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103517Z +LAST-MODIFIED:20090313T104442Z +DTSTAMP:20090313T103517Z +UID:8ad5dd52-cd0e-4be5-8e31-41c6a5350edb +SUMMARY:Երեխաների իրավունքների + պաշտպանության օր +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090601 +DTEND;VALUE=DATE:20090602 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103723Z +LAST-MODIFIED:20090313T104447Z +DTSTAMP:20090313T103723Z +UID:b3a438a6-6a91-4fdc-bafa-31e6ae91ebaa +SUMMARY:Սահմանադրության օր +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090705 +DTEND;VALUE=DATE:20090706 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103742Z +LAST-MODIFIED:20090313T104506Z +DTSTAMP:20090313T103742Z +UID:d83b3f84-99d2-4ecd-967e-8defb7e3a271 +SUMMARY:Գիտելիքի\, գրի և դպրության օր +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090901 +DTEND;VALUE=DATE:20090902 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103809Z +LAST-MODIFIED:20090313T104535Z +DTSTAMP:20090313T103809Z +UID:0744e1d0-3786-40d5-80e2-0c6881df0e26 +SUMMARY:Անկախության տոն +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090921 +DTEND;VALUE=DATE:20090922 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103849Z +LAST-MODIFIED:20090313T104631Z +DTSTAMP:20090313T103849Z +UID:57e9d404-75a6-49e7-9b45-93ef5f78b5b7 +SUMMARY:Թարգմանչաց տոն +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SA;BYMONTH=10 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20091010 +DTEND;VALUE=DATE:20091011 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103829Z +LAST-MODIFIED:20090313T104643Z +DTSTAMP:20090313T103829Z +UID:0108aa4e-7187-4804-b18d-056d30ea78ac +SUMMARY:Ուսուցչի օր +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=10 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20091004 +DTEND;VALUE=DATE:20091005 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103914Z +LAST-MODIFIED:20090313T104653Z +DTSTAMP:20090313T103914Z +UID:e1897a90-dc5a-4173-a1ce-ec6a8de0d746 +SUMMARY:Երկրաշարժի զոհերի հիշատակի օր +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Годовщины +DTSTART;VALUE=DATE:20091207 +DTEND;VALUE=DATE:20091208 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T105043Z +LAST-MODIFIED:20090313T105106Z +DTSTAMP:20090313T105043Z +UID:5f759a6a-3acb-4eac-b405-b9d3e2f024dc +SUMMARY:Տեառնընդառաջ +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090214 +DTEND;VALUE=DATE:20090215 +TRANSP:TRANSPARENT +X-MOZ-SNOOZE-TIME-1234569600000000:20090313T105559Z +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T110440Z +LAST-MODIFIED:20090313T110532Z +DTSTAMP:20090313T110440Z +UID:5cc52dcc-c6b3-403c-9bd0-8e93629bb1d9 +SUMMARY:Խաչվերաց +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=9 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090913 +DTEND;VALUE=DATE:20090914 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T110613Z +LAST-MODIFIED:20090313T110634Z +DTSTAMP:20090313T110613Z +UID:9e276a4c-a4ed-4120-b85b-fca61d200dda +SUMMARY:Ծաղկազարդ +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090405 +DTEND;VALUE=DATE:20090406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T110701Z +LAST-MODIFIED:20090313T110724Z +DTSTAMP:20090313T110701Z +UID:54205798-0b1d-4e24-8561-8849e874c777 +SUMMARY:Սբ. Սարգիս +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090207 +DTEND;VALUE=DATE:20090208 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T110746Z +LAST-MODIFIED:20090313T110806Z +DTSTAMP:20090313T110746Z +UID:46e67a1f-d171-44b2-ac39-6f3c644092bf +SUMMARY:Վարդավառ +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090719 +DTEND;VALUE=DATE:20090720 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T110832Z +LAST-MODIFIED:20090313T110848Z +DTSTAMP:20090313T110832Z +UID:9e9c93e0-1d8a-4ea4-8eac-5b03139b273e +SUMMARY:Խաղողօրհնեք +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090812 +DTEND;VALUE=DATE:20090813 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T111023Z +LAST-MODIFIED:20090313T111056Z +DTSTAMP:20090313T111023Z +UID:550c4690-af82-4cac-b880-b95e4d64e110 +SUMMARY:Ավագ շաբաթ +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090406 +DTEND;VALUE=DATE:20090413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T110209Z +LAST-MODIFIED:20090313T111140Z +DTSTAMP:20090313T110209Z +UID:7c67a441-84ed-4821-b6e6-24a2f0d6bee0 +SUMMARY:Զատիկ +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090313T103412Z +LAST-MODIFIED:20090313T112343Z +DTSTAMP:20090313T103412Z +UID:11ca9d91-3ca1-454e-976e-52521e5160dd +SUMMARY:Շուշիի ազատագրման օր +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Праздники +DTSTART;VALUE=DATE:20090508 +DTEND;VALUE=DATE:20090509 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/AustraliaHolidays.ics b/media/caldata/AustraliaHolidays.ics new file mode 100644 index 00000000000..5c8c1b54316 --- /dev/null +++ b/media/caldata/AustraliaHolidays.ics @@ -0,0 +1,433 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Australia/Hobart +X-LIC-LOCATION:Australia/Hobart +BEGIN:DAYLIGHT +TZOFFSETFROM:+1000 +TZOFFSETTO:+1100 +TZNAME:EST +DTSTART:19701004T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=10 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+1100 +TZOFFSETTO:+1000 +TZNAME:EST +DTSTART:19700405T030000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20120123T043013Z +LAST-MODIFIED:20130112T044432Z +DTSTAMP:20130112T044432Z +UID:1b873596-6e4d-4016-8bb7-9ebc4ee20810 +SUMMARY:New Year's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130101 +DTEND;VALUE=DATE:20130102 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T041700Z +LAST-MODIFIED:20130112T044710Z +DTSTAMP:20130112T044710Z +UID:c0150e0b-4b84-4d5b-91e6-b7949f3a4e1e +SUMMARY:Australia Day +CATEGORIES:Miscellaneous +DTSTART;VALUE=DATE:20130126 +DTEND;VALUE=DATE:20130127 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T052550Z +DTSTAMP:20130112T052550Z +UID:cb0d291f-01be-4f18-9247-d86d1964f1fd +SUMMARY:Eight Hours Day (TAS) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130311 +DTEND;VALUE=DATE:20130312 +TRANSP:TRANSPARENT +SEQUENCE:4 +X-MOZ-GENERATION:5 +LOCATION:TAS +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042212Z +LAST-MODIFIED:20130112T044859Z +DTSTAMP:20130112T044859Z +UID:424c0027-c676-4895-9629-8023dec5bbae +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042254Z +LAST-MODIFIED:20130112T045203Z +DTSTAMP:20130112T045203Z +UID:a55d66b7-3b7d-44be-9d8f-23b3cbc59bfe +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042321Z +LAST-MODIFIED:20130112T052544Z +DTSTAMP:20130112T052544Z +UID:5e217e81-85b3-4c4f-9506-cbb55ed6c2c4 +SUMMARY:Easter Tuesday (TAS) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130402 +DTEND;VALUE=DATE:20130403 +TRANSP:TRANSPARENT +SEQUENCE:5 +X-MOZ-GENERATION:5 +LOCATION:TAS +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042445Z +LAST-MODIFIED:20130112T044508Z +DTSTAMP:20130112T044508Z +UID:900769c1-693f-410d-931f-93eec5aabaff +SUMMARY:Anzac Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130425 +DTEND;VALUE=DATE:20130426 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042559Z +LAST-MODIFIED:20130112T055020Z +DTSTAMP:20130112T055020Z +UID:7133e8bd-35ab-44b0-81cc-000ebf5dcd72 +SUMMARY:Queen's Birthday (Ex WA) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130610 +DTEND;VALUE=DATE:20130611 +TRANSP:TRANSPARENT +SEQUENCE:3 +X-MOZ-GENERATION:4 +LOCATION:Ex WA +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042759Z +LAST-MODIFIED:20130112T050010Z +DTSTAMP:20130112T050010Z +UID:d6286189-a468-426d-b7d9-393ecaeb77c8 +SUMMARY:Melbourne Cup Day (Vic) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131106 +DTEND;VALUE=DATE:20131107 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +LOCATION:Vic +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042835Z +LAST-MODIFIED:20130112T044524Z +DTSTAMP:20130112T044524Z +UID:a32265bb-6058-4a0c-b88d-6ced2c490359 +SUMMARY:Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131225 +DTEND;VALUE=DATE:20131226 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042859Z +LAST-MODIFIED:20130112T044528Z +DTSTAMP:20130112T044528Z +UID:d611a4ca-7653-4af7-916f-6633659cb9a2 +SUMMARY:Boxing Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131226 +DTEND;VALUE=DATE:20131227 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T041700Z +LAST-MODIFIED:20130112T044730Z +DTSTAMP:20130112T044730Z +UID:89c11f23-0a71-4586-866b-91002fedc349 +SUMMARY:Australia Day Holiday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130128 +DTEND;VALUE=DATE:20130129 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042759Z +LAST-MODIFIED:20130112T052457Z +DTSTAMP:20130112T052457Z +UID:17400603-e91b-4711-99ed-09c00d3ad0ee +SUMMARY:Recreation Day (TAS ex Hobart) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131104 +DTEND;VALUE=DATE:20131105 +TRANSP:TRANSPARENT +SEQUENCE:4 +X-MOZ-GENERATION:5 +LOCATION:TAS +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T050456Z +DTSTAMP:20130112T050456Z +UID:3fd479f4-a03a-407c-a75b-7ae661d9a552 +SUMMARY:Labour Day (WA) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130304 +DTEND;VALUE=DATE:20130305 +TRANSP:TRANSPARENT +SEQUENCE:4 +X-MOZ-GENERATION:5 +LOCATION:WA +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042559Z +LAST-MODIFIED:20130112T050551Z +DTSTAMP:20130112T050551Z +UID:0259e90c-df1d-4fdf-a9eb-48599cfc841a +SUMMARY:Western Australia Day (WA) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130603 +DTEND;VALUE=DATE:20130604 +TRANSP:TRANSPARENT +SEQUENCE:3 +X-MOZ-GENERATION:3 +LOCATION:WA +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042559Z +LAST-MODIFIED:20130112T050718Z +DTSTAMP:20130112T050718Z +UID:421a9626-700c-4c16-912f-a3ddcb4ec87e +SUMMARY:Queen's Birthday (WA) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130930 +DTEND;VALUE=DATE:20131001 +TRANSP:TRANSPARENT +SEQUENCE:3 +X-MOZ-GENERATION:4 +LOCATION:WA +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T050801Z +DTSTAMP:20130112T050801Z +UID:95209266-77d2-447b-bed9-37912d6ff7d8 +SUMMARY:Canberra Day (ACT) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130311 +DTEND;VALUE=DATE:20130312 +TRANSP:TRANSPARENT +SEQUENCE:4 +X-MOZ-GENERATION:5 +LOCATION:ACT +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T050912Z +DTSTAMP:20130112T050912Z +UID:de4e77b0-ec3f-457f-b87d-087e8da28509 +SUMMARY:Labour Day (ACT) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131007 +DTEND;VALUE=DATE:20131008 +TRANSP:TRANSPARENT +SEQUENCE:6 +X-MOZ-GENERATION:7 +LOCATION:ACT +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T051138Z +DTSTAMP:20130112T051138Z +UID:6840bb5d-d939-4d2d-a432-1fd56f0ca568 +SUMMARY:Easter Saturday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130330 +DTEND;VALUE=DATE:20130331 +TRANSP:TRANSPARENT +SEQUENCE:5 +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T051227Z +DTSTAMP:20130112T051227Z +UID:211bfe16-3487-48c2-b051-529cd2dbb6ed +SUMMARY:Bank Holiday (NSW) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130805 +DTEND;VALUE=DATE:20130806 +TRANSP:TRANSPARENT +SEQUENCE:5 +X-MOZ-GENERATION:6 +LOCATION:NSW +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T051306Z +DTSTAMP:20130112T051306Z +UID:adf79de5-96b3-45b8-b9dd-f92b36c653ed +SUMMARY:Labour Day (NSW) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131007 +DTEND;VALUE=DATE:20131008 +TRANSP:TRANSPARENT +SEQUENCE:7 +X-MOZ-GENERATION:8 +LOCATION:NSW +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T051346Z +DTSTAMP:20130112T051346Z +UID:cf54e37e-876f-4a7c-8992-67c929b7f886 +SUMMARY:May Day (NT) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130506 +DTEND;VALUE=DATE:20130507 +TRANSP:TRANSPARENT +SEQUENCE:7 +X-MOZ-GENERATION:8 +LOCATION:NT +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T051438Z +DTSTAMP:20130112T051438Z +UID:3ef3ad6a-93da-4409-a982-28bef5197e92 +SUMMARY:Picnic Day (NT) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130805 +DTEND;VALUE=DATE:20130806 +TRANSP:TRANSPARENT +SEQUENCE:6 +X-MOZ-GENERATION:7 +LOCATION:NT +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T052529Z +DTSTAMP:20130112T052529Z +UID:085a3910-a2af-4c2a-87f8-5c5fcf98b900 +SUMMARY:Royal Queensland Show (QLD only Bris) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130814 +DTEND;VALUE=DATE:20130815 +TRANSP:TRANSPARENT +SEQUENCE:8 +X-MOZ-GENERATION:9 +LOCATION:QLD +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T051737Z +DTSTAMP:20130112T051737Z +UID:b251b044-f44c-4604-8c7a-3757e254f308 +SUMMARY:Labour Day (QLD) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131007 +DTEND;VALUE=DATE:20131008 +TRANSP:TRANSPARENT +SEQUENCE:8 +X-MOZ-GENERATION:9 +LOCATION:QLD +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T051838Z +DTSTAMP:20130112T051838Z +UID:f5651d61-4e10-439e-8538-59db888330c0 +SUMMARY:Adelaide Cup (SA) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130311 +DTEND;VALUE=DATE:20130312 +TRANSP:TRANSPARENT +SEQUENCE:4 +X-MOZ-GENERATION:5 +LOCATION:SA +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T052002Z +DTSTAMP:20130112T052002Z +UID:01eaf096-2a86-4c33-9b40-3a25548cfe00 +SUMMARY:Labour Day (SA) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131007 +DTEND;VALUE=DATE:20131008 +TRANSP:TRANSPARENT +SEQUENCE:9 +X-MOZ-GENERATION:11 +LOCATION:SA +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042835Z +LAST-MODIFIED:20130112T052212Z +DTSTAMP:20130112T052212Z +UID:c489572e-e942-4070-80b5-862a86aa1c66 +SUMMARY:Christmas Eve (SA) +CATEGORIES:Public Holiday +DTSTART;TZID=Australia/Hobart:20131224T190000 +DTEND;TZID=Australia/Hobart:20131225T000000 +TRANSP:OPAQUE +SEQUENCE:2 +X-MOZ-GENERATION:2 +LOCATION:SA +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042835Z +LAST-MODIFIED:20130112T055848Z +DTSTAMP:20130112T055848Z +UID:069a5549-98a8-4553-aea8-873b0fe25b73 +SUMMARY:New Year's Eve (SA) +CATEGORIES:Public Holiday +DTSTART;TZID=Australia/Hobart:20131231T190000 +DTEND;TZID=Australia/Hobart:20140101T000000 +TRANSP:OPAQUE +SEQUENCE:2 +X-MOZ-GENERATION:4 +LOCATION:SA +END:VEVENT +BEGIN:VEVENT +CREATED:20120123T042019Z +LAST-MODIFIED:20130112T052402Z +DTSTAMP:20130112T052402Z +UID:a5cd9b05-db52-4760-b8b9-9c48b823c7dd +SUMMARY:Royal Hobart Regatta (TAS only Hobart) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130311 +DTEND;VALUE=DATE:20130312 +TRANSP:TRANSPARENT +SEQUENCE:4 +X-MOZ-GENERATION:5 +LOCATION:TAS +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/AustrianHolidays.ics b/media/caldata/AustrianHolidays.ics new file mode 100644 index 00000000000..fdb4cfe1cfd --- /dev/null +++ b/media/caldata/AustrianHolidays.ics @@ -0,0 +1,1278 @@ +BEGIN:VCALENDAR +METHOD + :PUBLISH +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :982787692 +SUMMARY + :Neujahr +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=1 +DTSTART + ;VALUE=DATE + :20020101 +DTSTAMP + :20021113T091324Z +END:VEVENT +BEGIN:VEVENT +UID + :929296434 +SUMMARY + :Fronleichnam +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20050526 +DTEND + ;VALUE=DATE + :20050527 +DTSTAMP + :20021113T093827Z +LAST-MODIFIED + :20050514T205820Z +END:VEVENT +BEGIN:VEVENT +UID + :c342bb4c-1dd1-11b2-ae75-86b626b8af24 +SUMMARY + :Ostermontag +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20090413 +DTEND + ;VALUE=DATE + :20090414 +DTSTAMP + :20050514T210402Z +END:VEVENT +BEGIN:VEVENT +UID + :d84f9a78-1dd1-11b2-960f-88b8ce94006e +SUMMARY + :Christi Himmelfahrt +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20090521 +DTEND + ;VALUE=DATE + :20090522 +DTSTAMP + :20050514T210440Z +END:VEVENT +BEGIN:VEVENT +UID + :e9ff5682-1dd1-11b2-856c-c3d06c2ee118 +SUMMARY + :Pfingstmontag +CLASS + :PRIVATE +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20090601 +DTEND + ;VALUE=DATE + :20090602 +DTSTAMP + :20050514T210507Z +END:VEVENT +BEGIN:VEVENT +UID + :f98a58ae-1dd1-11b2-91bf-f21c6a670c9c +SUMMARY + :Fronleichnam +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20090611 +DTEND + ;VALUE=DATE + :20090612 +DTSTAMP + :20050514T210536Z +END:VEVENT +BEGIN:VEVENT +UID + :211d18c0-1dd2-11b2-a2d4-c52bf7ff0e48 +SUMMARY + :Ostermontag +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20100405 +DTEND + ;VALUE=DATE + :20100406 +DTSTAMP + :20050514T210639Z +END:VEVENT +BEGIN:VEVENT +UID + :41097a34-1dd2-11b2-8fa4-c75d37e870d5 +SUMMARY + :Christi Himmelfahrt +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20100513 +DTEND + ;VALUE=DATE + :20100514 +DTSTAMP + :20050514T210732Z +END:VEVENT +BEGIN:VEVENT +UID + :5c879746-1dd2-11b2-8b38-fbfae718683b +SUMMARY + :Pfingstmontag +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20100524 +DTEND + ;VALUE=DATE + :20100525 +DTSTAMP + :20050514T210804Z +END:VEVENT +BEGIN:VEVENT +UID + :6cf61f44-1dd2-11b2-bbaf-f17308295164 +SUMMARY + :Fronleichnam +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20100603 +DTEND + ;VALUE=DATE + :20100604 +DTSTAMP + :20050514T210849Z +END:VEVENT +BEGIN:VEVENT +UID + :ad4c4320-1dd1-11b2-a482-b42765be9115 +SUMMARY + :Ostermontag +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20110425 +DTEND + ;VALUE=DATE + :20110426 +DTSTAMP + :20050514T211032Z +END:VEVENT +BEGIN:VEVENT +UID + :e5293118-1dd1-11b2-96c1-e769a56e524e +SUMMARY + :Christi Himmelfahrt +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20110602 +DTEND + ;VALUE=DATE + :20110603 +DTSTAMP + :20050514T211110Z +END:VEVENT +BEGIN:VEVENT +UID + :ff128d2c-1dd1-11b2-85e9-885958ece137 +SUMMARY + :Pfingstmontag +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20110613 +DTEND + ;VALUE=DATE + :20110614 +DTSTAMP + :20050514T211242Z +END:VEVENT +BEGIN:VEVENT +UID + :131d9780-1dd2-11b2-807b-e5d83f7adf0b +SUMMARY + :Fronleichnam +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20110623 +DTEND + ;VALUE=DATE + :20110624 +DTSTAMP + :20050514T211335Z +END:VEVENT +BEGIN:VEVENT +UID + :7c807c5a-1dd2-11b2-b67f-98b16fe3ef38 +SUMMARY + :Ostermontag +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20120409 +DTEND + ;VALUE=DATE + :20120410 +DTSTAMP + :20050514T212338Z +END:VEVENT +BEGIN:VEVENT +UID + :8fc847e8-1dd2-11b2-92b2-d3f8c4d23917 +SUMMARY + :Christi Himmelfahrt +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20120517 +DTEND + ;VALUE=DATE + :20120518 +DTSTAMP + :20050514T212407Z +END:VEVENT +BEGIN:VEVENT +UID + :a1e2bc7e-1dd1-11b2-a477-8eb732d9b21c +SUMMARY + :Pfingstmontag +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20120528 +DTEND + ;VALUE=DATE + :20120529 +DTSTAMP + :20050514T212444Z +END:VEVENT +BEGIN:VEVENT +UID + :b0242458-1dd1-11b2-bbef-968b28755ec6 +SUMMARY + :Fronleichnam +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20120607 +DTEND + ;VALUE=DATE + :20120608 +DTSTAMP + :20050514T212511Z +LAST-MODIFIED + :20050514T212543Z +END:VEVENT +BEGIN:VEVENT +UID + :2255b5c8-1dd2-11b2-99c9-91a7630b71b2 +SUMMARY + :Ostermontag +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20130401 +DTEND + ;VALUE=DATE + :20130402 +DTSTAMP + :20050514T212716Z +END:VEVENT +BEGIN:VEVENT +UID + :34f41062-1dd2-11b2-ad05-f21fddb3a4ae +SUMMARY + :Christi Himmelfahrt +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20130509 +DTEND + ;VALUE=DATE + :20130510 +DTSTAMP + :20050514T212847Z +LAST-MODIFIED + :20050514T212927Z +END:VEVENT +BEGIN:VEVENT +UID + :56cf0a34-1dd2-11b2-9ad7-b87a8dd17315 +SUMMARY + :Pfingstmontag +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20130520 +DTEND + ;VALUE=DATE + :20130521 +DTSTAMP + :20050514T212949Z +END:VEVENT +BEGIN:VEVENT +UID + :66a82346-1dd2-11b2-a123-e5c8ba479d09 +SUMMARY + :Fronleichnam +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20130530 +DTEND + ;VALUE=DATE + :20130531 +DTSTAMP + :20050514T213014Z +END:VEVENT +BEGIN:VEVENT +UID + :885b16ec-1dd2-11b2-8168-a059ee8c6a0b +SUMMARY + :Ostermontag +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20140421 +DTEND + ;VALUE=DATE + :20140422 +DTSTAMP + :20050514T213044Z +END:VEVENT +BEGIN:VEVENT +UID + :b95a1626-1dd1-11b2-86b0-bb5ae7751fbd +SUMMARY + :Christi Himmelfahrt +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20140529 +DTEND + ;VALUE=DATE + :20140530 +DTSTAMP + :20050514T213141Z +END:VEVENT +BEGIN:VEVENT +UID + :d9b5a764-1dd1-11b2-a92a-d1a96231117e +SUMMARY + :Pfingstmontag +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20140609 +DTEND + ;VALUE=DATE + :20140610 +DTSTAMP + :20050514T213324Z +END:VEVENT +BEGIN:VEVENT +UID + :0962b510-1dd2-11b2-8c8e-c7f04690c0dd +SUMMARY + :Fronleichnam +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20140619 +DTEND + ;VALUE=DATE + :20140620 +DTSTAMP + :20050514T213353Z +END:VEVENT +BEGIN:VEVENT +UID + :27a09128-1dd2-11b2-903a-c874aef1e88f +SUMMARY + :Ostermontag +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20150406 +DTEND + ;VALUE=DATE + :20150407 +DTSTAMP + :20050514T213527Z +END:VEVENT +BEGIN:VEVENT +UID + :36501b76-1dd2-11b2-88e7-d34f52e68acb +SUMMARY + :Christi Himmelfahrt +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20150514 +DTEND + ;VALUE=DATE + :20150515 +DTSTAMP + :20050514T213602Z +END:VEVENT +BEGIN:VEVENT +UID + :a6970868-1dd1-11b2-9d28-a2e4e60a4956 +SUMMARY + :Pfingstmontag +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20150525 +DTEND + ;VALUE=DATE + :20150526 +DTSTAMP + :20050514T213812Z +END:VEVENT +BEGIN:VEVENT +UID + :b943e918-1dd1-11b2-9f35-dbefde4d6d8a +SUMMARY + :Fronleichnam +STATUS + :TENTATIVE +CLASS + :PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20150604 +DTEND + ;VALUE=DATE + :20150605 +DTSTAMP + :20050514T213945Z +END:VEVENT +BEGIN:VEVENT +UID + :ddbff320-1dd1-11b2-91d9-8ab1c6ed2367 +SUMMARY + :Geburtstag Thomas B. +STATUS + :CONFIRMED +CLASS + :PRIVATE +X-MOZILLA-ALARM-DEFAULT-LENGTH + :0 +DTSTART + ;VALUE=DATE + :20050611 +DTEND + ;VALUE=DATE + :20050612 +DTSTAMP + :20050606T210619Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :904259993 +SUMMARY + :Ostermontag +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20030421 +DTSTAMP + :20021113T092901Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :906774672 +SUMMARY + :Staatsfeiertag +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=5 +DTSTART + ;VALUE=DATE + :20020501 +DTSTAMP + :20021113T091459Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :938686152 +SUMMARY + :Christi Himmelfahrt +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20030529 +DTSTAMP + :20021113T093246Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :970262303 +SUMMARY + :Pfingstmontag +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20030609 +DTSTAMP + :20021113T093454Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :943909898 +SUMMARY + :Fronleichnam +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20030619 +DTSTAMP + :20021113T093647Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :938628849 +SUMMARY + :Maria Himmelfahrt +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=8 +DTSTART + ;VALUE=DATE + :20020815 +DTSTAMP + :20021113T091530Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :916990651 +SUMMARY + :Nationalfeiertag +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=10 +DTSTART + ;VALUE=DATE + :20021026 +DTSTAMP + :20021113T091639Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :919148894 +SUMMARY + :Ostermontag +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20040412 +DTSTAMP + :20021113T092959Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :905727931 +SUMMARY + :Christi Himmelfahrt +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20040520 +DTSTAMP + :20021113T093316Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :907543508 +SUMMARY + :Pfingstmontag +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20040531 +DTSTAMP + :20021113T093527Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :952759515 +SUMMARY + :Fronleichnam +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20040610 +DTSTAMP + :20021113T093704Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :952054300 +SUMMARY + :Ostermontag +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20050328 +DTSTAMP + :20021113T093025Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :926748582 +SUMMARY + :Christi Himmelfahrt +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20050505 +DTSTAMP + :20021113T093334Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :981685500 +SUMMARY + :Pfingstmontag +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20050516 +DTSTAMP + :20021113T093541Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :934950583 +SUMMARY + :Ostermontag +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20060417 +DTSTAMP + :20021113T093127Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :937051651 +SUMMARY + :Christi Himmelfahrt +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20060525 +DTSTAMP + :20021113T093350Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :945055989 +SUMMARY + :Pfingstmontag +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20060605 +DTSTAMP + :20021113T093557Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :918904474 +SUMMARY + :Fronleichnam +CLASS + :PRIVATE +DTSTART + ;VALUE=DATE + :20060615 +DTSTAMP + :20021113T093850Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :921714142 +SUMMARY + :Ostermontag +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20070409 +DTSTAMP + :20021113T093159Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :941055869 +SUMMARY + :Christi Himmelfahrt +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20070517 +DTSTAMP + :20021113T093414Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :955849531 +SUMMARY + :Pfingstmontag +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20070528 +DTSTAMP + :20021113T093613Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :905710574 +SUMMARY + :Fronleichnam +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20070607 +DTSTAMP + :20021113T093905Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :946017810 +SUMMARY + :Ostermontag +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20080324 +DTSTAMP + :20021113T093218Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :968555320 +SUMMARY + :Christi Himmelfahrt +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20080501 +DTSTAMP + :20021113T093434Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :968757005 +SUMMARY + :Pfingstmontag +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20080512 +DTSTAMP + :20021113T093630Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +METHOD + :PUBLISH +BEGIN:VEVENT +UID + :905199992 +SUMMARY + :Fronleichnam +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20080522 +DTSTAMP + :20021113T093921Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :928651174 +SUMMARY + :Maria Empfängnis +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=12 +DTSTART + ;VALUE=DATE + :20021208 +DTSTAMP + :20021113T091830Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :964886076 +SUMMARY + :Christtag +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=12 +DTSTART + ;VALUE=DATE + :20021225 +DTSTAMP + :20021113T091908Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :927277580 +SUMMARY + :Stefanitag +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=12 +DTSTART + ;VALUE=DATE + :20021226 +DTSTAMP + :20021113T091928Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :966060779 +SUMMARY + :Allerheiligen +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=11 +DTSTART + ;VALUE=DATE + :20021101 +DTSTAMP + :20021113T091705Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :981687214 +SUMMARY + :Heilige Drei Könige +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=1 +DTSTART + ;VALUE=DATE + :20020106 +DTEND + :20020106T235900Z +DTSTAMP + :20021113T091403Z +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/BasqueHolidays.ics b/media/caldata/BasqueHolidays.ics new file mode 100644 index 00000000000..65a761d42dc --- /dev/null +++ b/media/caldata/BasqueHolidays.ics @@ -0,0 +1,549 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Europe/Madrid +X-LIC-LOCATION:Europe/Madrid +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20090113T123500Z +LAST-MODIFIED:20100323T082701Z +DTSTAMP:20100323T082701Z +UID:08a46a29-0cfc-442e-83e6-f6fd7d4e6dcc +SUMMARY:Ostegun Santua +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20100401 +DTEND;VALUE=DATE:20100402 +TRANSP:TRANSPARENT +LOCATION:Hegoaldean +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T123527Z +LAST-MODIFIED:20100323T082755Z +DTSTAMP:20100323T082755Z +UID:55a600b4-7e64-48ca-874d-e569252f47db +SUMMARY:Ostiral Santua +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +LOCATION:Hegoaldean +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T123554Z +LAST-MODIFIED:20100323T082810Z +DTSTAMP:20100323T082810Z +UID:9cbf1af0-6a60-4610-be43-5e9356ce281a +SUMMARY:Paskua astelehena +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +TRANSP:TRANSPARENT +LOCATION:Euskal Herri osoan +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T130948Z +LAST-MODIFIED:20100528T054417Z +DTSTAMP:20100528T054417Z +UID:61386701-e84b-410c-9bcc-f6e6838212a7 +SUMMARY:Amen eguna +CATEGORIES:Jai Egunak +X-MOZ-LASTACK:20100528T054417Z +DTSTART;VALUE=DATE:20100528 +DTEND;VALUE=DATE:20100529 +LOCATION:Iparraldean +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +SEQUENCE:1 +BEGIN:VALARM +ACTION:DISPLAY +TRIGGER;VALUE=DURATION:-PT15M +DESCRIPTION:Lehenetsitako Mozilla azalpena +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T070406Z +LAST-MODIFIED:20101221T070443Z +DTSTAMP:20101221T070443Z +UID:b9458b2a-a0d5-4b5d-9880-b9ecc252286e +SUMMARY:Arantzazuko ama +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20110909 +DTEND;VALUE=DATE:20110910 +LOCATION:Gipuzkoan +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T071547Z +LAST-MODIFIED:20101221T071616Z +DTSTAMP:20101221T071616Z +UID:447cb927-c7ea-4dd9-9746-8e721e79da2b +SUMMARY:Valentin Berriotxoakoa +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20110704 +DTEND;VALUE=DATE:20110705 +LOCATION:Bizkaian +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T131846Z +LAST-MODIFIED:20101221T071707Z +DTSTAMP:20101221T071707Z +UID:4c7f12b4-bb73-49d4-a455-c166a59645f7 +SUMMARY:Indotxinan Frantziagatik hildakoen eguna +CATEGORIES:Jai Egunak +X-MOZ-LASTACK:20100610T073658Z +DTSTART;VALUE=DATE:20100608 +DTEND;VALUE=DATE:20100609 +LOCATION:Iparraldean +TRANSP:TRANSPARENT +X-MOZ-GENERATION:20 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T072034Z +LAST-MODIFIED:20101221T072114Z +DTSTAMP:20101221T072114Z +UID:8ec9c6b8-71cb-497b-8c97-66d1d3f7a45a +SUMMARY:Igokunde +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +LOCATION:Iparraldean +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T072119Z +LAST-MODIFIED:20101221T072140Z +DTSTAMP:20101221T072140Z +UID:3064b5d1-3999-478a-8f2a-f40c7bdc369e +SUMMARY:Penteskoste astelehena +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20100524 +DTEND;VALUE=DATE:20100525 +LOCATION:Iparralden +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T072558Z +LAST-MODIFIED:20101221T072613Z +DTSTAMP:20101221T072613Z +UID:bd4363b0-7a15-4537-bd07-651781877ad2 +SUMMARY:Igokunde +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +LOCATION:Iparraldean +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T072617Z +LAST-MODIFIED:20101221T072631Z +DTSTAMP:20101221T072631Z +UID:79cf71d3-be16-4b5a-9e60-9558522bbf8a +SUMMARY:Pentekoste astelehena +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +LOCATION:Iparraldean +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T072646Z +LAST-MODIFIED:20101221T072701Z +DTSTAMP:20101221T072701Z +UID:67898b17-8946-4f75-b8bb-0661402187e2 +SUMMARY:Igokunde +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +LOCATION:Iparraldean +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T072703Z +LAST-MODIFIED:20101221T072725Z +DTSTAMP:20101221T072725Z +UID:ba4f5a68-8b98-4f7f-b643-3cd46fe50d6b +SUMMARY:Pentekoste astelehena +DTSTART;VALUE=DATE:20120528 +DTEND;VALUE=DATE:20120529 +LOCATION:Iparraldean +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T072827Z +LAST-MODIFIED:20101221T072855Z +DTSTAMP:20101221T072855Z +UID:1af81472-0f59-41a0-8c9d-2e0bb69a415c +SUMMARY:Paskoa astelehena +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +LOCATION:Euskal Herria osoan +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T072934Z +LAST-MODIFIED:20101221T072956Z +DTSTAMP:20101221T072956Z +UID:726509e8-4394-4114-9267-83cd8c8546d2 +SUMMARY:Pasko astelehena +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +LOCATION:Euskal Herria osoan +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T073029Z +LAST-MODIFIED:20101221T073048Z +DTSTAMP:20101221T073048Z +UID:c88b5fc7-4fce-4ea6-9788-1b362bbba140 +SUMMARY:Ostiral Santua +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +LOCATION:Hegoaldean +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T073049Z +LAST-MODIFIED:20101221T073107Z +DTSTAMP:20101221T073107Z +UID:dcc57c8e-d8e1-4a00-882e-a4ddf319c719 +SUMMARY:Ostegun Santua +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20120405 +DTEND;VALUE=DATE:20120406 +LOCATION:Hegoaldean +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T073126Z +LAST-MODIFIED:20101221T073141Z +DTSTAMP:20101221T073141Z +UID:c77c7cd4-8c04-4086-a0b0-ce4776d996e4 +SUMMARY:Ostiral Santua +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +LOCATION:Hegoaldean +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T073143Z +LAST-MODIFIED:20101221T073200Z +DTSTAMP:20101221T073200Z +UID:a942c5ad-729b-462d-9fa6-345b92b736ff +SUMMARY:Ostegun santua +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20110421 +DTEND;VALUE=DATE:20110422 +LOCATION:Hegoaldean +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T133719Z +LAST-MODIFIED:20090113T133740Z +DTSTAMP:20090121T132513Z +UID:43d2a5a4-d85f-48bc-be49-648fcc4307d3 +SUMMARY:Igandea +RRULE:FREQ=WEEKLY +DTSTART;VALUE=DATE:20090104 +DTEND;VALUE=DATE:20090105 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T124607Z +LAST-MODIFIED:20101221T064638Z +DTSTAMP:20101221T064638Z +UID:f51bd792-5e9a-46d6-bea7-2640389b4fd7 +SUMMARY:San Frantzisko Xabier +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=3;BYMONTH=12 +DTSTART;VALUE=DATE:20101203 +DTEND;VALUE=DATE:20101204 +LOCATION:Nafarroan +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T124013Z +LAST-MODIFIED:20101221T064657Z +DTSTAMP:20101221T064657Z +UID:84df77ec-733a-4a4a-8b3c-470060cc5efe +SUMMARY:Kontzeziño eguna +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=8;BYMONTH=12 +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20101208 +DTEND;VALUE=DATE:20101209 +TRANSP:TRANSPARENT +LOCATION:Hegoaldean +X-MOZ-GENERATION:4 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T124013Z +LAST-MODIFIED:20101221T064718Z +DTSTAMP:20101221T064718Z +UID:55fb70a6-9cdc-483e-89e9-6d0cefdf70d6 +SUMMARY:Espainiar konstituzio eguna +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=6;BYMONTH=12 +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20101206 +DTEND;VALUE=DATE:20101207 +TRANSP:TRANSPARENT +LOCATION:Hegoaldean +X-MOZ-GENERATION:4 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T124033Z +LAST-MODIFIED:20101221T065519Z +DTSTAMP:20101221T065519Z +UID:883066f0-02ba-4c45-bbd2-89e38994c004 +SUMMARY:Gabon eguna +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=25;BYMONTH=12 +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +TRANSP:TRANSPARENT +LOCATION:Euskal Herri osoan +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T132045Z +LAST-MODIFIED:20101221T065552Z +DTSTAMP:20101221T065552Z +UID:aa5746ea-2bf5-4d8f-91c9-1520746878d4 +SUMMARY:1918ko bakea +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=11;BYMONTH=11 +CATEGORIES:Jai Egunak +X-MOZ-LASTACK:20101111T084636Z +DTSTART;VALUE=DATE:20101111 +DTEND;VALUE=DATE:20101112 +LOCATION:Iparraldean +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T065659Z +LAST-MODIFIED:20101221T065931Z +DTSTAMP:20101221T065931Z +UID:5bc5ad25-ba6a-4a34-96cd-33feb83a3235 +SUMMARY:Santu guztien eguna +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=1;BYMONTH=11 +DTSTART;VALUE=DATE:20101101 +DTEND;VALUE=DATE:20101102 +TRANSP:TRANSPARENT +LOCATION:Euskal Herri osoan +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T123930Z +LAST-MODIFIED:20101221T070104Z +DTSTAMP:20101221T070104Z +UID:ba60c0a4-b79f-42ba-bfbd-9ff84b045d1c +SUMMARY:Espainiar festa nazionala +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=12;BYMONTH=10 +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20101012 +DTEND;VALUE=DATE:20101013 +TRANSP:TRANSPARENT +LOCATION:Hegoaldean +X-MOZ-GENERATION:4 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101221T065957Z +LAST-MODIFIED:20101221T070113Z +DTSTAMP:20101221T070113Z +UID:e87fdb75-f469-4f94-b944-ea3b78c932a4 +SUMMARY:Gernikako estatutoaren eguna +RRULE:FREQ=YEARLY;COUNT=2;BYMONTHDAY=25;BYMONTH=10 +CATEGORIES:Jaieguna +DTSTART;VALUE=DATE:20111025 +DTEND;VALUE=DATE:20111026 +LOCATION:Euskadi autonomia erkidegoa +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T123853Z +LAST-MODIFIED:20101221T070202Z +DTSTAMP:20101221T070202Z +UID:933329b1-55b5-4153-9c68-08e6da96097b +SUMMARY:Andramari +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=15;BYMONTH=8 +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20100815 +DTEND;VALUE=DATE:20100816 +TRANSP:TRANSPARENT +LOCATION:Euskal Herri osoan +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T124226Z +LAST-MODIFIED:20101221T070242Z +DTSTAMP:20101221T070242Z +UID:f519311c-646d-4265-9978-9a100fecfda5 +SUMMARY:Loiolako Inaxio +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=31;BYMONTH=7 +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20100731 +DTEND;VALUE=DATE:20100801 +TRANSP:TRANSPARENT +LOCATION:Bizkaia eta Gipuzkoan +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T124207Z +LAST-MODIFIED:20101221T070301Z +DTSTAMP:20101221T070301Z +UID:c02c0a64-515b-462b-94bc-ac088e7cdd87 +SUMMARY:Santiago eguna +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=25;BYMONTH=7 +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20100725 +DTEND;VALUE=DATE:20100726 +TRANSP:TRANSPARENT +LOCATION:Hegoaldean +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T131924Z +LAST-MODIFIED:20101221T070320Z +DTSTAMP:20101221T070320Z +UID:835ca8ac-66a5-4a12-af08-afc8c3f70f69 +SUMMARY:Bastillako eguna +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=14;BYMONTH=7 +CATEGORIES:Jai Egunak +X-MOZ-LASTACK:20100714T092756Z +DTSTART;VALUE=DATE:20100714 +DTEND;VALUE=DATE:20100715 +LOCATION:Iparraldean +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T130747Z +LAST-MODIFIED:20101221T072216Z +DTSTAMP:20101221T072216Z +UID:48dea0ea-b0a6-4fb7-93f2-e221dff54e00 +SUMMARY:Jai nazionala\, II mundu gerratearen amaiera +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=8;BYMONTH=5 +CATEGORIES:Jai Egunak +X-MOZ-LASTACK:20100512T091748Z +DTSTART;VALUE=DATE:20100508 +DTEND;VALUE=DATE:20100509 +LOCATION:Iparraldean +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T123626Z +LAST-MODIFIED:20101221T072233Z +DTSTAMP:20101221T072233Z +UID:5a5fc2d2-df5e-400a-8177-4c020a6f3d07 +SUMMARY:Langileen eguna +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=1;BYMONTH=5 +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:20100502 +TRANSP:TRANSPARENT +LOCATION:Euskal Herri osoan +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T124447Z +LAST-MODIFIED:20101221T072257Z +DTSTAMP:20101221T072257Z +UID:9153b1d1-403c-4601-a481-261d0d563190 +SUMMARY:San Prudentzio +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=28;BYMONTH=4 +CATEGORIES:Jaieguna +X-MOZ-LASTACK:20100512T091749Z +DTSTART;TZID=Europe/Madrid:20100428T140000 +DTEND;TZID=Europe/Madrid:20100428T150000 +LOCATION:Araban +SEQUENCE:2 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T123423Z +LAST-MODIFIED:20101221T073402Z +DTSTAMP:20101221T073402Z +UID:864620c0-31e3-4497-a3f3-aae724a3167e +SUMMARY:San Jose +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=19;BYMONTH=3 +EXDATE;VALUE=DATE:20110319 +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20100319 +DTEND;VALUE=DATE:20100320 +TRANSP:TRANSPARENT +LOCATION:Hegoaldean +X-MOZ-GENERATION:4 +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T123334Z +LAST-MODIFIED:20101221T073439Z +DTSTAMP:20101221T073439Z +UID:4d3cabb8-ff22-4734-a2af-d87089d39a02 +SUMMARY:Epifania +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=6;BYMONTH=1 +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20100106 +DTEND;VALUE=DATE:20100107 +TRANSP:TRANSPARENT +LOCATION:Hegoaldean +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T123208Z +LAST-MODIFIED:20101221T073503Z +DTSTAMP:20101221T073503Z +UID:17802826-3f71-41a9-be50-2f9c6b65297a +SUMMARY:Urte berri +RRULE:FREQ=YEARLY;COUNT=3;BYMONTHDAY=1;BYMONTH=1 +CATEGORIES:Jai Egunak +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +LOCATION:Euskal Herri osoan +SEQUENCE:2 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/BelgianDutchHolidays.ics b/media/caldata/BelgianDutchHolidays.ics new file mode 100644 index 00000000000..3a80f211386 --- /dev/null +++ b/media/caldata/BelgianDutchHolidays.ics @@ -0,0 +1,422 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +BEGIN:VTIMEZONE +TZID:/mozilla.org/20070129_1/Europe/Brussels +X-LIC-LOCATION:Europe/Brussels +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VTIMEZONE +TZID:/mozilla.org/20070129_1/Europe/Brussels +X-LIC-LOCATION:Europe/Brussels +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20070606T141629Z +LAST-MODIFIED:20070606T154611Z +DTSTAMP:20070701T090934Z +UID:5d1ae55f-3910-4de9-8b65-d652768fb2f2 +SUMMARY:Paasmaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070409 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070410 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T161310Z +LAST-MODIFIED:20070606T161327Z +DTSTAMP:20070701T090934Z +UID:9e19b119-f077-4ae9-934e-cb62322ca81f +SUMMARY:Hemelvaartdag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20080501 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20080502 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070605T163903Z +LAST-MODIFIED:20070606T161656Z +DTSTAMP:20070701T090934Z +UID:c6a930d6-4ed5-45d8-bb3d-d3587a32b8aa +SUMMARY:Nieuwjaar +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070101 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070102 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T141739Z +LAST-MODIFIED:20070606T161721Z +DTSTAMP:20070701T090934Z +UID:f439c81b-fd09-4b40-a629-3a9663dd29ff +SUMMARY:Feest van de Arbeid +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070501 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070502 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T141853Z +LAST-MODIFIED:20070606T161731Z +DTSTAMP:20070701T090934Z +UID:b1c0e1ed-a09f-4fc2-aab1-170d3f661f13 +SUMMARY:Wapenstilstand 1945 +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070508 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070509 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T141932Z +LAST-MODIFIED:20070606T161741Z +DTSTAMP:20070701T090934Z +UID:5468e1a0-9dda-4fd2-88c0-dc3e727c1183 +SUMMARY:Hemelvaartdag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070517 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070518 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T154927Z +LAST-MODIFIED:20070606T161748Z +DTSTAMP:20070701T090934Z +UID:67a89bb6-9ad4-461b-951c-c4c8482d8618 +SUMMARY:Pinkstermaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070528 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070529 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142112Z +LAST-MODIFIED:20070606T162012Z +DTSTAMP:20070701T090934Z +UID:854e5499-9276-4a96-9be3-bcbaa7caafcf +SUMMARY:OLV Hemelvaart +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070815 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070816 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142147Z +LAST-MODIFIED:20070606T162034Z +DTSTAMP:20070701T090934Z +UID:725c8c16-c37a-49f0-9d2e-dc976d6c3ea5 +SUMMARY:Allerheiligen +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20071101 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20071102 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142211Z +LAST-MODIFIED:20070606T162044Z +DTSTAMP:20070701T090934Z +UID:5218f724-6b66-434d-a8c5-138dfed64e07 +SUMMARY:Wapenstilstand 1918 +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20071111 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20071112 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142243Z +LAST-MODIFIED:20070606T162054Z +DTSTAMP:20070701T090934Z +UID:18617cde-2d15-46c6-900f-b3341a7b7f98 +SUMMARY:Kerstdag +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20071225 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20071226 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T150648Z +LAST-MODIFIED:20070606T162128Z +DTSTAMP:20070701T090934Z +UID:19d50a52-f5a9-4d70-8fd7-a2caa97f6959 +SUMMARY:Paasmaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20080324 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20080325 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T105427Z +LAST-MODIFIED:20070607T105450Z +DTSTAMP:20070701T090934Z +UID:18c90b99-edfa-4418-9bc7-992a07384967 +SUMMARY:Paasmaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20090413 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20090414 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T105613Z +LAST-MODIFIED:20070607T105630Z +DTSTAMP:20070701T090934Z +UID:b989d129-8f2f-42be-a027-183f6d81eb40 +SUMMARY:Hemelvaartdag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20090521 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20090522 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T105907Z +LAST-MODIFIED:20070607T105928Z +DTSTAMP:20070701T090934Z +UID:7c6fe35c-44a5-450b-aea6-dd2baef78f06 +SUMMARY:Pinkstermaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20090601 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20090602 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T110046Z +LAST-MODIFIED:20070607T110100Z +DTSTAMP:20070701T090934Z +UID:98c1c381-8632-45ce-9b11-10757face7c4 +SUMMARY:Paasmaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20100405 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20100406 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T110121Z +LAST-MODIFIED:20070607T110135Z +DTSTAMP:20070701T090934Z +UID:aaeb1ba5-60f0-4e49-a25a-c0ff949acdd9 +SUMMARY:Hemelvaartdag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20100513 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20100514 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T110144Z +LAST-MODIFIED:20070607T110201Z +DTSTAMP:20070701T090934Z +UID:1f68f978-969e-4791-a7e3-cb3011134a34 +SUMMARY:Pinkstermaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20100524 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20100525 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T112820Z +LAST-MODIFIED:20070607T112836Z +DTSTAMP:20070701T090934Z +UID:fa0d4b5b-8eeb-4b98-b35c-b6a547b96953 +SUMMARY:Hemelvaartdag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20110602 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20110603 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T112846Z +LAST-MODIFIED:20070607T112906Z +DTSTAMP:20070701T090934Z +UID:5be6194a-9fbd-45da-8e3c-568cac66b997 +SUMMARY:Pinkstermaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20110613 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20110614 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T112958Z +LAST-MODIFIED:20070607T113016Z +DTSTAMP:20070701T090934Z +UID:4162d242-5468-4007-8814-10286b9589a0 +SUMMARY:Paasmaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20120409 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20120410 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113034Z +LAST-MODIFIED:20070607T113048Z +DTSTAMP:20070701T090934Z +UID:6d368a35-6b6d-4ec1-9f48-97c53b25502e +SUMMARY:Hemelvaartdag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20120517 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20120518 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113055Z +LAST-MODIFIED:20070607T113114Z +DTSTAMP:20070701T090934Z +UID:e8913a3d-3e84-447d-afb4-f0b082948449 +SUMMARY:Pinkstermaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20120528 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20120529 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113205Z +LAST-MODIFIED:20070607T113229Z +DTSTAMP:20070701T090934Z +UID:ebc79872-a185-4641-bc22-1092d5139efb +SUMMARY:Paasmaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20130401 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20130402 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113245Z +LAST-MODIFIED:20070607T113257Z +DTSTAMP:20070701T090934Z +UID:9714bd39-429b-433c-ab5c-5fd6a67e658e +SUMMARY:Hemelvaartdag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20130509 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20130510 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113305Z +LAST-MODIFIED:20070607T113325Z +DTSTAMP:20070701T090934Z +UID:79f5f02f-e92d-417f-9637-9e2a88840583 +SUMMARY:Pinkstermaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20130520 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20130521 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113408Z +LAST-MODIFIED:20070607T113426Z +DTSTAMP:20070701T090934Z +UID:172dcce6-6f95-4c1f-ada9-e8bf2a7e8245 +SUMMARY:Paasmaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20140421 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20140422 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113439Z +LAST-MODIFIED:20070607T113452Z +DTSTAMP:20070701T090934Z +UID:6625ed89-bf9f-478a-9796-c3dc203ab5e6 +SUMMARY:Hemelvaartdag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20140529 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20140530 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113504Z +LAST-MODIFIED:20070607T113523Z +DTSTAMP:20070701T090934Z +UID:7abad826-ab68-447f-81b2-1e04a4c2ef88 +SUMMARY:Pinkstermaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20140609 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20140610 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113606Z +LAST-MODIFIED:20070607T113622Z +DTSTAMP:20070701T090934Z +UID:cf42813f-4a74-422b-aa19-90dcefccc92d +SUMMARY:Paasmaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20150406 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20150407 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113643Z +LAST-MODIFIED:20070607T113657Z +DTSTAMP:20070701T090934Z +UID:e7d30f2b-d546-4b7e-8780-0754a46e6970 +SUMMARY:Hemelvaartdag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20150514 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20150515 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113706Z +LAST-MODIFIED:20070607T113726Z +DTSTAMP:20070701T090934Z +UID:a8ccc771-4e8b-4594-ae30-33e9ce384ac9 +SUMMARY:Pinkstermaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20150525 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20150526 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T162350Z +LAST-MODIFIED:20070607T115133Z +DTSTAMP:20070701T090934Z +UID:419f1bff-a820-4d07-bf4e-1a6ec139e3df +SUMMARY:Pinkstermaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20080512 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20080513 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T112742Z +LAST-MODIFIED:20070607T115439Z +DTSTAMP:20070701T090934Z +UID:570d9fe7-cdc9-4fdf-9794-909edf520383 +SUMMARY:Paasmaandag +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20110425 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20110426 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142033Z +LAST-MODIFIED:20070701T090453Z +DTSTAMP:20070701T090934Z +UID:00eb3adc-c059-47c8-a1c0-4ca7048051b9 +SUMMARY:Nationale Feestdag +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070721 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070722 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T090619Z +LAST-MODIFIED:20070701T090745Z +DTSTAMP:20070701T090934Z +UID:90934ec9-f9f0-4d1f-9412-7a400692387a +SUMMARY:Fête de la communauté française +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070927 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070928 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T090821Z +LAST-MODIFIED:20070701T090852Z +DTSTAMP:20070701T090934Z +UID:a9437d6d-c562-4183-b980-f1a63398db0c +SUMMARY:Vlaamse feestdag +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070711 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070712 +CATEGORIES:Public Holiday +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/BelgianFrenchHolidays.ics b/media/caldata/BelgianFrenchHolidays.ics new file mode 100644 index 00000000000..6fff12d042c --- /dev/null +++ b/media/caldata/BelgianFrenchHolidays.ics @@ -0,0 +1,422 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +BEGIN:VTIMEZONE +TZID:/mozilla.org/20070129_1/Europe/Brussels +X-LIC-LOCATION:Europe/Brussels +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VTIMEZONE +TZID:/mozilla.org/20070129_1/Europe/Brussels +X-LIC-LOCATION:Europe/Brussels +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20070606T141629Z +LAST-MODIFIED:20070606T154611Z +DTSTAMP:20070701T090934Z +UID:5d1ae55f-3910-4de9-8b65-d652768fb2f2 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070409 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070410 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T161310Z +LAST-MODIFIED:20070606T161327Z +DTSTAMP:20070701T090934Z +UID:9e19b119-f077-4ae9-934e-cb62322ca81f +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20080501 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20080502 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070605T163903Z +LAST-MODIFIED:20070606T161656Z +DTSTAMP:20070701T090934Z +UID:c6a930d6-4ed5-45d8-bb3d-d3587a32b8aa +SUMMARY:Jour de l'an +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070101 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070102 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T141739Z +LAST-MODIFIED:20070606T161721Z +DTSTAMP:20070701T090934Z +UID:f439c81b-fd09-4b40-a629-3a9663dd29ff +SUMMARY:Fête du Travail +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070501 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070502 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T141853Z +LAST-MODIFIED:20070606T161731Z +DTSTAMP:20070701T090934Z +UID:b1c0e1ed-a09f-4fc2-aab1-170d3f661f13 +SUMMARY:Armistice 1945 +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070508 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070509 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T141932Z +LAST-MODIFIED:20070606T161741Z +DTSTAMP:20070701T090934Z +UID:5468e1a0-9dda-4fd2-88c0-dc3e727c1183 +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070517 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070518 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T154927Z +LAST-MODIFIED:20070606T161748Z +DTSTAMP:20070701T090934Z +UID:67a89bb6-9ad4-461b-951c-c4c8482d8618 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070528 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070529 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142112Z +LAST-MODIFIED:20070606T162012Z +DTSTAMP:20070701T090934Z +UID:854e5499-9276-4a96-9be3-bcbaa7caafcf +SUMMARY:Assomption +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070815 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070816 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142147Z +LAST-MODIFIED:20070606T162034Z +DTSTAMP:20070701T090934Z +UID:725c8c16-c37a-49f0-9d2e-dc976d6c3ea5 +SUMMARY:Toussaint +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20071101 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20071102 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142211Z +LAST-MODIFIED:20070606T162044Z +DTSTAMP:20070701T090934Z +UID:5218f724-6b66-434d-a8c5-138dfed64e07 +SUMMARY:Armistice 1918 +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20071111 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20071112 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142243Z +LAST-MODIFIED:20070606T162054Z +DTSTAMP:20070701T090934Z +UID:18617cde-2d15-46c6-900f-b3341a7b7f98 +SUMMARY:Noël +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20071225 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20071226 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T150648Z +LAST-MODIFIED:20070606T162128Z +DTSTAMP:20070701T090934Z +UID:19d50a52-f5a9-4d70-8fd7-a2caa97f6959 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20080324 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20080325 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T105427Z +LAST-MODIFIED:20070607T105450Z +DTSTAMP:20070701T090934Z +UID:18c90b99-edfa-4418-9bc7-992a07384967 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20090413 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20090414 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T105613Z +LAST-MODIFIED:20070607T105630Z +DTSTAMP:20070701T090934Z +UID:b989d129-8f2f-42be-a027-183f6d81eb40 +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20090521 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20090522 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T105907Z +LAST-MODIFIED:20070607T105928Z +DTSTAMP:20070701T090934Z +UID:7c6fe35c-44a5-450b-aea6-dd2baef78f06 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20090601 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20090602 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T110046Z +LAST-MODIFIED:20070607T110100Z +DTSTAMP:20070701T090934Z +UID:98c1c381-8632-45ce-9b11-10757face7c4 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20100405 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20100406 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T110121Z +LAST-MODIFIED:20070607T110135Z +DTSTAMP:20070701T090934Z +UID:aaeb1ba5-60f0-4e49-a25a-c0ff949acdd9 +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20100513 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20100514 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T110144Z +LAST-MODIFIED:20070607T110201Z +DTSTAMP:20070701T090934Z +UID:1f68f978-969e-4791-a7e3-cb3011134a34 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20100524 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20100525 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T112820Z +LAST-MODIFIED:20070607T112836Z +DTSTAMP:20070701T090934Z +UID:fa0d4b5b-8eeb-4b98-b35c-b6a547b96953 +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20110602 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20110603 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T112846Z +LAST-MODIFIED:20070607T112906Z +DTSTAMP:20070701T090934Z +UID:5be6194a-9fbd-45da-8e3c-568cac66b997 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20110613 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20110614 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T112958Z +LAST-MODIFIED:20070607T113016Z +DTSTAMP:20070701T090934Z +UID:4162d242-5468-4007-8814-10286b9589a0 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20120409 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20120410 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113034Z +LAST-MODIFIED:20070607T113048Z +DTSTAMP:20070701T090934Z +UID:6d368a35-6b6d-4ec1-9f48-97c53b25502e +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20120517 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20120518 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113055Z +LAST-MODIFIED:20070607T113114Z +DTSTAMP:20070701T090934Z +UID:e8913a3d-3e84-447d-afb4-f0b082948449 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20120528 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20120529 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113205Z +LAST-MODIFIED:20070607T113229Z +DTSTAMP:20070701T090934Z +UID:ebc79872-a185-4641-bc22-1092d5139efb +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20130401 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20130402 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113245Z +LAST-MODIFIED:20070607T113257Z +DTSTAMP:20070701T090934Z +UID:9714bd39-429b-433c-ab5c-5fd6a67e658e +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20130509 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20130510 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113305Z +LAST-MODIFIED:20070607T113325Z +DTSTAMP:20070701T090934Z +UID:79f5f02f-e92d-417f-9637-9e2a88840583 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20130520 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20130521 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113408Z +LAST-MODIFIED:20070607T113426Z +DTSTAMP:20070701T090934Z +UID:172dcce6-6f95-4c1f-ada9-e8bf2a7e8245 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20140421 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20140422 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113439Z +LAST-MODIFIED:20070607T113452Z +DTSTAMP:20070701T090934Z +UID:6625ed89-bf9f-478a-9796-c3dc203ab5e6 +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20140529 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20140530 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113504Z +LAST-MODIFIED:20070607T113523Z +DTSTAMP:20070701T090934Z +UID:7abad826-ab68-447f-81b2-1e04a4c2ef88 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20140609 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20140610 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113606Z +LAST-MODIFIED:20070607T113622Z +DTSTAMP:20070701T090934Z +UID:cf42813f-4a74-422b-aa19-90dcefccc92d +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20150406 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20150407 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113643Z +LAST-MODIFIED:20070607T113657Z +DTSTAMP:20070701T090934Z +UID:e7d30f2b-d546-4b7e-8780-0754a46e6970 +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20150514 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20150515 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113706Z +LAST-MODIFIED:20070607T113726Z +DTSTAMP:20070701T090934Z +UID:a8ccc771-4e8b-4594-ae30-33e9ce384ac9 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20150525 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20150526 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T162350Z +LAST-MODIFIED:20070607T115133Z +DTSTAMP:20070701T090934Z +UID:419f1bff-a820-4d07-bf4e-1a6ec139e3df +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20080512 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20080513 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T112742Z +LAST-MODIFIED:20070607T115439Z +DTSTAMP:20070701T090934Z +UID:570d9fe7-cdc9-4fdf-9794-909edf520383 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20110425 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20110426 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142033Z +LAST-MODIFIED:20070701T090453Z +DTSTAMP:20070701T090934Z +UID:00eb3adc-c059-47c8-a1c0-4ca7048051b9 +SUMMARY:Fête Nationale +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070721 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070722 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T090619Z +LAST-MODIFIED:20070701T090745Z +DTSTAMP:20070701T090934Z +UID:90934ec9-f9f0-4d1f-9412-7a400692387a +SUMMARY:Fête de la communauté française +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070927 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070928 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T090821Z +LAST-MODIFIED:20070701T090852Z +DTSTAMP:20070701T090934Z +UID:a9437d6d-c562-4183-b980-f1a63398db0c +SUMMARY:Fête de la communauté flamande +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070711 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Brussels:20070712 +CATEGORIES:Public Holiday +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/BelgianHolidays.ics b/media/caldata/BelgianHolidays.ics new file mode 100644 index 00000000000..19235f048a4 --- /dev/null +++ b/media/caldata/BelgianHolidays.ics @@ -0,0 +1,894 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Europe/Brussels +X-LIC-LOCATION:Europe/Brussels +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20110602T061148Z +LAST-MODIFIED:20110602T061216Z +DTSTAMP:20110602T061216Z +UID:2c8aa8bb-6317-4ae2-b393-1f4639117270 +SUMMARY:HEMELVAART +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T061849Z +LAST-MODIFIED:20110602T061858Z +DTSTAMP:20110602T061858Z +UID:d82bc860-4db4-4f2d-bf05-90fb95691510 +SUMMARY:PASEN +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T061901Z +LAST-MODIFIED:20110602T061917Z +DTSTAMP:20110602T061917Z +UID:2f2daa0d-b74c-49f0-a64a-f103e2c74a97 +SUMMARY:2de Paasdag +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T060928Z +LAST-MODIFIED:20110602T061958Z +DTSTAMP:20110602T061958Z +UID:cb50093e-8579-44d6-a062-ffc201b0f622 +SUMMARY:PASEN +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T060945Z +LAST-MODIFIED:20110602T062006Z +DTSTAMP:20110602T062006Z +UID:b8148359-95f4-496c-a024-c5d97f90ef54 +SUMMARY:2de PAASDAG +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062026Z +LAST-MODIFIED:20110602T062035Z +DTSTAMP:20110602T062035Z +UID:d04d0200-5e1d-46f9-88a9-82f0e8cb7fdc +SUMMARY:PASEN +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062049Z +LAST-MODIFIED:20110602T062102Z +DTSTAMP:20110602T062102Z +UID:33682f07-7369-4fcb-a2de-0823d7e9211a +SUMMARY:2de PAASDAG +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062204Z +LAST-MODIFIED:20110602T062214Z +DTSTAMP:20110602T062214Z +UID:c3a5dba7-3943-40e0-bb6b-0cad252d4352 +SUMMARY:PASEN +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062217Z +LAST-MODIFIED:20110602T062228Z +DTSTAMP:20110602T062228Z +UID:11930937-1084-406d-82af-732ac5b73032 +SUMMARY:2de PAASDAG +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062601Z +LAST-MODIFIED:20110602T062613Z +DTSTAMP:20110602T062613Z +UID:d44aefb1-5e3d-4307-ae96-9714999f7653 +SUMMARY:HEMELVAART +DTSTART;VALUE=DATE:20140529 +DTEND;VALUE=DATE:20140530 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062706Z +LAST-MODIFIED:20110602T062719Z +DTSTAMP:20110602T062719Z +UID:1789ceef-8390-44e5-8d39-4063874a6ecc +SUMMARY:PINKSTEREN +DTSTART;VALUE=DATE:20140608 +DTEND;VALUE=DATE:20140609 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062722Z +LAST-MODIFIED:20110602T062740Z +DTSTAMP:20110602T062740Z +UID:968da920-5850-413f-894d-831b1216d677 +SUMMARY:2de PINKSTERENDAG +DTSTART;VALUE=DATE:20140609 +DTEND;VALUE=DATE:20140610 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062803Z +LAST-MODIFIED:20110602T062811Z +DTSTAMP:20110602T062811Z +UID:143a8441-3f33-4b04-9b16-1ad6e2b734ca +SUMMARY:PINKSTEREN +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062814Z +LAST-MODIFIED:20110602T062827Z +DTSTAMP:20110602T062827Z +UID:8e13f056-ede4-4f73-89cf-ddf0b9a9fa3e +SUMMARY:2de PINKSTERENDAG +DTSTART;VALUE=DATE:20130520 +DTEND;VALUE=DATE:20130521 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062844Z +LAST-MODIFIED:20110602T062857Z +DTSTAMP:20110602T062857Z +UID:b0c899b8-8300-42a2-a157-c80430e63d23 +SUMMARY:PINKSTEREN +DTSTART;VALUE=DATE:20120527 +DTEND;VALUE=DATE:20120528 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062904Z +LAST-MODIFIED:20110602T062917Z +DTSTAMP:20110602T062917Z +UID:672990b3-8589-44af-945e-73eb80c8dd0c +SUMMARY:2de PINKSTERENDAG +DTSTART;VALUE=DATE:20120528 +DTEND;VALUE=DATE:20120529 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062938Z +LAST-MODIFIED:20110602T062946Z +DTSTAMP:20110602T062946Z +UID:a10d7036-7efc-4d61-bf75-25254a1b966d +SUMMARY:PINKSTEREN +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062948Z +LAST-MODIFIED:20110602T062959Z +DTSTAMP:20110602T062959Z +UID:1cc03c77-842f-4c35-93c0-3c4f7b435762 +SUMMARY:2de PINKSTERENDAG +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065040Z +LAST-MODIFIED:20110602T065048Z +DTSTAMP:20110602T065048Z +UID:ad748d2a-ea20-4a0a-8c70-30f91c155930 +SUMMARY:PASEN +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065050Z +LAST-MODIFIED:20110602T065059Z +DTSTAMP:20110602T065059Z +UID:da2267aa-d261-486f-ab18-ae3b7799d28e +SUMMARY:2de PAASDAG +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065115Z +LAST-MODIFIED:20110602T065125Z +DTSTAMP:20110602T065125Z +UID:89e92ae9-fad7-4550-bd72-aab6c635ee55 +SUMMARY:HEMELVAART +DTSTART;VALUE=DATE:20150514 +DTEND;VALUE=DATE:20150515 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065236Z +LAST-MODIFIED:20110602T065247Z +DTSTAMP:20110602T065247Z +UID:fc2effd6-4f57-45bf-a73b-2afffd3f1e97 +SUMMARY:PINKSTEREN +DTSTART;VALUE=DATE:20150524 +DTEND;VALUE=DATE:20150525 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065252Z +LAST-MODIFIED:20110602T065301Z +DTSTAMP:20110602T065301Z +UID:f6641ae9-2aae-4c06-bd94-eee672c60606 +SUMMARY:2de PINKSTERENDAG +DTSTART;VALUE=DATE:20150525 +DTEND;VALUE=DATE:20150526 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065420Z +LAST-MODIFIED:20110602T065427Z +DTSTAMP:20110602T065427Z +UID:6e897ca5-3bca-4c29-adc9-b98350a84ed6 +SUMMARY:PASEN +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065431Z +LAST-MODIFIED:20110602T065441Z +DTSTAMP:20110602T065441Z +UID:f4e7c5a5-7da9-4b23-86e8-a60a01103ce0 +SUMMARY:2de PAASDAG +DTSTART;VALUE=DATE:20160328 +DTEND;VALUE=DATE:20160329 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065552Z +LAST-MODIFIED:20110602T065601Z +DTSTAMP:20110602T065601Z +UID:27df56f8-d133-4c50-b892-085936ed64c4 +SUMMARY:PINKSTEREN +DTSTART;VALUE=DATE:20160515 +DTEND;VALUE=DATE:20160516 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065611Z +LAST-MODIFIED:20110602T065624Z +DTSTAMP:20110602T065624Z +UID:49f53a43-565a-427c-8d6d-adfe9cded5c4 +SUMMARY:2de PINKSTERENDAG +DTSTART;VALUE=DATE:20160516 +DTEND;VALUE=DATE:20160517 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065501Z +LAST-MODIFIED:20110602T065653Z +DTSTAMP:20110602T065653Z +UID:2c66d89d-1c9b-4e81-8b45-45b06a2f2872 +SUMMARY:HEMELVAART +DTSTART;VALUE=DATE:20160505 +DTEND;VALUE=DATE:20160506 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065719Z +LAST-MODIFIED:20110602T065725Z +DTSTAMP:20110602T065725Z +UID:9e4f83ff-7fbf-4323-975b-5912f9eda587 +SUMMARY:PASEN +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065727Z +LAST-MODIFIED:20110602T065736Z +DTSTAMP:20110602T065736Z +UID:7f438f24-1b87-4865-9483-b4743b7367a7 +SUMMARY:2de PAASDAG +DTSTART;VALUE=DATE:20170417 +DTEND;VALUE=DATE:20170418 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065748Z +LAST-MODIFIED:20110602T065757Z +DTSTAMP:20110602T065757Z +UID:f6c6b1c2-c886-4c44-a1d5-739f731b7c72 +SUMMARY:HEMELVAART +DTSTART;VALUE=DATE:20170525 +DTEND;VALUE=DATE:20170526 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065845Z +LAST-MODIFIED:20110602T065854Z +DTSTAMP:20110602T065854Z +UID:ce980cca-ce88-41be-8dc2-1cffefff0ceb +SUMMARY:PINKSTEREN +DTSTART;VALUE=DATE:20170604 +DTEND;VALUE=DATE:20170605 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065920Z +LAST-MODIFIED:20110602T065934Z +DTSTAMP:20110602T065934Z +UID:bb37cdf2-9b23-44f6-b18b-0d9258169403 +SUMMARY:2de PINKSTERENDAG +DTSTART;VALUE=DATE:20170605 +DTEND;VALUE=DATE:20170606 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065956Z +LAST-MODIFIED:20110602T070003Z +DTSTAMP:20110602T070003Z +UID:be9c7fbc-42cd-4c74-b8a9-4f8f483849a4 +SUMMARY:PASEN +DTSTART;VALUE=DATE:20180401 +DTEND;VALUE=DATE:20180402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070006Z +LAST-MODIFIED:20110602T070015Z +DTSTAMP:20110602T070015Z +UID:fd50581a-c08e-4e75-a10d-08baf619203f +SUMMARY:2de PAASDAG +DTSTART;VALUE=DATE:20180402 +DTEND;VALUE=DATE:20180403 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070031Z +LAST-MODIFIED:20110602T070039Z +DTSTAMP:20110602T070039Z +UID:7d72a20d-83e7-4e6a-8ff2-261da27b03aa +SUMMARY:HEMELVAART +DTSTART;VALUE=DATE:20180510 +DTEND;VALUE=DATE:20180511 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070122Z +LAST-MODIFIED:20110602T070131Z +DTSTAMP:20110602T070131Z +UID:9fdcd64d-6c28-44f3-826b-496b04631b2d +SUMMARY:PINKSTEREN +DTSTART;VALUE=DATE:20180520 +DTEND;VALUE=DATE:20180521 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070149Z +LAST-MODIFIED:20110602T070201Z +DTSTAMP:20110602T070201Z +UID:74d25bb5-eae4-4fce-b56e-42383a9a25a1 +SUMMARY:2de PINKSTERENDAG +DTSTART;VALUE=DATE:20180521 +DTEND;VALUE=DATE:20180522 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070305Z +LAST-MODIFIED:20110602T070314Z +DTSTAMP:20110602T070314Z +UID:73e7dc8b-79de-49e3-b41c-b0943f57ff03 +SUMMARY:HEMELVAART +DTSTART;VALUE=DATE:20190523 +DTEND;VALUE=DATE:20190524 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070358Z +LAST-MODIFIED:20110602T070415Z +DTSTAMP:20110602T070415Z +UID:ceb2d711-4529-4a7f-beca-c3a10eb1f647 +SUMMARY:PINKSTEREN +DTSTART;VALUE=DATE:20190602 +DTEND;VALUE=DATE:20190603 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070418Z +LAST-MODIFIED:20110602T070429Z +DTSTAMP:20110602T070429Z +UID:43b88e5d-3dba-4711-8b90-2e1b813ca7c3 +SUMMARY:2de PINKSTERENDAG +DTSTART;VALUE=DATE:20190603 +DTEND;VALUE=DATE:20190604 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T073225Z +LAST-MODIFIED:20110602T073233Z +DTSTAMP:20110602T073233Z +UID:02fa5cde-594d-4825-adb1-960f61ad9838 +SUMMARY:PASEN +DTSTART;VALUE=DATE:20200412 +DTEND;VALUE=DATE:20200413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T073235Z +LAST-MODIFIED:20110602T073246Z +DTSTAMP:20110602T073246Z +UID:ff7a663e-46c6-4fdf-961c-e0cbc785c831 +SUMMARY:2de PAASDAG +DTSTART;VALUE=DATE:20200413 +DTEND;VALUE=DATE:20200414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070233Z +LAST-MODIFIED:20110602T074004Z +DTSTAMP:20110602T074004Z +UID:9042a06a-3004-4c9e-a419-729f066d831e +SUMMARY:PASEN +DTSTART;VALUE=DATE:20190421 +DTEND;VALUE=DATE:20190422 +TRANSP:TRANSPARENT +SEQUENCE:3 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070244Z +LAST-MODIFIED:20110602T074012Z +DTSTAMP:20110602T074012Z +UID:35098c0c-51d3-4ffc-abc4-2a2fc8e01a93 +SUMMARY:2de PAASDAG +DTSTART;VALUE=DATE:20190422 +DTEND;VALUE=DATE:20190423 +TRANSP:TRANSPARENT +SEQUENCE:3 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074220Z +LAST-MODIFIED:20110602T074230Z +DTSTAMP:20110602T074230Z +UID:738e4e02-2d8b-4911-b0cd-88688685ffd5 +SUMMARY:PASEN +DTSTART;VALUE=DATE:20210404 +DTEND;VALUE=DATE:20210405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074232Z +LAST-MODIFIED:20110602T074255Z +DTSTAMP:20110602T074255Z +UID:30c0954b-c8bf-4ea1-a125-42635e297e3f +SUMMARY:2de PAASDAG +DTSTART;VALUE=DATE:20210405 +DTEND;VALUE=DATE:20210406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074342Z +LAST-MODIFIED:20110602T074410Z +DTSTAMP:20110602T074410Z +UID:6a9c5350-feeb-43c5-b48e-9270ccf5a59f +SUMMARY:PASEN +DTSTART;VALUE=DATE:20220417 +DTEND;VALUE=DATE:20220418 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074412Z +LAST-MODIFIED:20110602T074426Z +DTSTAMP:20110602T074426Z +UID:9cc94126-e27c-4069-aaf7-82a22903ac9e +SUMMARY:2de PAASDAG +DTSTART;VALUE=DATE:20220418 +DTEND;VALUE=DATE:20220419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074516Z +LAST-MODIFIED:20110602T074532Z +DTSTAMP:20110602T074532Z +UID:464440b6-4cf6-45de-be8f-a1a453483a73 +SUMMARY:HEMELVAART +DTSTART;VALUE=DATE:20220526 +DTEND;VALUE=DATE:20220527 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074606Z +LAST-MODIFIED:20110602T074615Z +DTSTAMP:20110602T074615Z +UID:8f9f07ed-1ccf-4c8d-bdcc-e66bfe94023e +SUMMARY:PINKSTEREN +DTSTART;VALUE=DATE:20220605 +DTEND;VALUE=DATE:20220606 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074619Z +LAST-MODIFIED:20110602T074636Z +DTSTAMP:20110602T074636Z +UID:852878ae-bfae-4ff8-9743-21f43ffe531d +SUMMARY:2de PINKSTERENDAG +DTSTART;VALUE=DATE:20220606 +DTEND;VALUE=DATE:20220607 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074721Z +LAST-MODIFIED:20110602T074730Z +DTSTAMP:20110602T074730Z +UID:cb19eb72-1981-40e1-bc35-a7430874f2f8 +SUMMARY:HEMELVAART +DTSTART;VALUE=DATE:20210513 +DTEND;VALUE=DATE:20210514 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074755Z +LAST-MODIFIED:20110602T074803Z +DTSTAMP:20110602T074803Z +UID:a8820fe0-5dd5-4435-b3b1-6fe4153a4916 +SUMMARY:PINKSTEREN +DTSTART;VALUE=DATE:20210523 +DTEND;VALUE=DATE:20210524 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074820Z +LAST-MODIFIED:20110602T074836Z +DTSTAMP:20110602T074836Z +UID:115e66c0-4022-4e75-8910-17140957c587 +SUMMARY:2de PINKSTERENDAG +DTSTART;VALUE=DATE:20210524 +DTEND;VALUE=DATE:20210525 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074909Z +LAST-MODIFIED:20110602T074924Z +DTSTAMP:20110602T074924Z +UID:e0334a6a-767b-4957-8e4c-d61282c3f749 +SUMMARY:HEMELVAART +DTSTART;VALUE=DATE:20200521 +DTEND;VALUE=DATE:20200522 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074953Z +LAST-MODIFIED:20110602T075005Z +DTSTAMP:20110602T075005Z +UID:1a0795a2-827e-4b75-982d-de504c8915ae +SUMMARY:PINKSTEREN +DTSTART;VALUE=DATE:20200531 +DTEND;VALUE=DATE:20200601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T075030Z +LAST-MODIFIED:20110602T075042Z +DTSTAMP:20110602T075042Z +UID:315187d7-7183-4e7b-b5ed-dfcbb939797a +SUMMARY:2de PINKSTERENDAG +DTSTART;VALUE=DATE:20200601 +DTEND;VALUE=DATE:20200602 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T061402Z +LAST-MODIFIED:20110622T083530Z +DTSTAMP:20110622T083530Z +UID:d7299252-5000-4dcc-9c58-ad83b84e5f4c +SUMMARY:Aswoensdag +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20110309 +DTEND;VALUE=DATE:20110310 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T061446Z +LAST-MODIFIED:20110622T083643Z +DTSTAMP:20110622T083643Z +UID:231323c0-e249-415d-a496-2b269c499a3d +SUMMARY:Aswoensdag +CATEGORIES:Niet-officiële feestdag +DTSTART;TZID=Europe/Brussels:20120222T090000 +DTEND;TZID=Europe/Brussels:20120222T110000 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T061737Z +LAST-MODIFIED:20110622T083654Z +DTSTAMP:20110622T083654Z +UID:b6673ccd-b73a-4049-a654-07836815c33e +SUMMARY:Aswoensdag +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20140305 +DTEND;VALUE=DATE:20140306 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080047Z +LAST-MODIFIED:20110622T083701Z +DTSTAMP:20110622T083701Z +UID:056f8281-2bb1-4e3e-b798-fa439f481048 +SUMMARY:Aswoensdag +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20150211 +DTEND;VALUE=DATE:20150212 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080231Z +LAST-MODIFIED:20110622T083710Z +DTSTAMP:20110622T083710Z +UID:03e30172-4862-4e75-beaf-6a7ed0ca1f46 +SUMMARY:Aswoensdag +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20160210 +DTEND;VALUE=DATE:20160211 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080554Z +LAST-MODIFIED:20110622T083717Z +DTSTAMP:20110622T083717Z +UID:94b165dc-e0e6-416e-9033-a5c0862fbcf8 +SUMMARY:Aswoensdag +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20180214 +DTEND;VALUE=DATE:20180215 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T061707Z +LAST-MODIFIED:20110622T083721Z +DTSTAMP:20110622T083721Z +UID:0c529164-afc4-4af2-9bbe-3dc8a82efd03 +SUMMARY:Aswoensdag +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20130213 +DTEND;VALUE=DATE:20130214 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080702Z +LAST-MODIFIED:20110622T083726Z +DTSTAMP:20110622T083726Z +UID:23e1b254-17c4-4f85-b789-8c63bce19afd +SUMMARY:Aswoensdag +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20190306 +DTEND;VALUE=DATE:20190307 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080822Z +LAST-MODIFIED:20110622T083733Z +DTSTAMP:20110622T083733Z +UID:722b7424-bada-41fc-8e32-cba3d93327f0 +SUMMARY:Aswoensdag +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20200226 +DTEND;VALUE=DATE:20200227 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080430Z +LAST-MODIFIED:20110622T083740Z +DTSTAMP:20110622T083740Z +UID:b04ded88-d812-487f-a590-0341874e2264 +SUMMARY:Aswoensdag +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20170301 +DTEND;VALUE=DATE:20170302 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080928Z +LAST-MODIFIED:20110622T083750Z +DTSTAMP:20110622T083750Z +UID:00921b36-2bc1-46af-b31b-72c7a97c4798 +SUMMARY:Aswoensdag +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20210217 +DTEND;VALUE=DATE:20210218 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081030Z +LAST-MODIFIED:20110622T083800Z +DTSTAMP:20110622T083800Z +UID:e14de088-276e-420b-a5cf-fe50eda58a04 +SUMMARY:Aswoensdag +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20220302 +DTEND;VALUE=DATE:20220303 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062418Z +LAST-MODIFIED:20110622T083848Z +DTSTAMP:20110622T083848Z +UID:6aeb9a3c-5138-4a1f-b6b9-501130e00b51 +SUMMARY:HEMELVAART +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062517Z +LAST-MODIFIED:20110622T083855Z +DTSTAMP:20110622T083855Z +UID:160c7423-6e1d-4c60-9796-ec1f17923cb5 +SUMMARY:HEMELVAART +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080713Z +LAST-MODIFIED:20110622T083918Z +DTSTAMP:20110622T083918Z +UID:3130fc66-96e3-4a0e-81ac-6a5ecd4dfce3 +SUMMARY:Valentijn +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20190314 +DTEND;VALUE=DATE:20190315 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T054353Z +LAST-MODIFIED:20110602T054517Z +DTSTAMP:20110602T054517Z +UID:e0cb8f81-dbb9-4235-a60d-123dd2c2ba52 +SUMMARY:NIEUWJAAR +RRULE:FREQ=YEARLY;BYMONTHDAY=1;BYMONTH=1 +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:20110102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T054728Z +LAST-MODIFIED:20110602T054759Z +DTSTAMP:20110602T054759Z +UID:915c6b06-ae23-4373-8554-c7298ea6954d +SUMMARY:NATIONALE FEESTDAG +RRULE:FREQ=YEARLY;BYMONTHDAY=21;BYMONTH=7 +DTSTART;VALUE=DATE:20110721 +DTEND;VALUE=DATE:20110722 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T054807Z +LAST-MODIFIED:20110602T054838Z +DTSTAMP:20110602T054838Z +UID:233bdc02-f75a-414f-9b94-4564f4446c09 +SUMMARY:ONZE LIEVE VROUW HEMELVAART +RRULE:FREQ=YEARLY;BYMONTHDAY=15;BYMONTH=8 +DTSTART;VALUE=DATE:20110815 +DTEND;VALUE=DATE:20110816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T054911Z +LAST-MODIFIED:20110602T054941Z +DTSTAMP:20110602T054941Z +UID:de66e692-bffa-4b09-9dc6-565482e61db0 +SUMMARY:ALLERHEILIGEN +RRULE:FREQ=YEARLY;BYMONTHDAY=1;BYMONTH=11 +DTSTART;VALUE=DATE:20111101 +DTEND;VALUE=DATE:20111102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T054947Z +LAST-MODIFIED:20110602T055022Z +DTSTAMP:20110602T055022Z +UID:38a79322-a130-48a0-b83b-174cb8a5f933 +SUMMARY:WAPENSTILSTAND +RRULE:FREQ=YEARLY;BYMONTHDAY=11;BYMONTH=11 +DTSTART;VALUE=DATE;TZID=Europe/Brussels:20111111 +DTEND;VALUE=DATE;TZID=Europe/Brussels:20111112 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T055053Z +LAST-MODIFIED:20110602T055121Z +DTSTAMP:20110602T055121Z +UID:4f17a100-d003-4046-8c74-9d9d1c01ade0 +SUMMARY:KERSTMIS +RRULE:FREQ=YEARLY;BYMONTHDAY=25;BYMONTH=12 +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T054653Z +LAST-MODIFIED:20110622T083547Z +DTSTAMP:20110622T083547Z +UID:ab715718-0d44-4e0e-ba15-2542c2c2fe28 +SUMMARY:Vlaamse feestdag +RRULE:FREQ=YEARLY;BYMONTHDAY=11;BYMONTH=7 +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20110711 +DTEND;VALUE=DATE:20110712 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T060036Z +LAST-MODIFIED:20110622T083603Z +DTSTAMP:20110622T083603Z +UID:50111cbb-45eb-4010-a3cd-c098dda38c27 +SUMMARY:Valentijn +RRULE:FREQ=YEARLY;BYMONTHDAY=14;BYMONTH=2 +CATEGORIES:Niet-officiële feestdag +DTSTART;VALUE=DATE:20120214 +DTEND;VALUE=DATE:20120215 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T054548Z +LAST-MODIFIED:20110622T083834Z +DTSTAMP:20110622T083834Z +UID:4c6330e2-a8f6-47f4-b983-5fa66b61e794 +SUMMARY:FEEST VAN DE ARBEID +RRULE:FREQ=YEARLY;BYMONTHDAY=1;BYMONTH=5 +DTSTART;VALUE=DATE:20110501 +DTEND;VALUE=DATE:20110502 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/BoliviaHolidays.ics b/media/caldata/BoliviaHolidays.ics new file mode 100644 index 00000000000..61fc1d68b58 --- /dev/null +++ b/media/caldata/BoliviaHolidays.ics @@ -0,0 +1,696 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Asia/Tokyo +X-LIC-LOCATION:Asia/Tokyo +BEGIN:STANDARD +TZOFFSETFROM:+0900 +TZOFFSETTO:+0900 +TZNAME:JST +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20100406T053056Z +LAST-MODIFIED:20100406T053110Z +DTSTAMP:20100406T053110Z +UID:745a0c45-5940-4c4c-abe2-50c07f8ee3a9 +SUMMARY:Carnaval +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100215 +DTEND;VALUE=DATE:20100216 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T053111Z +LAST-MODIFIED:20100406T053125Z +DTSTAMP:20100406T053125Z +UID:9866c3e4-2380-40a3-9a01-8cd738be4e3a +SUMMARY:Martes de Ch'alla +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100216 +DTEND;VALUE=DATE:20100217 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T053145Z +LAST-MODIFIED:20100406T053209Z +DTSTAMP:20100406T053209Z +UID:bc01a690-663b-4d11-bcd3-665501fcd2ac +SUMMARY:Viernes Santo +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T053249Z +LAST-MODIFIED:20100406T053300Z +DTSTAMP:20100406T053300Z +UID:7a98cf46-75af-4d1e-bfc0-a3a55f2612c2 +SUMMARY:Corpus Christi +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100603 +DTEND;VALUE=DATE:20100604 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T054954Z +LAST-MODIFIED:20100406T055004Z +DTSTAMP:20100406T055004Z +UID:37aadb78-6658-4f4e-b53a-c540bbfb1e56 +SUMMARY:Carnaval +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110307 +DTEND;VALUE=DATE:20110308 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T055005Z +LAST-MODIFIED:20100406T055019Z +DTSTAMP:20100406T055019Z +UID:4661769c-ba02-47d4-b386-5cab428c64a6 +SUMMARY:Martes de Ch'alla +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110308 +DTEND;VALUE=DATE:20110309 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T055036Z +LAST-MODIFIED:20100406T055049Z +DTSTAMP:20100406T055049Z +UID:bff3f61f-aae6-4b50-85e0-f9344597b403 +SUMMARY:Viernes Santo +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T055137Z +LAST-MODIFIED:20100406T055202Z +DTSTAMP:20100406T055202Z +UID:80da0459-21a9-4437-84a9-17902a952d78 +SUMMARY:Carnaval +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120220 +DTEND;VALUE=DATE:20120221 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T055209Z +LAST-MODIFIED:20100406T055225Z +DTSTAMP:20100406T055225Z +UID:4af72193-4998-4dbd-99f4-21c65cb9bbea +SUMMARY:Martes de Ch'alla +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120221 +DTEND;VALUE=DATE:20120222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T055255Z +LAST-MODIFIED:20100406T055307Z +DTSTAMP:20100406T055307Z +UID:b3616bc6-aa7a-48bb-aaa7-95087d53bce5 +SUMMARY:Viernes Santo +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T055357Z +LAST-MODIFIED:20100406T055405Z +DTSTAMP:20100406T055405Z +UID:ed19cca7-b97b-40d2-9a70-63e5d71aa274 +SUMMARY:Carnaval +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130211 +DTEND;VALUE=DATE:20130212 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T055406Z +LAST-MODIFIED:20100406T055418Z +DTSTAMP:20100406T055418Z +UID:de3749fc-d526-40a6-a4f9-f6de2144e5a1 +SUMMARY:Martes de Ch'alla +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130212 +DTEND;VALUE=DATE:20130213 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T055433Z +LAST-MODIFIED:20100406T055453Z +DTSTAMP:20100406T055453Z +UID:f1e45701-aaad-4788-9d7c-0a7a0b904cad +SUMMARY:Viernes Santo +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T055814Z +LAST-MODIFIED:20100406T055831Z +DTSTAMP:20100406T055831Z +UID:da633c1a-dc76-424b-9d75-916fbc53365f +SUMMARY:Corpus Christi +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130530 +DTEND;VALUE=DATE:20130531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T055930Z +LAST-MODIFIED:20100406T055938Z +DTSTAMP:20100406T055938Z +UID:a40313f7-29e3-438b-97c5-bdcdbbdf6492 +SUMMARY:Carnaval +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140303 +DTEND;VALUE=DATE:20140304 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T055939Z +LAST-MODIFIED:20100406T055949Z +DTSTAMP:20100406T055949Z +UID:47622a12-6570-4c86-8d5b-530f02c1978e +SUMMARY:Martes de Ch'alla +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140304 +DTEND;VALUE=DATE:20140305 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T060019Z +LAST-MODIFIED:20100406T060030Z +DTSTAMP:20100406T060030Z +UID:502ea415-b5ca-49d8-930c-a953750c4e37 +SUMMARY:Viernes Santo +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T060046Z +LAST-MODIFIED:20100406T060056Z +DTSTAMP:20100406T060056Z +UID:4421c9b5-1085-4565-82e5-8d2a537bca15 +SUMMARY:Corpus Christi +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140619 +DTEND;VALUE=DATE:20140620 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T060213Z +LAST-MODIFIED:20100406T060235Z +DTSTAMP:20100406T060235Z +UID:1f11b881-7d0d-47c7-bc4a-0c1c1f5d8bfd +SUMMARY:Carnaval +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20150216 +DTEND;VALUE=DATE:20150217 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T060237Z +LAST-MODIFIED:20100406T060252Z +DTSTAMP:20100406T060252Z +UID:2894b68e-a547-4e4d-9707-860e381a369e +SUMMARY:Martes de Ch'alla +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20150217 +DTEND;VALUE=DATE:20150218 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T060310Z +LAST-MODIFIED:20100406T060321Z +DTSTAMP:20100406T060321Z +UID:e8357f20-81ca-4047-b36c-25f7720a5c44 +SUMMARY:Viernes Santo +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T060329Z +LAST-MODIFIED:20100406T060342Z +DTSTAMP:20100406T060342Z +UID:f9a0b095-ba7f-4b84-9355-9dfda22fc475 +SUMMARY:Corpus Christi +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20150604 +DTEND;VALUE=DATE:20150605 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T062139Z +LAST-MODIFIED:20100406T062158Z +DTSTAMP:20100406T062158Z +UID:153ae172-8c47-43d3-8017-f49643752e7e +SUMMARY:Carnaval +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20160208 +DTEND;VALUE=DATE:20160209 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T062200Z +LAST-MODIFIED:20100406T062212Z +DTSTAMP:20100406T062212Z +UID:d285b059-f521-42df-ad82-1f156c6f3187 +SUMMARY:Martes de Ch'alla +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20160209 +DTEND;VALUE=DATE:20160210 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T062235Z +LAST-MODIFIED:20100406T062250Z +DTSTAMP:20100406T062250Z +UID:29c7f66e-4537-4c40-b3db-8f246a0b3d94 +SUMMARY:Viernes Santo +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20160325 +DTEND;VALUE=DATE:20160326 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T062255Z +LAST-MODIFIED:20100406T062304Z +DTSTAMP:20100406T062304Z +UID:3e0d8a89-ded4-4d14-888d-6263c3bd13ac +SUMMARY:Corpus Christi +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20160526 +DTEND;VALUE=DATE:20160527 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T062329Z +LAST-MODIFIED:20100406T062340Z +DTSTAMP:20100406T062340Z +UID:6305d16e-93fd-4060-986d-0963469fb90e +SUMMARY:Carnaval +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20170227 +DTEND;VALUE=DATE:20170228 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T062341Z +LAST-MODIFIED:20100406T062354Z +DTSTAMP:20100406T062354Z +UID:e282f8fe-7543-4fac-acbe-5d1ba9a08f49 +SUMMARY:Martes de Ch'alla +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20170228 +DTEND;VALUE=DATE:20170301 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T062528Z +LAST-MODIFIED:20100406T062542Z +DTSTAMP:20100406T062542Z +UID:68bce531-573e-4102-91de-b53509662a1b +SUMMARY:Viernes Santo +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20170414 +DTEND;VALUE=DATE:20170415 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T062554Z +LAST-MODIFIED:20100406T062605Z +DTSTAMP:20100406T062605Z +UID:5188576b-eef7-477c-82bd-f84ab9ea16a4 +SUMMARY:Corpus Christi +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20170615 +DTEND;VALUE=DATE:20170616 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T062630Z +LAST-MODIFIED:20100406T062639Z +DTSTAMP:20100406T062639Z +UID:be1e70d3-1c36-45a0-85c9-1ac7ba9ac761 +SUMMARY:Carnaval +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20180212 +DTEND;VALUE=DATE:20180213 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T062640Z +LAST-MODIFIED:20100406T062651Z +DTSTAMP:20100406T062651Z +UID:9cb1e170-f0e6-4fd5-afc3-4ed4619a0811 +SUMMARY:Martes de Ch'alla +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20180213 +DTEND;VALUE=DATE:20180214 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T062702Z +LAST-MODIFIED:20100406T062714Z +DTSTAMP:20100406T062714Z +UID:7f88a260-94cf-4990-8422-7e9d5d0540e0 +SUMMARY:Viernes Santo +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20180330 +DTEND;VALUE=DATE:20180331 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T062726Z +LAST-MODIFIED:20100406T062756Z +DTSTAMP:20100406T062756Z +UID:05ce623c-e151-4656-9939-266624681df9 +SUMMARY:Corpus Christi +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20180531 +DTEND;VALUE=DATE:20180601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T063103Z +LAST-MODIFIED:20100406T063114Z +DTSTAMP:20100406T063114Z +UID:d3a0ca0f-47e5-437e-9ece-d8a71ae89d58 +SUMMARY:Carnaval +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20190304 +DTEND;VALUE=DATE:20190305 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T063115Z +LAST-MODIFIED:20100406T063130Z +DTSTAMP:20100406T063130Z +UID:6c5b7101-16b1-4b4f-906b-637c9bf311b2 +SUMMARY:Martes de Ch'alla +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20190305 +DTEND;VALUE=DATE:20190306 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T063147Z +LAST-MODIFIED:20100406T063156Z +DTSTAMP:20100406T063156Z +UID:78aa8b7b-6e4e-4896-b57f-26017c078db2 +SUMMARY:Viernes Santo +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20190419 +DTEND;VALUE=DATE:20190420 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T063207Z +LAST-MODIFIED:20100406T063220Z +DTSTAMP:20100406T063220Z +UID:40023221-0c8f-4470-a647-1a71f9e171f2 +SUMMARY:Corpus Christi +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20190620 +DTEND;VALUE=DATE:20190621 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T063244Z +LAST-MODIFIED:20100406T063252Z +DTSTAMP:20100406T063252Z +UID:960f012a-6e22-46e6-81fb-674d062536a3 +SUMMARY:Carnaval +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20200224 +DTEND;VALUE=DATE:20200225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T063254Z +LAST-MODIFIED:20100406T063307Z +DTSTAMP:20100406T063307Z +UID:7bbfccc3-5ca2-4600-ae7d-da433c2ebead +SUMMARY:Martes de Ch'alla +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20200225 +DTEND;VALUE=DATE:20200226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T063324Z +LAST-MODIFIED:20100406T063333Z +DTSTAMP:20100406T063333Z +UID:e799bfee-65ef-460d-997c-be2dd5c4dadc +SUMMARY:Viernes Santo +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20200410 +DTEND;VALUE=DATE:20200411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T063339Z +LAST-MODIFIED:20100406T063353Z +DTSTAMP:20100406T063353Z +UID:05ab683f-bbb9-4ff3-874f-0bdb8c2a65bf +SUMMARY:Corpus Christi +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20200611 +DTEND;VALUE=DATE:20200612 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T063550Z +LAST-MODIFIED:20100406T063559Z +DTSTAMP:20100406T063559Z +UID:867337f7-e7c7-43d1-be69-a5a27eaad05d +SUMMARY:Corpus Christi +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110623 +DTEND;VALUE=DATE:20110624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T063649Z +LAST-MODIFIED:20100406T063659Z +DTSTAMP:20100406T063659Z +UID:32d8a713-3d80-4c0c-8d1a-dd365b17b476 +SUMMARY:Corpus Christi +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120607 +DTEND;VALUE=DATE:20120608 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T052531Z +LAST-MODIFIED:20100406T053531Z +DTSTAMP:20100406T053531Z +UID:e2973a06-6aa6-4a87-95a9-7dacb21cb215 +SUMMARY:Año Nuevo +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T052850Z +LAST-MODIFIED:20100406T053543Z +DTSTAMP:20100406T053543Z +UID:880fb429-622c-42d4-b066-cc6128965df9 +SUMMARY:Día del mar +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100323 +DTEND;VALUE=DATE:20100324 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T053222Z +LAST-MODIFIED:20100406T053551Z +DTSTAMP:20100406T053551Z +UID:5a1e937a-2180-44bb-b35f-fe1ee85700f2 +SUMMARY:Día de Trabajador +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:20100502 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T053446Z +LAST-MODIFIED:20100406T053609Z +DTSTAMP:20100406T053609Z +UID:5e1a697f-7480-4e1b-8743-c460d07e2a65 +SUMMARY:Regional: Aniversario de La Paz +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100716 +DTEND;VALUE=DATE:20100717 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T053555Z +LAST-MODIFIED:20100406T053609Z +DTSTAMP:20100406T053609Z +UID:5e1a697f-7480-4e1b-8743-c460d07e2a65 +SUMMARY:Regional: Aniversario de La Paz +RECURRENCE-ID;VALUE=DATE:20100716 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100716 +DTEND;VALUE=DATE:20100717 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T053320Z +LAST-MODIFIED:20100406T053617Z +DTSTAMP:20100406T053617Z +UID:da99fb8b-1992-4759-8819-29862f25bd72 +SUMMARY:Día de la Independencia +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100806 +DTEND;VALUE=DATE:20100807 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T053351Z +LAST-MODIFIED:20100406T053630Z +DTSTAMP:20100406T053630Z +UID:75fe8dbd-a8f9-4dc7-9b4f-71fbeafadfe2 +SUMMARY:Fiesta de Todos los Santos +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101102 +DTEND;VALUE=DATE:20101103 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T053423Z +LAST-MODIFIED:20100406T053640Z +DTSTAMP:20100406T053640Z +UID:53052b8b-9710-488f-84e4-e15a270a000f +SUMMARY:Navidad +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T053854Z +LAST-MODIFIED:20100406T053908Z +DTSTAMP:20100406T053908Z +UID:e401e40e-52ff-433f-83f5-c1c7f6788b98 +SUMMARY:Regional: Aniversario de Cochambamba +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20100914 +DTEND;VALUE=DATE:20100915 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T054105Z +LAST-MODIFIED:20100406T054123Z +DTSTAMP:20100406T054123Z +UID:8c5e46b0-7691-4cb2-a053-55cb284880f8 +SUMMARY:Regional: Aniversario de Chuquisaca +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20100525 +DTEND;VALUE=DATE:20100526 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T054204Z +LAST-MODIFIED:20100406T054220Z +DTSTAMP:20100406T054220Z +UID:196cd97a-f4bd-4314-8544-44670fbebe2f +SUMMARY:Regional: Aniversario de Oruro +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100210 +DTEND;VALUE=DATE:20100211 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T054427Z +LAST-MODIFIED:20100406T054447Z +DTSTAMP:20100406T054447Z +UID:3b0d3d17-fb0b-49ce-8d64-1f218b3b47a7 +SUMMARY:Regional: Aniversario de Potosí +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101110 +DTEND;VALUE=DATE:20101111 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T054602Z +LAST-MODIFIED:20100406T054617Z +DTSTAMP:20100406T054617Z +UID:f4f962d5-cd55-4a44-a63c-b97fc0f3327b +SUMMARY:Regional: Aniversario de Pando +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101011 +DTEND;VALUE=DATE:20101012 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T053833Z +LAST-MODIFIED:20100406T054900Z +DTSTAMP:20100406T054900Z +UID:b926d2e2-d9d3-4f03-834b-eb74c86c54fa +SUMMARY:Regional: Aniversario de Santa Cruz de la Sierra +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;TZID=Asia/Tokyo:20100924T150000 +DTEND;TZID=Asia/Tokyo:20100924T160000 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100406T053852Z +LAST-MODIFIED:20100406T054900Z +DTSTAMP:20100406T054900Z +UID:b926d2e2-d9d3-4f03-834b-eb74c86c54fa +SUMMARY:Regional: Aniversario de Santa Cruz de la Sierra +RECURRENCE-ID;TZID=Asia/Tokyo:20100924T150000 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100924 +DTEND;VALUE=DATE:20100925 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/BrazilHolidays.ics b/media/caldata/BrazilHolidays.ics new file mode 100644 index 00000000000..0e6b8b73061 --- /dev/null +++ b/media/caldata/BrazilHolidays.ics @@ -0,0 +1,1149 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:America/Sao_Paulo +X-LIC-LOCATION:America/Sao_Paulo +BEGIN:DAYLIGHT +TZOFFSETFROM:-0300 +TZOFFSETTO:-0200 +TZNAME:BRST +DTSTART:19701011T000000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=10 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0200 +TZOFFSETTO:-0300 +TZNAME:BRT +DTSTART:19700215T000000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=3SU;BYMONTH=2 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20090106T135029Z +LAST-MODIFIED:20090106T135055Z +DTSTAMP:20090106T135029Z +UID:80b02293-92a6-4aca-927e-be3d070d8850 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20090221 +DTEND;VALUE=DATE:20090222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135059Z +LAST-MODIFIED:20090106T135104Z +DTSTAMP:20090106T135059Z +UID:9bf5b81e-382f-40d0-a0e8-328819ee75d8 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20090222 +DTEND;VALUE=DATE:20090223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135106Z +LAST-MODIFIED:20090106T135112Z +DTSTAMP:20090106T135106Z +UID:3795dd38-6ba6-4d73-a008-2e361fd9f38c +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20090223 +DTEND;VALUE=DATE:20090224 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135114Z +LAST-MODIFIED:20090106T135118Z +DTSTAMP:20090106T135114Z +UID:575e8be0-89b6-41c3-8253-19bf5fe4bfe2 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20090224 +DTEND;VALUE=DATE:20090225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135152Z +LAST-MODIFIED:20090106T135216Z +DTSTAMP:20090106T135152Z +UID:409594df-1e70-4139-bfa2-b6d79389dd98 +SUMMARY:Cinzas +DTSTART;TZID=America/Sao_Paulo:20090225T000000 +DTEND;TZID=America/Sao_Paulo:20090225T140000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135236Z +LAST-MODIFIED:20090106T135240Z +DTSTAMP:20090106T135236Z +UID:730db184-731e-45d8-9ebd-62cd15d54a6c +SUMMARY:Paixão de Cristo +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135255Z +LAST-MODIFIED:20090106T135303Z +DTSTAMP:20090106T135255Z +UID:9a4cf856-5886-4ddf-ae2e-feea57e925f4 +SUMMARY:Páscoa +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135446Z +LAST-MODIFIED:20090106T135450Z +DTSTAMP:20090106T135446Z +UID:3d8c43e5-a1ea-4234-8fcb-65d9b379a58e +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20090611 +DTEND;VALUE=DATE:20090612 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T141601Z +LAST-MODIFIED:20090106T141608Z +DTSTAMP:20090106T141601Z +UID:78ebb6e4-2639-40cf-b515-4fffa01d4428 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20100213 +DTEND;VALUE=DATE:20100214 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T141610Z +LAST-MODIFIED:20090106T141615Z +DTSTAMP:20090106T141610Z +UID:84b2559f-2fd4-4ca1-b66e-46289a232f41 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20100214 +DTEND;VALUE=DATE:20100215 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T141617Z +LAST-MODIFIED:20090106T141626Z +DTSTAMP:20090106T141617Z +UID:39f82997-e179-4ec5-aa38-46eea8bf095f +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20100215 +DTEND;VALUE=DATE:20100216 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T141628Z +LAST-MODIFIED:20090106T141634Z +DTSTAMP:20090106T141628Z +UID:3f288079-01e9-4b99-ba3e-8f92772ff041 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20100216 +DTEND;VALUE=DATE:20100217 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T141653Z +LAST-MODIFIED:20090106T141710Z +DTSTAMP:20090106T141653Z +UID:f02bc19e-18af-4480-8637-6da62e3fabf7 +SUMMARY:Cinzas +DTSTART;TZID=America/Sao_Paulo:20100217T000000 +DTEND;TZID=America/Sao_Paulo:20100217T140000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T141733Z +LAST-MODIFIED:20090106T141739Z +DTSTAMP:20090106T141733Z +UID:cc2ad878-d700-43e7-8ff8-2cb1036e7d15 +SUMMARY:Paixão de Cristo +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T141751Z +LAST-MODIFIED:20090106T141755Z +DTSTAMP:20090106T141751Z +UID:7b27b0ef-a846-43e2-91d6-e4b6737359e5 +SUMMARY:Páscoa +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T141826Z +LAST-MODIFIED:20090106T141832Z +DTSTAMP:20090106T141826Z +UID:62f157eb-8124-4861-b7cd-cb02380938d4 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20100603 +DTEND;VALUE=DATE:20100604 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T141934Z +LAST-MODIFIED:20090106T141939Z +DTSTAMP:20090106T141934Z +UID:2491adb3-2961-4037-9114-d6c8f12c2c6f +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20110305 +DTEND;VALUE=DATE:20110306 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T141940Z +LAST-MODIFIED:20090106T141944Z +DTSTAMP:20090106T141940Z +UID:a45971e8-bdda-4a93-b31f-326bb8b08685 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20110306 +DTEND;VALUE=DATE:20110307 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T141946Z +LAST-MODIFIED:20090106T141949Z +DTSTAMP:20090106T141946Z +UID:a1b4fb8f-e022-4229-9d22-2628c0544be2 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20110307 +DTEND;VALUE=DATE:20110308 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T141952Z +LAST-MODIFIED:20090106T141956Z +DTSTAMP:20090106T141952Z +UID:4fc77da7-0050-4583-84d1-af2472762843 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20110308 +DTEND;VALUE=DATE:20110309 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142009Z +LAST-MODIFIED:20090106T142021Z +DTSTAMP:20090106T142009Z +UID:190892b3-eff4-4a93-8f36-98cceaa31405 +SUMMARY:Cinzas +DTSTART;TZID=America/Sao_Paulo:20110309T000000 +DTEND;TZID=America/Sao_Paulo:20110309T140000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142037Z +LAST-MODIFIED:20090106T142043Z +DTSTAMP:20090106T142037Z +UID:9ddbf279-1d36-451e-a80c-9debd3cee909 +SUMMARY:Paixão de Cristo +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142052Z +LAST-MODIFIED:20090106T142056Z +DTSTAMP:20090106T142052Z +UID:4d23be11-c5c1-4fa6-9930-d34b595eb17a +SUMMARY:Páscoa +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142126Z +LAST-MODIFIED:20090106T142131Z +DTSTAMP:20090106T142126Z +UID:6b888c39-d51c-4fc7-89df-7be29bef2020 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20110623 +DTEND;VALUE=DATE:20110624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142634Z +LAST-MODIFIED:20090106T142639Z +DTSTAMP:20090106T142634Z +UID:d4263a59-a97b-4a8b-8f20-ba2fb3f78b26 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20120218 +DTEND;VALUE=DATE:20120219 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142641Z +LAST-MODIFIED:20090106T142645Z +DTSTAMP:20090106T142641Z +UID:0dea9841-b232-45fa-9acc-927a2dece1ae +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20120219 +DTEND;VALUE=DATE:20120220 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142647Z +LAST-MODIFIED:20090106T142652Z +DTSTAMP:20090106T142647Z +UID:6e2b7cf3-cc84-4fbb-98ed-e2853b1747e8 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20120220 +DTEND;VALUE=DATE:20120221 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142653Z +LAST-MODIFIED:20090106T142658Z +DTSTAMP:20090106T142653Z +UID:2e6c409b-7294-4057-8756-d0041b77f892 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20120221 +DTEND;VALUE=DATE:20120222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142710Z +LAST-MODIFIED:20090106T142723Z +DTSTAMP:20090106T142710Z +UID:b77f4c3f-64b7-4bc0-8096-4cc60d8869db +SUMMARY:Cinzas +DTSTART;TZID=America/Sao_Paulo:20120222T000000 +DTEND;TZID=America/Sao_Paulo:20120222T140000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142741Z +LAST-MODIFIED:20090106T142744Z +DTSTAMP:20090106T142741Z +UID:4c546428-e8d4-4a92-9de8-0f55e220afa0 +SUMMARY:Paixão de Cristo +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142758Z +LAST-MODIFIED:20090106T142805Z +DTSTAMP:20090106T142758Z +UID:0a4e32c3-0385-46ec-b056-0dacf29458cf +SUMMARY:Páscoa +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142835Z +LAST-MODIFIED:20090106T142840Z +DTSTAMP:20090106T142835Z +UID:b6736ff6-a6c7-4cd9-a2e2-a6230cd552cc +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20120607 +DTEND;VALUE=DATE:20120608 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142917Z +LAST-MODIFIED:20090106T142923Z +DTSTAMP:20090106T142917Z +UID:0282feb1-c645-4982-a28b-dbe5e4ebe98e +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20130209 +DTEND;VALUE=DATE:20130210 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142925Z +LAST-MODIFIED:20090106T142934Z +DTSTAMP:20090106T142925Z +UID:96a14d57-6cea-4390-bbd9-860321c65274 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20130210 +DTEND;VALUE=DATE:20130211 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142936Z +LAST-MODIFIED:20090106T142942Z +DTSTAMP:20090106T142936Z +UID:78b89567-f413-4a0a-92f7-e833519af72b +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20130211 +DTEND;VALUE=DATE:20130212 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142944Z +LAST-MODIFIED:20090106T142948Z +DTSTAMP:20090106T142944Z +UID:b899286b-b02f-43a3-9976-526baf18e4f4 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20130212 +DTEND;VALUE=DATE:20130213 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T142957Z +LAST-MODIFIED:20090106T143012Z +DTSTAMP:20090106T142957Z +UID:1a9042a1-7d41-4dac-8045-46a99093e85b +SUMMARY:Cinzas +DTSTART;TZID=America/Sao_Paulo:20130213T000000 +DTEND;TZID=America/Sao_Paulo:20130213T140000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143030Z +LAST-MODIFIED:20090106T143036Z +DTSTAMP:20090106T143030Z +UID:32b9e439-78d6-4776-a2e6-b17a771c2206 +SUMMARY:Paixão de Cristo +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143047Z +LAST-MODIFIED:20090106T143051Z +DTSTAMP:20090106T143047Z +UID:b01f9841-dc00-4138-83b7-bf4196b256af +SUMMARY:Páscoa +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143118Z +LAST-MODIFIED:20090106T143123Z +DTSTAMP:20090106T143118Z +UID:d84c7abe-764a-4e60-81f6-0bd08f0ab8f6 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20130530 +DTEND;VALUE=DATE:20130531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143203Z +LAST-MODIFIED:20090106T143207Z +DTSTAMP:20090106T143203Z +UID:4d75b9a6-0485-4bce-8e06-68f74491d45e +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20140301 +DTEND;VALUE=DATE:20140302 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143209Z +LAST-MODIFIED:20090106T143213Z +DTSTAMP:20090106T143209Z +UID:eacfc8fc-4a4a-4bab-8bcb-741ef0b241ef +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20140302 +DTEND;VALUE=DATE:20140303 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143214Z +LAST-MODIFIED:20090106T143218Z +DTSTAMP:20090106T143214Z +UID:ec252b29-117b-47d9-aad4-6630b7f02fc9 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20140303 +DTEND;VALUE=DATE:20140304 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143220Z +LAST-MODIFIED:20090106T143224Z +DTSTAMP:20090106T143220Z +UID:e01033c4-551b-46b6-bd9d-4b3ab582856d +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20140304 +DTEND;VALUE=DATE:20140305 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143232Z +LAST-MODIFIED:20090106T143249Z +DTSTAMP:20090106T143232Z +UID:79a61667-95b6-434e-821d-5d231602d003 +SUMMARY:Cinzas +DTSTART;TZID=America/Sao_Paulo:20140305T000000 +DTEND;TZID=America/Sao_Paulo:20140305T140000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143304Z +LAST-MODIFIED:20090106T143308Z +DTSTAMP:20090106T143304Z +UID:7dd0948a-7618-4c7c-9dd8-e7d29a759992 +SUMMARY:Paixão de Cristo +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143317Z +LAST-MODIFIED:20090106T143322Z +DTSTAMP:20090106T143317Z +UID:255abddb-6a0a-4710-a357-4a78fdf13caa +SUMMARY:Páscoa +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143337Z +LAST-MODIFIED:20090106T143343Z +DTSTAMP:20090106T143337Z +UID:d965d8ea-97af-46cf-a7fa-7fc930fa0fcd +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20140619 +DTEND;VALUE=DATE:20140620 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143412Z +LAST-MODIFIED:20090106T143416Z +DTSTAMP:20090106T143412Z +UID:1ac69ca4-75d3-48a6-bb74-c32d14533fd6 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20150214 +DTEND;VALUE=DATE:20150215 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143418Z +LAST-MODIFIED:20090106T143422Z +DTSTAMP:20090106T143418Z +UID:b9d1dc41-05ef-45f1-81e7-a40d2db33305 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20150215 +DTEND;VALUE=DATE:20150216 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143423Z +LAST-MODIFIED:20090106T143426Z +DTSTAMP:20090106T143423Z +UID:6e5967bd-058f-48be-86ae-fd1a553413eb +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20150216 +DTEND;VALUE=DATE:20150217 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143428Z +LAST-MODIFIED:20090106T143439Z +DTSTAMP:20090106T143428Z +UID:121be6b4-6c9c-4b59-8072-bf22c19987ae +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20150217 +DTEND;VALUE=DATE:20150218 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143517Z +LAST-MODIFIED:20090106T143530Z +DTSTAMP:20090106T143517Z +UID:755d4b5e-a380-4bc1-bfb7-669de73fc682 +SUMMARY:Cinzas +DTSTART;TZID=America/Sao_Paulo:20150218T000000 +DTEND;TZID=America/Sao_Paulo:20150218T140000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143543Z +LAST-MODIFIED:20090106T143547Z +DTSTAMP:20090106T143543Z +UID:45f0b666-238b-45f7-ab27-a2b0fdf1c0de +SUMMARY:Paixão de Cristo +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143557Z +LAST-MODIFIED:20090106T143602Z +DTSTAMP:20090106T143557Z +UID:63f827a9-b1a8-4124-94a0-2de38a4a6221 +SUMMARY:Páscoa +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143617Z +LAST-MODIFIED:20090106T143623Z +DTSTAMP:20090106T143617Z +UID:3394737e-5a72-4b84-87a2-4469d39f3d0e +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20150604 +DTEND;VALUE=DATE:20150605 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143707Z +LAST-MODIFIED:20090106T143716Z +DTSTAMP:20090106T143707Z +UID:51ff07c3-d213-4841-8447-7346f4573b14 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20160206 +DTEND;VALUE=DATE:20160207 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143718Z +LAST-MODIFIED:20090106T143721Z +DTSTAMP:20090106T143718Z +UID:b7f02955-3a5f-4b65-9396-51f4ffd28059 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20160207 +DTEND;VALUE=DATE:20160208 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143722Z +LAST-MODIFIED:20090106T143725Z +DTSTAMP:20090106T143722Z +UID:543619aa-70fc-4311-8910-f549eb4d6510 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20160208 +DTEND;VALUE=DATE:20160209 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143727Z +LAST-MODIFIED:20090106T143731Z +DTSTAMP:20090106T143727Z +UID:95992869-9b67-4264-bb7a-bb22a55ce54f +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20160209 +DTEND;VALUE=DATE:20160210 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143743Z +LAST-MODIFIED:20090106T143754Z +DTSTAMP:20090106T143743Z +UID:0f2d218a-7e85-47e5-bcef-83a88940a18a +SUMMARY:Cinzas +DTSTART;TZID=America/Sao_Paulo:20160210T000000 +DTEND;TZID=America/Sao_Paulo:20160210T140000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143806Z +LAST-MODIFIED:20090106T143811Z +DTSTAMP:20090106T143806Z +UID:1489343e-ce62-4999-9f23-4c0503e67623 +SUMMARY:Paixão de Cristo +DTSTART;VALUE=DATE:20160325 +DTEND;VALUE=DATE:20160326 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143819Z +LAST-MODIFIED:20090106T143823Z +DTSTAMP:20090106T143819Z +UID:4166c0ae-001a-4c37-8f47-ba466566053a +SUMMARY:Páscoa +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143844Z +LAST-MODIFIED:20090106T143848Z +DTSTAMP:20090106T143844Z +UID:13c7f46a-6c27-4c7b-86a1-90175ae1b2e0 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20160526 +DTEND;VALUE=DATE:20160527 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143922Z +LAST-MODIFIED:20090106T143926Z +DTSTAMP:20090106T143922Z +UID:c5de12db-7ad5-49f3-b857-afa46666924e +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20170225 +DTEND;VALUE=DATE:20170226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143927Z +LAST-MODIFIED:20090106T143932Z +DTSTAMP:20090106T143927Z +UID:4270b237-7079-4113-a52b-dca899281579 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20170226 +DTEND;VALUE=DATE:20170227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143934Z +LAST-MODIFIED:20090106T143937Z +DTSTAMP:20090106T143934Z +UID:d093e779-85da-40bb-a88c-c8f9fbb62e54 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20170227 +DTEND;VALUE=DATE:20170228 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143938Z +LAST-MODIFIED:20090106T143942Z +DTSTAMP:20090106T143938Z +UID:74f21005-c29e-4425-83c1-d05a0067bc20 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20170228 +DTEND;VALUE=DATE:20170301 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T143953Z +LAST-MODIFIED:20090106T144005Z +DTSTAMP:20090106T143953Z +UID:06d8ba15-ae77-4995-b53a-7edcc7470995 +SUMMARY:Cinzas +DTSTART;TZID=America/Sao_Paulo:20170301T000000 +DTEND;TZID=America/Sao_Paulo:20170301T140000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144019Z +LAST-MODIFIED:20090106T144025Z +DTSTAMP:20090106T144019Z +UID:dc0ef95b-e201-479b-9ff0-12041780be62 +SUMMARY:Paixão de Cristo +DTSTART;VALUE=DATE:20170414 +DTEND;VALUE=DATE:20170415 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144033Z +LAST-MODIFIED:20090106T144036Z +DTSTAMP:20090106T144033Z +UID:72b59385-cd79-413f-8b21-8b15628cd156 +SUMMARY:Páscoa +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144051Z +LAST-MODIFIED:20090106T144055Z +DTSTAMP:20090106T144051Z +UID:e77eca83-871f-4ac8-97c2-0bca08ab9c2a +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20170615 +DTEND;VALUE=DATE:20170616 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144124Z +LAST-MODIFIED:20090106T144128Z +DTSTAMP:20090106T144124Z +UID:8cd3cd18-1b75-4711-afe0-07ab4e81e51a +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20180210 +DTEND;VALUE=DATE:20180211 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144134Z +LAST-MODIFIED:20090106T144140Z +DTSTAMP:20090106T144134Z +UID:6753cf0a-b94e-47a6-a81c-b683475664f4 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20180211 +DTEND;VALUE=DATE:20180212 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144142Z +LAST-MODIFIED:20090106T144146Z +DTSTAMP:20090106T144142Z +UID:52504836-b825-475b-86dc-4f386edb3ba3 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20180212 +DTEND;VALUE=DATE:20180213 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144147Z +LAST-MODIFIED:20090106T144150Z +DTSTAMP:20090106T144147Z +UID:a405d8d0-8c23-42f5-a32c-b08c8073c463 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20180213 +DTEND;VALUE=DATE:20180214 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144206Z +LAST-MODIFIED:20090106T144217Z +DTSTAMP:20090106T144206Z +UID:5077ddcf-ca4c-4207-abc4-301b7cfc5687 +SUMMARY:Cinzas +DTSTART;TZID=America/Sao_Paulo:20180214T000000 +DTEND;TZID=America/Sao_Paulo:20180214T140000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144229Z +LAST-MODIFIED:20090106T144233Z +DTSTAMP:20090106T144229Z +UID:4bfa5f27-ceda-41d7-ba2e-b1650f0bea54 +SUMMARY:Paixão de Cristo +DTSTART;VALUE=DATE:20180330 +DTEND;VALUE=DATE:20180331 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144247Z +LAST-MODIFIED:20090106T144251Z +DTSTAMP:20090106T144247Z +UID:369576b5-e46a-489f-9f8c-888f641b4aaf +SUMMARY:Páscoa +DTSTART;VALUE=DATE:20180401 +DTEND;VALUE=DATE:20180402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144324Z +LAST-MODIFIED:20090106T144328Z +DTSTAMP:20090106T144324Z +UID:19e096e0-df92-4de5-ae80-7f00a61a6f4a +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20180531 +DTEND;VALUE=DATE:20180601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144416Z +LAST-MODIFIED:20090106T144419Z +DTSTAMP:20090106T144416Z +UID:860a732f-4fb1-4b63-9814-d1f806315009 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20190302 +DTEND;VALUE=DATE:20190303 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144420Z +LAST-MODIFIED:20090106T144424Z +DTSTAMP:20090106T144420Z +UID:35314a5e-5aa4-4790-96c2-55494a755396 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20190303 +DTEND;VALUE=DATE:20190304 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144425Z +LAST-MODIFIED:20090106T144429Z +DTSTAMP:20090106T144425Z +UID:a8d07bcb-84bf-4ccc-815b-53a76a15ce16 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20190304 +DTEND;VALUE=DATE:20190305 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144430Z +LAST-MODIFIED:20090106T144434Z +DTSTAMP:20090106T144430Z +UID:36ce5bf2-9e91-41be-99be-085091e44529 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20190305 +DTEND;VALUE=DATE:20190306 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144441Z +LAST-MODIFIED:20090106T144454Z +DTSTAMP:20090106T144441Z +UID:83252ad4-1440-485f-8692-0c7f414964f0 +SUMMARY:Cinzas +DTSTART;TZID=America/Sao_Paulo:20190306T000000 +DTEND;TZID=America/Sao_Paulo:20190306T140000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144508Z +LAST-MODIFIED:20090106T144512Z +DTSTAMP:20090106T144508Z +UID:15a703bb-8974-4d74-a01a-8c6da88008b5 +SUMMARY:Paixão de Cristo +DTSTART;VALUE=DATE:20190419 +DTEND;VALUE=DATE:20190420 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144522Z +LAST-MODIFIED:20090106T144528Z +DTSTAMP:20090106T144522Z +UID:6379f90b-af84-4acb-8e7f-a69a7e101d73 +SUMMARY:Páscoa +DTSTART;VALUE=DATE:20190421 +DTEND;VALUE=DATE:20190422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144543Z +LAST-MODIFIED:20090106T144547Z +DTSTAMP:20090106T144543Z +UID:891f9d34-9709-4fd6-86ff-072e08b03154 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20190620 +DTEND;VALUE=DATE:20190621 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144637Z +LAST-MODIFIED:20090106T144641Z +DTSTAMP:20090106T144637Z +UID:3c44f372-514d-49dd-ba49-630b3c557fe5 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20200222 +DTEND;VALUE=DATE:20200223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144643Z +LAST-MODIFIED:20090106T144646Z +DTSTAMP:20090106T144643Z +UID:aeeee39d-c448-4722-bd7b-6d69f7abcf5e +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20200223 +DTEND;VALUE=DATE:20200224 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144648Z +LAST-MODIFIED:20090106T144652Z +DTSTAMP:20090106T144648Z +UID:9515a760-be8f-450c-8182-2e1310fd2704 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20200224 +DTEND;VALUE=DATE:20200225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144653Z +LAST-MODIFIED:20090106T144657Z +DTSTAMP:20090106T144653Z +UID:70900ae0-3da4-4099-8fed-2fd1f3d250a9 +SUMMARY:Carnaval +DTSTART;VALUE=DATE:20200225 +DTEND;VALUE=DATE:20200226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144704Z +LAST-MODIFIED:20090106T144716Z +DTSTAMP:20090106T144704Z +UID:d3e200f1-e0dd-4219-b58a-61b1c00db20c +SUMMARY:Cinzas +DTSTART;TZID=America/Sao_Paulo:20200226T000000 +DTEND;TZID=America/Sao_Paulo:20200226T140000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144729Z +LAST-MODIFIED:20090106T144733Z +DTSTAMP:20090106T144729Z +UID:b1a8bf33-940e-42e0-a64c-c1dd3b7045a0 +SUMMARY:Paixão de Cristo +DTSTART;VALUE=DATE:20200410 +DTEND;VALUE=DATE:20200411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144742Z +LAST-MODIFIED:20090106T144746Z +DTSTAMP:20090106T144742Z +UID:6e639659-ee2f-4f52-ac39-49cabbf0cb8d +SUMMARY:Páscoa +DTSTART;VALUE=DATE:20200412 +DTEND;VALUE=DATE:20200413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T144757Z +LAST-MODIFIED:20090106T144802Z +DTSTAMP:20090106T144757Z +UID:14e309d9-2f87-4efc-a02b-d98f4dd0f9b7 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20200611 +DTEND;VALUE=DATE:20200612 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135915Z +LAST-MODIFIED:20090106T135922Z +DTSTAMP:20090106T135915Z +UID:fec98fbf-1c5d-4c28-b3e5-a859b4357c0a +SUMMARY:Proclamação da República +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20091115 +DTEND;VALUE=DATE:20091116 +TRANSP:TRANSPARENT +URL:http://www.brasil.gov.br/eventos/feriados/republica +DESCRIPTION:O dia 15 de novembro de 1889 marca o fim do Brasil imperial e + o início como República federativa. A proclamação foi feita\, no Rio + de Janeiro\, pelo marechal Deodoro da Fonseca\, que participou da + repressão à Praieira\, do cerco a Montevidéu e de uma dezena de + batalhas na Guerra do Paraguai. Nascido em Alagoas\, em 1827. Deodoro + assumiu a chefia do governo provisório\, na qualidade de comandante do + movimento armado. Elegeu-se presidente pelo Congresso Nacional a 25 de + fevereiro de 1891. O primeiro presidente civil foi Prudente de Morais\, + em 1894. +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135943Z +LAST-MODIFIED:20090106T135950Z +DTSTAMP:20090106T135943Z +UID:74237bec-45c5-4d08-9114-0897596e9fbd +SUMMARY:Natal +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +TRANSP:TRANSPARENT +URL:http://www.brasil.gov.br/eventos/feriados/natal +DESCRIPTION:O Natal simboliza o nascimento de Jesus Cristo e a data é + comemorada desde o ano 350 por determinação do Papa Júlio I\, + substituindo as festividades do Dia do Nascimento do Sol Inconquistável + ou solstício de inverno. Algumas tradições européias foram + incorporadas à comemoração no Brasil como a árvore de natal\, que + simboliza a vida\; a troca de presentes\; e a montagem de presépios\, + designação dada à representação artística do nascimento do Menino + Jesus em um estábulo. +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T134904Z +LAST-MODIFIED:20090106T140011Z +DTSTAMP:20090106T134904Z +UID:2a1776fa-da81-4bea-8d87-66f5862f7ba0 +SUMMARY:Confraternização Universal +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +URL:http://www.brasil.gov.br/eventos/feriados/new_years_eve +DESCRIPTION:O 1º de janeiro foi escolhido pela Organização das + Nações Unidas (ONU) como o Dia da Confraternização Mundial\, no + sentido de promover a união entre os povos. Na data\, se comemora\, + também\, o Dia Mundial da Paz. Na história da humanidade\, antes do + advento do calendário cristão\, os babilônios celebravam o recomeço + do ciclo anual no início da primavera\, época em que novas safras são + plantadas no Hemisfério Norte. O dia 1º de janeiro passou a ser + reconhecido como o primeiro do ano com a introdução do calendário + gregoriano na França\, Itália\, Portugal e Espanha em 1582. Uma data + comemorada por apenas um terço da população mundial\, incluindo os + brasileiros. Dos outros dois terços fazem parte\, por exemplo\, os + judeus\, muçulmanos e chineses\, que adotam outro calendário.\n +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135558Z +LAST-MODIFIED:20090106T140027Z +DTSTAMP:20090106T135558Z +UID:3fc1d5ae-c27b-4a80-a7c5-58136e8b645b +SUMMARY:Finados +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20091102 +DTEND;VALUE=DATE:20091103 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +URL:http://www.brasil.gov.br/eventos/feriados/finados +DESCRIPTION:A tradição de rezar pelos mortos é mantida pelos cristãos + desde o século I. A Igreja católica passou a dedicar um dia especial ao + culto por todos mortos no século V. Na época carolíngia\, que + compreende os séculos IX e X\, surgiu o registro dos vivos e mortos a + serem lembrados nas missas\, como ocorre ainda hoje. A data passou a ser + comemorada em 2 de novembro\, porque em 1º de novembro se festeja o Dia + de Todos os Santos. Em todo o País\, as homenagens são feitas com + orações\, oferta de flores e visitas aos cemitérios.\n +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135532Z +LAST-MODIFIED:20090106T140046Z +DTSTAMP:20090106T135532Z +UID:0527c464-4b54-4317-912f-10a2dbb69a7b +SUMMARY:Nossa Senhora de Aparecida +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20091012 +DTEND;VALUE=DATE:20091013 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +URL:http://www.brasil.gov.br/eventos/feriados/aparecida +DESCRIPTION:O culto à Nossa Senhora de Aparecida se originou em 1717\, + na cidade de Guaratinguetá\, Estado de São Paulo\, quando pescadores + retiraram a imagem da santa em madeira do Rio Paraíba. Em 1930\, o Papa + Pio XI proclamou Nossa Senhora Aparecida\, padroeira do Brasil. A santa + recebeu um templo consagrado pelo Papa João Paulo II\, em 1980\, na + primeira visita que fez ao Brasil.\n +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135512Z +LAST-MODIFIED:20090106T140100Z +DTSTAMP:20090106T135512Z +UID:984030a1-31bd-4bcb-bad5-624f64230b7e +SUMMARY:Independência +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20090907 +DTEND;VALUE=DATE:20090908 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +URL:http://www.brasil.gov.br/eventos/feriados/independencia +DESCRIPTION:Marco da separação de Portugal\, o dia 7 de setembro de + 1822 entrou para a História brasileira como a data em que D. Pedro I + declarou a independência do Brasil. A declaração ocorreu durante + viagem de Santos para São Paulo\, próximo ao riacho do Ipiranga. Os + primeiros países que reconheceram a independência foram os Estados + Unidos e o México. É considerada a data nacional do País. +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135356Z +LAST-MODIFIED:20090106T140211Z +DTSTAMP:20090106T135356Z +UID:768ebe6e-c46d-4493-aafc-c720f0a8196f +SUMMARY:Dia do Trabalho +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +URL:http://www.brasil.gov.br/eventos/feriados/trabalho +DESCRIPTION:A comemoração pelo Dia do Trabalho remonta aos Estados + Unidos do século XIX\, onde em 1º de maio de 1886 milhares de + trabalhadores saíram às ruas de Chicago por melhores salários e + condições de trabalho mais dignas. Houve conflito com a polícia e 80 + operários foram assassinados. Em 1889\, o Congresso Operário + Internacional decidiu proclamar a data como Dia Internacional do + Trabalho\, em homenagem aos trabalhadores mortos no massacre. No Brasil\, + a data se tornou feriado nacional em 1925\, no Governo do Presidente + Artur Bernardes. +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T135333Z +LAST-MODIFIED:20090106T140230Z +DTSTAMP:20090106T135333Z +UID:ad668d9a-72e1-498e-9279-3b55dcdf5de6 +SUMMARY:Tiradentes +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20090421 +DTEND;VALUE=DATE:20090422 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +URL:http://www.brasil.gov.br/eventos/feriados/tiradentes +DESCRIPTION:O alferes Joaquim José da Silva Xavier nasceu em 1746\, na + Fazenda do Pombal\, entre São José (hoje Tiradentes) e São João del + Rei\, em Minas Gerais. O nome Tiradentes se deve à habilidade como + dentista-prático. Integrante do Regimento de Dragões de Minas Gerais\, + foi condenado à morte sob a acusação de conspirar contra Portugal pela + libertação do Brasil. Morreu enforcado em 21 de abril em 1792\, no Rio + de Janeiro\, e seu corpo foi esquartejado. Considerado o grande mártir + da independência do País\, a data de sua morte se transformou em + feriado nacional.\n +END:VEVENT +BEGIN:VEVENT +CREATED:20090106T140522Z +LAST-MODIFIED:20090106T140544Z +DTSTAMP:20090106T140522Z +UID:45cc471f-c2ea-4831-9327-e41d59f2598a +SUMMARY:Véspera de Ano Novo +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;TZID=America/Sao_Paulo:20091231T140000 +DTEND;TZID=America/Sao_Paulo:20091231T235500 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/BulgarianHolidays.ics b/media/caldata/BulgarianHolidays.ics new file mode 100644 index 00000000000..ead3ddf382b --- /dev/null +++ b/media/caldata/BulgarianHolidays.ics @@ -0,0 +1,160 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20090331T062738Z +LAST-MODIFIED:20090331T062753Z +UID:3eee4764-815c-4346-839f-17518b11da5c +SUMMARY:Bank Holiday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090102 +DTEND;VALUE=DATE:20090103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090331T062855Z +LAST-MODIFIED:20090331T062905Z +UID:059d1e4b-6220-451e-b477-0b1f04410e1d +SUMMARY:Orthodox Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090420 +DTEND;VALUE=DATE:20090421 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090616T104341Z +LAST-MODIFIED:20090616T104421Z +DTSTAMP:20090616T104421Z +UID:6ae34f9e-f5d2-44dc-89ab-aea963ee6718 +SUMMARY:Bank Holiday +CATEGORIES:Public Holiday +X-MOZ-LASTACK:20090616T104356Z +DTSTART;VALUE=DATE:20090504 +DTEND;VALUE=DATE:20090505 +X-MOZ-GENERATION:3 +TRANSP:TRANSPARENT +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090616T104424Z +LAST-MODIFIED:20090616T104433Z +DTSTAMP:20090616T104433Z +UID:2f5f9406-0ee5-4c95-8c96-aa937b0295e5 +SUMMARY:Bank Holiday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090505 +DTEND;VALUE=DATE:20090506 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090331T062644Z +LAST-MODIFIED:20090331T062729Z +UID:5a815e3d-12ff-4f0a-a782-43016be98f39 +SUMMARY:New Year's Day +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090331T062815Z +LAST-MODIFIED:20090331T062825Z +UID:8169879c-5ee6-47dd-9417-c74a667b8184 +SUMMARY:Liberation Day +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090303 +DTEND;VALUE=DATE:20090304 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090331T062939Z +LAST-MODIFIED:20090331T062955Z +UID:bef79ffd-b852-4d50-92f1-551c4dde7ad1 +SUMMARY:Labor Day/May Day +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090331T063017Z +LAST-MODIFIED:20090331T063028Z +UID:8602e06c-ab1d-4d0e-a8fa-987a0f60a2c3 +SUMMARY:St George's Day / Army Day +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090506 +DTEND;VALUE=DATE:20090507 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090331T063424Z +LAST-MODIFIED:20090331T063434Z +UID:20113040-918e-455b-8e99-b0f9c9f8fa64 +SUMMARY:Bulgarian Alphabet and Culture Day +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090524 +DTEND;VALUE=DATE:20090525 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090331T063537Z +LAST-MODIFIED:20090331T063548Z +UID:e50bbd52-cdab-4fac-9100-965ec656000a +SUMMARY:Union Day +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090906 +DTEND;VALUE=DATE:20090907 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090331T063601Z +LAST-MODIFIED:20090331T063616Z +UID:a01eb2e5-dc43-44ab-bb50-542aea5435df +SUMMARY:Independence Day +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090922 +DTEND;VALUE=DATE:20090923 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090331T063634Z +LAST-MODIFIED:20090331T063644Z +UID:c3c84fcb-7ebb-4873-a7cf-1286b651de55 +SUMMARY:Christmas Eve +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20091224 +DTEND;VALUE=DATE:20091225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090331T063655Z +LAST-MODIFIED:20090331T063705Z +UID:8c96dc1b-0f3c-4cbf-9097-982e93032c46 +SUMMARY:Christmas Day +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090331T063708Z +LAST-MODIFIED:20090331T063731Z +UID:e9f9f2fb-c12d-464f-8893-763e896189ce +SUMMARY:St Stephen's Day +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/CanadaHolidays.ics b/media/caldata/CanadaHolidays.ics new file mode 100644 index 00000000000..62a931e2b27 --- /dev/null +++ b/media/caldata/CanadaHolidays.ics @@ -0,0 +1,2073 @@ +BEGIN:VCALENDAR +PRODID:-//K Desktop Environment//NONSGML libkcal 4.3//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:America/Denver +X-LIC-LOCATION:America/Denver +BEGIN:DAYLIGHT +TZOFFSETFROM:-0700 +TZOFFSETTO:-0600 +TZNAME:MDT +DTSTART:19700308T020000 +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0600 +TZOFFSETTO:-0700 +TZNAME:MST +DTSTART:19701101T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122820Z +UID:9e98b0a9-ded3-4e4c-8718-5da44666508a +LAST-MODIFIED:20120806T122820Z +SUMMARY:New Year's Eve +DTSTART;VALUE=DATE:20181231 +DTEND;VALUE=DATE:20190101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122406Z +UID:2f11190f-aaf8-4c25-a406-162f6d62dfc7 +LAST-MODIFIED:20120806T122406Z +SUMMARY:Christmas +DTSTART;VALUE=DATE:20151225 +DTEND;VALUE=DATE:20151226 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121713Z +UID:4c5c6bc3-88bf-4445-8b4f-0b8b067677ec +LAST-MODIFIED:20120806T121713Z +SUMMARY:Halloween +DTSTART;VALUE=DATE:20151031 +DTEND;VALUE=DATE:20151101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120643Z +UID:38c0c1f5-cdcb-4c36-b3e6-ee5ccf8a4d20 +SEQUENCE:1 +LAST-MODIFIED:20120806T120643Z +SUMMARY:Canada Day +DTSTART;VALUE=DATE:20140701 +DTEND;VALUE=DATE:20140702 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121434Z +UID:60e37336-9eed-4bd0-8b26-93cfa905d89f +LAST-MODIFIED:20120806T121434Z +SUMMARY:Thanksgiving Day (All) +DTSTART;VALUE=DATE:20131014 +DTEND;VALUE=DATE:20131015 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120719Z +UID:064e098c-1588-425b-a277-343aba7b7ec8 +LAST-MODIFIED:20120806T120719Z +SUMMARY:Canada Day +DTSTART;VALUE=DATE:20170701 +DTEND;VALUE=DATE:20170702 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113037Z +UID:9c3690ac-8a42-47dc-882c-0cd109770bc5 +LAST-MODIFIED:20120806T113037Z +SUMMARY:Familiy Day (AL\, ON\, SK) +DTSTART;VALUE=DATE:20130218 +DTEND;VALUE=DATE:20130219 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121922Z +UID:d5d55c88-9827-448f-998f-7973d3f46031 +LAST-MODIFIED:20120806T121922Z +SUMMARY:Remembrance Day (Most regions) +DTSTART;VALUE=DATE:20161111 +DTEND;VALUE=DATE:20161112 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112600Z +UID:f1c55757-5153-4bdd-93ea-1f0cb6fb59be +LAST-MODIFIED:20120806T112600Z +SUMMARY:Familiy Day (BC) +DTSTART;VALUE=DATE:20150209 +DTEND;VALUE=DATE:20150210 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114907Z +UID:6d0eb88f-c9cc-4790-8e15-51183b78968b +LAST-MODIFIED:20120806T114907Z +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121358Z +UID:d2853b95-fe8a-4094-88ff-b899c70be1cc +LAST-MODIFIED:20120806T121358Z +SUMMARY:Labour Day (All) +DTSTART;VALUE=DATE:20200907 +DTEND;VALUE=DATE:20200908 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115126Z +UID:a4cce146-21d0-464f-aec0-e1932b7f4772 +LAST-MODIFIED:20120806T115126Z +SUMMARY:Vimy Ridge Day +DTSTART;VALUE=DATE:20190409 +DTEND;VALUE=DATE:20190410 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112616Z +UID:8b93ae4d-d216-4507-a8c4-628c4c7d06a7 +LAST-MODIFIED:20120806T112616Z +SUMMARY:Familiy Day (BC) +DTSTART;VALUE=DATE:20160208 +DTEND;VALUE=DATE:20160209 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120503Z +UID:0427784d-5c3b-4600-8dec-5a02e704a2d0 +SEQUENCE:1 +LAST-MODIFIED:20120806T120503Z +SUMMARY:National Aboriginal Day +DTSTART;VALUE=DATE:20180621 +DTEND;VALUE=DATE:20180622 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122605Z +UID:d9101136-1a25-4de4-99d9-5adba3007eb9 +LAST-MODIFIED:20120806T122605Z +SUMMARY:Boxing Day (Most regions) +DTSTART;VALUE=DATE:20161226 +DTEND;VALUE=DATE:20161227 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115145Z +UID:c9bf7c30-acbe-4cbc-874f-a41e96c8d5e1 +LAST-MODIFIED:20120806T115145Z +SUMMARY:Vimy Ridge Day +DTSTART;VALUE=DATE:20200409 +DTEND;VALUE=DATE:20200410 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111714Z +UID:a4731227-98c5-42fb-890d-d11fc9921559 +LAST-MODIFIED:20120806T111714Z +SUMMARY:Epiphany +DTSTART;VALUE=DATE:20190106 +DTEND;VALUE=DATE:20190107 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121456Z +UID:97f36d88-ef2e-4680-973e-52f4369b19d3 +LAST-MODIFIED:20120806T121456Z +SUMMARY:Thanksgiving Day (All) +DTSTART;VALUE=DATE:20151012 +DTEND;VALUE=DATE:20151013 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112635Z +UID:02061a4d-d910-449a-99fd-faafee81d01a +LAST-MODIFIED:20120806T112635Z +SUMMARY:Familiy Day (BC) +DTSTART;VALUE=DATE:20170213 +DTEND;VALUE=DATE:20170214 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113636Z +UID:97cb8023-1e59-4f17-86c2-498a642673e1 +LAST-MODIFIED:20120806T113636Z +SUMMARY:Commonwealth Day +DTSTART;VALUE=DATE:20170313 +DTEND;VALUE=DATE:20170314 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113845Z +UID:e56dee73-a71b-4783-8017-0ed9439f4bd9 +LAST-MODIFIED:20120806T113845Z +SUMMARY:St. Patrick's Day +DTSTART;VALUE=DATE:20150317 +DTEND;VALUE=DATE:20150318 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121537Z +UID:3e89e0c7-9124-4682-805d-aac2155263d1 +LAST-MODIFIED:20120806T121537Z +SUMMARY:Thanksgiving Day (All) +DTSTART;VALUE=DATE:20181008 +DTEND;VALUE=DATE:20181009 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120453Z +UID:5959a81d-63b7-41cb-acfc-bfd5f37c00ab +LAST-MODIFIED:20120806T120453Z +SUMMARY:National Aboriginal Day +DTSTART;VALUE=DATE:20170621 +DTEND;VALUE=DATE:20170622 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114515Z +UID:c910fa90-d948-4b59-97b6-e11fb2e620fa +LAST-MODIFIED:20120806T114515Z +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114339Z +UID:8a221b48-08fd-4827-ae0f-f546edac5344 +SEQUENCE:1 +LAST-MODIFIED:20120806T114339Z +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20200410 +DTEND;VALUE=DATE:20200411 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114653Z +UID:4ee6bb8b-d47c-4585-9ef1-2e45bfc7fe52 +LAST-MODIFIED:20120806T114653Z +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20200412 +DTEND;VALUE=DATE:20200413 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121624Z +UID:9626a25b-ee91-4c91-b080-dc4bd9aae125 +LAST-MODIFIED:20120806T121624Z +SUMMARY:Thanksgiving Day (All) +DTSTART;VALUE=DATE:20201012 +DTEND;VALUE=DATE:20201013 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121053Z +UID:5f09999c-1293-4674-ac50-677772c75c47 +LAST-MODIFIED:20120806T121053Z +SUMMARY:Civic/Provincial Day (Many regions) +DTSTART;VALUE=DATE:20170807 +DTEND;VALUE=DATE:20170808 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +DTSTAMP:20120117T220215Z +UID:15440c4b-f459-4599-9d92-5906555eb6d1 +LAST-MODIFIED:20120117T220215Z +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113555Z +UID:30954079-9883-49e1-8baa-b05d67d36e86 +LAST-MODIFIED:20120806T113555Z +SUMMARY:Commonwealth Day +DTSTART;VALUE=DATE:20150309 +DTEND;VALUE=DATE:20150310 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113649Z +UID:1e5663e7-3b00-4ff9-9164-d7861e9c73d6 +SEQUENCE:1 +LAST-MODIFIED:20120806T113649Z +SUMMARY:Commonwealth Day +DTSTART;VALUE=DATE:20180312 +DTEND;VALUE=DATE:20180313 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121912Z +UID:e4e5277d-5a49-474a-903b-67bf789036f1 +LAST-MODIFIED:20120806T121912Z +SUMMARY:Remembrance Day (Most regions) +DTSTART;VALUE=DATE:20151111 +DTEND;VALUE=DATE:20151112 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113857Z +UID:d92a3d23-8dfb-4c95-8c0d-01eb05da3f8d +LAST-MODIFIED:20120806T113857Z +SUMMARY:St. Patrick's Day +DTSTART;VALUE=DATE:20160317 +DTEND;VALUE=DATE:20160318 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111356Z +UID:0a65b228-2ad1-4d0b-9c80-6e478d2242c0 +LAST-MODIFIED:20120806T111356Z +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20170101 +DTEND;VALUE=DATE:20170102 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121235Z +UID:8126c702-c0e8-4527-8707-06aff05049f0 +LAST-MODIFIED:20120806T121235Z +SUMMARY:Labour Day (All) +DTSTART;VALUE=DATE:20140901 +DTEND;VALUE=DATE:20140902 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113816Z +UID:d0fe3456-be78-4f94-9ba9-a84c24a616f1 +SEQUENCE:1 +LAST-MODIFIED:20120806T113816Z +SUMMARY:St. Patrick's Day +DTSTART;VALUE=DATE:20130317 +DTEND;VALUE=DATE:20130318 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114151Z +UID:e46e2935-c969-45fd-a335-8eb69abdd9bd +LAST-MODIFIED:20120806T114151Z +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114853Z +UID:fabf85d5-a742-4c45-b40f-e59dca604a7a +LAST-MODIFIED:20120806T114853Z +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112723Z +UID:1af43ec4-5a83-4809-af66-c3c437392575 +LAST-MODIFIED:20120806T112723Z +SUMMARY:Familiy Day (BC) +DTSTART;VALUE=DATE:20200210 +DTEND;VALUE=DATE:20200211 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121731Z +UID:4fa6c992-7ae7-45ad-9eb0-0b3ca988affb +LAST-MODIFIED:20120806T121731Z +SUMMARY:Halloween +DTSTART;VALUE=DATE:20161031 +DTEND;VALUE=DATE:20161101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122304Z +UID:5ee35f25-fb9c-4dad-b88e-7b7e1080e16a +LAST-MODIFIED:20120806T122304Z +SUMMARY:Anniversary of the Statute of Westminster +DTSTART;VALUE=DATE:20191211 +DTEND;VALUE=DATE:20191212 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114053Z +UID:8d095153-5b79-4a86-8c96-ceb216606ec7 +LAST-MODIFIED:20120806T114053Z +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112915Z +UID:c1a11792-2295-4f98-a972-e69b8d9155f3 +LAST-MODIFIED:20120806T112915Z +SUMMARY:Valentine's Day +DTSTART;VALUE=DATE:20170214 +DTEND;VALUE=DATE:20170215 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112528Z +UID:0088e542-9744-46f2-80cf-93a5b327d811 +SEQUENCE:1 +LAST-MODIFIED:20120806T112528Z +SUMMARY:Familiy Day (BC) +DTSTART;VALUE=DATE:20140210 +DTEND;VALUE=DATE:20140211 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111339Z +UID:40d1df3d-9fae-411e-86f7-abe1fa569188 +LAST-MODIFIED:20120806T111339Z +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20160101 +DTEND;VALUE=DATE:20160102 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122148Z +UID:1df306b5-82ca-40be-b579-1b7a4d5f3c1b +SEQUENCE:1 +LAST-MODIFIED:20120806T122148Z +SUMMARY:Anniversary of the Statute of Westminster +DTSTART;VALUE=DATE:20131211 +DTEND;VALUE=DATE:20131212 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122451Z +UID:1c12575d-a6ae-4c63-befb-94d44748438f +LAST-MODIFIED:20120806T122451Z +SUMMARY:Christmas +DTSTART;VALUE=DATE:20191225 +DTEND;VALUE=DATE:20191226 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112500Z +UID:eed21728-0d6d-411b-bdcd-2db8e0033b09 +LAST-MODIFIED:20120806T112500Z +SUMMARY:Familiy Day (BC) +DTSTART;VALUE=DATE:20130211 +DTEND;VALUE=DATE:20130212 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121931Z +UID:7f257f5d-d925-4e10-9ad7-2a6caedd7a6d +LAST-MODIFIED:20120806T121931Z +SUMMARY:Remembrance Day (Most regions) +DTSTART;VALUE=DATE:20171111 +DTEND;VALUE=DATE:20171112 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112824Z +UID:c2bf0788-53a9-41d1-bdbb-16a0f6a9ded2 +LAST-MODIFIED:20120806T112824Z +SUMMARY:Valentine's Day +DTSTART;VALUE=DATE:20150214 +DTEND;VALUE=DATE:20150215 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121218Z +UID:eae4eee9-363a-489e-af6d-c607fe1cb8a2 +LAST-MODIFIED:20120806T121218Z +SUMMARY:Labour Day (All) +DTSTART;VALUE=DATE:20130902 +DTEND;VALUE=DATE:20130903 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +DTSTAMP:20120117T220251Z +UID:8443f87e-ccc7-4bbc-bdc2-8244f459638f +LAST-MODIFIED:20120117T220251Z +SUMMARY:Vimy Ridge Day +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120411Z +UID:abf76863-44f9-4788-8939-65da297bd2c3 +LAST-MODIFIED:20120806T120411Z +SUMMARY:National Aboriginal Day +DTSTART;VALUE=DATE:20140621 +DTEND;VALUE=DATE:20140622 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120117T220411Z +UID:dc725c0c-587a-4f7d-997f-521478528973 +SEQUENCE:2 +LAST-MODIFIED:20120117T220411Z +SUMMARY:Canada Day +DTSTART;VALUE=DATE:20120701 +DTEND;VALUE=DATE:20120702 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120627Z +UID:1420041b-611f-47b2-be56-98da6c05b590 +SEQUENCE:1 +LAST-MODIFIED:20120806T120627Z +SUMMARY:Canada Day +DTSTART;VALUE=DATE:20130701 +DTEND;VALUE=DATE:20130702 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115411Z +UID:fad27151-a044-4bb9-b599-3e1cb9afb4b4 +LAST-MODIFIED:20120806T115411Z +SUMMARY:Victoria Day (Most regions) +DTSTART;VALUE=DATE:20140519 +DTEND;VALUE=DATE:20140520 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121750Z +UID:9594d587-1064-4dda-ac18-2acdee4a2a74 +LAST-MODIFIED:20120806T121750Z +SUMMARY:Halloween +DTSTART;VALUE=DATE:20181031 +DTEND;VALUE=DATE:20181101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112008Z +UID:75f22f3b-bcd1-4412-862c-d0360efbc3a1 +LAST-MODIFIED:20120806T112008Z +SUMMARY:Groundhog Day +DTSTART;VALUE=DATE:20170202 +DTEND;VALUE=DATE:20170203 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114212Z +UID:80990696-408a-4d41-95d4-be21c1eabb71 +LAST-MODIFIED:20120806T114212Z +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20160325 +DTEND;VALUE=DATE:20160326 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111621Z +UID:8e044c49-1f37-4e97-ad52-59eeab6f92e6 +LAST-MODIFIED:20120806T111621Z +SUMMARY:Epiphany +DTSTART;VALUE=DATE:20160106 +DTEND;VALUE=DATE:20160107 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122554Z +UID:72f1c771-b7d3-4c08-b110-ce37556df929 +LAST-MODIFIED:20120806T122554Z +SUMMARY:Boxing Day (Most regions) +DTSTART;VALUE=DATE:20151226 +DTEND;VALUE=DATE:20151227 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114258Z +UID:08112e3f-936a-4262-85fd-ce82403141aa +LAST-MODIFIED:20120806T114258Z +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20180330 +DTEND;VALUE=DATE:20180331 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122419Z +UID:c21cd657-ded8-4ba2-a055-6e24350a6916 +LAST-MODIFIED:20120806T122419Z +SUMMARY:Christmas +DTSTART;VALUE=DATE:20161225 +DTEND;VALUE=DATE:20161226 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111639Z +UID:f88a878c-569e-4ab1-9803-c80b0ec59adf +SEQUENCE:1 +LAST-MODIFIED:20120806T111639Z +SUMMARY:Epiphany +DTSTART;VALUE=DATE:20170106 +DTEND;VALUE=DATE:20170107 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121941Z +UID:5d4e0151-9991-4364-8277-b460fe3e1c94 +LAST-MODIFIED:20120806T121941Z +SUMMARY:Remembrance Day (Most regions) +DTSTART;VALUE=DATE:20181111 +DTEND;VALUE=DATE:20181112 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113618Z +UID:50882e80-ebab-4ec7-9a99-cdc8283ee0e2 +LAST-MODIFIED:20120806T113618Z +SUMMARY:Commonwealth Day +DTSTART;VALUE=DATE:20160314 +DTEND;VALUE=DATE:20160315 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122634Z +UID:54304aa4-e36e-4b33-9971-24033295af71 +LAST-MODIFIED:20120806T122634Z +SUMMARY:Boxing Day (Most regions) +DTSTART;VALUE=DATE:20191226 +DTEND;VALUE=DATE:20191227 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122441Z +UID:d51b3879-6437-47bf-b9ef-5fce6cd3b5e9 +LAST-MODIFIED:20120806T122441Z +SUMMARY:Christmas +DTSTART;VALUE=DATE:20181225 +DTEND;VALUE=DATE:20181226 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121959Z +UID:1f77d433-3fef-4ae3-9bcd-04505eac3bfe +LAST-MODIFIED:20120806T121959Z +SUMMARY:Remembrance Day (Most regions) +DTSTART;VALUE=DATE:20201111 +DTEND;VALUE=DATE:20201112 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113311Z +UID:1e5ceead-4408-4183-8c68-b370a6aa6dc9 +LAST-MODIFIED:20120806T113311Z +SUMMARY:Familiy Day (AL\, ON\, SK) +DTSTART;VALUE=DATE:20160215 +DTEND;VALUE=DATE:20160216 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120814Z +UID:633730f9-d620-43c5-ad15-ae51f78a6d94 +LAST-MODIFIED:20120806T120814Z +SUMMARY:Canada Day (additional) +DTSTART;VALUE=DATE:20180702 +DTEND;VALUE=DATE:20180703 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114713Z +UID:9e9c3674-4381-499b-912c-cb36a355fb1c +LAST-MODIFIED:20120806T114713Z +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20200413 +DTEND;VALUE=DATE:20200414 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120117T220040Z +UID:42daa2c5-42e0-4cbc-a614-1284b2f3378b +SEQUENCE:2 +LAST-MODIFIED:20120117T220040Z +SUMMARY:Valentine's Day +DTSTART;VALUE=DATE:20120214 +DTEND;VALUE=DATE:20120215 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZX-MOZ-GENERATION:1 +DTSTAMP:20120117T222123Z +UID:074e1958-329b-45b8-b918-3d6807c9deb4 +SEQUENCE:2 +LAST-MODIFIED:20120117T222123Z +SUMMARY:Civic/Provincial Day (Many regions) +DTSTART;VALUE=DATE:20120806 +DTEND;VALUE=DATE:20120807 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113930Z +UID:a7af1632-9c60-433e-a14e-b2fa7b63d0e4 +LAST-MODIFIED:20120806T113930Z +SUMMARY:St. Patrick's Day +DTSTART;VALUE=DATE:20190317 +DTEND;VALUE=DATE:20190318 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112706Z +UID:51c6de42-d9d9-470b-80a6-7235c4c323f8 +LAST-MODIFIED:20120806T112706Z +SUMMARY:Familiy Day (BC) +DTSTART;VALUE=DATE:20190211 +DTEND;VALUE=DATE:20190212 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121653Z +UID:002768db-919a-44ed-b266-cc816736be21 +LAST-MODIFIED:20120806T121653Z +SUMMARY:Halloween +DTSTART;VALUE=DATE:20131031 +DTEND;VALUE=DATE:20131101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122624Z +UID:0ffe67f0-43d9-448b-941e-9b86e4e5ce0c +LAST-MODIFIED:20120806T122624Z +SUMMARY:Boxing Day (Most regions) +DTSTART;VALUE=DATE:20181226 +DTEND;VALUE=DATE:20181227 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111538Z +UID:3a1c6e55-a0f9-4e45-ab88-32bb6a9e717f +LAST-MODIFIED:20120806T111538Z +SUMMARY:Epiphany +DTSTART;VALUE=DATE:20130106 +DTEND;VALUE=DATE:20130107 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +X-MOZ-GENERATION:1 +DTSTAMP:20120117T222100Z +UID:e9a8bda0-2fa1-4cdf-94e1-5eb5467869ff +LAST-MODIFIED:20120117T222100Z +SUMMARY:Canada Day - statutory holiday +DTSTART;VALUE=DATE:20120702 +DTEND;VALUE=DATE:20120703 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111609Z +UID:700dfd09-1ec3-4870-9b45-c9ab2fb2e1de +LAST-MODIFIED:20120806T111609Z +SUMMARY:Epiphany +DTSTART;VALUE=DATE:20150106 +DTEND;VALUE=DATE:20150107 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115115Z +UID:c32ac59d-0361-41c9-ba90-f756937b0e8e +LAST-MODIFIED:20120806T115115Z +SUMMARY:Vimy Ridge Day +DTSTART;VALUE=DATE:20180409 +DTEND;VALUE=DATE:20180410 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121106Z +UID:4c0c2771-b82c-48f1-bfab-4b9d47d3e4f6 +LAST-MODIFIED:20120806T121106Z +SUMMARY:Civic/Provincial Day (Many regions) +DTSTART;VALUE=DATE:20180806 +DTEND;VALUE=DATE:20180807 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122757Z +UID:c45812b1-72f2-4f35-989d-f7d94d85ddae +LAST-MODIFIED:20120806T122757Z +SUMMARY:New Year's Eve +DTSTART;VALUE=DATE:20161231 +DTEND;VALUE=DATE:20170101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115043Z +UID:f22d73f8-8bd2-4bc7-9d48-d69e2dd0aa10 +LAST-MODIFIED:20120806T115043Z +SUMMARY:Vimy Ridge Day +DTSTART;VALUE=DATE:20150409 +DTEND;VALUE=DATE:20150410 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +DTSTAMP:20120117T220307Z +UID:3b2035b3-1b4c-4f08-8a38-5ab3d57ef4bb +LAST-MODIFIED:20120117T220307Z +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115031Z +UID:c456b869-3ba6-4b9d-b0be-440e6acfecbd +LAST-MODIFIED:20120806T115031Z +SUMMARY:Vimy Ridge Day +DTSTART;VALUE=DATE:20140409 +DTEND;VALUE=DATE:20140410 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122236Z +UID:46e06aa6-dc2c-44e2-9acf-6bb3c3d8be0e +SEQUENCE:1 +LAST-MODIFIED:20120806T122236Z +SUMMARY:Anniversary of the Statute of Westminster +DTSTART;VALUE=DATE:20171211 +DTEND;VALUE=DATE:20171212 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115052Z +UID:3ec6ead6-27e7-4aae-a05f-04bf0496a7d2 +LAST-MODIFIED:20120806T115052Z +SUMMARY:Vimy Ridge Day +DTSTART;VALUE=DATE:20160409 +DTEND;VALUE=DATE:20160410 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122252Z +UID:f628782a-2734-4cc8-b231-17eab40a4410 +LAST-MODIFIED:20120806T122252Z +SUMMARY:Anniversary of the Statute of Westminster +DTSTART;VALUE=DATE:20181211 +DTEND;VALUE=DATE:20181212 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114529Z +UID:378ed9e6-d6fc-4f7f-9cc2-2a6ac32ec5ab +LAST-MODIFIED:20120806T114529Z +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120658Z +UID:e501f977-fe30-49c8-ae9e-eb9adfd8a365 +LAST-MODIFIED:20120806T120658Z +SUMMARY:Canada Day +DTSTART;VALUE=DATE:20150701 +DTEND;VALUE=DATE:20150702 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121140Z +UID:b30d93b0-4ac2-46a9-b0a2-30e5a3fda0d3 +LAST-MODIFIED:20120806T121140Z +SUMMARY:Civic/Provincial Day (Many regions) +DTSTART;VALUE=DATE:20200803 +DTEND;VALUE=DATE:20200804 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120400Z +UID:ef17cc5d-3a8b-487b-80c5-d05b1a1e83d3 +LAST-MODIFIED:20120806T120400Z +SUMMARY:National Aboriginal Day +DTSTART;VALUE=DATE:20130621 +DTEND;VALUE=DATE:20130622 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZX-MOZ-GENERATION:1 +DTSTAMP:20120117T221906Z +UID:4370e2c8-0863-456c-b1d0-e64ec8a06ef1 +SEQUENCE:2 +LAST-MODIFIED:20120117T221906Z +SUMMARY:Commonwealth Day +DTSTART;VALUE=DATE:20120312 +DTEND;VALUE=DATE:20120313 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113939Z +UID:ad94f6ba-9e73-458d-abcd-eb60f6f7ab95 +LAST-MODIFIED:20120806T113939Z +SUMMARY:St. Patrick's Day +DTSTART;VALUE=DATE:20200317 +DTEND;VALUE=DATE:20200318 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114815Z +UID:8bdce439-4188-4d42-a31e-1aae85ef2bb3 +LAST-MODIFIED:20120806T114815Z +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20170417 +DTEND;VALUE=DATE:20170418 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111309Z +UID:1917d92a-da6c-442a-8487-accd88371742 +LAST-MODIFIED:20120806T111309Z +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20140101 +DTEND;VALUE=DATE:20140102 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115546Z +UID:d4eee053-5d5e-40cb-98bd-c83b562b7a34 +LAST-MODIFIED:20120806T115546Z +SUMMARY:Victoria Day (Most regions) +DTSTART;VALUE=DATE:20190520 +DTEND;VALUE=DATE:20190521 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112840Z +UID:a35d57b1-1ed1-45e1-8019-cba7cb126997 +LAST-MODIFIED:20120806T112840Z +SUMMARY:Valentine's Day +DTSTART;VALUE=DATE:20160214 +DTEND;VALUE=DATE:20160215 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112058Z +UID:03e53920-f7d4-4db0-882b-117e66e84f6b +LAST-MODIFIED:20120806T112058Z +SUMMARY:Groundhog Day +DTSTART;VALUE=DATE:20200202 +DTEND;VALUE=DATE:20200203 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121819Z +UID:6b63b306-4462-4dd9-8dd8-a411ddb059ff +LAST-MODIFIED:20120806T121819Z +SUMMARY:Halloween +DTSTART;VALUE=DATE:20201031 +DTEND;VALUE=DATE:20201101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +X-MOZ-GENERATION:1 +DTSTAMP:20120117T222145Z +UID:ed33f08c-fcb1-44ee-9173-1bd7051093fb +LAST-MODIFIED:20120117T222145Z +SUMMARY:Thanksgiving Day (All) +DTSTART;VALUE=DATE:20121008 +DTEND;VALUE=DATE:20121009 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122502Z +UID:570de254-18f5-4065-9168-3daa97f0e5b4 +LAST-MODIFIED:20120806T122502Z +SUMMARY:Christmas +DTSTART;VALUE=DATE:20201225 +DTEND;VALUE=DATE:20201226 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120530Z +UID:0ca16e6c-dab1-42e5-beed-304fd466533b +SEQUENCE:1 +LAST-MODIFIED:20120806T120530Z +SUMMARY:National Aboriginal Day +DTSTART;VALUE=DATE:20200621 +DTEND;VALUE=DATE:20200622 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111413Z +UID:ec273493-1d41-4627-86f8-e62f55b56ae7 +LAST-MODIFIED:20120806T111413Z +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20180101 +DTEND;VALUE=DATE:20180102 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120443Z +UID:4c7571d3-8f2e-4fd2-b558-aa7881ba67c1 +LAST-MODIFIED:20120806T120443Z +SUMMARY:National Aboriginal Day +DTSTART;VALUE=DATE:20160621 +DTEND;VALUE=DATE:20160622 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122315Z +UID:1916284f-b2d3-463e-af76-f921f6b7863b +LAST-MODIFIED:20120806T122315Z +SUMMARY:Anniversary of the Statute of Westminster +DTSTART;VALUE=DATE:20201211 +DTEND;VALUE=DATE:20201212 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120117T215941Z +UID:7fdfe99e-3485-4af4-8949-2b0c8c829d17 +SEQUENCE:2 +LAST-MODIFIED:20120117T215941Z +SUMMARY:Epiphany +DTSTART;VALUE=DATE:20120106 +DTEND;VALUE=DATE:20120107 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113407Z +UID:79937d85-f410-4b27-bf42-2c674cad3c85 +LAST-MODIFIED:20120806T113407Z +SUMMARY:Familiy Day (AL\, ON\, SK) +DTSTART;VALUE=DATE:20190218 +DTEND;VALUE=DATE:20190219 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111728Z +UID:539e3ede-a9ae-4c17-8a14-030e7530c1d7 +SEQUENCE:1 +LAST-MODIFIED:20120806T111728Z +SUMMARY:Epiphany +DTSTART;VALUE=DATE:20200106 +DTEND;VALUE=DATE:20200107 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114234Z +UID:b9cac697-69bf-46d8-973a-5a932afc646c +LAST-MODIFIED:20120806T114234Z +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20170414 +DTEND;VALUE=DATE:20170415 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121446Z +UID:239b0c1f-268c-4884-962f-7442210a1527 +LAST-MODIFIED:20120806T121446Z +SUMMARY:Thanksgiving Day (All) +DTSTART;VALUE=DATE:20141013 +DTEND;VALUE=DATE:20141014 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121118Z +UID:efbbe042-a635-40ed-b744-ac3fabb4f663 +LAST-MODIFIED:20120806T121118Z +SUMMARY:Civic/Provincial Day (Many regions) +DTSTART;VALUE=DATE:20190805 +DTEND;VALUE=DATE:20190806 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111944Z +UID:2dce4b48-e02b-433f-a40e-9c5eff979188 +LAST-MODIFIED:20120806T111944Z +SUMMARY:Groundhog Day +DTSTART;VALUE=DATE:20150202 +DTEND;VALUE=DATE:20150203 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122832Z +UID:c9787413-b10a-4083-9e07-e4e7fd33d629 +LAST-MODIFIED:20120806T122832Z +SUMMARY:New Year's Eve +DTSTART;VALUE=DATE:20191231 +DTEND;VALUE=DATE:20200101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +DTSTAMP:20120117T215919Z +UID:58f2f5bb-3be9-43d5-998b-088c593dbc85 +LAST-MODIFIED:20120117T215919Z +SUMMARY:New Year's Day +DTSTART;TZID=America/Denver:20120101T081500 +DTEND;TZID=America/Denver:20120101T090500 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113920Z +UID:3ad74476-2205-4ef2-bcfc-ac819c847e4e +LAST-MODIFIED:20120806T113920Z +SUMMARY:St. Patrick's Day +DTSTART;VALUE=DATE:20180317 +DTEND;VALUE=DATE:20180318 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122842Z +UID:ccb85a68-8a72-46e2-8484-8f9a2fd5a612 +LAST-MODIFIED:20120806T122842Z +SUMMARY:New Year's Eve +DTSTART;VALUE=DATE:20201231 +DTEND;VALUE=DATE:20210101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121902Z +UID:309f836c-bfce-44ea-b99c-3f2621442023 +LAST-MODIFIED:20120806T121902Z +SUMMARY:Remembrance Day (Most regions) +DTSTART;VALUE=DATE:20141111 +DTEND;VALUE=DATE:20141112 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115102Z +UID:ebdf8843-ed81-4ec3-bfb7-16bbe430ec35 +LAST-MODIFIED:20120806T115102Z +SUMMARY:Vimy Ridge Day +DTSTART;VALUE=DATE:20170409 +DTEND;VALUE=DATE:20170410 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122714Z +UID:b7204428-ea95-41bb-b234-d31ff479d45d +LAST-MODIFIED:20120806T122714Z +SUMMARY:New Year's Eve +DTSTART;VALUE=DATE:20131231 +DTEND;VALUE=DATE:20140101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113516Z +UID:ff3c27d0-d4cc-43cf-9e62-a956d7d44d15 +SEQUENCE:1 +LAST-MODIFIED:20120806T113516Z +SUMMARY:Commonwealth Day +DTSTART;VALUE=DATE:20130311 +DTEND;VALUE=DATE:20130312 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111325Z +UID:08a8c90d-2d01-45f2-a5f6-583809dc0e32 +LAST-MODIFIED:20120806T111325Z +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20150101 +DTEND;VALUE=DATE:20150102 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120422Z +UID:be2c5fd4-1159-4c93-82c8-16d8e8d1ff03 +SEQUENCE:1 +LAST-MODIFIED:20120806T120422Z +SUMMARY:National Aboriginal Day +DTSTART;VALUE=DATE:20150621 +DTEND;VALUE=DATE:20150622 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114739Z +UID:60e4eb44-15e9-40ff-b2b7-8ce1abbc5ec1 +LAST-MODIFIED:20120806T114739Z +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20190422 +DTEND;VALUE=DATE:20190423 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +DTSTAMP:20120117T220622Z +UID:5663c847-3a29-492b-aeab-1d009852ad67 +LAST-MODIFIED:20120117T220622Z +SUMMARY:Halloween +DTSTART;VALUE=DATE:20121031 +DTEND;VALUE=DATE:20121101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121248Z +UID:62d83603-af10-4924-ac5c-3e34276b5c9c +LAST-MODIFIED:20120806T121248Z +SUMMARY:Labour Day (All) +DTSTART;VALUE=DATE:20150907 +DTEND;VALUE=DATE:20150908 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113253Z +UID:8e57f398-b33e-48a8-a1bd-10906f5099a9 +LAST-MODIFIED:20120806T113253Z +SUMMARY:Familiy Day (AL\, ON\, SK) +DTSTART;VALUE=DATE:20150216 +DTEND;VALUE=DATE:20150217 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111551Z +UID:cb87c0f5-fc52-4c04-92b9-c271531ad2b4 +LAST-MODIFIED:20120806T111551Z +SUMMARY:Epiphany +DTSTART;VALUE=DATE:20140106 +DTEND;VALUE=DATE:20140107 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121034Z +UID:0a561e63-1666-4522-9321-39103a0ca90d +LAST-MODIFIED:20120806T121034Z +SUMMARY:Civic/Provincial Day (Many regions) +DTSTART;VALUE=DATE:20160801 +DTEND;VALUE=DATE:20160802 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +X-MOZ-GENERATION:1 +DTSTAMP:20120117T220943Z +UID:4913c6ab-5332-4094-811a-f6060616fda3 +LAST-MODIFIED:20120117T220943Z +SUMMARY:Boxing Day (Most regions) +DTSTART;VALUE=DATE:20121226 +DTEND;VALUE=DATE:20121227 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +X-MOZ-GENERATION:2 +DTSTAMP:20120117T222159Z +UID:27bff647-69a4-4be8-9647-6dd1ad3b4d60 +LAST-MODIFIED:20120117T222159Z +SUMMARY:Remembrance Day (Most regions) +DTSTART;VALUE=DATE:20121111 +DTEND;VALUE=DATE:20121112 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121016Z +UID:1e044725-e348-4e33-af95-f28f0354baca +LAST-MODIFIED:20120806T121016Z +SUMMARY:Civic/Provincial Day (Many regions) +DTSTART;VALUE=DATE:20150803 +DTEND;VALUE=DATE:20150804 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113235Z +UID:e5733f72-8ec0-465f-9539-cd79f8f43b1e +LAST-MODIFIED:20120806T113235Z +SUMMARY:Familiy Day (AL\, ON\, SK) +DTSTART;VALUE=DATE:20140217 +DTEND;VALUE=DATE:20140218 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112753Z +UID:bc55bce5-c062-4143-8dd2-2026adce9b72 +LAST-MODIFIED:20120806T112753Z +SUMMARY:Valentine's Day +DTSTART;VALUE=DATE:20130214 +DTEND;VALUE=DATE:20130215 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114641Z +UID:5b2a608d-4de4-4e72-b8b5-3749dd63b30a +LAST-MODIFIED:20120806T114641Z +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20190421 +DTEND;VALUE=DATE:20190422 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111700Z +UID:90a7adab-3550-4076-83e0-55af716bd7ca +LAST-MODIFIED:20120806T111700Z +SUMMARY:Epiphany +DTSTART;VALUE=DATE:20180106 +DTEND;VALUE=DATE:20180107 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122615Z +UID:e7e75f01-cf09-4252-a733-1221d4a2b2cc +LAST-MODIFIED:20120806T122615Z +SUMMARY:Boxing Day (Most regions) +DTSTART;VALUE=DATE:20171226 +DTEND;VALUE=DATE:20171227 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +X-MOZ-GENERATION:1 +DTSTAMP:20120117T222205Z +UID:487d87a7-618f-4f07-bba2-9f472be8c836 +LAST-MODIFIED:20120117T222205Z +SUMMARY:Remembrance Day observed (Many regions) +DTSTART;VALUE=DATE:20121112 +DTEND;VALUE=DATE:20121113 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122356Z +UID:2c890d53-6f33-4567-8455-86ed18f48877 +LAST-MODIFIED:20120806T122356Z +SUMMARY:Christmas +DTSTART;VALUE=DATE:20141225 +DTEND;VALUE=DATE:20141226 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112035Z +UID:b8067f58-cfe4-4803-bfcf-ecd9f18a3477 +LAST-MODIFIED:20120806T112035Z +SUMMARY:Groundhog Day +DTSTART;VALUE=DATE:20190202 +DTEND;VALUE=DATE:20190203 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112023Z +UID:8e2537ca-9d3c-48fc-adf3-ecc4ac2308b5 +LAST-MODIFIED:20120806T112023Z +SUMMARY:Groundhog Day +DTSTART;VALUE=DATE:20180202 +DTEND;VALUE=DATE:20180203 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114929Z +UID:8f2b2190-a224-49ea-8a63-7607a3e54c2a +LAST-MODIFIED:20120806T114929Z +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113732Z +UID:779eb141-bec4-42b4-828a-fec6aca0328b +SEQUENCE:1 +LAST-MODIFIED:20120806T113732Z +SUMMARY:Commonwealth Day +DTSTART;VALUE=DATE:20200309 +DTEND;VALUE=DATE:20200310 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115344Z +UID:bdcf3107-2220-4a26-b0ae-0c3a8a6076ca +LAST-MODIFIED:20120806T115344Z +SUMMARY:Victoria Day (Most regions) +DTSTART;VALUE=DATE:20130520 +DTEND;VALUE=DATE:20130521 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111442Z +UID:4031b73c-247a-4fd4-8d92-8fc9817d58c1 +LAST-MODIFIED:20120806T111442Z +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20200101 +DTEND;VALUE=DATE:20200102 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122428Z +UID:e86fd5df-a3a8-438e-980a-b79203d31181 +LAST-MODIFIED:20120806T122428Z +SUMMARY:Christmas +DTSTART;VALUE=DATE:20171225 +DTEND;VALUE=DATE:20171226 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +DTSTAMP:20120117T220232Z +UID:00c93d5e-4c1a-45b0-a4f5-3a60b4ba865b +LAST-MODIFIED:20120117T220232Z +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120740Z +UID:d5877ba9-4bd0-42f4-9983-6d9437034888 +LAST-MODIFIED:20120806T120740Z +SUMMARY:Canada Day +DTSTART;VALUE=DATE:20190701 +DTEND;VALUE=DATE:20190702 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122544Z +UID:c43f51f5-60e7-4a03-8e1c-962ba973e411 +LAST-MODIFIED:20120806T122544Z +SUMMARY:Boxing Day (Most regions) +DTSTART;VALUE=DATE:20141226 +DTEND;VALUE=DATE:20141227 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120750Z +UID:d7dae22b-d072-4498-9b3b-6df8a376141a +LAST-MODIFIED:20120806T120750Z +SUMMARY:Canada Day +DTSTART;VALUE=DATE:20200701 +DTEND;VALUE=DATE:20200702 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120857Z +UID:56c6d990-3818-449d-8ccc-8e4fbc5c20af +SEQUENCE:1 +LAST-MODIFIED:20120806T120857Z +SUMMARY:Canada Day (additional) +DTSTART;VALUE=DATE:20170703 +DTEND;VALUE=DATE:20170704 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121740Z +UID:61c81c44-7f53-4052-bcc4-02e7999a68c6 +LAST-MODIFIED:20120806T121740Z +SUMMARY:Halloween +DTSTART;VALUE=DATE:20171031 +DTEND;VALUE=DATE:20171101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115430Z +UID:5cd46495-0f2a-4b44-b9a1-428b59eb7fc3 +LAST-MODIFIED:20120806T115430Z +SUMMARY:Victoria Day (Most regions) +DTSTART;VALUE=DATE:20150518 +DTEND;VALUE=DATE:20150519 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120519Z +UID:269e25f1-bdf9-497a-8efc-e58d444c4bc7 +LAST-MODIFIED:20120806T120519Z +SUMMARY:National Aboriginal Day +DTSTART;VALUE=DATE:20190621 +DTEND;VALUE=DATE:20190622 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112956Z +UID:70b22ae5-ecb7-4052-a260-bb723ebdf46e +LAST-MODIFIED:20120806T112956Z +SUMMARY:Valentine's Day +DTSTART;VALUE=DATE:20200214 +DTEND;VALUE=DATE:20200215 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113427Z +UID:5b3c08fc-4f6a-4b12-9f16-9d6d777b28db +LAST-MODIFIED:20120806T113427Z +SUMMARY:Familiy Day (AL\, ON\, SK) +DTSTART;VALUE=DATE:20200217 +DTEND;VALUE=DATE:20200218 +TRANSP:OPAQUE +BEGIN:VALARM +DESCRIPTION: +X-KDE-KCALCORE-ENABLED:TRUE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111227Z +UID:c3cb86d3-296d-44cd-ad23-3bab82bb1c05 +SEQUENCE:1 +LAST-MODIFIED:20120806T111227Z +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20130101 +DTEND;VALUE=DATE:20130102 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114832Z +UID:96d94a48-0ea6-4a60-9060-c4d63b9e6cb1 +LAST-MODIFIED:20120806T114832Z +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20160328 +DTEND;VALUE=DATE:20160329 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114611Z +UID:37b0cdbe-e475-454c-b5a0-d5ad3c6f3235 +LAST-MODIFIED:20120806T114611Z +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115529Z +UID:aaeb1072-d22b-42d5-ae05-74a37d14c72a +LAST-MODIFIED:20120806T115529Z +SUMMARY:Victoria Day (Most regions) +DTSTART;VALUE=DATE:20180521 +DTEND;VALUE=DATE:20180522 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +X-MOZ-GENERATION:1 +DTSTAMP:20120117T222220Z +UID:696de927-4e80-4d07-a283-550f51ec324e +LAST-MODIFIED:20120117T222220Z +SUMMARY:Anniversary of the Statute of Westminster +DTSTART;VALUE=DATE:20121211 +DTEND;VALUE=DATE:20121212 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120117T220156Z +UID:d35c66b7-cc8f-4fa8-b980-eae06732a679 +SEQUENCE:2 +LAST-MODIFIED:20120117T220156Z +SUMMARY:St. Patrick's Day +DTSTART;VALUE=DATE:20120317 +DTEND;VALUE=DATE:20120318 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121340Z +UID:3a123d9f-96a3-4c16-8e1a-ed33bb36d780 +LAST-MODIFIED:20120806T121340Z +SUMMARY:Labour Day (All) +DTSTART;VALUE=DATE:20190902 +DTEND;VALUE=DATE:20190903 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +X-MOZ-GENERATION:1 +DTSTAMP:20120117T222135Z +UID:e2bc628c-79da-4f09-bfbb-b1d1ea9ca79f +LAST-MODIFIED:20120117T222135Z +SUMMARY:Labour Day (All) +DTSTART;VALUE=DATE:20120903 +DTEND;VALUE=DATE:20120904 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113832Z +UID:8b80b385-6de5-4679-82ea-65a8668df02f +LAST-MODIFIED:20120806T113832Z +SUMMARY:St. Patrick's Day +DTSTART;VALUE=DATE:20140317 +DTEND;VALUE=DATE:20140318 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120117T220007Z +UID:112cd226-2600-48d3-b5e8-55ab497c7a10 +SEQUENCE:2 +LAST-MODIFIED:20120117T220007Z +SUMMARY:Groundhog Day +DTSTART;VALUE=DATE:20120202 +DTEND;VALUE=DATE:20120203 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111817Z +UID:9d5d5862-d4ed-4673-b877-20fed4ef6598 +LAST-MODIFIED:20120806T111817Z +SUMMARY:Groundhog Day +DTSTART;VALUE=DATE:20130202 +DTEND;VALUE=DATE:20130203 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122809Z +UID:a2c9e44c-073c-4a6d-a209-696ef200d7ea +LAST-MODIFIED:20120806T122809Z +SUMMARY:New Year's Eve +DTSTART;VALUE=DATE:20171231 +DTEND;VALUE=DATE:20180101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121315Z +UID:d2699e03-7f9a-43f1-9795-eb4aa8ce0924 +LAST-MODIFIED:20120806T121315Z +SUMMARY:Labour Day (All) +DTSTART;VALUE=DATE:20170904 +DTEND;VALUE=DATE:20170905 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122204Z +UID:755afe18-5274-4bcb-a0b8-afdb3e9ef4b6 +LAST-MODIFIED:20120806T122204Z +SUMMARY:Anniversary of the Statute of Westminster +DTSTART;VALUE=DATE:20141211 +DTEND;VALUE=DATE:20141212 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111954Z +UID:33cabd1a-9d94-4126-a296-26d7c166ccf8 +LAST-MODIFIED:20120806T111954Z +SUMMARY:Groundhog Day +DTSTART;VALUE=DATE:20160202 +DTEND;VALUE=DATE:20160203 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122346Z +UID:a0ad80d7-4cd0-40bd-ae81-44e0631a3fb6 +LAST-MODIFIED:20120806T122346Z +SUMMARY:Christmas +DTSTART;VALUE=DATE:20131225 +DTEND;VALUE=DATE:20131226 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZX-MOZ-GENERATION:1 +DTSTAMP:20120117T221850Z +UID:31cc39a6-9b41-4a5f-9fd2-f5c43ad686fb +SEQUENCE:2 +LAST-MODIFIED:20120117T221850Z +SUMMARY:Family Day (AB\, ON\, SK) +DTSTART;VALUE=DATE:20120220 +DTEND;VALUE=DATE:20120221 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113344Z +UID:d73973f7-f7ec-40fb-ad66-50cd1e5d75cc +LAST-MODIFIED:20120806T113344Z +SUMMARY:Familiy Day (AL\, ON\, SK) +DTSTART;VALUE=DATE:20180219 +DTEND;VALUE=DATE:20180220 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +DTSTAMP:20120117T220905Z +UID:ab6e8de1-e4cd-46c2-a031-5e030d7d56d2 +LAST-MODIFIED:20120117T220905Z +SUMMARY:Christmas Eve +DTSTART;VALUE=DATE:20121224 +DTEND;VALUE=DATE:20121225 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +DTSTAMP:20120117T220917Z +UID:6a7de4c3-bb70-477c-91b8-5d780c19d4ca +LAST-MODIFIED:20120117T220917Z +SUMMARY:Christmas +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +DTSTAMP:20120117T221003Z +UID:43bc10df-bd29-4f2b-aa0f-c6cc8cf3839f +LAST-MODIFIED:20120117T221003Z +SUMMARY:New Year's Eve +DTSTART;VALUE=DATE:20121231 +DTEND;VALUE=DATE:20130101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120944Z +UID:678f8308-dfe4-4c6a-8cd0-2835b3a78831 +LAST-MODIFIED:20120806T120944Z +SUMMARY:Civic/Provincial Day (Many regions) +DTSTART;VALUE=DATE:20130805 +DTEND;VALUE=DATE:20130806 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120117T221734Z +UID:a51d1d54-72c6-4fe7-8080-bb78b3ab0c09 +SEQUENCE:2 +LAST-MODIFIED:20120117T221734Z +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20120101 +DTEND;VALUE=DATE:20120102 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112946Z +UID:6d1b6b67-3048-46ec-9739-35c7bef5fb52 +LAST-MODIFIED:20120806T112946Z +SUMMARY:Valentine's Day +DTSTART;VALUE=DATE:20190214 +DTEND;VALUE=DATE:20190215 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114326Z +UID:0d13bec4-08a3-4606-a2ca-0a3b2c925c01 +LAST-MODIFIED:20120806T114326Z +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20190419 +DTEND;VALUE=DATE:20190420 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115016Z +UID:459931fe-5fc7-4fa0-a7db-70d359159778 +LAST-MODIFIED:20120806T115016Z +SUMMARY:Vimy Ridge Day +DTSTART;VALUE=DATE:20130409 +DTEND;VALUE=DATE:20130410 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222Z +X-MOZ-GENERATION:1 +DTSTAMP:20120117T221951Z +UID:722dc2f8-c0c8-457b-902c-30e94aee23bb +LAST-MODIFIED:20120117T221951Z +SUMMARY:Victoria Day (Most regions) +DTSTART;VALUE=DATE:20120521 +DTEND;VALUE=DATE:20120522 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122227Z +UID:b3e8f3e9-4d3a-4750-8135-4514ba963b95 +LAST-MODIFIED:20120806T122227Z +SUMMARY:Anniversary of the Statute of Westminster +DTSTART;VALUE=DATE:20161211 +DTEND;VALUE=DATE:20161212 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZX-MOZ-GENERATION:1 +DTSTAMP:20120117T222004Z +UID:f782fb4f-7d96-425c-ae58-839d0f8a9283 +SEQUENCE:2 +LAST-MODIFIED:20120117T222004Z +SUMMARY:National Aboriginal Day +DTSTART;VALUE=DATE:20120621 +DTEND;VALUE=DATE:20120622 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114545Z +UID:2b132a4c-e6fd-4076-b494-69d4b6a3cf53 +LAST-MODIFIED:20120806T114545Z +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115502Z +UID:fb4e32a5-3312-4143-816f-07c1011712db +LAST-MODIFIED:20120806T115502Z +SUMMARY:Victoria Day (Most regions) +DTSTART;VALUE=DATE:20170522 +DTEND;VALUE=DATE:20170523 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122216Z +UID:a0b803cc-6e68-4ee4-8c31-1df355afb1b2 +LAST-MODIFIED:20120806T122216Z +SUMMARY:Anniversary of the Statute of Westminster +DTSTART;VALUE=DATE:20151211 +DTEND;VALUE=DATE:20151212 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113719Z +UID:3a0a2d57-917a-443c-9a96-d7bbb0f718d2 +LAST-MODIFIED:20120806T113719Z +SUMMARY:Commonwealth Day +DTSTART;VALUE=DATE:20190311 +DTEND;VALUE=DATE:20190312 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120729Z +UID:c636e02b-d9ae-44cd-82f8-25f904047ad9 +LAST-MODIFIED:20120806T120729Z +SUMMARY:Canada Day +DTSTART;VALUE=DATE:20180701 +DTEND;VALUE=DATE:20180702 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112805Z +UID:d08c9cb4-f28e-4ea3-b9ed-c7c8e44cd7ff +SEQUENCE:1 +LAST-MODIFIED:20120806T112805Z +SUMMARY:Valentine's Day +DTSTART;VALUE=DATE:20140214 +DTEND;VALUE=DATE:20140215 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121511Z +UID:85516741-125a-4e23-9718-e8a97c3632c0 +LAST-MODIFIED:20120806T121511Z +SUMMARY:Thanksgiving Day (All) +DTSTART;VALUE=DATE:20161010 +DTEND;VALUE=DATE:20161011 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115600Z +UID:56062369-252e-47e8-ad7a-c85289573a07 +LAST-MODIFIED:20120806T115600Z +SUMMARY:Victoria Day (Most regions) +DTSTART;VALUE=DATE:20200518 +DTEND;VALUE=DATE:20200519 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113331Z +UID:183e81ef-4c62-46b2-b9e5-945a2a72bd5d +LAST-MODIFIED:20120806T113331Z +SUMMARY:Familiy Day (AL\, ON\, SK) +DTSTART;VALUE=DATE:20170220 +DTEND;VALUE=DATE:20170221 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121548Z +UID:af10260b-a8ee-42fc-b75e-1ee1fbbb4066 +SEQUENCE:1 +LAST-MODIFIED:20120806T121548Z +SUMMARY:Thanksgiving Day (All) +DTSTART;VALUE=DATE:20191014 +DTEND;VALUE=DATE:20191015 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114629Z +UID:355c9356-2d43-4f5b-9536-037b3e698c85 +LAST-MODIFIED:20120806T114629Z +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20180401 +DTEND;VALUE=DATE:20180402 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121259Z +UID:7410f9c5-f817-40f8-93e5-605b19eab151 +LAST-MODIFIED:20120806T121259Z +SUMMARY:Labour Day (All) +DTSTART;VALUE=DATE:20160905 +DTEND;VALUE=DATE:20160906 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112936Z +UID:0d4aa9ea-5dce-477e-9ae0-32b557888d13 +LAST-MODIFIED:20120806T112936Z +SUMMARY:Valentine's Day +DTSTART;VALUE=DATE:20180214 +DTEND;VALUE=DATE:20180215 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121002Z +UID:8a077cec-fd98-4d87-ae8c-8529a3a4668a +LAST-MODIFIED:20120806T121002Z +SUMMARY:Civic/Provincial Day (Many regions) +DTSTART;VALUE=DATE:20140804 +DTEND;VALUE=DATE:20140805 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114445Z +UID:89dae081-ad42-40fe-8f88-9c29f7265030 +LAST-MODIFIED:20120806T114445Z +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111431Z +UID:61a5a6b9-152e-42d6-aee3-f0e314bf3045 +LAST-MODIFIED:20120806T111431Z +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20190101 +DTEND;VALUE=DATE:20190102 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T115446Z +UID:977806c8-62e4-4f0c-b766-2a55caf50e5e +LAST-MODIFIED:20120806T115446Z +SUMMARY:Victoria Day (Most regions) +DTSTART;VALUE=DATE:20160523 +DTEND;VALUE=DATE:20160524 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114758Z +UID:6331f30a-e396-4b7b-9d3f-b0263d3a1268 +LAST-MODIFIED:20120806T114758Z +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20180402 +DTEND;VALUE=DATE:20180403 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121705Z +UID:4ff68533-ca4d-483a-a215-a1c6f479c998 +LAST-MODIFIED:20120806T121705Z +SUMMARY:Halloween +DTSTART;VALUE=DATE:20141031 +DTEND;VALUE=DATE:20141101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121327Z +UID:e1df04ae-e20b-4de0-aa0a-1ab86ba93e0e +LAST-MODIFIED:20120806T121327Z +SUMMARY:Labour Day (All) +DTSTART;VALUE=DATE:20180903 +DTEND;VALUE=DATE:20180904 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122732Z +UID:07fb190a-db81-4d2d-a6f6-e661509958d2 +LAST-MODIFIED:20120806T122732Z +SUMMARY:New Year's Eve +DTSTART;VALUE=DATE:20141231 +DTEND;VALUE=DATE:20150101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113539Z +UID:0e57d242-5702-46ac-a8d2-0ebae7f1a5c4 +LAST-MODIFIED:20120806T113539Z +SUMMARY:Commonwealth Day +DTSTART;VALUE=DATE:20140310 +DTEND;VALUE=DATE:20140311 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T114128Z +UID:3a0ea361-6c05-42dc-9015-04324522c0e2 +LAST-MODIFIED:20120806T114128Z +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T111931Z +UID:ffe6d828-6eab-439e-b637-bb573ca759d8 +LAST-MODIFIED:20120806T111931Z +SUMMARY:Groundhog Day +DTSTART;VALUE=DATE:20140202 +DTEND;VALUE=DATE:20140203 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122534Z +UID:5657746b-69d6-493e-a314-069599781a7a +LAST-MODIFIED:20120806T122534Z +SUMMARY:Boxing Day (Most regions) +DTSTART;VALUE=DATE:20131226 +DTEND;VALUE=DATE:20131227 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121806Z +UID:0ce3099a-974b-4a96-ab48-3ae573fe018b +LAST-MODIFIED:20120806T121806Z +SUMMARY:Halloween +DTSTART;VALUE=DATE:20191031 +DTEND;VALUE=DATE:20191101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T113907Z +UID:961d0225-09d5-4226-b670-90f7c213d104 +LAST-MODIFIED:20120806T113907Z +SUMMARY:St. Patrick's Day +DTSTART;VALUE=DATE:20170317 +DTEND;VALUE=DATE:20170318 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122643Z +UID:0fe42fdf-c342-4104-83d2-fd004eda8090 +LAST-MODIFIED:20120806T122643Z +SUMMARY:Boxing Day (Most regions) +DTSTART;VALUE=DATE:20201226 +DTEND;VALUE=DATE:20201227 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121853Z +UID:9b1d8049-74a9-46b6-8626-1f0c5321d5e1 +LAST-MODIFIED:20120806T121853Z +SUMMARY:Remembrance Day (Most regions) +DTSTART;VALUE=DATE:20131111 +DTEND;VALUE=DATE:20131112 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T120708Z +UID:7be0d920-f2c3-4eb5-a977-4ebe75bf1a13 +LAST-MODIFIED:20120806T120708Z +SUMMARY:Canada Day +DTSTART;VALUE=DATE:20160701 +DTEND;VALUE=DATE:20160702 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121524Z +UID:cf27d4de-7658-4d2b-940d-c7787d1ab418 +LAST-MODIFIED:20120806T121524Z +SUMMARY:Thanksgiving Day (All) +DTSTART;VALUE=DATE:20171009 +DTEND;VALUE=DATE:20171010 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T122742Z +UID:fa9a2782-92de-465b-9a98-91c16127f289 +LAST-MODIFIED:20120806T122742Z +SUMMARY:New Year's Eve +DTSTART;VALUE=DATE:20151231 +DTEND;VALUE=DATE:20160101 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T112651Z +UID:eb5348e9-4804-447a-8fcf-b0ace3a4498e +LAST-MODIFIED:20120806T112651Z +SUMMARY:Familiy Day (BC) +DTSTART;VALUE=DATE:20180212 +DTEND;VALUE=DATE:20180213 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20120806T123222ZDTSTAMP:20120806T121950Z +UID:fb3c7843-5278-4528-9188-7439c89522ce +LAST-MODIFIED:20120806T121950Z +SUMMARY:Remembrance Day (Most regions) +DTSTART;VALUE=DATE:20191111 +DTEND;VALUE=DATE:20191112 +TRANSP:OPAQUE +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/CatalanHolidays.ics b/media/caldata/CatalanHolidays.ics new file mode 100644 index 00000000000..1cfc93a5e9f --- /dev/null +++ b/media/caldata/CatalanHolidays.ics @@ -0,0 +1,723 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20090120T170238Z +LAST-MODIFIED:20090120T175851Z +DTSTAMP:20090120T170238Z +UID:f9bb9245-c511-4d52-83db-54da67156b55 +SUMMARY:Armistici 1918 +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20091111 +DTEND;VALUE=DATE:20091112 +LOCATION:Catalunya Nord +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T170221Z +LAST-MODIFIED:20090120T175903Z +DTSTAMP:20090120T170221Z +UID:6ad4e2f6-02d2-4296-9e6e-03a6022ff0e8 +SUMMARY:Armistici 1918 +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20081111 +DTEND;VALUE=DATE:20081112 +LOCATION:Catalunya Nord +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T175021Z +LAST-MODIFIED:20090120T175937Z +DTSTAMP:20090120T175021Z +UID:46ab5866-4730-4efb-814d-81f84ef26a87 +SUMMARY:Ascensió +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090521 +DTEND;VALUE=DATE:20090522 +LOCATION:Catalunya Nord +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T162239Z +LAST-MODIFIED:20090120T175949Z +DTSTAMP:20090120T162239Z +UID:48a6bf3c-5189-4fac-a042-ad53d9dd800f +SUMMARY:Cap d'Any +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T162144Z +LAST-MODIFIED:20090120T180001Z +DTSTAMP:20090120T162144Z +UID:70e438e6-fc03-4e06-ac91-542f62506d3c +SUMMARY:Cap d'Any +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080101 +DTEND;VALUE=DATE:20080102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T164318Z +LAST-MODIFIED:20090120T180016Z +DTSTAMP:20090120T164318Z +UID:d1c36d23-90eb-4494-989d-80ac0a435974 +SUMMARY:Capitulació d'Alemanya el 1945 +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080508 +DTEND;VALUE=DATE:20080509 +LOCATION:Catalunya Nord +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T164428Z +LAST-MODIFIED:20090120T180043Z +DTSTAMP:20090120T164428Z +UID:2d090a97-1cb0-4345-b92b-0fa1ca30c94f +SUMMARY:Capitulació d'Alemanya el 1945 +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090508 +DTEND;VALUE=DATE:20090509 +LOCATION:Catalunya Nord +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T162715Z +LAST-MODIFIED:20090120T180057Z +DTSTAMP:20090120T162715Z +UID:8fb39ca7-e412-45b2-b91c-ef2a9830547f +SUMMARY:Carnestoltes +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080204 +DTEND;VALUE=DATE:20080205 +LOCATION:Andorra +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T162647Z +LAST-MODIFIED:20090120T180108Z +DTSTAMP:20090120T162647Z +UID:3ba7e9c2-34d6-4275-b709-1e70cd283c76 +SUMMARY:Carnestoltes +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090204 +DTEND;VALUE=DATE:20090205 +LOCATION:Andorra +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T165326Z +LAST-MODIFIED:20090120T180120Z +DTSTAMP:20090120T165326Z +UID:d87fd71c-7c5f-4141-bf0c-7eda01d034f6 +SUMMARY:Diada de Catalunya +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090911 +DTEND;VALUE=DATE:20090912 +LOCATION:Catalunya +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T165432Z +LAST-MODIFIED:20090120T180134Z +DTSTAMP:20090120T165432Z +UID:1dc15da6-b4a7-45cf-a6e7-7e0029258fd0 +SUMMARY:Diada de Catalunya +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080911 +DTEND;VALUE=DATE:20080912 +LOCATION:Catalunya +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T164649Z +LAST-MODIFIED:20090120T180152Z +DTSTAMP:20090120T164649Z +UID:2b16e034-bd41-42a7-8bb0-a6c60f0b4133 +SUMMARY:Diada de la Vall d'Aran +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080617 +DTEND;VALUE=DATE:20080618 +LOCATION:Vall d'Aran +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T164555Z +LAST-MODIFIED:20090120T180204Z +DTSTAMP:20090120T164555Z +UID:6149f69f-d23b-467c-afe4-c9838c4a7346 +SUMMARY:Diada de la Vall d'Aran +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090617 +DTEND;VALUE=DATE:20090618 +LOCATION:Vall d'Aran +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T165532Z +LAST-MODIFIED:20090120T180222Z +DTSTAMP:20090120T165532Z +UID:cfeab4de-5082-4ced-90ad-4a51b7015117 +SUMMARY:Diada del País Valencià +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20091009 +DTEND;VALUE=DATE:20091010 +LOCATION:País Valencià +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T165556Z +LAST-MODIFIED:20090120T180247Z +DTSTAMP:20090120T165556Z +UID:95ecb07d-3bb6-44e6-af6a-bd3c42018d9d +SUMMARY:Diada del País Valencià +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20081009 +DTEND;VALUE=DATE:20081010 +LOCATION:País Valencià +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T162933Z +LAST-MODIFIED:20090120T180259Z +DTSTAMP:20090120T162933Z +UID:f8a5e579-2991-4633-8a60-841bcba56167 +SUMMARY:Dia de la constitució andorrana +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080314 +DTEND;VALUE=DATE:20080315 +LOCATION:Andorra +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T162959Z +LAST-MODIFIED:20090120T180312Z +DTSTAMP:20090120T162959Z +UID:44c3dfa4-078b-4760-bfd7-758ea50f232b +SUMMARY:Dia de la constitució andorrana +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090314 +DTEND;VALUE=DATE:20090315 +LOCATION:Andorra +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T170312Z +LAST-MODIFIED:20090120T180327Z +DTSTAMP:20090120T170312Z +UID:ad1b5fc4-26a7-4e4e-b916-3d5f88fc00b5 +SUMMARY:Dia de la constitució espanyola +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20081206 +DTEND;VALUE=DATE:20081207 +LOCATION:La Franja\, Catalunya\, País Valencià\, Illes Balears +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T162753Z +LAST-MODIFIED:20090120T180342Z +DTSTAMP:20090120T162753Z +UID:40ef7e93-07cd-410e-9945-e4e85cbc32a7 +SUMMARY:Dia de les Illes +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080301 +DTEND;VALUE=DATE:20080302 +LOCATION:Illes Balears +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T163454Z +LAST-MODIFIED:20090120T180358Z +DTSTAMP:20090120T163454Z +UID:20d290dd-2427-48ec-947d-63d22548f8e4 +SUMMARY:Dia del Treball +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080501 +DTEND;VALUE=DATE:20080502 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T163509Z +LAST-MODIFIED:20090120T180413Z +DTSTAMP:20090120T163509Z +UID:0200711c-cad9-4304-8a08-1a157f3c9d29 +SUMMARY:Dia del Treball +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T163856Z +LAST-MODIFIED:20090120T180426Z +DTSTAMP:20090120T163856Z +UID:9b3b35ec-9dad-442c-8df0-7885a3c7b2ab +SUMMARY:Dijous Sant +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080320 +DTEND;VALUE=DATE:20080321 +LOCATION:La Franja\, País Valencià\, Illes Balears +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T170852Z +LAST-MODIFIED:20090120T180438Z +DTSTAMP:20090120T170852Z +UID:5443c8d0-5492-4e8d-846c-5b066f44417d +SUMMARY:Dijous Sant +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090409 +DTEND;VALUE=DATE:20090410 +LOCATION:La Franja\, País Valencià\, Illes Balears +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T164153Z +LAST-MODIFIED:20090120T180453Z +DTSTAMP:20090120T164153Z +UID:9a8008f1-3b7a-437a-a938-57c8e0e210fa +SUMMARY:Dilluns de Pasqua +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080324 +DTEND;VALUE=DATE:20080325 +LOCATION:Catalunya Nord\, Andorra\, País Valencià\, Catalunya +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T174755Z +LAST-MODIFIED:20090120T180508Z +DTSTAMP:20090120T174755Z +UID:34205bba-b2eb-48e7-8d08-c2238cd426c6 +SUMMARY:Dilluns de Pasqua +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +TRANSP:TRANSPARENT +LOCATION:Catalunya Nord\, Andorra\, País Valencià\, Catalunya +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T171657Z +LAST-MODIFIED:20090120T180522Z +DTSTAMP:20090120T171657Z +UID:87d48ede-66cf-4199-bf5e-489b24b2f955 +SUMMARY:Dilluns de Pentecosta +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090601 +DTEND;VALUE=DATE:20090602 +LOCATION:Catalunya Nord\, Andorra +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T171824Z +LAST-MODIFIED:20090120T180536Z +DTSTAMP:20090120T171824Z +UID:02ed6a8b-ce41-45dc-ba24-3c2d60896900 +SUMMARY:Dilluns de Pentecosta +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080512 +DTEND;VALUE=DATE:20080513 +LOCATION:Catalunya Nord\, Andorra +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T172522Z +LAST-MODIFIED:20090120T180548Z +DTSTAMP:20090120T172522Z +UID:89310055-c592-464e-8357-e973dfea815e +SUMMARY:Dilluns següent al dia de la constitució espanyola +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20091207 +DTEND;VALUE=DATE:20091208 +TRANSP:TRANSPARENT +LOCATION:La Franja\, Illes Balears +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T172025Z +LAST-MODIFIED:20090120T180600Z +DTSTAMP:20090120T172025Z +UID:eb416279-56f3-4902-8255-58bc10308462 +SUMMARY:Dilluns següent al Pilar +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20081013 +DTEND;VALUE=DATE:20081014 +LOCATION:La Franja\, Illes Balears +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T165956Z +LAST-MODIFIED:20090120T180616Z +DTSTAMP:20090120T165956Z +UID:1ac4c560-e99a-4281-8c93-14195f6e445e +SUMMARY:Dilluns següent a Tots Sants +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20091102 +DTEND;VALUE=DATE:20091103 +LOCATION:La Franja +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T170139Z +LAST-MODIFIED:20090120T180627Z +DTSTAMP:20090120T170139Z +UID:bfe08a17-0933-4078-9198-5ced524822d7 +SUMMARY:Dilluns següent a Tots Sants +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20081103 +DTEND;VALUE=DATE:20081104 +LOCATION:La Franja +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T165834Z +LAST-MODIFIED:20090120T180645Z +DTSTAMP:20090120T165834Z +UID:fd0ee63d-455c-4f33-9445-d45addb3da84 +SUMMARY:Tots Sants +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20081101 +DTEND;VALUE=DATE:20081102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T164715Z +LAST-MODIFIED:20090120T180658Z +DTSTAMP:20090120T164715Z +UID:433f9df7-57eb-4e5e-bb9e-d08af4911e6e +SUMMARY:Sant Joan +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080624 +DTEND;VALUE=DATE:20080625 +LOCATION:Catalunya +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T164735Z +LAST-MODIFIED:20090120T180725Z +DTSTAMP:20090120T164735Z +UID:eb494dd2-5e2f-44b1-9430-0cc58900e9a5 +SUMMARY:Sant Joan +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090624 +DTEND;VALUE=DATE:20090625 +LOCATION:Catalunya +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T163332Z +LAST-MODIFIED:20090120T180735Z +DTSTAMP:20090120T163332Z +UID:c6b8604d-0162-4cdc-81ab-d72aff3a2ed9 +SUMMARY:Sant Jordi +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080423 +DTEND;VALUE=DATE:20080424 +LOCATION:La Franja +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T163355Z +LAST-MODIFIED:20090120T180748Z +DTSTAMP:20090120T163355Z +UID:4d12b428-e69b-429f-bf04-21d4f872119f +SUMMARY:Sant Jordi +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090423 +DTEND;VALUE=DATE:20090424 +LOCATION:La Franja +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T163102Z +LAST-MODIFIED:20090120T180800Z +DTSTAMP:20090120T163102Z +UID:5ec45fc9-d990-475d-b239-d82cfd023d7d +SUMMARY:Sant Josep +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090319 +DTEND;VALUE=DATE:20090320 +LOCATION:País Valencià +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T163042Z +LAST-MODIFIED:20090120T180811Z +DTSTAMP:20090120T163042Z +UID:49642b3e-e6ef-486f-a89e-726320657514 +SUMMARY:Sant Josep +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080319 +DTEND;VALUE=DATE:20080320 +LOCATION:País Valencià +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T170741Z +LAST-MODIFIED:20090120T180826Z +DTSTAMP:20090120T170741Z +UID:392d1b65-2873-429c-821b-b2ecef762754 +SUMMARY:Sant Esteve +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +LOCATION:Andorra\, Catalunya\, Illes Balears +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T170708Z +LAST-MODIFIED:20090120T180838Z +DTSTAMP:20090120T170708Z +UID:e78f1a81-6b7b-46b6-bfb6-03ffb85899b5 +SUMMARY:Sant Esteve +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20081226 +DTEND;VALUE=DATE:20081227 +LOCATION:Andorra\, Catalunya\, Illes Balears +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T165002Z +LAST-MODIFIED:20090120T180848Z +DTSTAMP:20090120T165002Z +UID:9626a417-0a91-4616-8643-f443ab158d0c +SUMMARY:Sant Jaume +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090725 +DTEND;VALUE=DATE:20090726 +LOCATION:Illes Balears +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T164931Z +LAST-MODIFIED:20090120T180901Z +DTSTAMP:20090120T164931Z +UID:70d5bea0-d98b-402c-9d15-8482f6d234a6 +SUMMARY:Sant Jaume +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080725 +DTEND;VALUE=DATE:20080726 +LOCATION:Illes Balears +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T164848Z +LAST-MODIFIED:20090120T202522Z +DTSTAMP:20090120T164848Z +UID:2ac9d0f5-7930-4575-ac86-475b7aba0f01 +SUMMARY:Presa de la Bastilla el 1789 +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090714 +DTEND;VALUE=DATE:20090715 +LOCATION:Catalunya Nord +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T171027Z +LAST-MODIFIED:20090120T202552Z +DTSTAMP:20090120T171027Z +UID:3f6246c1-850d-47d1-804e-a5e6ac688b41 +SUMMARY:Divendres Sant +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +LOCATION:Catalunya\, La Franja\, País Valencià\, Illes Balears\, Andorra +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T165049Z +LAST-MODIFIED:20090120T202605Z +DTSTAMP:20090120T165049Z +UID:c270fee9-b3b9-4aa2-8500-957705aef74e +SUMMARY:Mare de Déu d'Agost +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080815 +DTEND;VALUE=DATE:20080816 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T170514Z +LAST-MODIFIED:20090120T202615Z +DTSTAMP:20090120T170514Z +UID:f7074ebc-8be5-4069-b2f4-82afc85c07f1 +SUMMARY:Immaculada Concepció +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20091208 +DTEND;VALUE=DATE:20091209 +LOCATION:Andorra\, La Franja\, Catalunya\, País Valencià\, Illes Balears +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T170628Z +LAST-MODIFIED:20090120T202627Z +DTSTAMP:20090120T170628Z +UID:85d3508e-0eab-40e8-99f7-0006792ebeb0 +SUMMARY:Nadal +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20081225 +DTEND;VALUE=DATE:20081226 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T165656Z +LAST-MODIFIED:20090120T202640Z +DTSTAMP:20090120T165656Z +UID:bf1bef81-79b1-4d32-bc68-a44b296fb674 +SUMMARY:Mare de Déu del Pilar +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20091012 +DTEND;VALUE=DATE:20091013 +LOCATION:La Franja\, Catalunya\, País Valencia\, Illes Balears +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T170443Z +LAST-MODIFIED:20090120T202652Z +DTSTAMP:20090120T170443Z +UID:cef09b6f-0ee2-4437-a8d1-767b884a9b9a +SUMMARY:Immaculada Concepció +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20081208 +DTEND;VALUE=DATE:20081209 +LOCATION:Andorra\, La Franja\, Catalunya\, País Valencià\, Illes Balears +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T165227Z +LAST-MODIFIED:20090120T202703Z +DTSTAMP:20090120T165227Z +UID:a7d14b23-5841-46ef-9a28-70b8b514ab9a +SUMMARY:Mare de Déu de Meritxell +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090908 +DTEND;VALUE=DATE:20090909 +LOCATION:Andorra +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T165159Z +LAST-MODIFIED:20090120T202713Z +DTSTAMP:20090120T165159Z +UID:fbcc08fd-933f-4505-a70d-d352aa388cf4 +SUMMARY:Mare de Déu de Meritxell +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080908 +DTEND;VALUE=DATE:20080909 +LOCATION:Andorra +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T164815Z +LAST-MODIFIED:20090120T202723Z +DTSTAMP:20090120T164815Z +UID:5b81d59e-324e-4690-9150-8a968c5af71a +SUMMARY:Presa de la Bastilla el 1789 +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080714 +DTEND;VALUE=DATE:20080715 +LOCATION:Catalunya Nord +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T165113Z +LAST-MODIFIED:20090120T202735Z +DTSTAMP:20090120T165113Z +UID:efb2fe0c-68ac-4a10-86af-f8f8ef41e016 +SUMMARY:Mare de Déu d'Agost +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090815 +DTEND;VALUE=DATE:20090816 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T162415Z +LAST-MODIFIED:20090120T202745Z +DTSTAMP:20090120T162415Z +UID:15b8897e-279d-4957-9f2b-6919584a7b31 +SUMMARY:Reis +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20090106 +DTEND;VALUE=DATE:20090107 +LOCATION:Catalunya\, La Franja\, País Valencià\, Illes Balears i Andorra +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T170644Z +LAST-MODIFIED:20090120T202759Z +DTSTAMP:20090120T170644Z +UID:07d3fbe8-917f-4935-afd0-dc2dff7f97ae +SUMMARY:Nadal +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T164020Z +LAST-MODIFIED:20090120T202829Z +DTSTAMP:20090120T164020Z +UID:8fc8041a-edfd-4e47-8846-68d5807673ea +SUMMARY:Divendres Sant +CATEGORIES:Dia festiu +DTSTART;VALUE=DATE:20080321 +DTEND;VALUE=DATE:20080322 +LOCATION:Catalunya\, La Franja\, País Valencià\, Illes Balears\, Andorra +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/ChileHolidays.ics b/media/caldata/ChileHolidays.ics new file mode 100644 index 00000000000..138b14728b2 --- /dev/null +++ b/media/caldata/ChileHolidays.ics @@ -0,0 +1,416 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:America/Santiago +X-LIC-LOCATION:America/Santiago +BEGIN:DAYLIGHT +TZOFFSETFROM:-0400 +TZOFFSETTO:-0300 +TZNAME:CLST +DTSTART:19701011T000000 +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=10 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0300 +TZOFFSETTO:-0400 +TZNAME:CLT +DTSTART:19700315T000000 +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20090125T210504Z +LAST-MODIFIED:20100117T004529Z +DTSTAMP:20100117T004529Z +UID:A0C5B071-6D70-4378-BD0A-B4CD0725E1BF +SUMMARY:Elecciones presidenciales - Segunda vuelta +DTSTART;VALUE=DATE:20100117 +DTEND;VALUE=DATE:20100118 +SEQUENCE:4 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090125T204903Z +LAST-MODIFIED:20100117T005432Z +DTSTAMP:20100117T005432Z +UID:E52EA838-25A1-408B-BB0D-F4A0CCB585C5 +SUMMARY:Viernes santo +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +SEQUENCE:4 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090125T204920Z +LAST-MODIFIED:20100117T005442Z +DTSTAMP:20100117T005442Z +UID:AA44D39B-180B-407A-9088-8E942706D5DC +SUMMARY:Sábado santo +DTSTART;VALUE=DATE:20100403 +DTEND;VALUE=DATE:20100404 +SEQUENCE:4 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090125T204932Z +LAST-MODIFIED:20100117T005454Z +DTSTAMP:20100117T005454Z +UID:1A3D42A5-11D5-4DC4-917C-E2D3C89C34AD +SUMMARY:Pascua de resurrección +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +SEQUENCE:4 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090108T023732Z +LAST-MODIFIED:20100117T005511Z +DTSTAMP:20100117T005511Z +UID:EBBA53A9-E11C-419D-BF6F-559D0E717D2C +SUMMARY:Glorias navales - Combate naval de Iquique +DTSTART;VALUE=DATE:20100521 +DTEND;VALUE=DATE:20100522 +SEQUENCE:12 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090125T205734Z +LAST-MODIFIED:20100117T005526Z +DTSTAMP:20100117T005526Z +UID:40812F42-F9CD-4C3D-94A5-B31C7B645642 +SUMMARY:Fiestas patrias +DTSTART;VALUE=DATE:20100918 +DTEND;VALUE=DATE:20100919 +SEQUENCE:8 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090125T210036Z +LAST-MODIFIED:20100117T005533Z +DTSTAMP:20100117T005533Z +UID:9078B4F0-CCEC-4BF9-BEB4-71F0FFF41AB3 +SUMMARY:Día nacional de las Iglesias Evangélicas y Protestantes +DTSTART;VALUE=DATE:20101031 +DTEND;VALUE=DATE:20101101 +SEQUENCE:10 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090125T205819Z +LAST-MODIFIED:20100117T005550Z +DTSTAMP:20100117T005550Z +UID:2DEB0443-7584-416E-9B80-1B857EF363D2 +SUMMARY:Glorias del Ejército +DTSTART;VALUE=DATE:20100919 +DTEND;VALUE=DATE:20100920 +SEQUENCE:8 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090125T210114Z +LAST-MODIFIED:20100117T005601Z +DTSTAMP:20100117T005601Z +UID:5342CCF1-3FC2-48DC-9E45-2054694152E2 +SUMMARY:Día de Todos los santos +DTSTART;VALUE=DATE:20101101 +DTEND;VALUE=DATE:20101102 +SEQUENCE:9 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090125T205448Z +LAST-MODIFIED:20100117T005735Z +DTSTAMP:20100117T005735Z +UID:A5D089B8-8B07-4A93-A660-F077DB859E4D +SUMMARY:Asunción de la Virgen María +DTSTART;VALUE=DATE:20100815 +DTEND;VALUE=DATE:20100816 +SEQUENCE:11 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090108T023732Z +LAST-MODIFIED:20100117T005748Z +DTSTAMP:20100117T005748Z +UID:3375A52E-74A5-4A66-9D4F-0C05FA751966 +SUMMARY:Día del trabajo +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:20100502 +SEQUENCE:10 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090125T205357Z +LAST-MODIFIED:20100117T005840Z +DTSTAMP:20100117T005840Z +UID:5CB94E21-4E84-4958-AF0F-9A30FE0FAB1E +SUMMARY:Festividad de la Virgen del Carmen +DTSTART;VALUE=DATE:20100716 +DTEND;VALUE=DATE:20100717 +SEQUENCE:16 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090125T205310Z +LAST-MODIFIED:20100117T005919Z +DTSTAMP:20100117T005919Z +UID:0CF78EDB-51DE-45BF-9CB7-A63226ECB7F4 +SUMMARY:San Pedro y San Pablo +DTSTART;VALUE=DATE:20100628 +DTEND;VALUE=DATE:20100629 +SEQUENCE:4 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T202941Z +LAST-MODIFIED:20101219T202959Z +DTSTAMP:20101219T202959Z +UID:5f661175-69ad-4dc5-9f41-dc464826ae54 +SUMMARY:Viernes Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T203000Z +LAST-MODIFIED:20101219T203011Z +DTSTAMP:20101219T203011Z +UID:4de7d720-6231-45fa-a5bf-bff36009a4db +SUMMARY:Sábado Santo +CATEGORIES:Holidays +DTSTART;TZID=America/Santiago:20110423T180000 +DTEND;TZID=America/Santiago:20110423T190000 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T203221Z +LAST-MODIFIED:20101219T203232Z +DTSTAMP:20101219T203232Z +UID:0c3420f6-9e35-462f-9705-e4541a3ba827 +SUMMARY:San Pedro y San Pablo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110627 +DTEND;VALUE=DATE:20110628 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T203630Z +LAST-MODIFIED:20101219T203650Z +DTSTAMP:20101219T203650Z +UID:5ee28bad-5848-4407-afb9-c1a5e50f0590 +SUMMARY:Día de las Iglesias Evangélicas y Protestantes +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20111031 +DTEND;VALUE=DATE:20111101 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T204602Z +LAST-MODIFIED:20101219T204622Z +DTSTAMP:20101219T204622Z +UID:0b4a29ae-76f8-412b-97f1-e83f4f4b411e +SUMMARY:Viernes Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T204623Z +LAST-MODIFIED:20101219T204634Z +DTSTAMP:20101219T204634Z +UID:8bd93f24-8b9e-4338-92c3-77d553d9290a +SUMMARY:Sábado Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120407 +DTEND;VALUE=DATE:20120408 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T204702Z +LAST-MODIFIED:20101219T204717Z +DTSTAMP:20101219T204717Z +UID:e539a0c9-01f3-48b4-9725-c56096b01e9b +SUMMARY:San Pedro y San Pablo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120702 +DTEND;VALUE=DATE:20120703 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T204809Z +LAST-MODIFIED:20101219T204820Z +DTSTAMP:20101219T204820Z +UID:2a0774b5-706c-42ad-a4b8-a47cc4a85775 +SUMMARY:Fiestas Patrias +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120917 +DTEND;VALUE=DATE:20120918 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T203603Z +LAST-MODIFIED:20101219T204851Z +DTSTAMP:20101219T204851Z +UID:b46b7b9b-4f34-4cef-869d-370bd14be60c +SUMMARY:Encuentro de Dos Mundos +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20111010 +DTEND;VALUE=DATE:20111011 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T204912Z +LAST-MODIFIED:20101219T204924Z +DTSTAMP:20101219T204924Z +UID:dbf84a72-9296-477d-bdd7-6c607c2cf942 +SUMMARY:Encuentro de Dos Mundos +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20121015 +DTEND;VALUE=DATE:20121016 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T204953Z +LAST-MODIFIED:20101219T205009Z +DTSTAMP:20101219T205009Z +UID:9c0f57ed-d368-417e-a340-5e28a180416b +SUMMARY:Día de las Iglesias Evangélicas y Protestantes +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121102 +DTEND;VALUE=DATE:20121103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T203104Z +LAST-MODIFIED:20101219T203251Z +DTSTAMP:20101219T203251Z +UID:eb1b66a1-4849-4db0-b053-62f53af22038 +SUMMARY:Día de las Glorias Navales +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110521 +DTEND;VALUE=DATE:20110522 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T203034Z +LAST-MODIFIED:20101219T203301Z +DTSTAMP:20101219T203301Z +UID:b0d39783-ae1c-4dc9-b52b-486d7b84a316 +SUMMARY:Día Nacional del Trabajo +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110501 +DTEND;VALUE=DATE:20110502 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T203340Z +LAST-MODIFIED:20101219T203408Z +DTSTAMP:20101219T203408Z +UID:765bfd36-37a4-4b60-8699-654eee0f54b3 +SUMMARY:Asunción de la Virgen +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20110815 +DTEND;VALUE=DATE:20110816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T203314Z +LAST-MODIFIED:20101219T203427Z +DTSTAMP:20101219T203427Z +UID:7766a794-013e-482c-b585-b03a64d30b3a +SUMMARY:Día de la Virgen del Carmen +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110716 +DTEND;VALUE=DATE:20110717 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T203455Z +LAST-MODIFIED:20101219T203512Z +DTSTAMP:20101219T203512Z +UID:b0151532-6472-4883-8a1d-6b9839a28e15 +SUMMARY:Independencia Nacional +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110918 +DTEND;VALUE=DATE:20110919 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T203520Z +LAST-MODIFIED:20101219T203541Z +DTSTAMP:20101219T203541Z +UID:7dc634a0-5466-448a-9c73-005689899a1f +SUMMARY:Día de las Glorias del Ejército +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110919 +DTEND;VALUE=DATE:20110920 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101219T203708Z +LAST-MODIFIED:20101219T203725Z +DTSTAMP:20101219T203725Z +UID:339e4fe1-0777-4152-95e1-56aba25c401f +SUMMARY:Día de Todos los Santos +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20111101 +DTEND;VALUE=DATE:20111102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090125T210525Z +LAST-MODIFIED:20101219T204107Z +DTSTAMP:20101219T204107Z +UID:1F01185F-771D-4C33-9877-1CF6F7B75DA9 +SUMMARY:Navidad +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +SEQUENCE:11 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090108T023732Z +LAST-MODIFIED:20101219T204203Z +DTSTAMP:20101219T204203Z +UID:55460119-AE52-4840-BDFA-84D61DAF5D85 +SUMMARY:Año nuevo +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +SEQUENCE:13 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090125T210205Z +LAST-MODIFIED:20101219T204539Z +DTSTAMP:20101219T204539Z +UID:CEEC099A-64FB-4AE0-9DC2-921A27067533 +SUMMARY:Día de la Inmaculada Concepción +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101208 +DTEND;VALUE=DATE:20101209 +SEQUENCE:9 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/ChinaHolidays.ics b/media/caldata/ChinaHolidays.ics new file mode 100644 index 00000000000..d885ebd485c --- /dev/null +++ b/media/caldata/ChinaHolidays.ics @@ -0,0 +1,611 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +X-WR-CALNAME:Chinese Lunar Calendar 中国农历日历 +X-WR-CALDESC:中国农历日历,包含阳历节假日,阴历节气,中国传统阴历节日。\nChinese Calendar\, + Include solar calendar and holidays\, Chinese traditional lunar festivals. + \n\n\n~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~* + \nComposed by : Mr. Li Ping Ju 李平举. (C) 2010 - 12. All rights + reserved\nSend comments to: lipingju_AT_gmail_DOT_com\n~*~*~*~*~*~*~*~*~*~ + *~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~* +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:2010012 +SUMMARY:十一月十七 元旦 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100105 +DTEND;VALUE=DATE:2010016 +SUMMARY:十一廿一 小寒 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100120 +DTEND;VALUE=DATE:20100121 +SUMMARY:十二月初六 大寒 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100122 +DTEND;VALUE=DATE:20100123 +SUMMARY:十二月初八 腊八 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100204 +DTEND;VALUE=DATE:2010025 +SUMMARY:十二月廿一 立春 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100214 +DTEND;VALUE=DATE:20100215 +SUMMARY:正月初一 庚寅(虎)年春节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100219 +DTEND;VALUE=DATE:20100220 +SUMMARY:正月初六 雨水 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100228 +DTEND;VALUE=DATE:20100229 +SUMMARY:正月十五 元宵 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100306 +DTEND;VALUE=DATE:2010037 +SUMMARY:正月廿一 惊蛰 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100308 +DTEND;VALUE=DATE:2010039 +SUMMARY:正月廿三 妇女节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100312 +DTEND;VALUE=DATE:20100313 +SUMMARY:正月廿七 植树节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100321 +DTEND;VALUE=DATE:20100322 +SUMMARY:二月初六 春分 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:2010046 +SUMMARY:二月廿一 清明 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100420 +DTEND;VALUE=DATE:20100421 +SUMMARY:三月初七 谷雨 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:2010052 +SUMMARY:三月十八 劳动节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100504 +DTEND;VALUE=DATE:2010055 +SUMMARY:三月廿一 青年节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100505 +DTEND;VALUE=DATE:2010056 +SUMMARY:三月廿二 立夏 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100521 +DTEND;VALUE=DATE:20100522 +SUMMARY:四月初八 小满 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100601 +DTEND;VALUE=DATE:2010062 +SUMMARY:四月十九 儿童节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100606 +DTEND;VALUE=DATE:2010067 +SUMMARY:四月廿四 芒种 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100616 +DTEND;VALUE=DATE:20100617 +SUMMARY:五月初五 端午 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100621 +DTEND;VALUE=DATE:20100622 +SUMMARY:五月初十 夏至 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100701 +DTEND;VALUE=DATE:2010072 +SUMMARY:五月二十 建党节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100707 +DTEND;VALUE=DATE:2010078 +SUMMARY:五月廿六 小暑 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100723 +DTEND;VALUE=DATE:20100724 +SUMMARY:六月十二 大暑 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100801 +DTEND;VALUE=DATE:2010082 +SUMMARY:六月廿一 建军节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100807 +DTEND;VALUE=DATE:2010088 +SUMMARY:六月廿七 立秋 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100816 +DTEND;VALUE=DATE:20100817 +SUMMARY:七月初七 七夕 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100823 +DTEND;VALUE=DATE:20100824 +SUMMARY:七月十四 处暑 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100910 +DTEND;VALUE=DATE:20100911 +SUMMARY:八月初三 教师节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100922 +DTEND;VALUE=DATE:20100923 +SUMMARY:八月十五 中秋 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100923 +DTEND;VALUE=DATE:20100924 +SUMMARY:八月十六 秋分 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101001 +DTEND;VALUE=DATE:2010102 +SUMMARY:八月廿四 国庆节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101016 +DTEND;VALUE=DATE:20101017 +SUMMARY:九月初九 重阳 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101023 +DTEND;VALUE=DATE:20101024 +SUMMARY:九月十六 霜降 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101107 +DTEND;VALUE=DATE:2010118 +SUMMARY:十月初二 立冬 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101122 +DTEND;VALUE=DATE:20101123 +SUMMARY:十月十七 小雪 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101207 +DTEND;VALUE=DATE:2010128 +SUMMARY:十一月初二 大雪 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101222 +DTEND;VALUE=DATE:20101223 +SUMMARY:十一月十七 冬至 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +SUMMARY:十一月二十 圣诞节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:2011012 +SUMMARY:廿七 元旦 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110106 +DTEND;VALUE=DATE:2011017 +SUMMARY:十二月初三 小寒 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110111 +DTEND;VALUE=DATE:20110112 +SUMMARY:十二月初八 腊八 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110120 +DTEND;VALUE=DATE:20110121 +SUMMARY:十二月十七 大寒 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110203 +DTEND;VALUE=DATE:2011024 +SUMMARY:正月初一 辛卯(兔)年春节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110204 +DTEND;VALUE=DATE:2011025 +SUMMARY:正月初二 立春 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110217 +DTEND;VALUE=DATE:20110218 +SUMMARY:正月十五 元宵 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110219 +DTEND;VALUE=DATE:20110220 +SUMMARY:正月十七 雨水 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110306 +DTEND;VALUE=DATE:2011037 +SUMMARY:二月初二 惊蛰 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110308 +DTEND;VALUE=DATE:2011039 +SUMMARY:二月初四 妇女节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110312 +DTEND;VALUE=DATE:20110313 +SUMMARY:二月初八 植树节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110321 +DTEND;VALUE=DATE:20110322 +SUMMARY:二月十七 春分 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110405 +DTEND;VALUE=DATE:2011046 +SUMMARY:三月初三 清明 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110420 +DTEND;VALUE=DATE:20110421 +SUMMARY:三月十八 谷雨 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110501 +DTEND;VALUE=DATE:2011052 +SUMMARY:三月廿九 劳动节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110504 +DTEND;VALUE=DATE:2011055 +SUMMARY:四月初二 青年节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110506 +DTEND;VALUE=DATE:2011057 +SUMMARY:四月初四 立夏 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110521 +DTEND;VALUE=DATE:20110522 +SUMMARY:四月十九 小满 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110601 +DTEND;VALUE=DATE:2011062 +SUMMARY:四月三十 儿童节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110606 +DTEND;VALUE=DATE:2011067 +SUMMARY:五月初五 芒种 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110622 +DTEND;VALUE=DATE:20110623 +SUMMARY:五月廿一 夏至 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110701 +DTEND;VALUE=DATE:2011072 +SUMMARY:六月初一 建党节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110707 +DTEND;VALUE=DATE:2011078 +SUMMARY:六月初七 小暑 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110723 +DTEND;VALUE=DATE:20110724 +SUMMARY:六月廿三 大暑 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110801 +DTEND;VALUE=DATE:2011082 +SUMMARY:七月初二 建军节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110806 +DTEND;VALUE=DATE:2011087 +SUMMARY:七月初七 七夕 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110808 +DTEND;VALUE=DATE:2011089 +SUMMARY:七月初九 立秋 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110823 +DTEND;VALUE=DATE:20110824 +SUMMARY:七月廿四 处暑 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110908 +DTEND;VALUE=DATE:2011099 +SUMMARY:八月十一 白露 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110910 +DTEND;VALUE=DATE:20110911 +SUMMARY:八月十三 教师节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110912 +DTEND;VALUE=DATE:20110913 +SUMMARY:八月十五 中秋 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110923 +DTEND;VALUE=DATE:20110924 +SUMMARY:八月廿六 秋分 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111001 +DTEND;VALUE=DATE:2011102 +SUMMARY:九月初五 国庆节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111005 +DTEND;VALUE=DATE:2011106 +SUMMARY:九月初九 重阳 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111008 +DTEND;VALUE=DATE:2011109 +SUMMARY:九月十二 寒露 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111024 +DTEND;VALUE=DATE:20111025 +SUMMARY:九月廿八 霜降 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111108 +DTEND;VALUE=DATE:2011119 +SUMMARY:十月十三 立冬 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111123 +DTEND;VALUE=DATE:20111124 +SUMMARY:十月廿八 小雪 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111207 +DTEND;VALUE=DATE:2011128 +SUMMARY:十一月十三 大雪 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111222 +DTEND;VALUE=DATE:20111223 +SUMMARY:十一月廿八 冬至 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111226 +SUMMARY:十二月初一 圣诞节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120101 +DTEND;VALUE=DATE:2012012 +SUMMARY:初八 元旦 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120106 +DTEND;VALUE=DATE:2012017 +SUMMARY:十三 小寒 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120121 +DTEND;VALUE=DATE:20120122 +SUMMARY:廿八 大寒 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120123 +DTEND;VALUE=DATE:20120124 +SUMMARY:正月初一 壬辰(龙)年春节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120204 +DTEND;VALUE=DATE:2012025 +SUMMARY:正月十三 立春 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120206 +DTEND;VALUE=DATE:2012027 +SUMMARY:正月十五 元宵 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120219 +DTEND;VALUE=DATE:20120220 +SUMMARY:正月廿八 雨水 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120305 +DTEND;VALUE=DATE:2012036 +SUMMARY:二月十三 惊蛰 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120308 +DTEND;VALUE=DATE:2012039 +SUMMARY:二月十六 妇女节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120312 +DTEND;VALUE=DATE:20120313 +SUMMARY:二月二十 植树节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120320 +DTEND;VALUE=DATE:20120321 +SUMMARY:二月廿八 春分 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120404 +DTEND;VALUE=DATE:2012045 +SUMMARY:三月十四 清明 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120420 +DTEND;VALUE=DATE:20120421 +SUMMARY:三月三十 谷雨 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120501 +DTEND;VALUE=DATE:2012052 +SUMMARY:四月十一 劳动节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120504 +DTEND;VALUE=DATE:2012055 +SUMMARY:四月十四 青年节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120505 +DTEND;VALUE=DATE:2012056 +SUMMARY:四月十五 立夏 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120520 +DTEND;VALUE=DATE:20120521 +SUMMARY:四月三十 小满 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120601 +DTEND;VALUE=DATE:2012062 +SUMMARY:闰四十二 儿童节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120605 +DTEND;VALUE=DATE:2012066 +SUMMARY:闰四十六 芒种 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120621 +DTEND;VALUE=DATE:20120622 +SUMMARY:五月初三 夏至 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120623 +DTEND;VALUE=DATE:20120624 +SUMMARY:五月初五 端午 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120701 +DTEND;VALUE=DATE:2012072 +SUMMARY:五月十三 建党节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120707 +DTEND;VALUE=DATE:2012078 +SUMMARY:五月十九 小暑 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120722 +DTEND;VALUE=DATE:20120723 +SUMMARY:六月初四 大暑 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120801 +DTEND;VALUE=DATE:2012082 +SUMMARY:六月十四 建军节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120807 +DTEND;VALUE=DATE:2012088 +SUMMARY:六月二十 立秋 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120823 +DTEND;VALUE=DATE:20120824 +SUMMARY:七月初七 处暑 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120907 +DTEND;VALUE=DATE:2012098 +SUMMARY:七月廿二 白露 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120910 +DTEND;VALUE=DATE:20120911 +SUMMARY:七月廿五 教师节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120922 +DTEND;VALUE=DATE:20120923 +SUMMARY:八月初七 秋分 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120930 +DTEND;VALUE=DATE:20120931 +SUMMARY:八月十五 中秋 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121001 +DTEND;VALUE=DATE:2012102 +SUMMARY:八月十六 国庆节 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121008 +DTEND;VALUE=DATE:2012109 +SUMMARY:八月廿三 寒露 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121023 +DTEND;VALUE=DATE:20121024 +SUMMARY:九月初九 霜降 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121107 +DTEND;VALUE=DATE:2012118 +SUMMARY:九月廿四 立冬 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121122 +DTEND;VALUE=DATE:20121123 +SUMMARY:十月初九 小雪 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121207 +DTEND;VALUE=DATE:2012128 +SUMMARY:十月廿四 大雪 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121221 +DTEND;VALUE=DATE:20121222 +SUMMARY:十一月初九 冬至 +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +SUMMARY:十一月十三 圣诞节 +END:VEVENT +END:VCALENDAR \ No newline at end of file diff --git a/media/caldata/ColombianHolidays.ics b/media/caldata/ColombianHolidays.ics new file mode 100644 index 00000000000..47d8fba1eff --- /dev/null +++ b/media/caldata/ColombianHolidays.ics @@ -0,0 +1,5298 @@ +BEGIN:VCALENDAR +PRODID:-//Google Inc//Google Calendar 70.9054//EN +VERSION:2.0 +CALSCALE:GREGORIAN +METHOD:PUBLISH +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010702 +DTEND;VALUE=DATE:20010703 +DTSTAMP:20090116T165552Z +UID:CSVConvert0287228d5dad408ce192ea16d816d31f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165447Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000320 +DTEND;VALUE=DATE:20000321 +DTSTAMP:20090116T165552Z +UID:CSVConverta46d1214998701027f4d55d7d7f79828 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165447Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000110 +DTEND;VALUE=DATE:20000111 +DTSTAMP:20090116T165552Z +UID:CSVConvertcf64ecce4a0e27e617eaad61035f0a4b +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165447Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000626 +DTEND;VALUE=DATE:20000627 +DTSTAMP:20090116T165552Z +UID:CSVConverta616608276770386f68b0e73da51f2da +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165447Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000101 +DTEND;VALUE=DATE:20000102 +DTSTAMP:20090116T165552Z +UID:CSVConvert2d9ea85ca0a14f6cb0d3459f628a0371 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165447Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030418 +DTEND;VALUE=DATE:20030419 +DTSTAMP:20090116T165552Z +UID:CSVConvertee7a3674e44ea36c5a25c613a75e2a3c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010413 +DTEND;VALUE=DATE:20010414 +DTSTAMP:20090116T165552Z +UID:CSVConvert5ab50b9a8e6db148a8845d655b855895 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020329 +DTEND;VALUE=DATE:20020330 +DTSTAMP:20090116T165552Z +UID:CSVConvert201ee17855640e2c91ba0f1084168ad1 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000421 +DTEND;VALUE=DATE:20000422 +DTSTAMP:20090116T165552Z +UID:CSVConvert143cf4c53ea97361c5c96e4d859b4cd6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020701 +DTEND;VALUE=DATE:20020702 +DTSTAMP:20090116T165552Z +UID:CSVConverta3758cc9f636d01acc5baddade33e66a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000703 +DTEND;VALUE=DATE:20000704 +DTSTAMP:20090116T165552Z +UID:CSVConvert6892a0188803b55e383d07b0c31d7c45 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20011225 +DTEND;VALUE=DATE:20011226 +DTSTAMP:20090116T165552Z +UID:CSVConvertd5a21a634e67ad3a5aca290be73b9435 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20001225 +DTEND;VALUE=DATE:20001226 +DTSTAMP:20090116T165552Z +UID:CSVConvert9071f4e70893ee07e1b1da722e101a90 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20021225 +DTEND;VALUE=DATE:20021226 +DTSTAMP:20090116T165552Z +UID:CSVConvert7b8d655b547566afcde576113f788434 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030417 +DTEND;VALUE=DATE:20030418 +DTSTAMP:20090116T165552Z +UID:CSVConvertf7adb492bf2cce502cfb0b6e929549cb +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000420 +DTEND;VALUE=DATE:20000421 +DTSTAMP:20090116T165552Z +UID:CSVConverte671e7b87cbe1289d719a2a67db38c88 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020328 +DTEND;VALUE=DATE:20020329 +DTSTAMP:20090116T165552Z +UID:CSVConvertd0caa696a8c563989b5e0779ac56f186 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010412 +DTEND;VALUE=DATE:20010413 +DTSTAMP:20090116T165552Z +UID:CSVConvert57df0d28a1d1535b8c0198d2401e7d17 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20021208 +DTEND;VALUE=DATE:20021209 +DTSTAMP:20090116T165552Z +UID:CSVConvert92dc8c5249547b32348510e479324a63 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20001208 +DTEND;VALUE=DATE:20001209 +DTSTAMP:20090116T165552Z +UID:CSVConvert6a33b2f60f4d37cf6c4c409f42b3ad15 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20011208 +DTEND;VALUE=DATE:20011209 +DTSTAMP:20090116T165552Z +UID:CSVConvert639900bcffbafb3cd9dbf45e90d1f65e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010720 +DTEND;VALUE=DATE:20010721 +DTSTAMP:20090116T165552Z +UID:CSVConvert68a950aaf42355275a6b4481df210803 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000720 +DTEND;VALUE=DATE:20000721 +DTSTAMP:20090116T165552Z +UID:CSVConvert271454477abe4dc234f510f01e561b08 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020720 +DTEND;VALUE=DATE:20020721 +DTSTAMP:20090116T165552Z +UID:CSVConvert1acd25262c26e8cc68a63db050e5e1ae +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20021111 +DTEND;VALUE=DATE:20021112 +DTSTAMP:20090116T165552Z +UID:CSVConverteec1fc1179bd52a488752a03f4fc742b +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20001113 +DTEND;VALUE=DATE:20001114 +DTSTAMP:20090116T165552Z +UID:CSVConvert90ecb7877cdea57e27152c0d9e6b72d5 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20011112 +DTEND;VALUE=DATE:20011113 +DTSTAMP:20090116T165552Z +UID:CSVConvert8e1f26ea65c7a12766fd042a00eaf616 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20011105 +DTEND;VALUE=DATE:20011106 +DTSTAMP:20090116T165552Z +UID:CSVConvertcb04e1879b71f8c7d30a44841c2660d4 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20001106 +DTEND;VALUE=DATE:20001107 +DTSTAMP:20090116T165552Z +UID:CSVConvert5bfa316225097401ca82b7a338513e67 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20021104 +DTEND;VALUE=DATE:20021105 +DTSTAMP:20090116T165552Z +UID:CSVConvert4e4f1278cc81f61486b966cc2e338fb4 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010501 +DTEND;VALUE=DATE:20010502 +DTSTAMP:20090116T165552Z +UID:CSVConverta07f848e3d588106053b7ec9065dab8e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030501 +DTEND;VALUE=DATE:20030502 +DTSTAMP:20090116T165552Z +UID:CSVConvert2d032d26df569c13bbd0a4d08fb44164 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000501 +DTEND;VALUE=DATE:20000502 +DTSTAMP:20090116T165552Z +UID:CSVConvert1ffe6021861890dcf9f75a2e9da50300 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020501 +DTEND;VALUE=DATE:20020502 +DTSTAMP:20090116T165552Z +UID:CSVConvert1d04e9e095e52128bc1d3b03c76119f7 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020610 +DTEND;VALUE=DATE:20020611 +DTSTAMP:20090116T165552Z +UID:CSVConvert8bd3998fb9622cb4d1f01d2c4f63a5a4 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010625 +DTEND;VALUE=DATE:20010626 +DTSTAMP:20090116T165552Z +UID:CSVConvert681f62e90b36111eb0aab323821471d1 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000703 +DTEND;VALUE=DATE:20000704 +DTSTAMP:20090116T165552Z +UID:CSVConvert00aac1d47c5b34726c4cad4aa46a9d1e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020325 +DTEND;VALUE=DATE:20020326 +DTSTAMP:20090116T165552Z +UID:CSVConvertf17e7dd4d0fdec66da3408d5023a6031 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010319 +DTEND;VALUE=DATE:20010320 +DTSTAMP:20090116T165552Z +UID:CSVConvert6bf256302aaa299354fd23f55a366b5c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030324 +DTEND;VALUE=DATE:20030325 +DTSTAMP:20090116T165552Z +UID:CSVConvert13d4038965ed086d4847a842e5feeb6d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020107 +DTEND;VALUE=DATE:20020108 +DTSTAMP:20090116T165552Z +UID:CSVConvertfdc43d37fd5efc828b98a7f3f71ae312 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010108 +DTEND;VALUE=DATE:20010109 +DTSTAMP:20090116T165552Z +UID:CSVConverta95a086e45879e5a6221b8aff7b9a1e0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030106 +DTEND;VALUE=DATE:20030107 +DTSTAMP:20090116T165552Z +UID:CSVConvert145d32f64fbfac36dbf05a046ca2966b +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20001016 +DTEND;VALUE=DATE:20001017 +DTSTAMP:20090116T165552Z +UID:CSVConverta811ad99d4a271a68dceac9588670325 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20011015 +DTEND;VALUE=DATE:20011016 +DTSTAMP:20090116T165552Z +UID:CSVConvert3f5e10ad9f37a09eb454db5334481ee4 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20021014 +DTEND;VALUE=DATE:20021015 +DTSTAMP:20090116T165552Z +UID:CSVConvert39daf3b36d20891a15da122b8e346dda +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010618 +DTEND;VALUE=DATE:20010619 +DTSTAMP:20090116T165552Z +UID:CSVConvert6838cdfa9b1d1707343bbff059763088 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020603 +DTEND;VALUE=DATE:20020604 +DTSTAMP:20090116T165552Z +UID:CSVConvert3907809660e270280ab0e1cac081de62 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040614 +DTEND;VALUE=DATE:20040615 +DTSTAMP:20090116T165552Z +UID:CSVConvert20840ee33bdd62b1525684f068394f37 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010807 +DTEND;VALUE=DATE:20010808 +DTSTAMP:20090116T165552Z +UID:CSVConvertea1d2e2f1d4c5a379d557f822dac1ff6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000807 +DTEND;VALUE=DATE:20000808 +DTSTAMP:20090116T165552Z +UID:CSVConvert849e201a137a738bc2654b5d46ff53d2 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020807 +DTEND;VALUE=DATE:20020808 +DTSTAMP:20090116T165552Z +UID:CSVConvert81fc8f0ad032fe24d8fc0fd9a5dfe736 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010101 +DTEND;VALUE=DATE:20010102 +DTSTAMP:20090116T165552Z +UID:CSVConvertbeb86d6f94d65c89c7485dbfa34af762 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020101 +DTEND;VALUE=DATE:20020102 +DTSTAMP:20090116T165552Z +UID:CSVConvert550ec6fa41620c6bc65a5d23d0effcc4 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030101 +DTEND;VALUE=DATE:20030102 +DTSTAMP:20090116T165552Z +UID:CSVConvert120a2a9933a1bb8262bdb53bca29236b +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000821 +DTEND;VALUE=DATE:20000822 +DTSTAMP:20090116T165552Z +UID:CSVConvertbdc588d303c159a535a21e8f02f0aa16 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020819 +DTEND;VALUE=DATE:20020820 +DTSTAMP:20090116T165552Z +UID:CSVConvert5ef7d1231eb42238c3ccaac728600556 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010820 +DTEND;VALUE=DATE:20010821 +DTSTAMP:20090116T165552Z +UID:CSVConvert3b9012156e90c1578315261d73900a04 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20020513 +DTEND;VALUE=DATE:20020514 +DTSTAMP:20090116T165552Z +UID:CSVConvertf73c7b6b6315b843cd58064b65e05e49 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20010528 +DTEND;VALUE=DATE:20010529 +DTSTAMP:20090116T165552Z +UID:CSVConvert81808b037e981f3ef52d7f480f8edcba +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20000605 +DTEND;VALUE=DATE:20000606 +DTSTAMP:20090116T165552Z +UID:CSVConvert6fa2516d8b1cbed197ee8b1dc7f798c2 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165446Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050325 +DTEND;VALUE=DATE:20050326 +DTSTAMP:20090116T165552Z +UID:CSVConvert3890a11a3acb3be6217857cd28982c75 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040409 +DTEND;VALUE=DATE:20040410 +DTSTAMP:20090116T165552Z +UID:CSVConvert264436508094ad7527cbf4534a0be7a4 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050704 +DTEND;VALUE=DATE:20050705 +DTSTAMP:20090116T165552Z +UID:CSVConvertc136e35d8d9a3ad4bc428f926b9d68af +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040705 +DTEND;VALUE=DATE:20040706 +DTSTAMP:20090116T165552Z +UID:CSVConvert1e96f66018be4207b5250169fc664899 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030630 +DTEND;VALUE=DATE:20030701 +DTSTAMP:20090116T165552Z +UID:CSVConvert1af115d16d6b1bab84ddf168d927bf41 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20031225 +DTEND;VALUE=DATE:20031226 +DTSTAMP:20090116T165552Z +UID:CSVConvertf5396096866641039752d90b77c1b4d1 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20051225 +DTEND;VALUE=DATE:20051226 +DTSTAMP:20090116T165552Z +UID:CSVConvertc5c9e15c2c90d0c2648171c521b01916 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20041225 +DTEND;VALUE=DATE:20041226 +DTSTAMP:20090116T165552Z +UID:CSVConvertc50f7015d882e443dad9bd400c4bad0e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050324 +DTEND;VALUE=DATE:20050325 +DTSTAMP:20090116T165552Z +UID:CSVConvert72c132e5f8603936b32f9ade539b8abd +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040408 +DTEND;VALUE=DATE:20040409 +DTSTAMP:20090116T165552Z +UID:CSVConvert53cc42d7d4b69487e32a2893e42da1dd +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20031208 +DTEND;VALUE=DATE:20031209 +DTSTAMP:20090116T165552Z +UID:CSVConvertf45a9f9ba5cc07ab777f421fc73e09bd +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20051208 +DTEND;VALUE=DATE:20051209 +DTSTAMP:20090116T165552Z +UID:CSVConvertac109990fddd50563221ff866dc14638 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20041208 +DTEND;VALUE=DATE:20041209 +DTSTAMP:20090116T165552Z +UID:CSVConvert051c53c26b08b4a5956345a272af5d1a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030720 +DTEND;VALUE=DATE:20030721 +DTSTAMP:20090116T165552Z +UID:CSVConvertc44a400dc65c5215d1a33b6e311350ff +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040720 +DTEND;VALUE=DATE:20040721 +DTSTAMP:20090116T165552Z +UID:CSVConvert5c2fef3156dac743bcdec62dbc3e3f42 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050720 +DTEND;VALUE=DATE:20050721 +DTSTAMP:20090116T165552Z +UID:CSVConvert206be6d2cb79d7197110f3125894a841 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20041115 +DTEND;VALUE=DATE:20041116 +DTSTAMP:20090116T165552Z +UID:CSVConverte91126a85dd91da94397b42b70e5e762 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20031117 +DTEND;VALUE=DATE:20031118 +DTSTAMP:20090116T165552Z +UID:CSVConverte1f40efcf4e8add980f32c7536cb4fb9 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20051114 +DTEND;VALUE=DATE:20051115 +DTSTAMP:20090116T165552Z +UID:CSVConvertaa4165545aba77d380d66a5576d7e672 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20041101 +DTEND;VALUE=DATE:20041102 +DTSTAMP:20090116T165552Z +UID:CSVConverteeeeb5553539afc042d7c85f09d0a7d4 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20051107 +DTEND;VALUE=DATE:20051108 +DTSTAMP:20090116T165552Z +UID:CSVConvertbd0e77e8a2240db2d63337f3aa01b1ce +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20031103 +DTEND;VALUE=DATE:20031104 +DTSTAMP:20090116T165552Z +UID:CSVConvert5643f7a3c3d6a518b9fcee2090f79776 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050501 +DTEND;VALUE=DATE:20050502 +DTSTAMP:20090116T165552Z +UID:CSVConvertd375f2c1da1af5c197d634e09a06a202 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040501 +DTEND;VALUE=DATE:20040502 +DTSTAMP:20090116T165552Z +UID:CSVConvert148c840897220c22434fda84a10d5641 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030630 +DTEND;VALUE=DATE:20030701 +DTSTAMP:20090116T165552Z +UID:CSVConvertcb2b407021064f09e04db9d4ca6cddde +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040621 +DTEND;VALUE=DATE:20040622 +DTSTAMP:20090116T165552Z +UID:CSVConvertbba0b71bbcd828d68863128aefb90c75 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050606 +DTEND;VALUE=DATE:20050607 +DTSTAMP:20090116T165552Z +UID:CSVConvert7b4abd937456ba84c46fe60ceca442a6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050321 +DTEND;VALUE=DATE:20050322 +DTSTAMP:20090116T165552Z +UID:CSVConvertcdd79be0c58b88feb2305e0bf02ab427 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040322 +DTEND;VALUE=DATE:20040323 +DTSTAMP:20090116T165552Z +UID:CSVConvert1ccd50431519b0f8a5ce8fe4352f2c32 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050110 +DTEND;VALUE=DATE:20050111 +DTSTAMP:20090116T165552Z +UID:CSVConvert94824642b4dd3a9d19d332fa87156c5d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040112 +DTEND;VALUE=DATE:20040113 +DTSTAMP:20090116T165552Z +UID:CSVConvert7e47f26be965f32353e9147c32eb557f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20041018 +DTEND;VALUE=DATE:20041019 +DTSTAMP:20090116T165552Z +UID:CSVConverta63b40509b444f5e5f0ea076653b04bf +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20031013 +DTEND;VALUE=DATE:20031014 +DTSTAMP:20090116T165552Z +UID:CSVConvert6600bc6e2273a1b4f5af450855236f14 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20051017 +DTEND;VALUE=DATE:20051018 +DTSTAMP:20090116T165552Z +UID:CSVConvert58186052321176a163e0a4f45f62c55d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030623 +DTEND;VALUE=DATE:20030624 +DTSTAMP:20090116T165552Z +UID:CSVConvert5930da3f98515c55383503d4e7132a3a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050530 +DTEND;VALUE=DATE:20050531 +DTSTAMP:20090116T165552Z +UID:CSVConvert1a9ebef379364886a6a496ff68dc95d0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050807 +DTEND;VALUE=DATE:20050808 +DTSTAMP:20090116T165552Z +UID:CSVConverteb351711f28d19bb33087035c3f8717e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040807 +DTEND;VALUE=DATE:20040808 +DTSTAMP:20090116T165552Z +UID:CSVConvertb66b1a7d53442b932dabbb436ed18be3 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030807 +DTEND;VALUE=DATE:20030808 +DTSTAMP:20090116T165552Z +UID:CSVConvert049928b56b86a7076b63736b6a029644 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040101 +DTEND;VALUE=DATE:20040102 +DTSTAMP:20090116T165552Z +UID:CSVConvertb19d014d0b4f263ec10a3663298a908c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050101 +DTEND;VALUE=DATE:20050102 +DTSTAMP:20090116T165552Z +UID:CSVConvert744234ae892932dc5c1a3ac26cb99dc0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060101 +DTEND;VALUE=DATE:20060102 +DTSTAMP:20090116T165552Z +UID:CSVConvert3112f384fb9d7b8bb2820af64573f32f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050815 +DTEND;VALUE=DATE:20050816 +DTSTAMP:20090116T165552Z +UID:CSVConvert91cd7f2ea4da1eea050756a77e3ce3a5 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040816 +DTEND;VALUE=DATE:20040817 +DTSTAMP:20090116T165552Z +UID:CSVConvert6b8c50e2ec5ceedd7609db3524ba38e8 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030818 +DTEND;VALUE=DATE:20030819 +DTSTAMP:20090116T165552Z +UID:CSVConvert2f0c437a5e1df08290ff2f7cb455112a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20030602 +DTEND;VALUE=DATE:20030603 +DTSTAMP:20090116T165552Z +UID:CSVConvertd502702f1155b917a8889437ea715332 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20040524 +DTEND;VALUE=DATE:20040525 +DTSTAMP:20090116T165552Z +UID:CSVConvert9b2d45391ceb74faad5d8c09d41abd68 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20050509 +DTEND;VALUE=DATE:20050510 +DTSTAMP:20090116T165552Z +UID:CSVConvert653893c23e950591e625d06e6f39e987 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165445Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080321 +DTEND;VALUE=DATE:20080322 +DTSTAMP:20090116T165552Z +UID:CSVConverta81e3b3daa1ee9bc1164deaf0fb1682c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060414 +DTEND;VALUE=DATE:20060415 +DTSTAMP:20090116T165552Z +UID:CSVConverta1072a29659e978053b529682abe5b52 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070406 +DTEND;VALUE=DATE:20070407 +DTSTAMP:20090116T165552Z +UID:CSVConvert5ae9e641ca73a7f88842e39388f1f43d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080630 +DTEND;VALUE=DATE:20080701 +DTSTAMP:20090116T165552Z +UID:CSVConverte238541e3a0ba4caa8653068980168d6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060703 +DTEND;VALUE=DATE:20060704 +DTSTAMP:20090116T165552Z +UID:CSVConvertbb8d849cd667f35adfda9cb50b19176d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070702 +DTEND;VALUE=DATE:20070703 +DTSTAMP:20090116T165552Z +UID:CSVConvert36e59cdab43e1fa5ee8591e74fb1fb3e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20061225 +DTEND;VALUE=DATE:20061226 +DTSTAMP:20090116T165552Z +UID:CSVConvertd1a209c4326a9284615ccaf95dbc1ebf +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20071225 +DTEND;VALUE=DATE:20071226 +DTSTAMP:20090116T165552Z +UID:CSVConverta7d3f2a0d8807f3da3b604935f938187 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080320 +DTEND;VALUE=DATE:20080321 +DTSTAMP:20090116T165552Z +UID:CSVConvertf0af503e74c0a513190034b768d220d7 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070405 +DTEND;VALUE=DATE:20070406 +DTSTAMP:20090116T165552Z +UID:CSVConvert867efca032b45d8313b02c8c1637b1dc +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060413 +DTEND;VALUE=DATE:20060414 +DTSTAMP:20090116T165552Z +UID:CSVConvert3d9a19a3eff0fed275d435c44abd7058 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20071208 +DTEND;VALUE=DATE:20071209 +DTSTAMP:20090116T165552Z +UID:CSVConvertb57d405ae970b321e918837dbfd9acc6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20061208 +DTEND;VALUE=DATE:20061209 +DTSTAMP:20090116T165552Z +UID:CSVConvert62a897c9b3445d8fb45aca902e2b7720 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070720 +DTEND;VALUE=DATE:20070721 +DTSTAMP:20090116T165552Z +UID:CSVConvertec89085ecbaa9dadee23970238c160a6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080720 +DTEND;VALUE=DATE:20080721 +DTSTAMP:20090116T165552Z +UID:CSVConvertc3fc27869fcf8ec750cc1f04f9d32492 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060720 +DTEND;VALUE=DATE:20060721 +DTSTAMP:20090116T165552Z +UID:CSVConvert693fd93d5287ff506882faa25590a695 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20071112 +DTEND;VALUE=DATE:20071113 +DTSTAMP:20090116T165552Z +UID:CSVConvert2e92834462c582d4f17624c11a32770f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20061113 +DTEND;VALUE=DATE:20061114 +DTSTAMP:20090116T165552Z +UID:CSVConvert2057d8eedaf501412f3266433b7a8c84 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20061106 +DTEND;VALUE=DATE:20061107 +DTSTAMP:20090116T165552Z +UID:CSVConverteeed7a601610d9d9d76ab830c340bbe1 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20071105 +DTEND;VALUE=DATE:20071106 +DTSTAMP:20090116T165552Z +UID:CSVConvert7b33556e7cff3c1f151d5f6e722169e6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080501 +DTEND;VALUE=DATE:20080502 +DTSTAMP:20090116T165552Z +UID:CSVConvertf5c82e619b6164a9d918ecd630b3c28e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060501 +DTEND;VALUE=DATE:20060502 +DTSTAMP:20090116T165552Z +UID:CSVConvert6ed7d9f5dcfbe490b298a60446679245 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070501 +DTEND;VALUE=DATE:20070502 +DTSTAMP:20090116T165552Z +UID:CSVConvert655ad818ab4cd40cdc11a5ed77102d50 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080602 +DTEND;VALUE=DATE:20080603 +DTSTAMP:20090116T165552Z +UID:CSVConvertccee5b7930969f9f92b56538229883d7 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070618 +DTEND;VALUE=DATE:20070619 +DTSTAMP:20090116T165552Z +UID:CSVConvert9cc1ce2967bce227863032119f1e6b02 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060626 +DTEND;VALUE=DATE:20060627 +DTSTAMP:20090116T165552Z +UID:CSVConvert6c496409f484672bc51557477772d5da +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060320 +DTEND;VALUE=DATE:20060321 +DTSTAMP:20090116T165552Z +UID:CSVConvert97fd4d6b760c7186b4f7b3b0ead7c2bb +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080324 +DTEND;VALUE=DATE:20080325 +DTSTAMP:20090116T165552Z +UID:CSVConvert97764d9959450b1399a30554e45933d6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070319 +DTEND;VALUE=DATE:20070320 +DTSTAMP:20090116T165552Z +UID:CSVConvert1b2a9b078edc2e607c26ebeb3befb30a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080107 +DTEND;VALUE=DATE:20080108 +DTSTAMP:20090116T165552Z +UID:CSVConvert9f90679a12e0717dcb73f0b8c1ec57a5 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070108 +DTEND;VALUE=DATE:20070109 +DTSTAMP:20090116T165552Z +UID:CSVConvert90ab01822c3373ececf24f915f9c103f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060109 +DTEND;VALUE=DATE:20060110 +DTSTAMP:20090116T165552Z +UID:CSVConvert3ab6ca7a7c251aa4169bf0d86a55bf8a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20061016 +DTEND;VALUE=DATE:20061017 +DTSTAMP:20090116T165552Z +UID:CSVConvertf69623fe98893862cd9ec7caf20be885 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20071015 +DTEND;VALUE=DATE:20071016 +DTSTAMP:20090116T165552Z +UID:CSVConvert283965de3565a88f09145a08a50a3e67 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080526 +DTEND;VALUE=DATE:20080527 +DTSTAMP:20090116T165552Z +UID:CSVConvertb1f6a585ef4a552351a97b10d745cbfd +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070611 +DTEND;VALUE=DATE:20070612 +DTSTAMP:20090116T165552Z +UID:CSVConvertad8dfb4e996a1157bede9e6a9442d985 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060619 +DTEND;VALUE=DATE:20060620 +DTSTAMP:20090116T165552Z +UID:CSVConvert4a81b08fed5292d9a1acb737904f71be +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060807 +DTEND;VALUE=DATE:20060808 +DTSTAMP:20090116T165552Z +UID:CSVConvertefc4ca3b628ccc5d26d8e4f34fe30f0b +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080807 +DTEND;VALUE=DATE:20080808 +DTSTAMP:20090116T165552Z +UID:CSVConvert2a274de8a29ab88c2f87bc2d18ee6c3f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070807 +DTEND;VALUE=DATE:20070808 +DTSTAMP:20090116T165552Z +UID:CSVConvert203568fcbd14bc5cd231f28c4d616c6e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070101 +DTEND;VALUE=DATE:20070102 +DTSTAMP:20090116T165552Z +UID:CSVConverta603c2ef5020b009534cf599c93d5bba +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080101 +DTEND;VALUE=DATE:20080102 +DTSTAMP:20090116T165552Z +UID:CSVConverta3fc613ac3524f9256457fe439ee2d9d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060821 +DTEND;VALUE=DATE:20060822 +DTSTAMP:20090116T165552Z +UID:CSVConvertd53f3b445fa925cbb72fe3398d59891f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080818 +DTEND;VALUE=DATE:20080819 +DTSTAMP:20090116T165552Z +UID:CSVConvert4d5f0efad6cc1c0abba0a56bb3f41dfe +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070820 +DTEND;VALUE=DATE:20070821 +DTSTAMP:20090116T165552Z +UID:CSVConvert3bb627832580e446e279cc250b530cb7 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080505 +DTEND;VALUE=DATE:20080506 +DTSTAMP:20090116T165552Z +UID:CSVConverteb182800b933d39102d6a947e4fbfa7b +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20070521 +DTEND;VALUE=DATE:20070522 +DTSTAMP:20090116T165552Z +UID:CSVConvert26caa49443b753892fbcc1e66d127177 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20060529 +DTEND;VALUE=DATE:20060530 +DTSTAMP:20090116T165552Z +UID:CSVConvert2016a000f1135fef15c1c30808fd9ee1 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165444Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +DTSTAMP:20090116T165552Z +UID:CSVConverte6229a5ba8c29b97317bb190e3f20073 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +DTSTAMP:20090116T165552Z +UID:CSVConvert223c83bf70cd495dcbbb8cec0e251224 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120702 +DTEND;VALUE=DATE:20120703 +DTSTAMP:20090116T165552Z +UID:CSVConverta28b21401a19dcda5d54e29c5051cb17 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100705 +DTEND;VALUE=DATE:20100706 +DTSTAMP:20090116T165552Z +UID:CSVConvert4f115a90fa1a6494853852af9a476402 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090629 +DTEND;VALUE=DATE:20090630 +DTSTAMP:20090116T165552Z +UID:CSVConvert07dee5f536a9bcf61449705162d1acbe +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +DTSTAMP:20090116T165552Z +UID:CSVConvert2c6bba3110fbcb5bad6eb9e71d66966f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20081225 +DTEND;VALUE=DATE:20081226 +DTSTAMP:20090116T165552Z +UID:CSVConvert1839585f0bcf7cd199ea67f217c229cc +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090409 +DTEND;VALUE=DATE:20090410 +DTSTAMP:20090116T165552Z +UID:CSVConvertf867847fe0160df0c9c663d6f46048cc +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100401 +DTEND;VALUE=DATE:20100402 +DTSTAMP:20090116T165552Z +UID:CSVConvertc0f92b85b22a0fa4fb988110d470d4dc +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20081208 +DTEND;VALUE=DATE:20081209 +DTSTAMP:20090116T165552Z +UID:CSVConvertcd0e43e54a979e5796ad0781d90242ff +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101208 +DTEND;VALUE=DATE:20101209 +DTSTAMP:20090116T165552Z +UID:CSVConvert5cf268eda1124f377015c0c08318e39b +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20091208 +DTEND;VALUE=DATE:20091209 +DTSTAMP:20090116T165552Z +UID:CSVConvert13dba2a1060b9ef0a535299f72438eb9 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090720 +DTEND;VALUE=DATE:20090721 +DTSTAMP:20090116T165552Z +UID:CSVConverta4236befe42b7fe48aa3bb2b1a0b95dd +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100720 +DTEND;VALUE=DATE:20100721 +DTSTAMP:20090116T165552Z +UID:CSVConvert5112d1f9fbdff0ec0841510181a3cc0d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20091116 +DTEND;VALUE=DATE:20091117 +DTSTAMP:20090116T165552Z +UID:CSVConvert4c470149e9ae9d6e669b833d0406f9b3 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20081117 +DTEND;VALUE=DATE:20081118 +DTSTAMP:20090116T165552Z +UID:CSVConvert1015a9e1d61e7137d066914225940635 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101101 +DTEND;VALUE=DATE:20101102 +DTSTAMP:20090116T165552Z +UID:CSVConvertec1854e038c3952cb28257cca8e19512 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20081103 +DTEND;VALUE=DATE:20081104 +DTSTAMP:20090116T165552Z +UID:CSVConvertd47b36d7befa759a998d3850e14c43ec +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20091102 +DTEND;VALUE=DATE:20091103 +DTSTAMP:20090116T165552Z +UID:CSVConvert5613387cfbd1b310abaac62887594d24 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:20100502 +DTSTAMP:20090116T165552Z +UID:CSVConvert29fae55aa072a76da00aaa607b05d81a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +DTSTAMP:20090116T165552Z +UID:CSVConvert10747a4336662c36eeaa4b4f2f3afc27 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090622 +DTEND;VALUE=DATE:20090623 +DTSTAMP:20090116T165552Z +UID:CSVConvert486126606f82470f6ace611bc48c1dc2 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100614 +DTEND;VALUE=DATE:20100615 +DTSTAMP:20090116T165552Z +UID:CSVConvert03b8b81c32d84b37efbfc1fb21c8ed6f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090323 +DTEND;VALUE=DATE:20090324 +DTSTAMP:20090116T165552Z +UID:CSVConvertdf7678511042f19813efcc9b0ff53e6c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100322 +DTEND;VALUE=DATE:20100323 +DTSTAMP:20090116T165552Z +UID:CSVConvert370920750b9989af15305dafa40c00a5 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100111 +DTEND;VALUE=DATE:20100112 +DTSTAMP:20090116T165552Z +UID:CSVConverteebac83945fa5fb8d63cabc72a901147 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090112 +DTEND;VALUE=DATE:20090113 +DTSTAMP:20090116T165552Z +UID:CSVConvertce0bab4e4b69c056b277f81aa071fa61 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101018 +DTEND;VALUE=DATE:20101019 +DTSTAMP:20090116T165552Z +UID:CSVConvertdc1fda3719d1c0cd497919e3012c444b +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20091012 +DTEND;VALUE=DATE:20091013 +DTSTAMP:20090116T165552Z +UID:CSVConvertd0f9e2d7286525389d0a5af786972dd3 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20081013 +DTEND;VALUE=DATE:20081014 +DTSTAMP:20090116T165552Z +UID:CSVConvert880013eb08a99f0cff1537a28d07f98a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090615 +DTEND;VALUE=DATE:20090616 +DTSTAMP:20090116T165552Z +UID:CSVConverta8518abc5d68bef68db06a4e1007af00 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130603 +DTEND;VALUE=DATE:20130604 +DTSTAMP:20090116T165552Z +UID:CSVConvert7893a39818ea2d7698b433635444bdc6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100607 +DTEND;VALUE=DATE:20100608 +DTSTAMP:20090116T165552Z +UID:CSVConvert704c25b3cdd5f3478971e3bd651274f5 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100807 +DTEND;VALUE=DATE:20100808 +DTSTAMP:20090116T165552Z +UID:CSVConvert92e1f061a2a1f5d632865576be7cc956 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090807 +DTEND;VALUE=DATE:20090808 +DTSTAMP:20090116T165552Z +UID:CSVConvert4f43e9ff0cf760d64685bbe48659f72e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +DTSTAMP:20090116T165552Z +UID:CSVConvert60ac7a58109fb514f176a7f521cd1f89 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +DTSTAMP:20090116T165552Z +UID:CSVConvert23838fb942a8dfac745a503bbd1f9835 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100816 +DTEND;VALUE=DATE:20100817 +DTSTAMP:20090116T165552Z +UID:CSVConvertc89414dde8cf9820c6ea56e038494b98 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090817 +DTEND;VALUE=DATE:20090818 +DTSTAMP:20090116T165552Z +UID:CSVConvert56bd8a1ea5987069050bf0e57ec0acf6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100517 +DTEND;VALUE=DATE:20100518 +DTSTAMP:20090116T165552Z +UID:CSVConvertc9a103d8ae4b961ae7be25655fdd2f44 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090525 +DTEND;VALUE=DATE:20090526 +DTSTAMP:20090116T165552Z +UID:CSVConvert0e6f19c38752b5cefd0d3f627567ff28 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165443Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +DTSTAMP:20090116T165552Z +UID:CSVConvertd536119c6c16b0cd6699e2bbe56088e9 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +DTSTAMP:20090116T165552Z +UID:CSVConvertc9be807495fa5cc5a447b58868c6510a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110704 +DTEND;VALUE=DATE:20110705 +DTSTAMP:20090116T165552Z +UID:CSVConvert8cc892c7cdfddc43beb046f14477454f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +DTSTAMP:20090116T165552Z +UID:CSVConvertca5dd9d5c2048d120a7b7756eb41f63d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111226 +DTSTAMP:20090116T165552Z +UID:CSVConvert8484254c4f443db57971a9b46a9f5f8b +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +DTSTAMP:20090116T165552Z +UID:CSVConvert0c3954433971a1320b451451fed375d0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130328 +DTEND;VALUE=DATE:20130329 +DTSTAMP:20090116T165552Z +UID:CSVConvertae9d7a71cce552f1d325bf5e931a64c0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120405 +DTEND;VALUE=DATE:20120406 +DTSTAMP:20090116T165552Z +UID:CSVConvert8e37e3238f551dac406e087628905199 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110421 +DTEND;VALUE=DATE:20110422 +DTSTAMP:20090116T165552Z +UID:CSVConvert556bba8771a182e10d9458cf6a7dc891 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121208 +DTEND;VALUE=DATE:20121209 +DTSTAMP:20090116T165552Z +UID:CSVConvertd893e9839f401b70a182b5fcb5f04dcc +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111208 +DTEND;VALUE=DATE:20111209 +DTSTAMP:20090116T165552Z +UID:CSVConvertae49bb48b4871773d0c92347e6460795 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110720 +DTEND;VALUE=DATE:20110721 +DTSTAMP:20090116T165552Z +UID:CSVConvertcbfbb73e0b40694ae10933d2404d4608 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150720 +DTEND;VALUE=DATE:20150721 +DTSTAMP:20090116T165552Z +UID:CSVConvert6367c1f50e019ecb4bc685f40ec36a1a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120720 +DTEND;VALUE=DATE:20120721 +DTSTAMP:20090116T165552Z +UID:CSVConvert07316c945e32ef7ea691187fa2d23e3a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111114 +DTEND;VALUE=DATE:20111115 +DTSTAMP:20090116T165552Z +UID:CSVConvertd720cd31aa76a4268753cec04ecf81b7 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121112 +DTEND;VALUE=DATE:20121113 +DTSTAMP:20090116T165552Z +UID:CSVConvert4283c073a8967e7baaab05ecab3283c8 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101115 +DTEND;VALUE=DATE:20101116 +DTSTAMP:20090116T165552Z +UID:CSVConvert125aeeed90a4371c494a872ad8ef88bc +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121105 +DTEND;VALUE=DATE:20121106 +DTSTAMP:20090116T165552Z +UID:CSVConvert99cd1edba4a374d76d340d66ba314fdd +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111107 +DTEND;VALUE=DATE:20111108 +DTSTAMP:20090116T165552Z +UID:CSVConvert726698b58452cb8b38739035566db62a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110501 +DTEND;VALUE=DATE:20110502 +DTSTAMP:20090116T165552Z +UID:CSVConvertf163a3f5ce74f94ce5a4f58c10b79813 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120501 +DTEND;VALUE=DATE:20120502 +DTSTAMP:20090116T165552Z +UID:CSVConvertd7807ac643d6a7cd3e196ab458bd8d76 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130501 +DTEND;VALUE=DATE:20130502 +DTSTAMP:20090116T165552Z +UID:CSVConvert2a25e5fb941986bfe7da10fcfa1757c4 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110704 +DTEND;VALUE=DATE:20110705 +DTSTAMP:20090116T165552Z +UID:CSVConvert67488d55a56d11182f0896bd434b0041 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120618 +DTEND;VALUE=DATE:20120619 +DTSTAMP:20090116T165552Z +UID:CSVConvert186faf9044281c44de6e72f699a1b2f7 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120319 +DTEND;VALUE=DATE:20120320 +DTSTAMP:20090116T165552Z +UID:CSVConvertf1bcd22abdd452c8549a295f3ebd3ea7 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110321 +DTEND;VALUE=DATE:20110322 +DTSTAMP:20090116T165552Z +UID:CSVConvertf0441aa1d87132ed053ed667fac44469 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120109 +DTEND;VALUE=DATE:20120110 +DTSTAMP:20090116T165552Z +UID:CSVConvertc9053d3eee2e705d1cb1b807a54ed01e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110110 +DTEND;VALUE=DATE:20110111 +DTSTAMP:20090116T165552Z +UID:CSVConvert5e5ba9539b8dfcc803d0e79011229877 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111017 +DTEND;VALUE=DATE:20111018 +DTSTAMP:20090116T165552Z +UID:CSVConverte1f269e2eb241330803753afc44c0dd5 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121015 +DTEND;VALUE=DATE:20121016 +DTSTAMP:20090116T165552Z +UID:CSVConvert7c40c5ef3840822228abd4a4ff4685a7 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110627 +DTEND;VALUE=DATE:20110628 +DTSTAMP:20090116T165552Z +UID:CSVConvert64c9fcf6de37071970d7229a84532d33 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120611 +DTEND;VALUE=DATE:20120612 +DTSTAMP:20090116T165552Z +UID:CSVConvert1270122c2275c63aeb656d3cc753e6b9 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120807 +DTEND;VALUE=DATE:20120808 +DTSTAMP:20090116T165552Z +UID:CSVConverta6c58eebc89cacf64f4ea8d5e17bf210 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110807 +DTEND;VALUE=DATE:20110808 +DTSTAMP:20090116T165552Z +UID:CSVConvert18ee4938a4ff7bbfed35b57bc85cf70a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120101 +DTEND;VALUE=DATE:20120102 +DTSTAMP:20090116T165552Z +UID:CSVConvert9705ab4079e79f42bc261f260b737ff1 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130101 +DTEND;VALUE=DATE:20130102 +DTSTAMP:20090116T165552Z +UID:CSVConvert94030633a6d5eef322079145adad1e27 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:20110102 +DTSTAMP:20090116T165552Z +UID:CSVConvert46506bf1b01d69d8d2b2853335a4e052 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120820 +DTEND;VALUE=DATE:20120821 +DTSTAMP:20090116T165552Z +UID:CSVConvertc7e6f1814d5487900f96ea9399b37e10 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110815 +DTEND;VALUE=DATE:20110816 +DTSTAMP:20090116T165552Z +UID:CSVConvert59f6c530e2453e8e1ff23f81386727c0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110606 +DTEND;VALUE=DATE:20110607 +DTSTAMP:20090116T165552Z +UID:CSVConvertd23a0bb407283cce6beac64339348b57 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120521 +DTEND;VALUE=DATE:20120522 +DTSTAMP:20090116T165552Z +UID:CSVConvert8767f3ef004d757f5c9949190c87dc09 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165442Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +DTSTAMP:20090116T165552Z +UID:CSVConvertdaa955f6ed100b4437a31c07a0459704 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +DTSTAMP:20090116T165552Z +UID:CSVConvert84595dd5d90c0218a35a4b42b05d574d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +DTSTAMP:20090116T165552Z +UID:CSVConvert4920bd7498a035978bd7cf4967ae2e5d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140630 +DTEND;VALUE=DATE:20140701 +DTSTAMP:20090116T165552Z +UID:CSVConvertac4c664c768e9df2ff49b9eb2813c5d0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130701 +DTEND;VALUE=DATE:20130702 +DTSTAMP:20090116T165552Z +UID:CSVConvert80aca7f98ba3e3e4c7d967df6f6034d0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150629 +DTEND;VALUE=DATE:20150630 +DTSTAMP:20090116T165552Z +UID:CSVConvert3ff6decd554dbed752e46125c6bccd6a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20131225 +DTEND;VALUE=DATE:20131226 +DTSTAMP:20090116T165552Z +UID:CSVConvert4c267c634ea7b610828a7bb835b57236 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20141225 +DTEND;VALUE=DATE:20141226 +DTSTAMP:20090116T165552Z +UID:CSVConvert307ceb4869c033380afbb6b4836e2e69 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140417 +DTEND;VALUE=DATE:20140418 +DTSTAMP:20090116T165552Z +UID:CSVConvertec91cf172449eed593e1d0b66067c8f3 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150402 +DTEND;VALUE=DATE:20150403 +DTSTAMP:20090116T165552Z +UID:CSVConvert16e631c7a170b65ee8c72f591b4919f6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20131208 +DTEND;VALUE=DATE:20131209 +DTSTAMP:20090116T165552Z +UID:CSVConvertca581e7dac4aa24d60ad272346ed94cc +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20141208 +DTEND;VALUE=DATE:20141209 +DTSTAMP:20090116T165552Z +UID:CSVConvert9de6d3befd4882573e53dc9902f7cda0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140720 +DTEND;VALUE=DATE:20140721 +DTSTAMP:20090116T165552Z +UID:CSVConvert6f04b68cf0da3d36e779789756ca9741 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130720 +DTEND;VALUE=DATE:20130721 +DTSTAMP:20090116T165552Z +UID:CSVConvert38b7e4a42d6e3b140329567176fe3cf0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20131111 +DTEND;VALUE=DATE:20131112 +DTSTAMP:20090116T165552Z +UID:CSVConvertf93e36847447e8df911091f76df62120 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20141117 +DTEND;VALUE=DATE:20141118 +DTSTAMP:20090116T165552Z +UID:CSVConvert82158aad92280b782f454e133b21dc01 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20141103 +DTEND;VALUE=DATE:20141104 +DTSTAMP:20090116T165552Z +UID:CSVConvertcaaf778d8641c5459a28a18113b14445 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20131104 +DTEND;VALUE=DATE:20131105 +DTSTAMP:20090116T165552Z +UID:CSVConvert63891c2728e1fc7e97bfdf5931e9ee3c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150501 +DTEND;VALUE=DATE:20150502 +DTSTAMP:20090116T165552Z +UID:CSVConvertd154c9c48ec1068b2d4c2da7440ccfa2 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140501 +DTEND;VALUE=DATE:20140502 +DTSTAMP:20090116T165552Z +UID:CSVConvert7eb21999e91066a672906b704c39225e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140630 +DTEND;VALUE=DATE:20140701 +DTSTAMP:20090116T165552Z +UID:CSVConvertf5ead4825d285ea3063b2eb19f1842e8 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150615 +DTEND;VALUE=DATE:20150616 +DTSTAMP:20090116T165552Z +UID:CSVConvertdc5aee2856d34729c1e4a7a366f02f55 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130610 +DTEND;VALUE=DATE:20130611 +DTSTAMP:20090116T165552Z +UID:CSVConvert5cf8a96a11ca7648ede97e4b6e39f1eb +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130325 +DTEND;VALUE=DATE:20130326 +DTSTAMP:20090116T165552Z +UID:CSVConverted5e40d1c39f7f4c322f10faae4ccef9 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150323 +DTEND;VALUE=DATE:20150324 +DTSTAMP:20090116T165552Z +UID:CSVConvert8f6868cb504f674af82227002b0424aa +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140324 +DTEND;VALUE=DATE:20140325 +DTSTAMP:20090116T165552Z +UID:CSVConvert026925f4779826107b82210a27998679 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150112 +DTEND;VALUE=DATE:20150113 +DTSTAMP:20090116T165552Z +UID:CSVConvertc5ff76460bffe160800fc86054a12f91 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140106 +DTEND;VALUE=DATE:20140107 +DTSTAMP:20090116T165552Z +UID:CSVConvert58305594ed4ee34f667cf82f894ed31d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130107 +DTEND;VALUE=DATE:20130108 +DTSTAMP:20090116T165552Z +UID:CSVConvert3f932f1a15c71f81e121c7ff1506c7db +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20141013 +DTEND;VALUE=DATE:20141014 +DTSTAMP:20090116T165552Z +UID:CSVConvertd7697036ac3f331c22edefe11bcde6c1 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20131014 +DTEND;VALUE=DATE:20131015 +DTSTAMP:20090116T165552Z +UID:CSVConvert1a84cb9e8002606f06d208f976b4728b +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20151012 +DTEND;VALUE=DATE:20151013 +DTSTAMP:20090116T165552Z +UID:CSVConvert0cd3718eb85d91e5c6ca0da326c4594c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140623 +DTEND;VALUE=DATE:20140624 +DTSTAMP:20090116T165552Z +UID:CSVConvertee6dfd1854ea5da9074dce34e9e9716f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150608 +DTEND;VALUE=DATE:20150609 +DTSTAMP:20090116T165552Z +UID:CSVConvertd081a38c3b1b9e6aacc17da28c255b6e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140807 +DTEND;VALUE=DATE:20140808 +DTSTAMP:20090116T165552Z +UID:CSVConvertd6f6685403284ab54eeb73bd99272885 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130807 +DTEND;VALUE=DATE:20130808 +DTSTAMP:20090116T165552Z +UID:CSVConvertd2e0fd2bf7b3dee587c69e82a842878c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150807 +DTEND;VALUE=DATE:20150808 +DTSTAMP:20090116T165552Z +UID:CSVConvertc0b33d3820a23abec9d900103be5f89a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140101 +DTEND;VALUE=DATE:20140102 +DTSTAMP:20090116T165552Z +UID:CSVConvertbc1b798f3bb393e096fa32b4fd8db241 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150101 +DTEND;VALUE=DATE:20150102 +DTSTAMP:20090116T165552Z +UID:CSVConverta3e08639f942976aefe33dad1cb68bd6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130819 +DTEND;VALUE=DATE:20130820 +DTSTAMP:20090116T165552Z +UID:CSVConvert723e9e3493283d1e5a31cbe378e66319 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140818 +DTEND;VALUE=DATE:20140819 +DTSTAMP:20090116T165552Z +UID:CSVConvert6933a7290c4fc080cf36b814a54d1535 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140602 +DTEND;VALUE=DATE:20140603 +DTSTAMP:20090116T165552Z +UID:CSVConvert702cf2b00df4e97fcbb84272abac6801 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130513 +DTEND;VALUE=DATE:20130514 +DTSTAMP:20090116T165552Z +UID:CSVConvert6dcacbd7c05577e42cfed2a5de26753f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150518 +DTEND;VALUE=DATE:20150519 +DTSTAMP:20090116T165552Z +UID:CSVConvert23b102a7fcd45cff712ba229318109cc +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165441Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160325 +DTEND;VALUE=DATE:20160326 +DTSTAMP:20090116T165552Z +UID:CSVConvert996df680433bfc7ecaac50770b5b30e8 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170414 +DTEND;VALUE=DATE:20170415 +DTSTAMP:20090116T165552Z +UID:CSVConvert6566563f919191389da6ccd5745942cb +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170703 +DTEND;VALUE=DATE:20170704 +DTSTAMP:20090116T165552Z +UID:CSVConvertcfaa8189e5cc7d0c8d927459ec536d1e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160704 +DTEND;VALUE=DATE:20160705 +DTSTAMP:20090116T165552Z +UID:CSVConvert984bea85cb916601c2a033448faa9442 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20151225 +DTEND;VALUE=DATE:20151226 +DTSTAMP:20090116T165552Z +UID:CSVConvertc743db71dfcf10a070d2128ba52a4a30 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20161225 +DTEND;VALUE=DATE:20161226 +DTSTAMP:20090116T165552Z +UID:CSVConvert307869cc54307ab967c029fceb4003cd +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160324 +DTEND;VALUE=DATE:20160325 +DTSTAMP:20090116T165552Z +UID:CSVConvert73f9422efeb381865c9fafb6c3cc3160 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170413 +DTEND;VALUE=DATE:20170414 +DTSTAMP:20090116T165552Z +UID:CSVConvert5486d4b7174707cd5bea1d9b3e294b7d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20161208 +DTEND;VALUE=DATE:20161209 +DTSTAMP:20090116T165552Z +UID:CSVConvert76bc840300d1f041e423577f0cbaf390 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20151208 +DTEND;VALUE=DATE:20151209 +DTSTAMP:20090116T165552Z +UID:CSVConvert1018a5380fb8c9385d0bd5ff2dbf66c4 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160720 +DTEND;VALUE=DATE:20160721 +DTSTAMP:20090116T165552Z +UID:CSVConvert56fab33e4f8cbec5fe66c35ed258c7f4 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170720 +DTEND;VALUE=DATE:20170721 +DTSTAMP:20090116T165552Z +UID:CSVConvert4dfc9561595edd561fc871532b180401 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20171113 +DTEND;VALUE=DATE:20171114 +DTSTAMP:20090116T165552Z +UID:CSVConvertdd2d164d82e0f52d1a017969e839a533 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20151116 +DTEND;VALUE=DATE:20151117 +DTSTAMP:20090116T165552Z +UID:CSVConvert0c1897fb0645f99271dcf2a1de5fb58c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20161114 +DTEND;VALUE=DATE:20161115 +DTSTAMP:20090116T165552Z +UID:CSVConvert09c2444b1055470a248dc8ddf4d5bc08 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20151102 +DTEND;VALUE=DATE:20151103 +DTSTAMP:20090116T165552Z +UID:CSVConvertc8665204b9d3da5b1ce43e1c253e9f2f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20171106 +DTEND;VALUE=DATE:20171107 +DTSTAMP:20090116T165552Z +UID:CSVConvert82475030b75ad09dc81b573ce34b9306 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20161107 +DTEND;VALUE=DATE:20161108 +DTSTAMP:20090116T165552Z +UID:CSVConvert0b65fa96454bac03ce609d43c269f9b8 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160501 +DTEND;VALUE=DATE:20160502 +DTSTAMP:20090116T165552Z +UID:CSVConvert518d2b24458f48d890f77e1ace95384c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170501 +DTEND;VALUE=DATE:20170502 +DTSTAMP:20090116T165552Z +UID:CSVConvert0a6757ea15e3eb7f5aa307eb6f1b1877 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160606 +DTEND;VALUE=DATE:20160607 +DTSTAMP:20090116T165552Z +UID:CSVConvert52f455703edb5198abd1e7b3133a2dd6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170626 +DTEND;VALUE=DATE:20170627 +DTSTAMP:20090116T165552Z +UID:CSVConvert3e4c40d3fc8bd03a99c8ebd531533059 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170320 +DTEND;VALUE=DATE:20170321 +DTSTAMP:20090116T165552Z +UID:CSVConvertec357305693c41fb5b0836a116ebff74 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160321 +DTEND;VALUE=DATE:20160322 +DTSTAMP:20090116T165552Z +UID:CSVConvert8e4a7b8458165f5259d608a9d37de447 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180108 +DTEND;VALUE=DATE:20180109 +DTSTAMP:20090116T165552Z +UID:CSVConverta0da9d611ed600a8e1c1711802e4aa57 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170109 +DTEND;VALUE=DATE:20170110 +DTSTAMP:20090116T165552Z +UID:CSVConvert823569820c4d6be6cd570db834839393 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160111 +DTEND;VALUE=DATE:20160112 +DTSTAMP:20090116T165552Z +UID:CSVConvert30724b6ecf679944a3ce74e788a978b6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20171016 +DTEND;VALUE=DATE:20171017 +DTSTAMP:20090116T165552Z +UID:CSVConvert7a0769784501a83fc11a4f5db8f208a6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20161017 +DTEND;VALUE=DATE:20161018 +DTSTAMP:20090116T165552Z +UID:CSVConvert2eee4038d7fda067793f6d55db401629 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170619 +DTEND;VALUE=DATE:20170620 +DTSTAMP:20090116T165552Z +UID:CSVConvertdde9c3df2904fa2ad0c43e555eb34597 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160530 +DTEND;VALUE=DATE:20160531 +DTSTAMP:20090116T165552Z +UID:CSVConvert9d0c2235c705e41dcc117c2fad011d1f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170807 +DTEND;VALUE=DATE:20170808 +DTSTAMP:20090116T165552Z +UID:CSVConvertf53d60021c304b8225fb41f75513805f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160807 +DTEND;VALUE=DATE:20160808 +DTSTAMP:20090116T165552Z +UID:CSVConvert369397fc5d39972b93400fb9e7aca7e6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160101 +DTEND;VALUE=DATE:20160102 +DTSTAMP:20090116T165552Z +UID:CSVConvert67595c512b79a3cc583db0eccc7539c3 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170101 +DTEND;VALUE=DATE:20170102 +DTSTAMP:20090116T165552Z +UID:CSVConvert0d5fa7b4baaa7e8888bcd7fb529f677b +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160815 +DTEND;VALUE=DATE:20160816 +DTSTAMP:20090116T165552Z +UID:CSVConvertc942a120014dcb4d6e1cbea7db769f6f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150817 +DTEND;VALUE=DATE:20150818 +DTSTAMP:20090116T165552Z +UID:CSVConvert765118d4ebfd3e98ddadd8820f7ae7bc +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170821 +DTEND;VALUE=DATE:20170822 +DTSTAMP:20090116T165552Z +UID:CSVConvert39faafc8cc5ad787f40d55a0d193436e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170529 +DTEND;VALUE=DATE:20170530 +DTSTAMP:20090116T165552Z +UID:CSVConvertbf4b27aac0de2607c9dd7556a61ebfd0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160509 +DTEND;VALUE=DATE:20160510 +DTSTAMP:20090116T165552Z +UID:CSVConvert7b217c71b571121b4a724079c5607ce6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165440Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190419 +DTEND;VALUE=DATE:20190420 +DTSTAMP:20090116T165552Z +UID:CSVConverta67bd3344509cf6f51d534eb14cca99f +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180330 +DTEND;VALUE=DATE:20180331 +DTSTAMP:20090116T165552Z +UID:CSVConvert298cecb8493785b9745676ceadc74bee +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190701 +DTEND;VALUE=DATE:20190702 +DTSTAMP:20090116T165552Z +UID:CSVConvertfe463f1b492006fd7b2553eb214aad73 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180702 +DTEND;VALUE=DATE:20180703 +DTSTAMP:20090116T165552Z +UID:CSVConvert1a94183904b2853478e0ce03e702e55d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20181225 +DTEND;VALUE=DATE:20181226 +DTSTAMP:20090116T165552Z +UID:CSVConverte269e7ddf83593a62ca49cf542a4509c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20171225 +DTEND;VALUE=DATE:20171226 +DTSTAMP:20090116T165552Z +UID:CSVConvert3677c279b533a7439ba6bbaddd16e89c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190418 +DTEND;VALUE=DATE:20190419 +DTSTAMP:20090116T165552Z +UID:CSVConvertea9dc30d04932ffc4d0a6a1ef3fb62ca +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180329 +DTEND;VALUE=DATE:20180330 +DTSTAMP:20090116T165552Z +UID:CSVConvert07ae549461871cad092346c236251711 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20171208 +DTEND;VALUE=DATE:20171209 +DTSTAMP:20090116T165552Z +UID:CSVConvertbfceff87efe562ce25b67a7de6f01b2d +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20181208 +DTEND;VALUE=DATE:20181209 +DTSTAMP:20090116T165552Z +UID:CSVConvert18dcf60c7b174cfbfbee27480214a289 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180720 +DTEND;VALUE=DATE:20180721 +DTSTAMP:20090116T165552Z +UID:CSVConvert983b5bb7471a6910b28e37bcfcbd5dd7 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190720 +DTEND;VALUE=DATE:20190721 +DTSTAMP:20090116T165552Z +UID:CSVConvert6828b3e814e928c38c327277d332b8f9 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20181112 +DTEND;VALUE=DATE:20181113 +DTSTAMP:20090116T165552Z +UID:CSVConvertd418db92aaa3dd1f8b11c46a3fe8acaa +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20181105 +DTEND;VALUE=DATE:20181106 +DTSTAMP:20090116T165552Z +UID:CSVConvert87b09527cd8ddf415818711bc78b0916 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190501 +DTEND;VALUE=DATE:20190502 +DTSTAMP:20090116T165552Z +UID:CSVConvertc6185b37746f29b4d40c5658e21e4517 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180501 +DTEND;VALUE=DATE:20180502 +DTSTAMP:20090116T165552Z +UID:CSVConvert5b77b30727e99afd479d318bdcb96315 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180611 +DTEND;VALUE=DATE:20180612 +DTSTAMP:20090116T165552Z +UID:CSVConvert90f24591267cd778429eec70a9acb25e +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190701 +DTEND;VALUE=DATE:20190702 +DTSTAMP:20090116T165552Z +UID:CSVConvert7f4cce41b440b8da4f11ec2554cbd5ac +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180319 +DTEND;VALUE=DATE:20180320 +DTSTAMP:20090116T165552Z +UID:CSVConvertf35963ca4a0399b4e635cb07775662d7 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190325 +DTEND;VALUE=DATE:20190326 +DTSTAMP:20090116T165552Z +UID:CSVConverte54b00fc2be9bdbf66693fa74a19f4d0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190107 +DTEND;VALUE=DATE:20190108 +DTSTAMP:20090116T165552Z +UID:CSVConvert6b38770238b6dad3b78005594e3376e5 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20181015 +DTEND;VALUE=DATE:20181016 +DTSTAMP:20090116T165552Z +UID:CSVConvertd2ed3fbef51f4f2e61f9bff961c9bbb4 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190624 +DTEND;VALUE=DATE:20190625 +DTSTAMP:20090116T165552Z +UID:CSVConverte81724245beb4ce4c031a1399d8ca669 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180604 +DTEND;VALUE=DATE:20180605 +DTSTAMP:20090116T165552Z +UID:CSVConverte20807141c3176d14665f45f95880e5a +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180807 +DTEND;VALUE=DATE:20180808 +DTSTAMP:20090116T165552Z +UID:CSVConvertc75368f1f941e4698a389c42fac429d7 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180101 +DTEND;VALUE=DATE:20180102 +DTSTAMP:20090116T165552Z +UID:CSVConvert6a34c84d1933c89db0661b286aa405e0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190101 +DTEND;VALUE=DATE:20190102 +DTSTAMP:20090116T165552Z +UID:CSVConvert170e75ed1b540ec9631639f5a4a88bb0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180820 +DTEND;VALUE=DATE:20180821 +DTSTAMP:20090116T165552Z +UID:CSVConvert1b6a1d25e8ab69439689177c3dba46d5 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180514 +DTEND;VALUE=DATE:20180515 +DTSTAMP:20090116T165552Z +UID:CSVConvert8f0597d7e11e7812dcbb4d969c986779 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190603 +DTEND;VALUE=DATE:20190604 +DTSTAMP:20090116T165552Z +UID:CSVConvert1b33034d29d287b6031f055ad5f4ba69 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165439Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200410 +DTEND;VALUE=DATE:20200411 +DTSTAMP:20090116T165552Z +UID:CSVConvert64d82ec852a1fa9928f718fcaa3376e8 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Viernes Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200629 +DTEND;VALUE=DATE:20200630 +DTSTAMP:20090116T165552Z +UID:CSVConvert3e21c5944eeba04aa45499e4f60f5a14 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:San Pedro y San Pablo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20191225 +DTEND;VALUE=DATE:20191226 +DTSTAMP:20090116T165552Z +UID:CSVConvert67f2460b67c527cb5cef4a85cea00655 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20201225 +DTEND;VALUE=DATE:20201226 +DTSTAMP:20090116T165552Z +UID:CSVConvert5865bac972d588432b44e5ee3f74e470 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Navidad +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200409 +DTEND;VALUE=DATE:20200410 +DTSTAMP:20090116T165552Z +UID:CSVConvert0d4d452c4a60390a7644db9bb0538e88 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Jueves Santo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20191208 +DTEND;VALUE=DATE:20191209 +DTSTAMP:20090116T165552Z +UID:CSVConvertc4b33f047366f416cc55e34acc1a6fd2 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20201208 +DTEND;VALUE=DATE:20201209 +DTSTAMP:20090116T165552Z +UID:CSVConvert1450a348f8874c15caa786fae57c5871 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Inmaculada concepción +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200720 +DTEND;VALUE=DATE:20200721 +DTSTAMP:20090116T165552Z +UID:CSVConvert850561a59664ea3d11fcd228555e6410 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia nacional +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20191111 +DTEND;VALUE=DATE:20191112 +DTSTAMP:20090116T165552Z +UID:CSVConvertfe523a12a44f58daa7c947d1cc9f83f4 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20201116 +DTEND;VALUE=DATE:20201117 +DTSTAMP:20090116T165552Z +UID:CSVConvert618e3d9ef9871b873865ae6fdc2555f6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Independencia de Cartagena +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20201102 +DTEND;VALUE=DATE:20201103 +DTSTAMP:20090116T165552Z +UID:CSVConvertbbc6f01f5c707864824df830a21b1f71 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20191104 +DTEND;VALUE=DATE:20191105 +DTSTAMP:20090116T165552Z +UID:CSVConvert5e3c7d7fcc69dba348fc0d9a88fb5729 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Fiesta de todos los santos +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200501 +DTEND;VALUE=DATE:20200502 +DTSTAMP:20090116T165552Z +UID:CSVConvert0f788b615acea7edffc7a070ddcd2592 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del trabajo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200622 +DTEND;VALUE=DATE:20200623 +DTSTAMP:20090116T165552Z +UID:CSVConvert38bc587271deeacb2ac104cc7e818914 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día del Sagrado Corazón +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200323 +DTEND;VALUE=DATE:20200324 +DTSTAMP:20090116T165552Z +UID:CSVConvertd2e0e0c1fcfad2bc1b6b4371cd9f1f58 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de San José +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200106 +DTEND;VALUE=DATE:20200107 +DTSTAMP:20090116T165552Z +UID:CSVConvertc500d9a19f89174979bc367832078045 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de los Reyes +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20191014 +DTEND;VALUE=DATE:20191015 +DTSTAMP:20090116T165552Z +UID:CSVConvertfd619a29361f5106b3e152ea6f645474 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20201012 +DTEND;VALUE=DATE:20201013 +DTSTAMP:20090116T165552Z +UID:CSVConvertaeccb69e5258d636a92729558f6a020b +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Día de la raza +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200615 +DTEND;VALUE=DATE:20200616 +DTSTAMP:20090116T165552Z +UID:CSVConvertda3e8d3e984a9a53fe75d64c07eb96e0 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Corpus Christi +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190807 +DTEND;VALUE=DATE:20190808 +DTSTAMP:20090116T165552Z +UID:CSVConvertbedce1d29fc7952a9a6235c8fe3246e1 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200807 +DTEND;VALUE=DATE:20200808 +DTSTAMP:20090116T165552Z +UID:CSVConvert5fd8b02f60f29eae194f6847a8b72ea5 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Batalla de Boyacá +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200101 +DTEND;VALUE=DATE:20200102 +DTSTAMP:20090116T165552Z +UID:CSVConvert6430b2b5f4b5c1134dd939b4d0c8cb4c +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Año nuevo +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190819 +DTEND;VALUE=DATE:20190820 +DTSTAMP:20090116T165552Z +UID:CSVConvert3c14f20e219a66a7381809bad52b3888 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200817 +DTEND;VALUE=DATE:20200818 +DTSTAMP:20090116T165552Z +UID:CSVConvert39d992e38528ce85abfce1eaa70401a6 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Asunción de la Virgen +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200525 +DTEND;VALUE=DATE:20200526 +DTSTAMP:20090116T165552Z +UID:CSVConvert9c174384039383baa42a293400aa8ae1 +CLASS:PUBLIC +CREATED:19000101T120000Z +DESCRIPTION: +LAST-MODIFIED:20090116T165438Z +LOCATION: +SEQUENCE:0 +SUMMARY:Ascensión de Jesús +TRANSP:OPAQUE +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/CostaRicaHolidays.ics b/media/caldata/CostaRicaHolidays.ics new file mode 100644 index 00000000000..41ad22e458d --- /dev/null +++ b/media/caldata/CostaRicaHolidays.ics @@ -0,0 +1,310 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20120704T160759Z +LAST-MODIFIED:20120704T160820Z +DTSTAMP:20120704T160820Z +UID:811d534c-3fef-4297-819d-090a80b12992 +SUMMARY:Jueves Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120405 +DTEND;VALUE=DATE:20120406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T160822Z +LAST-MODIFIED:20120704T160836Z +DTSTAMP:20120704T160836Z +UID:34af36e5-6937-40ea-8f4f-1930af81a823 +SUMMARY:Viernes Sando +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161254Z +LAST-MODIFIED:20120704T161315Z +DTSTAMP:20120704T161315Z +UID:959a46ab-c34f-498d-9f81-7d79072acef7 +SUMMARY:Jueves Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130328 +DTEND;VALUE=DATE:20130329 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161317Z +LAST-MODIFIED:20120704T161331Z +DTSTAMP:20120704T161331Z +UID:1c91d0a7-3b3e-4205-821f-3a5a6322622e +SUMMARY:Viernes Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161355Z +LAST-MODIFIED:20120704T161414Z +DTSTAMP:20120704T161414Z +UID:27109f34-76a4-43f1-899b-9f24eeb326fc +SUMMARY:Jueves Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140417 +DTEND;VALUE=DATE:20140418 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161416Z +LAST-MODIFIED:20120704T161431Z +DTSTAMP:20120704T161431Z +UID:67196af7-c9ec-427a-b554-738f493c3042 +SUMMARY:Viernes Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161453Z +LAST-MODIFIED:20120704T161510Z +DTSTAMP:20120704T161510Z +UID:b3ccf964-f655-44af-b042-c145b02aec71 +SUMMARY:Jueves Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150402 +DTEND;VALUE=DATE:20150403 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161512Z +LAST-MODIFIED:20120704T161528Z +DTSTAMP:20120704T161528Z +UID:e8bb89f7-cca9-438a-82a7-d3331db6ddb6 +SUMMARY:Viernes Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161603Z +LAST-MODIFIED:20120704T161625Z +DTSTAMP:20120704T161625Z +UID:0a2970c8-85e9-4871-a871-37d29916d2f5 +SUMMARY:Jueves Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160324 +DTEND;VALUE=DATE:20160325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161627Z +LAST-MODIFIED:20120704T161640Z +DTSTAMP:20120704T161640Z +UID:2e532a75-c664-4a3b-9a8f-9698223ddf26 +SUMMARY:Viernes Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160325 +DTEND;VALUE=DATE:20160326 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161708Z +LAST-MODIFIED:20120704T161721Z +DTSTAMP:20120704T161721Z +UID:ec4e9f22-b528-4b04-89f6-ee0d8ae00fb6 +SUMMARY:Jueves Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170413 +DTEND;VALUE=DATE:20170414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161723Z +LAST-MODIFIED:20120704T161740Z +DTSTAMP:20120704T161740Z +UID:409a5bb2-d2c2-4bad-8887-b15a33e45aa6 +SUMMARY:Viernes Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170414 +DTEND;VALUE=DATE:20170415 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161809Z +LAST-MODIFIED:20120704T161821Z +DTSTAMP:20120704T161821Z +UID:3aa5aac4-4833-43fa-b352-fd3a6f043db8 +SUMMARY:Jueves Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180329 +DTEND;VALUE=DATE:20180330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161823Z +LAST-MODIFIED:20120704T161842Z +DTSTAMP:20120704T161842Z +UID:ef1205e4-6bc6-4354-bc34-a418cd220911 +SUMMARY:Viernes Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180330 +DTEND;VALUE=DATE:20180331 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161905Z +LAST-MODIFIED:20120704T161921Z +DTSTAMP:20120704T161921Z +UID:f854ae7e-6cd0-49db-9ffc-06f32c1497cf +SUMMARY:Jueves Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190418 +DTEND;VALUE=DATE:20190419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161923Z +LAST-MODIFIED:20120704T161937Z +DTSTAMP:20120704T161937Z +UID:43a09ed6-6d36-483d-b4f4-66bdb48a6a61 +SUMMARY:Viernes Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190419 +DTEND;VALUE=DATE:20190420 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T161953Z +LAST-MODIFIED:20120704T162011Z +DTSTAMP:20120704T162011Z +UID:07131c40-1c6e-49b4-9ce7-ed2db657ce3c +SUMMARY:Jueves Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200409 +DTEND;VALUE=DATE:20200410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T162013Z +LAST-MODIFIED:20120704T162024Z +DTSTAMP:20120704T162024Z +UID:d38d2b57-b330-4ae2-a03b-b60b3371f7fa +SUMMARY:Viernes Santo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200410 +DTEND;VALUE=DATE:20200411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T155657Z +LAST-MODIFIED:20120704T155753Z +DTSTAMP:20120704T155753Z +UID:80490751-44e5-4da1-87f2-9d0e2057f261 +SUMMARY:Año Nuevo +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120101 +DTEND;VALUE=DATE:20120102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T155808Z +LAST-MODIFIED:20120704T155834Z +DTSTAMP:20120704T155834Z +UID:25194f2f-f56f-4860-99db-e6207e8e48c2 +SUMMARY:Dia de Juan Santamaria +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120411 +DTEND;VALUE=DATE:20120412 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T155924Z +LAST-MODIFIED:20120704T155956Z +DTSTAMP:20120704T155956Z +UID:b0e0d518-04d6-4929-98d8-517e27102caa +SUMMARY:Dia Internacional del Trabajo +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120501 +DTEND;VALUE=DATE:20120502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T160020Z +LAST-MODIFIED:20120704T160049Z +DTSTAMP:20120704T160049Z +UID:35d62677-c7c0-4eb0-9f31-407c543b456d +SUMMARY:Anexion del Partido de Nicoya a Costa Rica +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120725 +DTEND;VALUE=DATE:20120726 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T160114Z +LAST-MODIFIED:20120704T160134Z +DTSTAMP:20120704T160134Z +UID:d08b0215-01fd-4bce-b923-d389eec1bd9a +SUMMARY:Dia de la Madre +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120815 +DTEND;VALUE=DATE:20120816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T160155Z +LAST-MODIFIED:20120704T160219Z +DTSTAMP:20120704T160219Z +UID:b9f85e6d-b411-44e3-b892-ca38698be9fe +SUMMARY:Dia de la Independencia de Costa Rica +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120915 +DTEND;VALUE=DATE:20120916 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T160237Z +LAST-MODIFIED:20120704T160257Z +DTSTAMP:20120704T160257Z +UID:fd4a62fc-d4d5-4e33-96be-59c66cf3425b +SUMMARY:Natividad de Jesucristo +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T160345Z +LAST-MODIFIED:20120704T160409Z +DTSTAMP:20120704T160409Z +UID:7fe35c35-3005-4a7e-803b-5d3f4f4c5640 +SUMMARY:Dia de la Virgen de Los Angeles +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120802 +DTEND;VALUE=DATE:20120803 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120704T160421Z +LAST-MODIFIED:20120704T160439Z +DTSTAMP:20120704T160439Z +UID:93b722c5-453b-44f8-891a-38f0d9a17eb7 +SUMMARY:Dia de las Culturas +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121012 +DTEND;VALUE=DATE:20121013 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/CroatiaHolidays.ics b/media/caldata/CroatiaHolidays.ics new file mode 100644 index 00000000000..5746f4204c1 --- /dev/null +++ b/media/caldata/CroatiaHolidays.ics @@ -0,0 +1,409 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20090701T090536Z +LAST-MODIFIED:20090701T090709Z +DTSTAMP:20090701T090536Z +UID:3450fd11-5db0-4890-972a-aaa5e5c685df +SUMMARY:Uskrs +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090711Z +LAST-MODIFIED:20090701T090731Z +DTSTAMP:20090701T090711Z +UID:897fa1ae-4725-443d-a8c6-af0010b55bca +SUMMARY:Uskrsni ponedjeljak +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090805Z +LAST-MODIFIED:20090701T090843Z +DTSTAMP:20090701T090805Z +UID:e7f91b9d-4ccf-47f7-95ab-c3e4ccd8a17c +SUMMARY:Tijelovo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090611 +DTEND;VALUE=DATE:20090612 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090909Z +LAST-MODIFIED:20090701T090913Z +DTSTAMP:20090701T090909Z +UID:02e522e4-c373-4f61-b10f-009dd2399b56 +SUMMARY:Dan državnosti +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090625 +DTEND;VALUE=DATE:20090626 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T091312Z +LAST-MODIFIED:20090701T091320Z +DTSTAMP:20090701T091312Z +UID:bffa94bf-5f8b-4058-97f8-e7e34486bb26 +SUMMARY:Uskrs +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T091543Z +LAST-MODIFIED:20090701T091549Z +DTSTAMP:20090701T091543Z +UID:98f3dd48-0685-43c5-9a13-58553c79e626 +SUMMARY:Uskrs +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T091602Z +LAST-MODIFIED:20090701T091610Z +DTSTAMP:20090701T091602Z +UID:75dc8c68-0281-4b7b-86a6-9fc60c835972 +SUMMARY:Uskrs +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T091622Z +LAST-MODIFIED:20090701T091627Z +DTSTAMP:20090701T091622Z +UID:110a09f1-dfa0-45c1-8063-7767f4ddec35 +SUMMARY:Uskrs +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T091637Z +LAST-MODIFIED:20090701T091641Z +DTSTAMP:20090701T091637Z +UID:9e186bcf-bb87-431d-b4ac-aa84ffc7fd38 +SUMMARY:Uskrs +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T091652Z +LAST-MODIFIED:20090701T091656Z +DTSTAMP:20090701T091652Z +UID:a128d42b-8d16-4dd1-ad81-bedda2cf2b76 +SUMMARY:Uskrs +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T091710Z +LAST-MODIFIED:20090701T091714Z +DTSTAMP:20090701T091710Z +UID:8fd14197-ecf7-41de-a429-267e3bf18bf9 +SUMMARY:Uskrs +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T091723Z +LAST-MODIFIED:20090701T091726Z +DTSTAMP:20090701T091723Z +UID:62700bdc-3d28-4830-a6e2-3ed2f8bbcf06 +SUMMARY:Uskrs +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090711Z +LAST-MODIFIED:20090701T091846Z +DTSTAMP:20090701T091841Z +UID:a813311c-1138-44ff-8b9f-e32845fa4211 +SUMMARY:Uskrsni ponedjeljak +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090711Z +LAST-MODIFIED:20090701T091852Z +DTSTAMP:20090701T091841Z +UID:0a306e65-d4c7-483f-9e0f-4979be3d1d67 +SUMMARY:Uskrsni ponedjeljak +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090711Z +LAST-MODIFIED:20090701T091857Z +DTSTAMP:20090701T091841Z +UID:42293e39-3af9-4b7e-af84-77b0de1cb47e +SUMMARY:Uskrsni ponedjeljak +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090711Z +LAST-MODIFIED:20090701T091902Z +DTSTAMP:20090701T091841Z +UID:d3bf6704-0e1f-45c2-9208-47ce1673a935 +SUMMARY:Uskrsni ponedjeljak +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090711Z +LAST-MODIFIED:20090701T092012Z +DTSTAMP:20090701T091841Z +UID:17e71364-490e-40b7-86f0-2aef92783c23 +SUMMARY:Uskrsni ponedjeljak +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090711Z +LAST-MODIFIED:20090701T092016Z +DTSTAMP:20090701T091841Z +UID:2e11d85d-99c6-4189-a594-3f949cb330f3 +SUMMARY:Uskrsni ponedjeljak +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090711Z +LAST-MODIFIED:20090701T092028Z +DTSTAMP:20090701T091841Z +UID:c65e1fa6-7d32-460a-b2a2-d370a4ebe566 +SUMMARY:Uskrsni ponedjeljak +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160328 +DTEND;VALUE=DATE:20160329 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090711Z +LAST-MODIFIED:20090701T092035Z +DTSTAMP:20090701T091841Z +UID:662264e9-06dc-440f-b14f-7afc702f33c5 +SUMMARY:Uskrsni ponedjeljak +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170417 +DTEND;VALUE=DATE:20170418 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T092249Z +LAST-MODIFIED:20090701T092256Z +DTSTAMP:20090701T092249Z +UID:ac4e8793-6039-461b-870e-0834ae185f65 +SUMMARY:Tijelovo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100603 +DTEND;VALUE=DATE:20100604 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T092249Z +LAST-MODIFIED:20090701T092310Z +DTSTAMP:20090701T092258Z +UID:67a17b7e-de47-465b-a52e-842feda99d11 +SUMMARY:Tijelovo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110623 +DTEND;VALUE=DATE:20110624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T092249Z +LAST-MODIFIED:20090701T092327Z +DTSTAMP:20090701T092258Z +UID:efb07092-d161-4172-89ec-e4c29ddf6d86 +SUMMARY:Tijelovo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120607 +DTEND;VALUE=DATE:20120608 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T092249Z +LAST-MODIFIED:20090701T092336Z +DTSTAMP:20090701T092258Z +UID:03ba7f58-3bcf-4cff-885a-f665a4b5a8d6 +SUMMARY:Tijelovo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130530 +DTEND;VALUE=DATE:20130531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T092249Z +LAST-MODIFIED:20090701T092350Z +DTSTAMP:20090701T092258Z +UID:981c6bc1-bb0d-4a66-a816-cc441041c1a1 +SUMMARY:Tijelovo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140619 +DTEND;VALUE=DATE:20140620 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T092249Z +LAST-MODIFIED:20090701T092437Z +DTSTAMP:20090701T092258Z +UID:53e39acb-cc0a-42d7-ab42-1b04509807a8 +SUMMARY:Tijelovo +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150604 +DTEND;VALUE=DATE:20150605 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090339Z +LAST-MODIFIED:20090701T090350Z +DTSTAMP:20090701T090339Z +UID:9314c47d-91b7-4231-ae9a-eb128a691ada +SUMMARY:Nova Godina +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090401Z +LAST-MODIFIED:20090701T090433Z +DTSTAMP:20090701T090401Z +UID:335ada9e-465d-4d1a-a994-1e064a6782bd +SUMMARY:Sveta tri kralja +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090106 +DTEND;VALUE=DATE:20090107 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090751Z +LAST-MODIFIED:20090701T090757Z +DTSTAMP:20090701T090751Z +UID:2258a9ca-f769-4dbd-8ec5-84c6dd6316b0 +SUMMARY:Praznik rada +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090857Z +LAST-MODIFIED:20090701T090902Z +DTSTAMP:20090701T090857Z +UID:0bd22904-9c9d-46a4-8f5b-48737542f295 +SUMMARY:Dan antifašističke borbe +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090622 +DTEND;VALUE=DATE:20090623 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090937Z +LAST-MODIFIED:20090701T090942Z +DTSTAMP:20090701T090937Z +UID:114f2d93-7bf6-478f-9ba2-8f3dfc22d569 +SUMMARY:Dan pobjede i domovinske zahvalnosti +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090805 +DTEND;VALUE=DATE:20090806 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T090957Z +LAST-MODIFIED:20090701T091003Z +DTSTAMP:20090701T090957Z +UID:26f9fece-f509-425f-b961-4f2517109dff +SUMMARY:Velika Gospa +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20090815 +DTEND;VALUE=DATE:20090816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T091014Z +LAST-MODIFIED:20090701T091020Z +DTSTAMP:20090701T091014Z +UID:d3db0806-f7e9-442a-a5e2-23d7ed846af0 +SUMMARY:Dan neovisnosti +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20091008 +DTEND;VALUE=DATE:20091009 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T091028Z +LAST-MODIFIED:20090701T091033Z +DTSTAMP:20090701T091028Z +UID:077eec26-1527-4647-a2af-aee4078587a4 +SUMMARY:Svi sveti +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20091101 +DTEND;VALUE=DATE:20091102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T091042Z +LAST-MODIFIED:20090701T091052Z +DTSTAMP:20090701T091042Z +UID:07a08fb1-2cd4-48e5-ac89-12c75e059f0d +SUMMARY:Božić +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090701T091053Z +LAST-MODIFIED:20090701T091059Z +DTSTAMP:20090701T091053Z +UID:912a1a2a-6fda-4cf4-94dd-5f9bf7bad54f +SUMMARY:Sveti Stjepan +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/CzechHolidays.ics b/media/caldata/CzechHolidays.ics new file mode 100644 index 00000000000..0f603fdfdfe --- /dev/null +++ b/media/caldata/CzechHolidays.ics @@ -0,0 +1,216 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +BEGIN:VEVENT +CREATED:20071221T221835Z +LAST-MODIFIED:20071221T230409Z +DTSTAMP:20071221T233816Z +UID:b4cfcb30-8041-4244-91bb-9af9954c5b2d +SUMMARY:1. svátek vánoční +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20071225 +DTEND;VALUE=DATE:20071226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T221921Z +LAST-MODIFIED:20071221T230432Z +DTSTAMP:20071221T233816Z +UID:f1381245-0442-9a41-9eb3-43ab84b148e2 +SUMMARY:2. svátek vánoční +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20071226 +DTEND;VALUE=DATE:20071227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T223420Z +LAST-MODIFIED:20071221T230629Z +DTSTAMP:20071221T233816Z +UID:c92e67c1-1319-ad4d-9e47-b078c82732ae +SUMMARY:Nový rok +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080101 +DTEND;VALUE=DATE:20080102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T230805Z +LAST-MODIFIED:20071221T230833Z +DTSTAMP:20071221T233816Z +UID:520f666b-fe72-a146-b6e8-a68036f8b09f +SUMMARY:Svátek práce +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080501 +DTEND;VALUE=DATE:20080502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T231430Z +LAST-MODIFIED:20071221T231455Z +DTSTAMP:20071221T233816Z +UID:38aef6bb-4646-5f48-aba5-c12481cc6b8f +SUMMARY:Den české státnosti +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080928 +DTEND;VALUE=DATE:20080929 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T231617Z +LAST-MODIFIED:20071221T231640Z +DTSTAMP:20071221T233816Z +UID:7233642b-1f2d-4442-befc-fa6ce63daf0f +SUMMARY:Den boje za svobodu a demokracii +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20081117 +DTEND;VALUE=DATE:20081118 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T221704Z +LAST-MODIFIED:20071221T231722Z +DTSTAMP:20071221T233816Z +UID:a56cc74b-7a5b-4848-9b3f-b6b729b682ba +SUMMARY:Štědrý den +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20071224 +DTEND;VALUE=DATE:20071225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T230636Z +LAST-MODIFIED:20071221T231806Z +DTSTAMP:20071221T233816Z +UID:aca364cd-7732-0d40-bddc-8951284a8008 +SUMMARY:Den obnovy samostatného českého státu (1993) +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080101 +DTEND;VALUE=DATE:20080102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T230844Z +LAST-MODIFIED:20071221T231907Z +DTSTAMP:20071221T233816Z +UID:99803396-7b1d-4745-a5f0-df95188d6555 +SUMMARY:Den vítězství (1945) +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080508 +DTEND;VALUE=DATE:20080509 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T231520Z +LAST-MODIFIED:20071221T232052Z +DTSTAMP:20071221T233816Z +UID:3f5df1be-1028-524d-9e1d-4e4bff4c4d48 +SUMMARY:Den vzniku samostatného československého státu (1918) +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20081028 +DTEND;VALUE=DATE:20081029 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T231053Z +LAST-MODIFIED:20071221T232145Z +DTSTAMP:20071221T233816Z +UID:34e10e5b-b11a-5044-a9f2-7e0e45f32117 +SUMMARY:Den slovanských věrozvěstů Cyrila a Metoděje (863) +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080705 +DTEND;VALUE=DATE:20080706 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T231259Z +LAST-MODIFIED:20071221T232208Z +DTSTAMP:20071221T233816Z +UID:9886a881-7eac-7e43-bb8f-3a0def75a8c9 +SUMMARY:Den upálení mistra Jana Husa (1415) +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080706 +DTEND;VALUE=DATE:20080707 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T232731Z +LAST-MODIFIED:20071221T232756Z +DTSTAMP:20071221T233816Z +UID:ae76d459-8ede-c44a-aee3-c1556503f6c7 +SUMMARY:Velikonoční pondělí +DTSTART;VALUE=DATE:20080324 +DTEND;VALUE=DATE:20080325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T232847Z +LAST-MODIFIED:20071221T232904Z +DTSTAMP:20071221T233816Z +UID:abdde23e-7fdc-a645-b055-9c62c4b2dcf9 +SUMMARY:Velikonoční pondělí +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T233137Z +LAST-MODIFIED:20071221T233225Z +DTSTAMP:20071221T233816Z +UID:7e443818-5b3d-474c-b995-f653641eaaf9 +SUMMARY:Velikonoční pondělí +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T233349Z +LAST-MODIFIED:20071221T233416Z +DTSTAMP:20071221T233816Z +UID:6078a5c9-949f-9f42-8e11-5c9640fa790b +SUMMARY:Velikonoční pondělí +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T233349Z +LAST-MODIFIED:20071221T233507Z +DTSTAMP:20071221T233816Z +UID:8c16e28f-5cbb-8a4b-a522-af2f88762d71 +SUMMARY:Velikonoční pondělí +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T233349Z +LAST-MODIFIED:20071221T233539Z +DTSTAMP:20071221T233816Z +UID:7181bc2b-aa52-a641-87ef-440dd3b5e690 +SUMMARY:Velikonoční pondělí +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T233349Z +LAST-MODIFIED:20071221T233610Z +DTSTAMP:20071221T233816Z +UID:6e6d4a93-341a-d04f-b76d-db1af1e69079 +SUMMARY:Velikonoční pondělí +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071221T233349Z +LAST-MODIFIED:20071221T233653Z +DTSTAMP:20071221T233816Z +UID:26fd664e-066b-6441-94bf-19048f244518 +SUMMARY:Velikonoční pondělí +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/DanishHolidays.ics b/media/caldata/DanishHolidays.ics new file mode 100644 index 00000000000..971e78f57df --- /dev/null +++ b/media/caldata/DanishHolidays.ics @@ -0,0 +1,5636 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T210322Z +UID: + 851E0562-658B-45D1-9036-16D8685FD8C9-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Danmarks befrielse 1945* +RRULE:FREQ=YEARLY;UNTIL=20150505;INTERVAL=1 +DTSTART;VALUE=DATE:20060505 +DTEND;VALUE=DATE:20060506 +DESCRIPTION:Danmarks befrielse 1945.\n\nDe tyske styrker i Danmark + overgiver sig denne dag. Den 5. maj 1945 kl. 8 trådte kapitulationen i + kraft.\n\nDagen har siden været officiel fest- og flagdag i + Danmark.\n\nKilde: http://www.kkb.bib.dk \n\n*) Flagdag\nFlaget hejses + kl. 0800 og hales ved solnedgang. På dage\, hvor solen står op efter + kl. 0800\, hejses flaget først ved solopgang.\n\nKilde: http: + //www.spejderportal.dk/ +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122237Z +UID: + ABEEAD91-A668-4D4A-9AA6-7DE33279F58F-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skærtorsdag +DTSTART;VALUE=DATE:20080320 +DTEND;VALUE=DATE:20080321 +DESCRIPTION:Skærtorsdag\n\nSkærtorsdag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n\"Skær\" er et gammelt dansk + ord\, der betyder ren og renset. Skærtorsdag spiste Jesus et jødisk + påskemåltid med lammesteg sammen med sine disciple. Inden de satte sig + til bords\, vaskede Jesus disciplenes fødder\, hvorfor dagen blev til + \"Skær-torsdag\".\n\n-----------------------------\n\nSkærtorsdag + mindes vi Jesu indstiftelse af nadveren.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T225007Z +UID: + A321D1E2-813A-4FD3-B51B-9922B6C275B8-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Mortensaften +RRULE:FREQ=YEARLY;UNTIL=20151110;INTERVAL=1 +DTSTART;VALUE=DATE:20061110 +DTEND;VALUE=DATE:20061111 +DESCRIPTION:Mortensaften.\n\nNavnet knytter sig til Biskop Martin fra + Tours.\n\nLegenden fortæller\, at Martin gemte sig i en gåsesti for at + undgå at blive valgt til biskop.\n\nGæssene afslørede ham imidlertid + med deres skræppen. Han blev trukket frem og herefter valgt til + biskop.\n\nHan besluttede derfor\, at gæssene hvert år på denne dag + skulle lade livet for at blive spist.\n\nI Danmark finder gåsespisningen + sted mortensaften den 10. november. Gåsen er dog efterhånden blevet + erstattet af and.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122444Z +UID: + D319E228-7168-4D54-8305-95E4FF58AF3D-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Påskedag* +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +DESCRIPTION:Påskedag\n\nPåskesøndag fejres det at Jesus genopstod fra + de døde og blev levende igen. Jesus forblev på jorden de næste 40 dage + frem til Kristi + himmelfartsdag.\n\n-----------------------------\n\nPåskedag er den + vigtigste af kirkeårets højtider (også selv om julen fejres af flere). + Det er festen for Jesu opstandelse.\n\nPåsken består egentligt ikke kun + af de to påskedage\, men af hele tiden frem til pinse\, søndagene efter + påske.\n\nKilde: http://www.folkekirken.dk\n\nPåskedagene\, der altså + markerer centrale begivenheder i Kristi lidelseshistorie\, + fejres til minde om Kristi død og opstandelse. \n\nPåsken + indtræffer den første søndag efter fuldmåne efter + forårsjævndøgn\, hvilket vil sige mellem 22. marts og 25. + april.\n\nForuden de kirkelige traditioner har der gennem tiderne været + knyttet utallige folkelige skikke til påsken. Mange af dem eksisterer + stadig\, men i mindre omfang.\n\nMaden\, herunder især dekorerede æg\, + spiller en stor rolle\, og mange familier samles til frokost + påskedag.\n\nBordpynten er holdt i gult\, og man giver hinanden + påskeæg. I slutningen af 1800-tallet optræder chokoladeæg som + gaveobjekt første gang.\n\nKilde: http://www.kkb.bib.dk\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121210Z +UID: + 70CF1996-45C9-4B71-A78E-821864FAEBD3-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Forårsjævndøgn +DTSTART;VALUE=DATE:20120320 +DTEND;VALUE=DATE:20120321 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Forårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122431Z +UID: + DCC5A954-FE40-4EA2-822E-CFDD1A7EA5FD-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Langfredag* +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +DESCRIPTION:Langfredag\n\nLangfredag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\nDagen hvor Jesus ifølge + biblen blev korsfæstet. Dagen hedder \"lang-fredag\"\, fordi det var en + lang og smertefuld dag for Jesus. Han blev pint og plaget til døde af af + de romerske soldater.\n\n-----------------------------\n\nPå Langfredag + er gudstjenesten koncentreret omkring Jesu domfældelse og død. + Gudstjenesten den dag har mange steder en særlig udformning.\n\nKilde: + http://www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nDer flages på halv stang til + solnedgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115209Z +UID: + 5DC9B82F-8677-430E-AF9B-F5F5545CBFF6-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. søndag i Advent +DTSTART;VALUE=DATE:20141207 +DTEND;VALUE=DATE:20141208 +DESCRIPTION:2. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T120055Z +UID: + 467EDD03-28CA-4567-A24B-28BBF0711266-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:4. søndag i Advent +DTSTART;VALUE=DATE:20141221 +DTEND;VALUE=DATE:20141222 +DESCRIPTION:4. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T184451Z +UID: + 36CD5D9A-4131-4EFF-B4E1-3ED3CDEC8E5F-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Besættelsen* +RRULE:FREQ=YEARLY;UNTIL=20150409;INTERVAL=1 +DTSTART;VALUE=DATE:20060409 +DTEND;VALUE=DATE:20060410 +DESCRIPTION:Besættelsen\n\nÅrsdagen for tyskernes besættelse af + Danmark i 1940.\n\n*) Flagdag\n\nHvis man ønsker at flage skal Dannebrog + hejses kl. 8 og sættes på halv stang til kl. 12.02\, derefter på hel + stang indtil solnedgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131657Z +UID: + D9B7C7DC-E86C-4F0E-B523-80E5120661D7-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Juledag* +RRULE:FREQ=YEARLY;UNTIL=20151226;INTERVAL=1 +DTSTART;VALUE=DATE:20061226 +DTEND;VALUE=DATE:20061227 +DESCRIPTION:2. Juledag.\n\n2. Juledag er en Søgnehelligdag\, hvor der + generelt holdes fri fra arbejde m.m. hele + dagen.\n\n-----------------------------\n\nAnden juledag\, som også + kaldes Skt. Stefans dag\, er en fejring af Skt. Stefan\, den første + kristne martyr\, og dermed for alle\, som er døde for troens skyld. Det + kan være lidt vanskeligt at holde dette sammen med forventningen om en + julegudstjeneste.\n\nhttp://www.folkekirken.dk/leksikon.htm\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.aalborgflagfabrik.dk +SEQUENCE:10 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T112722Z +UID: + 51A5F81C-9BC8-4502-B822-49D9A411AF43-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Pinsedag +DTSTART;VALUE=DATE:20080512 +DTEND;VALUE=DATE:20080513 +DESCRIPTION:2. Pinsedag.\n\n2. Pinsedag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n2. Pinsedag er en forlængelse + af pinsen. Førhen giftede mange sig i øvrigt ved pinsetide. 2. Pinsedag + falder 50 dage efter 2. Påskedag.\n\n-----------------------\n\nPinse + kommer af det græske ord \"pentekoste\"\, den + halvtredssindstyvende.\n\nI pinsen fejres Helligåndens komme og den + kristne kirkes fødsel.\n\nSøndag efter pinse fejres Trinitatis søndag + eller Hellig Trefoldigheds fest\, festdagen for Gud som den treenige + Gud\, Fader\, Søn og Helligånd.\n\nKilde: http: + //www.folkekirken.dk/leksikon.htm\n\n-----------------------\n\nFør i + tiden var det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet + blev derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T225717Z +UID: + 362D0038-CEFE-4873-BB53-880D2F36B96F-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:3. søndag i Advent +DTSTART;VALUE=DATE:20061217 +DTEND;VALUE=DATE:20061218 +DESCRIPTION:3. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125434Z +UID: + 51DBBDE4-0C38-4032-B771-D577829B7EBA-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Kr. Himmelfart* +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +DESCRIPTION:Kr. Himmelfart.\n\nKristi Himmelfartsdag er en + Søgnehelligdag\, hvor der holdes fri fra arbejde m.m. hele dagen.\n\n40 + dage efter påskedag\, hvor Jesus genopstod fra de døde og blev levende + igen\, stiger han denne dag til himmels og efterlader sine disciple med + besked på at vente på hjælp og støtte fra Helligånden\, som viser + sig 10 dage senere (50 dage efter påskedag) + Pinsedag.\n\n-----------------------------\n\nKristi Himmelfartsdag 40 + dage efter påske er festdagen for Jesu ophøjelse til Faderens højre + hånd.\n\nKilde: http://www.folkekirken.dk\n\nKristi himmelfartsdag\, der + fejres til minde om Kristi optagelse i himlen falder torsdag i den 6. uge + efter påske. Dagen er officiel helligdag i Danmark.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122815Z +UID: + BFCC829B-5CB7-4453-9386-3FBCF8D141E4-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skærtorsdag +DTSTART;VALUE=DATE:20140417 +DTEND;VALUE=DATE:20140418 +DESCRIPTION:Skærtorsdag\n\nSkærtorsdag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n\"Skær\" er et gammelt dansk + ord\, der betyder ren og renset. Skærtorsdag spiste Jesus et jødisk + påskemåltid med lammesteg sammen med sine disciple. Inden de satte sig + til bords\, vaskede Jesus disciplenes fødder\, hvorfor dagen blev til + \"Skær-torsdag\".\n\n-----------------------------\n\nSkærtorsdag + mindes vi Jesu indstiftelse af nadveren.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115052Z +UID: + 19DAC188-4714-4900-A12D-D464B5B7CD80-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. søndag i Advent +DTSTART;VALUE=DATE:20111204 +DTEND;VALUE=DATE:20111205 +DESCRIPTION:2. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121238Z +UID: + 8A71D218-50D0-47D9-BA2B-061B66AC29AD-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Forårsjævndøgn +DTSTART;VALUE=DATE:20140320 +DTEND;VALUE=DATE:20140321 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Forårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060425T160704Z +UID: + F0AA7781-1DF9-4AFD-B899-A13E06A4796E-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Fastelavn +DTSTART;VALUE=DATE:20110306 +DTEND;VALUE=DATE:20110307 +DESCRIPTION:Fastelavn.\n\nFastelavn er 7. søndag før + Påske\n\nFastelavn eller fasteaften var oprindelig betegnelsen for + aftenen før den kristne faste\, som indledtes onsdag i den syvende uge + før påskedag.\n\nDagen kaldes stadig askeonsdag. I Danmark blev + fastelavn betegnelsen for de 3 forudgående dage\, hvor man spiste og + drak umådeholdent for at have noget at stå imod med.\n\nMed + reformationen ophørte fastepligten i Danmark\, og fastelavn blev + efterhånden alene en verdslig fest.\n\nMange af de gamle + fastelavnsskikke så som tøndeslagning\, biden til bolle\, udklædning + og raslen ved dørene lever i bedste velGående i dag\, men kun i + børnenes verden.\n\nFastelavnsmandag var helt frem til 1960'erne + skolefridag i Danmark.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125634Z +UID: + FB537849-06CB-44B3-96A3-73952A42F1D9-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Pinsedag* +DTSTART;VALUE=DATE:20060604 +DTEND;VALUE=DATE:20060605 +DESCRIPTION:Pinsedag.\n\nPinsedag er 10 dage efter Kristi Himmelfartsdag. + Da Jesus steg til himmels bad han sine disciple missionere og til at + hjælpe dem lovede han at sende Helligånden ned til dem. Det skete denne + dag 50 dage efter Påskedag.\n\nDa de tolv disciple\, (nu benævnt + \"apostle\") med hjælp fra Helligånden\, nu kunne missionere\, + betragtes denne dag som kirkens + fødselsdag.\n\n-----------------------------\n\nPinse kommer af det + græske ord \"pentekoste\"\, den halvtredssindstyvende.\n\nI pinsen + fejres Helligåndens komme og den kristne kirkes fødsel.\n\nSøndag + efter pinse fejres Trinitatis søndag eller Hellig Trefoldigheds fest\, + festdagen for Gud som den treenige Gud\, Fader\, Søn og + Helligånd.\n\nKilde: http: + //www.folkekirken.dk\n\n-----------------------------\n\nFør i tiden var + det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet blev + derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk\n\n-----------------------\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:11 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125410Z +UID: + 7FC0726E-03BD-4B16-AB38-14567A50C39A-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Kr. Himmelfart* +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +DESCRIPTION:Kr. Himmelfart.\n\nKristi Himmelfartsdag er en + Søgnehelligdag\, hvor der holdes fri fra arbejde m.m. hele dagen.\n\n40 + dage efter påskedag\, hvor Jesus genopstod fra de døde og blev levende + igen\, stiger han denne dag til himmels og efterlader sine disciple med + besked på at vente på hjælp og støtte fra Helligånden\, som viser + sig 10 dage senere (50 dage efter påskedag) + Pinsedag.\n\n-----------------------------\n\nKristi Himmelfartsdag 40 + dage efter påske er festdagen for Jesu ophøjelse til Faderens højre + hånd.\n\nKilde: http://www.folkekirken.dk\n\nKristi himmelfartsdag\, der + fejres til minde om Kristi optagelse i himlen falder torsdag i den 6. uge + efter påske. Dagen er officiel helligdag i Danmark.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125948Z +UID: + 0C98223A-DE8E-4EE8-B470-3DBEF1158481-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Pinsedag* +DTSTART;VALUE=DATE:20120527 +DTEND;VALUE=DATE:20120528 +DESCRIPTION:Pinsedag.\n\nPinsedag er 10 dage efter Kristi Himmelfartsdag. + Da Jesus steg til himmels bad han sine disciple missionere og til at + hjælpe dem lovede han at sende Helligånden ned til dem. Det skete denne + dag 50 dage efter Påskedag.\n\nDa de tolv disciple\, (nu benævnt + \"apostle\") med hjælp fra Helligånden\, nu kunne missionere\, ses + denne dag som kirkens + fødselsdag.\n\n-----------------------------\n\nPinse kommer af det + græske ord \"pentekoste\"\, den halvtredssindstyvende.\n\nI pinsen + fejres Helligåndens komme og den kristne kirkes fødsel.\n\nSøndag + efter pinse fejres Trinitatis søndag eller Hellig Trefoldigheds fest\, + festdagen for Gud som den treenige Gud\, Fader\, Søn og + Helligånd.\n\nKilde: http: + //www.folkekirken.dk\n\n-----------------------------\n\nFør i tiden var + det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet blev + derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk\n\n-----------------------\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130820Z +UID: + B299BA35-A0E2-44DC-B650-0DF26284C411-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets længste dag +DTSTART;VALUE=DATE:20140621 +DTEND;VALUE=DATE:20140622 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets længste dag - også kaldet \"Sommersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nSommersolhverv er det tidspunkt + på året\, hvor dagen er længst og solen står højest på himlen kl. + 12 middag (som svarer til kl. 13 under sommertid). Begge dele skyldes\, + at solen står lodret over den nordlige vendekreds (\"Krebsens + Vendekreds\") ved middagstid netop den dag.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114936Z +UID: + 592B4F3D-E737-4F68-AA1E-AEC6B45C41B2-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. søndag i Advent +DTSTART;VALUE=DATE:20091206 +DTEND;VALUE=DATE:20091207 +DESCRIPTION:2. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121047Z +UID: + 29CBC147-2F4F-4375-9646-FB1C9FCE413C-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Forårsjævndøgn +DTSTART;VALUE=DATE:20070321 +DTEND;VALUE=DATE:20070322 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Forårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115540Z +UID: + 0C4D4583-3095-4948-A3BA-85919A69D4CB-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:3. søndag i Advent +DTSTART;VALUE=DATE:20121216 +DTEND;VALUE=DATE:20121217 +DESCRIPTION:3. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125306Z +UID: + B3B03AEF-1FA1-4E8C-8FB9-308A76DFEDFD-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Kr. Himmelfart* +DTSTART;VALUE=DATE:20080501 +DTEND;VALUE=DATE:20080502 +DESCRIPTION:Kr. Himmelfart.\n\nKristi Himmelfartsdag er en + Søgnehelligdag\, hvor der holdes fri fra arbejde m.m. hele dagen.\n\n40 + dage efter påskedag\, hvor Jesus genopstod fra de døde og blev levende + igen\, stiger han denne dag til himmels og efterlader sine disciple med + besked på at vente på hjælp og støtte fra Helligånden\, som viser + sig 10 dage senere (50 dage efter påskedag) + Pinsedag.\n\n-----------------------------\n\nKristi Himmelfartsdag 40 + dage efter påske er festdagen for Jesu ophøjelse til Faderens højre + hånd.\n\nKilde: http://www.folkekirken.dk\n\nKristi himmelfartsdag\, der + fejres til minde om Kristi optagelse i himlen falder torsdag i den 6. uge + efter påske. Dagen er officiel helligdag i Danmark.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125825Z +UID: + EAD7D2B7-7106-4A1A-8B5C-BBC01AFBE8A4-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Pinsedag* +DTSTART;VALUE=DATE:20090531 +DTEND;VALUE=DATE:20090601 +DESCRIPTION:Pinsedag.\n\nPinsedag er 10 dage efter Kristi Himmelfartsdag. + Da Jesus steg til himmels bad han sine disciple missionere og til at + hjælpe dem lovede han at sende Helligånden ned til dem. Det skete denne + dag 50 dage efter Påskedag.\n\nDa de tolv disciple\, (nu benævnt + \"apostle\") med hjælp fra Helligånden\, nu kunne missionere\, ses + denne dag som kirkens + fødselsdag.\n\n-----------------------------\n\nPinse kommer af det + græske ord \"pentekoste\"\, den halvtredssindstyvende.\n\nI pinsen + fejres Helligåndens komme og den kristne kirkes fødsel.\n\nSøndag + efter pinse fejres Trinitatis søndag eller Hellig Trefoldigheds fest\, + festdagen for Gud som den treenige Gud\, Fader\, Søn og + Helligånd.\n\nKilde: http: + //www.folkekirken.dk\n\n-----------------------------\n\nFør i tiden var + det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet blev + derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk\n\n-----------------------\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122634Z +UID: + 4DA16605-A929-4D9E-A20A-2BA944B56C9D-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skærtorsdag +DTSTART;VALUE=DATE:20120405 +DTEND;VALUE=DATE:20120406 +DESCRIPTION:Skærtorsdag\n\nSkærtorsdag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n\"Skær\" er et gammelt dansk + ord\, der betyder ren og renset. Skærtorsdag spiste Jesus et jødisk + påskemåltid med lammesteg sammen med sine disciple. Inden de satte sig + til bords\, vaskede Jesus disciplenes fødder\, hvorfor dagen blev til + \"Skær-torsdag\".\n\n-----------------------------\n\nSkærtorsdag + mindes vi Jesu indstiftelse af nadveren.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T225437Z +UID: + 6551DA89-276E-427B-9C51-945D62D2C3F4-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. søndag i Advent +DTSTART;VALUE=DATE:20061210 +DTEND;VALUE=DATE:20061211 +DESCRIPTION:2. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131248Z +UID: + 2F695D10-2F5D-4B3D-8F1D-861E33A2ACD0-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Efterårsjævndøgn +DTSTART;VALUE=DATE:20110923 +DTEND;VALUE=DATE:20110924 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Efterårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T172022Z +UID: + D6C523BB-46DE-4E01-835F-8698B170F392-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Fastelavn +DTSTART;VALUE=DATE:20060226 +DTEND;VALUE=DATE:20060227 +DESCRIPTION:Fastelavn.\n\nFastelavn er 7. søndag før + Påske\n\nFastelavn eller fasteaften var oprindelig betegnelsen for + aftenen før den kristne faste\, som indledtes onsdag i den syvende uge + før påskedag.\n\nDagen kaldes stadig askeonsdag. I Danmark blev + fastelavn betegnelsen for de 3 forudgående dage\, hvor man spiste og + drak umådeholdent for at have noget at stå imod med.\n\nMed + reformationen ophørte fastepligten i Danmark\, og fastelavn blev + efterhånden alene en verdslig fest.\n\nMange af de gamle + fastelavnsskikke så som tøndeslagning\, biden til bolle\, udklædning + og raslen ved dørene lever i bedste velGående i dag\, men kun i + børnenes verden.\n\nFastelavnsmandag var helt frem til 1960'erne + skolefridag i Danmark.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T205745Z +UID: + 220E32E8-8598-497C-A020-42E0E183092E-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Arbejdernes internationale kampdag +RRULE:FREQ=YEARLY;UNTIL=20150501;INTERVAL=1 +DTSTART;VALUE=DATE:20060501 +DTEND;VALUE=DATE:20060502 +DESCRIPTION:Arbejdernes internationale kampdag.\n\nFestligholdelsen af 1. + maj stammer fra USA\, hvor arbejderne i 1888 kæmpede for indførelse af + 8 timers arbejdsdag.\n\nDer har været afholdt majdemonstrationer i + Danmark siden 1890\, og på mange arbejdspladser er dagen enten hel eller + halv fridag.\n\nDagen kaldes også Valborgsdag efter den engelske + prinsesse Valborg.\n\nDer knyttede sig tidligere en del folkeskikke af + profan oprindelse til dagen.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T204932Z +UID: + 10C5C058-BFB1-471E-8DD0-A40BDF364D54-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Slaget ved Dybbøl* +RRULE:FREQ=YEARLY;UNTIL=20150418;INTERVAL=1 +DTSTART;VALUE=DATE:20060418 +DTEND;VALUE=DATE:20060419 +DESCRIPTION:Slaget ved Dybbøl.\n\nDen dansk hær bliver den 18. april + 1864 besejret ved Dybbøl af den Preussiske hær.\n\nKilde: http: + //www.milhist.dk\n\n*) Flagdag\n\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114629Z +UID: + 8E1B0580-6F2B-4DB8-9604-223B6E8E2B23-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:1. søndag i Advent +DTSTART;VALUE=DATE:20111127 +DTEND;VALUE=DATE:20111128 +DESCRIPTION:1. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, Omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115234Z +UID: + 863A7824-1847-46F5-9DC0-F3BB2B50EC5D-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. søndag i Advent +DTSTART;VALUE=DATE:20151206 +DTEND;VALUE=DATE:20151207 +DESCRIPTION:2. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131915Z +UID: + 06B9EE67-E425-47B9-B1B4-9564205DBA7F-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets korteste dag +DTSTART;VALUE=DATE:20141222 +DTEND;VALUE=DATE:20141223 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets korteste dag - også kaldet \"Vintersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nVintersolhverv er det tidspunkt + på året\, hvor dagen er kortest og solen står lavest på himlen kl. 12 + middag. Begge dele skyldes\, at solen står lodret over den sydlige + vendekreds (\"Stenbukkens Vendekreds\") ved middagstid netop den + dag.\n\nKilde: http://da.wikipedia.org/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115858Z +UID: + CE66FE91-2206-4299-9FED-142486005B9F-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:4. søndag i Advent +DTSTART;VALUE=DATE:20091220 +DTEND;VALUE=DATE:20091221 +DESCRIPTION:4. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T120901Z +UID: + D9FA2016-1A22-43EF-8CBC-51F5DEBAE8DB-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Forårsjævndøgn +DTSTART;VALUE=DATE:20060320 +DTEND;VALUE=DATE:20060321 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Forårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:12 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131328Z +UID: + D3BA5C0C-20E8-42B6-96E8-8F8D61113899-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Efterårsjævndøgn +DTSTART;VALUE=DATE:20150923 +DTEND;VALUE=DATE:20150924 +URL;VALUE=URI:http://www.crh.noaa.gov/ind/seasons.txt +DESCRIPTION:Efterårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //www.crh.noaa.gov/ind/seasons.txt\n\n-----------------------------\n\nJæ + vndøgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114652Z +UID: + 8351CC1E-3F0F-47B4-B5CA-C17350F1874E-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:1. søndag i Advent +DTSTART;VALUE=DATE:20121202 +DTEND;VALUE=DATE:20121203 +DESCRIPTION:1. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, Omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130539Z +UID: + F080C231-C039-457A-826A-D009D43D9AD1-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets længste dag +DTSTART;VALUE=DATE:20080621 +DTEND;VALUE=DATE:20080622 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets længste dag - også kaldet \"Sommersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nSommersolhverv er det tidspunkt + på året\, hvor dagen er længst og solen står højest på himlen kl. + 12 middag (som svarer til kl. 13 under sommertid). Begge dele skyldes\, + at solen står lodret over den nordlige vendekreds (\"Krebsens + Vendekreds\") ved middagstid netop den dag.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060423T195059Z +UID: + EF3CF335-FD8C-47EA-9D2A-7348123AE60F-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Fastelavn +DTSTART;VALUE=DATE:20130210 +DTEND;VALUE=DATE:20130211 +DESCRIPTION:Fastelavn.\n\nFastelavn er 7. søndag før + Påske\n\nFastelavn eller fasteaften var oprindelig betegnelsen for + aftenen før den kristne faste\, som indledtes onsdag i den syvende uge + før påskedag.\n\nDagen kaldes stadig askeonsdag. I Danmark blev + fastelavn betegnelsen for de 3 forudgående dage\, hvor man spiste og + drak umådeholdent for at have noget at stå imod med.\n\nMed + reformationen ophørte fastepligten i Danmark\, og fastelavn blev + efterhånden alene en verdslig fest.\n\nMange af de gamle + fastelavnsskikke så som tøndeslagning\, biden til bolle\, udklædning + og raslen ved dørene lever i bedste velGående i dag\, men kun i + børnenes verden.\n\nFastelavnsmandag var helt frem til 1960'erne + skolefridag i Danmark.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122001Z +UID: + F77B8810-EB5F-40BC-BA4A-B8C61C3CDADA-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Langfredag* +DTSTART;VALUE=DATE:20060414 +DTEND;VALUE=DATE:20060415 +DESCRIPTION:Langfredag\n\nLangfredag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\nDagen hvor Jesus ifølge + biblen blev korsfæstet. Dagen hedder \"lang-fredag\"\, fordi det var en + lang og smertefuld dag for Jesus. Han blev pint og plaget til døde af de + romerske soldater.\n\n-----------------------------\n\nPå Langfredag er + gudstjenesten koncentreret omkring Jesu domfældelse og død. + Gudstjenesten den dag har mange steder en særlig udformning.\n\nKilde: + http://www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nDer flages på halv stang til + solnedgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122111Z +UID: + D691BC6F-66DA-4BEC-A8A0-EE63190B8074-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skærtorsdag +DTSTART;VALUE=DATE:20070405 +DTEND;VALUE=DATE:20070406 +DESCRIPTION:Skærtorsdag\n\nSkærtorsdag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n\"Skær\" er et gammelt dansk + ord\, der betyder ren og renset. Skærtorsdag spiste Jesus et jødisk + påskemåltid med lammesteg sammen med sine disciple. Inden de satte sig + til bords\, vaskede Jesus disciplenes fødder\, hvorfor dagen blev til + \"Skær-torsdag\".\n\n-----------------------------\n\nSkærtorsdag + mindes vi Jesu indstiftelse af nadveren.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122026Z +UID: + ED263D5C-747C-4738-9F17-8D6CCCDE8689-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Påskedag* +DTSTART;VALUE=DATE:20060416 +DTEND;VALUE=DATE:20060417 +DESCRIPTION:Påskedag\n\nPåskesøndag fejres det at Jesus genopstod fra + de døde og blev levende igen. Jesus forblev på jorden de næste 40 dage + frem til Kristi + himmelfartsdag.\n\n-----------------------------\n\nPåskedag er den + vigtigste af kirkeårets højtider (også selv om julen fejres af flere). + Det er festen for Jesu opstandelse.\n\nPåsken består egentligt ikke kun + af de to påskedage\, men af hele tiden frem til pinse\, søndagene efter + påske.\n\nKilde: http://www.folkekirken.dk\n\nPåskedagene\, der altså + markerer centrale begivenheder i Kristi lidelseshistorie\, + fejres til minde om Kristi død og opstandelse. \n\nPåsken + indtræffer den første søndag efter fuldmåne efter + forårsjævndøgn\, hvilket vil sige mellem 22. marts og 25. + april.\n\nForuden de kirkelige traditioner har der gennem tiderne været + knyttet utallige folkelige skikke til påsken. Mange af dem eksisterer + stadig\, men i mindre omfang.\n\nMaden\, herunder især dekorerede æg\, + spiller en stor rolle\, og mange familier samles til frokost + påskedag.\n\nBordpynten er holdt i gult\, og man giver hinanden + påskeæg. I slutningen af 1800-tallet optræder chokoladeæg som + gaveobjekt første gang.\n\nKilde: http://www.kkb.bib.dk\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122644Z +UID: + 969E0DEB-B9A2-4855-A9B1-A44C61BFC06B-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Langfredag* +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +DESCRIPTION:Langfredag\n\nLangfredag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\nDagen hvor Jesus ifølge + biblen blev korsfæstet. Dagen hedder \"lang-fredag\"\, fordi det var en + lang og smertefuld dag for Jesus. Han blev pint og plaget til døde af af + de romerske soldater.\n\n-----------------------------\n\nPå Langfredag + er gudstjenesten koncentreret omkring Jesu domfældelse og død. + Gudstjenesten den dag har mange steder en særlig udformning.\n\nKilde: + http://www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nDer flages på halv stang til + solnedgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T225827Z +UID: + DCD58B94-F8B5-4C8E-9F87-4739BB097BC9-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Lille juleaften +RRULE:FREQ=YEARLY;UNTIL=20151223;INTERVAL=1 +DTSTART;VALUE=DATE:20061223 +DTEND;VALUE=DATE:20061224 +DESCRIPTION:Lille juleaften.\n\nDenne dag er ingen helligdag\, men i + mange hjem er den optakten til juleaften.\n\nDe ugelange + juleforberedelser kulminerer med pyntning af juletræet\, indpakning af + gaver og de sidste forberedelser af julemaden.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122316Z +UID: + 9CDD0A5D-3464-41E0-92F8-C85630A3388C-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Påskedag +DTSTART;VALUE=DATE:20080324 +DTEND;VALUE=DATE:20080325 +DESCRIPTION:2. Påskedag.\n\n2. Påskedag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele dagen.\n\n2. Påskedag er en + forlængelse af påsken. I kirken fejres dagen selvfølgelig. De fleste + vælger dog at slappe af efter en til tider hektisk påske og lade op til + en ny række arbejdsdage.\n\n-----------------------------\n\nPåskedag + er den vigtigste af kirkeårets højtider (også selv om julen fejres af + flere). Det er festen for Jesu opstandelse.\n\nPåsken består egentligt + ikke kun af de to påskedage\, men af hele tiden frem til pinse\, + søndagene efter påske.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122520Z +UID: + D15B287E-1875-4F12-A3DC-5E7E96555090-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skærtorsdag +DTSTART;VALUE=DATE:20110421 +DTEND;VALUE=DATE:20110422 +DESCRIPTION:Skærtorsdag\n\nSkærtorsdag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n\"Skær\" er et gammelt dansk + ord\, der betyder ren og renset. Skærtorsdag spiste Jesus et jødisk + påskemåltid med lammesteg sammen med sine disciple. Inden de satte sig + til bords\, vaskede Jesus disciplenes fødder\, hvorfor dagen blev til + \"Skær-torsdag\".\n\n-----------------------------\n\nSkærtorsdag + mindes vi Jesu indstiftelse af nadveren.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060423T202330Z +UID: + B591AE95-8AA7-4C18-A298-75E3B07F0542-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skærtorsdag +DTSTART;VALUE=DATE:20150402 +DTEND;VALUE=DATE:20150403 +DESCRIPTION:Skærtorsdag\n\nSkærtorsdag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n\"Skær\" er et gammelt dansk + ord\, der betyder ren og renset. Skærtorsdag spiste Jesus et jødisk + påskemåltid med lammesteg sammen med sine disciple. Inden de satte sig + til bords\, vaskede Jesus disciplenes fødder\, hvorfor dagen blev til + \"Skær-torsdag\".\n\n-----------------------\n\nSkærtorsdag mindes vi + Jesu indstiftelse af nadveren.\n\nKilde: http: + //www.folkekirken.dk/leksikon.htm\n\nPåskedagene\, der altså markerer + centrale begivenheder i Kristi lidelseshistorie\, fejres til + minde om Kristi død og opstandelse. \n\nPåsken indtræffer + den første søndag efter fuldmåne efter forårsjævndøgn\, + hvilket vil sige mellem 22. marts og 25. april.\n\nForuden de kirkelige + traditioner har der gennem tiderne været knyttet utallige folkelige + skikke til påsken. Mange af dem eksisterer stadig\, men i mindre + omfang.\n\nMaden\, herunder især dekorerede æg\, spiller en stor + rolle\, og mange familier samles til frokost påskedag.\n\nBordpynten er + holdt i gult\, og man giver hinanden påskeæg. I slutningen af + 1800-tallet optræder chokoladeæg som gaveobjekt første gang.\n\nKilde: + http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130720Z +UID: + F5AD7089-91C9-405B-A521-043A97ED5BEE-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets længste dag +DTSTART;VALUE=DATE:20100621 +DTEND;VALUE=DATE:20100622 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets længste dag - også kaldet \"Sommersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nSommersolhverv er det tidspunkt + på året\, hvor dagen er længst og solen står højest på himlen kl. + 12 middag (som svarer til kl. 13 under sommertid). Begge dele skyldes\, + at solen står lodret over den nordlige vendekreds (\"Krebsens + Vendekreds\") ved middagstid netop den dag.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T184029Z +UID: + 0FF7911D-41E7-428B-A085-707D0BC1F1C8-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Aprilsnar +RRULE:FREQ=YEARLY;UNTIL=20150401;INTERVAL=1 +DTSTART;VALUE=DATE:20060401 +DTEND;VALUE=DATE:20060402 +DESCRIPTION:Aprilsnar\n\nSkikken at narre april har sin oprindelse i de + gamle kultiske narrefester til vårens ære.\n\nMan blev narret til at + løbe april ved at blive sendt ud i et opdigtet ærinde eller til at + modtage en narregave med et ubrugeligt indhold.\n\nI Danmark er der + tradition for\, at massemedierne hvert år lancerer en + aprilspøg.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T225338Z +UID: + 15116F8B-95A1-479B-B573-8CDBD3A3A3DF-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:1. søndag i Advent +DTSTART;VALUE=DATE:20061203 +DTEND;VALUE=DATE:20061204 +DESCRIPTION:1. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, Omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122303Z +UID: + D29B4EC9-910C-4765-8B83-F9A1A642C26C-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Påskedag* +DTSTART;VALUE=DATE:20080323 +DTEND;VALUE=DATE:20080324 +DESCRIPTION:Påskedag\n\nPåskesøndag fejres det at Jesus genopstod fra + de døde og blev levende igen. Jesus forblev på jorden de næste 40 dage + frem til Kristi + himmelfartsdag.\n\n-----------------------------\n\nPåskedag er den + vigtigste af kirkeårets højtider (også selv om julen fejres af flere). + Det er festen for Jesu opstandelse.\n\nPåsken består egentligt ikke kun + af de to påskedage\, men af hele tiden frem til pinse\, søndagene efter + påske.\n\nKilde: http://www.folkekirken.dk\n\nPåskedagene\, der altså + markerer centrale begivenheder i Kristi lidelseshistorie\, + fejres til minde om Kristi død og opstandelse. \n\nPåsken + indtræffer den første søndag efter fuldmåne efter + forårsjævndøgn\, hvilket vil sige mellem 22. marts og 25. + april.\n\nForuden de kirkelige traditioner har der gennem tiderne været + knyttet utallige folkelige skikke til påsken. Mange af dem eksisterer + stadig\, men i mindre omfang.\n\nMaden\, herunder især dekorerede æg\, + spiller en stor rolle\, og mange familier samles til frokost + påskedag.\n\nBordpynten er holdt i gult\, og man giver hinanden + påskeæg. I slutningen af 1800-tallet optræder chokoladeæg som + gaveobjekt første gang.\n\nKilde: http://www.kkb.bib.dk\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122851Z +UID: + 098486D9-027E-4880-8943-C6EBD15699F1-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Påskedag +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +DESCRIPTION:2. Påskedag.\n\n2. Påskedag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele dagen.\n\n2. Påskedag er en + forlængelse af påsken. I kirken fejres dagen selvfølgelig. De fleste + vælger dog at slappe af efter en til tider hektisk påske og lade op til + en ny række arbejdsdage.\n\n-----------------------------\n\nPåskedag + er den vigtigste af kirkeårets højtider (også selv om julen fejres af + flere). Det er festen for Jesu opstandelse.\n\nPåsken består egentligt + ikke kun af de to påskedage\, men af hele tiden frem til pinse\, + søndagene efter påske.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060423T194350Z +UID: + 15B10B27-2369-4A02-B830-474619DA4271-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Fastelavn +DTSTART;VALUE=DATE:20090222 +DTEND;VALUE=DATE:20090223 +DESCRIPTION:Fastelavn.\n\nFastelavn er 7. søndag før + Påske\n\nFastelavn eller fasteaften var oprindelig betegnelsen for + aftenen før den kristne faste\, som indledtes onsdag i den syvende uge + før påskedag.\n\nDagen kaldes stadig askeonsdag. I Danmark blev + fastelavn betegnelsen for de 3 forudgående dage\, hvor man spiste og + drak umådeholdent for at have noget at stå imod med.\n\nMed + reformationen ophørte fastepligten i Danmark\, og fastelavn blev + efterhånden alene en verdslig fest.\n\nMange af de gamle + fastelavnsskikke så som tøndeslagning\, biden til bolle\, udklædning + og raslen ved dørene lever i bedste velGående i dag\, men kun i + børnenes verden.\n\nFastelavnsmandag var helt frem til 1960'erne + skolefridag i Danmark.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060423T194042Z +UID: + 45DFCB06-74B7-4B5A-8B0A-10A3A9FBEA60-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Fastelavn +DTSTART;VALUE=DATE:20070218 +DTEND;VALUE=DATE:20070219 +DESCRIPTION:Fastelavn.\n\nFastelavn er 7. søndag før + Påske\n\nFastelavn eller fasteaften var oprindelig betegnelsen for + aftenen før den kristne faste\, som indledtes onsdag i den syvende uge + før påskedag.\n\nDagen kaldes stadig askeonsdag. I Danmark blev + fastelavn betegnelsen for de 3 forudgående dage\, hvor man spiste og + drak umådeholdent for at have noget at stå imod med.\n\nMed + reformationen ophørte fastepligten i Danmark\, og fastelavn blev + efterhånden alene en verdslig fest.\n\nMange af de gamle + fastelavnsskikke så som tøndeslagning\, biden til bolle\, udklædning + og raslen ved dørene lever i bedste velGående i dag\, men kun i + børnenes verden.\n\nFastelavnsmandag var helt frem til 1960'erne + skolefridag i Danmark.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060428T215637Z +UID: + ED10B9EB-D0AD-4E06-8C82-CFC0D58EF452-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Halloween +RRULE:FREQ=YEARLY;UNTIL=20151031;INTERVAL=1 +DTSTART;VALUE=DATE:20061031 +DTEND;VALUE=DATE:20061101 +DESCRIPTION:Halloween - Allehelgensaften.\n\nI USA kaldes dagen + halloween. Den har antaget en ren verdslig karakter og fejres med + skikke\, der minder om vor fastelavnsfest. Denne tradition har i de + senere år bredt sig til + Danmark.\n\n-----------------------------\n\nAllehelgensaften (som den + også kaldes) den 31. oktober er ifølge folketroen den aften\, hvor + hekse\, genfærd og mørkets magter er løs. Mange steder fortælles der + spøgelseshistorier og tages varsler.\n\nIsær i USA\, men også i + Skotland og Wales\, er allehelgensaften (her kaldt halloween) en stor + festdag\, hvor børn klæder sig ud og går rundt og banker på + nabokvarterets døre for at få slik (trick or treat)\, hvilket i stor + udstrækning kan sammenlignes med traditionen omkring fastelavn i + Danmark. Skikken med at udskære og dekorere orange græskar til + skræmmende oplyste masker ved Halloween er langsomt ved at vinde større + og større popularitet også i Danmark.\n\nI USA er dagen også + \"national trylledag\".\n\nPlaceringen på den 31. oktober skyldes at det + er aftenen før 1. november\, som traditionelt er Allehelgensdag. I den + danske folkekirke er Allehelgensdag af praktiske grunde flyttet til den + første søndag i november.\n\nKilde: http://da.wikipedia.org +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125706Z +UID: + 7D0EEAD2-CFDD-4FAF-B826-4B08A7D5CFCD-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Pinsedag* +DTSTART;VALUE=DATE:20070527 +DTEND;VALUE=DATE:20070528 +DESCRIPTION:Pinsedag.\n\nPinsedag er 10 dage efter Kristi Himmelfartsdag. + Da Jesus steg til himmels bad han sine disciple missionere og til at + hjælpe dem lovede han at sende Helligånden ned til dem. Det skete denne + dag 50 dage efter Påskedag.\n\nDa de tolv disciple\, (nu benævnt + \"apostle\") med hjælp fra Helligånden\, nu kunne missionere\, ses + denne dag som kirkens + fødselsdag.\n\n-----------------------------\n\nPinse kommer af det + græske ord \"pentekoste\"\, den halvtredssindstyvende.\n\nI pinsen + fejres Helligåndens komme og den kristne kirkes fødsel.\n\nSøndag + efter pinse fejres Trinitatis søndag eller Hellig Trefoldigheds fest\, + festdagen for Gud som den treenige Gud\, Fader\, Søn og + Helligånd.\n\nKilde: http: + //www.folkekirken.dk/\n\n-----------------------------\n\nFør i tiden + var det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet blev + derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk\n\n-----------------------\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121824Z +UID: + 64FFD329-E100-48AB-834D-BD550DBE1883-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Palmesøndag +DTSTART;VALUE=DATE:20130324 +DTEND;VALUE=DATE:20130325 +DESCRIPTION:Palmesøndag\n\nPalmesøndag fejres indtoget i Jerusalem og + starter påskeugen.\n\nKilde: http://www.folkekirken.dk\n\nHvorfor hedder + dagen ”Palmesøndag”?\n\nDen dag\, der indleder påskeugen - også + kaldet \"den stille uge\" - hedder \"palmesøndag\". Forklaringen er + ligetil - og dog...\n\nPalmesøndag er den dag\, Jesus red ind i + Jerusalem for at fejre påske og blev modtaget som en konge (af de samme + mennesker\, som korsfæstede ham mindre end en uge senere!).\n\nMatthæus + skriver i bibelteksten\, at \"den store folkeskare bredte deres kapper ud + på vejen\, andre skar grene af træerne og strøede dem på vejen\". Og + vi plejer at forestille os\, at disse grene var palmegrene\, fordi + palmegrenen er et gammelt tegn på hyldest.\n\nMEN - der vokser bare ikke + palmer i og omkring Jerusalem\, og har aldrig gjort det... Så nogen + burde i virkeligheden finde på et bedre navn til dagen!\n\nKilde: + www.skole-kirke.dk +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131448Z +UID: + EB3F26F7-0DC8-49DF-A1E8-8004256E23CD-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Morten Bisp +RRULE:FREQ=YEARLY;UNTIL=20151111;INTERVAL=1 +DTSTART;VALUE=DATE:20061111 +DTEND;VALUE=DATE:20061112 +DESCRIPTION:Morten Bisp.\n\nMortensdag er en helligdag\, hvor der ikke + holdes fri fra arbejde m.m.\n\n-----------------------------\n\nNavnet + knytter sig til Biskop Martin fra Tours.\n\nLegenden fortæller\, at + Martin gemte sig i en gåsesti for at undgå at blive valgt til + biskop.\n\nGæssene afslørede ham imidlertid med deres skræppen. Han + blev trukket frem og herefter valgt til biskop.\n\nHan besluttede + derfor\, at gæssene hvert år på denne dag skulle lade livet for at + blive spist.\n\nI Danmark finder gåsespisningen sted mortensaften den + 10. november. Gåsen er dog efterhånden blevet erstattet af + and.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122531Z +UID: + 8D8419A7-EE15-45B3-9D3B-682222BE0ABF-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Langfredag* +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +DESCRIPTION:Langfredag\n\nLangfredag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\nDagen hvor Jesus ifølge + biblen blev korsfæstet. Dagen hedder \"lang-fredag\"\, fordi det var en + lang og smertefuld dag for Jesus. Han blev pint og plaget til døde af af + de romerske soldater.\n\n-----------------------------\n\nPå Langfredag + er gudstjenesten koncentreret omkring Jesu domfældelse og død. + Gudstjenesten den dag har mange steder en særlig udformning.\n\nKilde: + http://www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nDer flages på halv stang til + solnedgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122619Z +UID: + C25AE443-E818-4A38-BBE4-016140C50DD6-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Påskedag +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +DESCRIPTION:2. Påskedag.\n\n2. Påskedag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele dagen.\n\n2. Påskedag er en + forlængelse af påsken. I kirken fejres dagen selvfølgelig. De fleste + vælger dog at slappe af efter en til tider hektisk påske og lade op til + en ny række arbejdsdage.\n\n-----------------------------\n\nPåskedag + er den vigtigste af kirkeårets højtider (også selv om julen fejres af + flere). Det er festen for Jesu opstandelse.\n\nPåsken består egentligt + ikke kun af de to påskedage\, men af hele tiden frem til pinse\, + søndagene efter påske.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T124949Z +UID: + D7FF3497-2090-406B-9665-22B90098FF40-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:St. Bededag* +DTSTART;VALUE=DATE:20100430 +DTEND;VALUE=DATE:20100501 +DESCRIPTION:St. Bededag.\n\nStore Bededag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele + dagen.\n\n-----------------------------\n\nStore Bededag falder fredag i + den fjerde uge efter påske.\n\nDagen blev indført i Danmark ved + kongelig forordning af 27. marts 1686 til afløsning af et umådeligt + stort antal bods- og bededage. \n\nTorsdag aften kl. 18 standsede alt + arbejde og al selskabelighed\, og man fastede indtil gudstjenesten på + bededagen\, fredag\, var forbi. \n\nDagen er officiel helligdag\, men kun + de folkelige traditioner med spadseretur på Københavns volde og + spisning af varme hveder holdes i hævd.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131227Z +UID: + 6FB8A295-C19E-4EFC-AED8-72E496B9762D-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Efterårsjævndøgn +DTSTART;VALUE=DATE:20090922 +DTEND;VALUE=DATE:20090923 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Efterårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115351Z +UID: + ABD01A79-9E9F-462B-A99D-A32F459F904A-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:3. søndag i Advent +DTSTART;VALUE=DATE:20081214 +DTEND;VALUE=DATE:20081215 +DESCRIPTION:3. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125054Z +UID: + D0D992F5-7948-49B3-8ACF-D549F45D65C0-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:St. Bededag* +DTSTART;VALUE=DATE:20130426 +DTEND;VALUE=DATE:20130427 +DESCRIPTION:St. Bededag.\n\nStore Bededag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele + dagen.\n\n-----------------------------\n\nStore Bededag falder fredag i + den fjerde uge efter påske.\n\nDagen blev indført i Danmark ved + kongelig forordning af 27. marts 1686 til afløsning af et umådeligt + stort antal bods- og bededage. \n\nTorsdag aften kl. 18 standsede alt + arbejde og al selskabelighed\, og man fastede indtil gudstjenesten på + bededagen\, fredag\, var forbi. \n\nDagen er officiel helligdag\, men kun + de folkelige traditioner med spadseretur på Københavns volde og + spisning af varme hveder holdes i hævd.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121254Z +UID: + B8D897C7-8BB1-4CDD-B684-E2F7342B64EB-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Forårsjævndøgn +DTSTART;VALUE=DATE:20150320 +DTEND;VALUE=DATE:20150321 +URL;VALUE=URI:http://www.crh.noaa.gov/ind/seasons.txt +DESCRIPTION:Forårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //www.crh.noaa.gov/ind/seasons.txt\n\n-----------------------------\n\nJæ + vndøgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131725Z +UID: + 912D6828-CE84-429D-9D57-B7636AEDC28B-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets korteste dag +DTSTART;VALUE=DATE:20071222 +DTEND;VALUE=DATE:20071223 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets korteste dag - også kaldet \"Vintersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nVintersolhverv er det tidspunkt + på året\, hvor dagen er kortest og solen står lavest på himlen kl. 12 + middag. Begge dele skyldes\, at solen står lodret over den sydlige + vendekreds (\"Stenbukkens Vendekreds\") ved middagstid netop den + dag.\n\nKilde: http://da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121125Z +UID: + 121B37AA-9FFF-4389-887E-595B182E70F9-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Forårsjævndøgn +DTSTART;VALUE=DATE:20090320 +DTEND;VALUE=DATE:20090321 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Forårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121609Z +UID: + 9C0CAE95-828E-4091-87F0-C711878D6CE1-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Palmesøndag +DTSTART;VALUE=DATE:20070401 +DTEND;VALUE=DATE:20070402 +DESCRIPTION:Palmesøndag\n\nPalmesøndag fejres indtoget i Jerusalem og + starter påskeugen.\n\nKilde: http://www.folkekirken.dk\n\nHvorfor hedder + dagen ”Palmesøndag”?\n\nDen dag\, der indleder påskeugen - også + kaldet \"den stille uge\" - hedder \"palmesøndag\". Forklaringen er + ligetil - og dog...\n\nPalmesøndag er den dag\, Jesus red ind i + Jerusalem for at fejre påske og blev modtaget som en konge (af de samme + mennesker\, som korsfæstede ham mindre end en uge senere!).\n\nMatthæus + skriver i bibelteksten\, at \"den store folkeskare bredte deres kapper ud + på vejen\, andre skar grene af træerne og strøede dem på vejen\". Og + vi plejer at forestille os\, at disse grene var palmegrene\, fordi + palmegrenen er et gammelt tegn på hyldest.\n\nMEN - der vokser bare ikke + palmer i og omkring Jerusalem\, og har aldrig gjort det... Så nogen + burde i virkeligheden finde på et bedre navn til dagen!\n\nKilde: + www.skole-kirke.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T171652Z +UID: + FA9BE691-FFD8-4D9D-855B-F36EE40DF0D7-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Stormen på København* +RRULE:FREQ=YEARLY;UNTIL=20150211;INTERVAL=1 +DTSTART;VALUE=DATE:20060211 +DTEND;VALUE=DATE:20060212 +DESCRIPTION:Stormen på København.\n\nDen første Svenske krig + (1657-1658) endte med et dansk nederlag\, hvor Danmark måtte afstå + Skåne\, Halland\, Blekinge og Bornholm ved fredslutningen.\n\nDette var + imidlertid ikke nok for den svenske konge Karl Gustav\, og i 1658 angreb + han igen Danmark med det formål at erobre hele landet.\n\nI august 1658 + blev København indesluttet. Befæstningen blev udbygget\, og en + mobilisering bragte antallet af forsvarere op på 8.500 mand.\n\nDen 11. + februar 1659 gik svenskerne til angreb på København\, men angrebet blev + slået tilbage med store svenske tab. Kun ganske få danske soldater + mistede livet.\n\nKilde: http://www.milhist.dk/\n\n*) Flagdag\n\nFlaget + hejses kl. 0800 og hales ved solnedgang. På dage\, hvor solen står op + efter kl. 0800\, hejses flaget først ved solopgang.\n\nKilde: http: + //www.spejderportal.dk/ +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125801Z +UID: + 2FA3CF79-A2F4-4B99-97AC-7DD4A972C980-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Pinsedag* +DTSTART;VALUE=DATE:20080511 +DTEND;VALUE=DATE:20080512 +DESCRIPTION:Pinsedag.\n\nPinsedag er 10 dage efter Kristi Himmelfartsdag. + Da Jesus steg til himmels bad han sine disciple missionere og til at + hjælpe dem lovede han at sende Helligånden ned til dem. Det skete denne + dag 50 dage efter Påskedag.\n\nDa de tolv disciple\, (nu benævnt + \"apostle\") med hjælp fra Helligånden\, nu kunne missionere\, ses + denne dag som kirkens + fødselsdag.\n\n-----------------------------\n\nPinse kommer af det + græske ord \"pentekoste\"\, den halvtredssindstyvende.\n\nI pinsen + fejres Helligåndens komme og den kristne kirkes fødsel.\n\nSøndag + efter pinse fejres Trinitatis søndag eller Hellig Trefoldigheds fest\, + festdagen for Gud som den treenige Gud\, Fader\, Søn og + Helligånd.\n\nKilde: http: + //www.folkekirken.dk\n\n-----------------------------\n\nFør i tiden var + det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet blev + derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk\n\n-----------------------\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131759Z +UID: + 02FA01C0-5660-481B-AA06-2B9F134839BF-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets korteste dag +DTSTART;VALUE=DATE:20091221 +DTEND;VALUE=DATE:20091222 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets korteste dag - også kaldet \"Vintersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nVintersolhverv er det tidspunkt + på året\, hvor dagen er kortest og solen står lavest på himlen kl. 12 + middag. Begge dele skyldes\, at solen står lodret over den sydlige + vendekreds (\"Stenbukkens Vendekreds\") ved middagstid netop den + dag.\n\nKilde: http://da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122756Z +UID: + F5B9BF8F-35C1-4240-ACAB-D5DB83E19028-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Påskedag +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +DESCRIPTION:2. Påskedag.\n\n2. Påskedag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele dagen.\n\n2. Påskedag er en + forlængelse af påsken. I kirken fejres dagen selvfølgelig. De fleste + vælger dog at slappe af efter en til tider hektisk påske og lade op til + en ny række arbejdsdage.\n\n-----------------------------\n\nPåskedag + er den vigtigste af kirkeårets højtider (også selv om julen fejres af + flere). Det er festen for Jesu opstandelse.\n\nPåsken består egentligt + ikke kun af de to påskedage\, men af hele tiden frem til pinse\, + søndagene efter påske.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T113154Z +UID: + EA806940-3565-4AF6-8151-326CA1841064-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Pinsedag +DTSTART;VALUE=DATE:20140609 +DTEND;VALUE=DATE:20140610 +DESCRIPTION:2. Pinsedag.\n\n2. Pinsedag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n2. Pinsedag er en forlængelse + af pinsen. Førhen giftede mange sig i øvrigt ved pinsetide. 2. Pinsedag + falder 50 dage efter 2. Påskedag.\n\n-----------------------\n\nPinse + kommer af det græske ord \"pentekoste\"\, den + halvtredssindstyvende.\n\nI pinsen fejres Helligåndens komme og den + kristne kirkes fødsel.\n\nSøndag efter pinse fejres Trinitatis søndag + eller Hellig Trefoldigheds fest\, festdagen for Gud som den treenige + Gud\, Fader\, Søn og Helligånd.\n\nKilde: http: + //www.folkekirken.dk/leksikon.htm\n\n-----------------------\n\nFør i + tiden var det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet + blev derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122555Z +UID: + 27F037B7-AABB-44F0-BDDB-B35C442092E3-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Påskedag* +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +DESCRIPTION:Påskedag\n\nPåskesøndag fejres det at Jesus genopstod fra + de døde og blev levende igen. Jesus forblev på jorden de næste 40 dage + frem til Kristi + himmelfartsdag.\n\n-----------------------------\n\nPåskedag er den + vigtigste af kirkeårets højtider (også selv om julen fejres af flere). + Det er festen for Jesu opstandelse.\n\nPåsken består egentligt ikke kun + af de to påskedage\, men af hele tiden frem til pinse\, søndagene efter + påske.\n\nKilde: http://www.folkekirken.dk\n\nPåskedagene\, der altså + markerer centrale begivenheder i Kristi lidelseshistorie\, + fejres til minde om Kristi død og opstandelse. \n\nPåsken + indtræffer den første søndag efter fuldmåne efter + forårsjævndøgn\, hvilket vil sige mellem 22. marts og 25. + april.\n\nForuden de kirkelige traditioner har der gennem tiderne været + knyttet utallige folkelige skikke til påsken. Mange af dem eksisterer + stadig\, men i mindre omfang.\n\nMaden\, herunder især dekorerede æg\, + spiller en stor rolle\, og mange familier samles til frokost + påskedag.\n\nBordpynten er holdt i gult\, og man giver hinanden + påskeæg. I slutningen af 1800-tallet optræder chokoladeæg som + gaveobjekt første gang.\n\nKilde: http://www.kkb.bib.dk\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060425T162256Z +UID: + 6D2264E6-CB2C-41B5-BAF1-919888587AA8-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skuddag +RRULE:FREQ=YEARLY;UNTIL=20150124;INTERVAL=4;BYMONTH=2 +DTSTART;VALUE=DATE:20080224 +DTEND;VALUE=DATE:20080225 +URL;VALUE=URI:http://da.wikipedia.org/wiki/Skuddag +DESCRIPTION:Skuddag.\n\nDen 24. februar er skuddag i skudår. I den gamle + romerske kalender var februar den sidste måned\, som oprindelig havde 23 + dage. Da kalenderen ikke passede helt godt til årstiderne\, skød man + sommetider en skudmåned af variabel længde ind. Denne placering af + skuddag på d. 24. februar blev bibeholdt af Cæsar i den julianske + kalender og senere også da den gregorianske kalender blev + indført.\n\nIfølge en gammel tradition skal mænd\, der afviser + kvinders frieri på skuddag\, i stedet give frieren 12 par silkehandsker. + Ifølge overleveringen stammer traditionen fra et dekret i 1288 af + dronning Margaret af Skotland.\n\nKilde: http: + //da.wikipedia.org/wiki/Skuddag +SEQUENCE:11 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130836Z +UID: + F45AB8EF-3F1A-4CFB-B9E1-555C59E82B9E-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets længste dag +DTSTART;VALUE=DATE:20150621 +DTEND;VALUE=DATE:20150622 +URL;VALUE=URI:http://www.crh.noaa.gov/ind/seasons.txt +DESCRIPTION:Årets længste dag - også kaldet \"Sommersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //www.crh.noaa.gov/ind/seasons.txt\n\n-----------------------------\n\nSol + hverv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nSommersolhverv er det tidspunkt + på året\, hvor dagen er længst og solen står højest på himlen kl. + 12 middag (som svarer til kl. 13 under sommertid). Begge dele skyldes\, + at solen står lodret over den nordlige vendekreds (\"Krebsens + Vendekreds\") ved middagstid netop den dag.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125836Z +UID: + ADC806FF-9A5B-4F3A-8E40-16A44267B30C-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Pinsedag +DTSTART;VALUE=DATE:20090601 +DTEND;VALUE=DATE:20090602 +DESCRIPTION:2. Pinsedag.\n\n2. Pinsedag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n2. Pinsedag er en forlængelse + af pinsen. Førhen giftede mange sig i øvrigt ved pinsetide. 2. Pinsedag + falder 50 dage efter 2. + Påskedag.\n\n-----------------------------\n\nPinse kommer af det + græske ord \"pentekoste\"\, den halvtredssindstyvende.\n\nI pinsen + fejres Helligåndens komme og den kristne kirkes fødsel.\n\nSøndag + efter pinse fejres Trinitatis søndag eller Hellig Trefoldigheds fest\, + festdagen for Gud som den treenige Gud\, Fader\, Søn og + Helligånd.\n\nKilde: http: + //www.folkekirken.dk\n\n-----------------------------\n\nFør i tiden var + det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet blev + derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125349Z +UID: + 3224C810-99E0-4BF4-8A8D-489A3A42DBB4-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Kr. Himmelfart* +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +DESCRIPTION:Kr. Himmelfart.\n\nKristi Himmelfartsdag er en + Søgnehelligdag\, hvor der holdes fri fra arbejde m.m. hele dagen.\n\n40 + dage efter påskedag\, hvor Jesus genopstod fra de døde og blev levende + igen\, stiger han denne dag til himmels og efterlader sine disciple med + besked på at vente på hjælp og støtte fra Helligånden\, som viser + sig 10 dage senere (50 dage efter påskedag) + Pinsedag.\n\n-----------------------------\n\nKristi Himmelfartsdag 40 + dage efter påske er festdagen for Jesu ophøjelse til Faderens højre + hånd.\n\nKilde: http://www.folkekirken.dk\n\nKristi himmelfartsdag\, der + fejres til minde om Kristi optagelse i himlen falder torsdag i den 6. uge + efter påske. Dagen er officiel helligdag i Danmark.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125452Z +UID: + 922F5363-AF5A-4207-A624-CBC63DE7EAB3-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Kr. Himmelfart* +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +DESCRIPTION:Kr. Himmelfart.\n\nKristi Himmelfartsdag er en + Søgnehelligdag\, hvor der holdes fri fra arbejde m.m. hele dagen.\n\n40 + dage efter påskedag\, hvor Jesus genopstod fra de døde og blev levende + igen\, stiger han denne dag til himmels og efterlader sine disciple med + besked på at vente på hjælp og støtte fra Helligånden\, som viser + sig 10 dage senere (50 dage efter påskedag) + Pinsedag.\n\n-----------------------------\n\nKristi Himmelfartsdag 40 + dage efter påske er festdagen for Jesu ophøjelse til Faderens højre + hånd.\n\nKilde: http://www.folkekirken.dk\n\nKristi himmelfartsdag\, der + fejres til minde om Kristi optagelse i himlen falder torsdag i den 6. uge + efter påske. Dagen er officiel helligdag i Danmark.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115513Z +UID: + 5C11FDCF-FD4C-45C3-A944-E6B4544ADA82-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:3. søndag i Advent +DTSTART;VALUE=DATE:20111211 +DTEND;VALUE=DATE:20111212 +DESCRIPTION:3. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115607Z +UID: + 145D51E8-D7F7-4600-9C9B-17F638F1F36C-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:3. søndag i Advent +DTSTART;VALUE=DATE:20131215 +DTEND;VALUE=DATE:20131216 +DESCRIPTION:3. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115920Z +UID: + 325768CC-7BE7-4DA0-B222-C1DC8BB62235-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:4. søndag i Advent +DTSTART;VALUE=DATE:20101219 +DTEND;VALUE=DATE:20101220 +DESCRIPTION:4. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T113518Z +UID: + 2A89ADA5-95D0-4B96-9CE8-DF3FA58F990A-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Kyndelmissedag +RRULE:FREQ=YEARLY;UNTIL=20150202;INTERVAL=1 +DTSTART;VALUE=DATE:20060202 +DTEND;VALUE=DATE:20060203 +DESCRIPTION:Kyndelmissedag\n\nIfølge dansk folketro årets koldeste dag + og vinterens + vendepunkt.\n\n-----------------------------\n\nKyndelmissedagen er + årsdagen for Marias renselse og Kristi fremstilling i templet. Dagen\, + som var helligdag i Danmark indtil 1770\, fejredes med processioner med + levende lys.\n\nKyndelmisse blev festligholdt til langt op i + 1800-tallet\, og der knytter sig stadig vejrvarsler til dagen. Skinner + solen f.eks. klart på kyndelmissedag\, kan der ventes megen + sne.\n\nKilde: http://www.kkb.bib.dk\n\n\"Hvis det blæser så stærkt + på Kyndelmissedag\, at 18 kællinger ikke kan holde på én til\, så + bli’r det tidligt forår\"\n\nPeder syv formaner til\, at det halve af + vinterens foder skal være tilbage ved Kyndelmissetide!\n\nKyndelmisse er + vinterens midtpunkt og drejepunkt.\n\nGammel jødisk skik at en kvinde\, + der havde født\, skulle renses ved en religiøs ceremoni 40 dage efter + fødslen. Det er 2. februar præcis 40 dage efter Jesu fødsel.\n\nEndnu + op i 1900-tallet var der på landet kvinder\, såkaldte + \"kirkegangskoner\"\, som ved bøn og formaning holdt sin første + kirkegang efter en barnefødsel.\n\nKilde: Google +SEQUENCE:12 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114709Z +UID: + 245B1DD7-415A-4B19-9B49-5D84624AD1CC-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:1. søndag i Advent +DTSTART;VALUE=DATE:20131201 +DTEND;VALUE=DATE:20131202 +DESCRIPTION:1. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, Omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115810Z +UID: + 73EE0AA3-D414-4EC4-9E13-4E134007A5BB-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:4. søndag i Advent +DTSTART;VALUE=DATE:20071223 +DTEND;VALUE=DATE:20071224 +DESCRIPTION:4. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131147Z +UID: + 8C3AEA62-682D-470F-8CB8-2D9F120ED891-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Efterårsjævndøgn +DTSTART;VALUE=DATE:20060923 +DTEND;VALUE=DATE:20060924 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Efterårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122828Z +UID: + 9B787C92-5D6D-4D0D-A6F8-E95DEF6185F0-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Langfredag* +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +DESCRIPTION:Langfredag\n\nLangfredag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\nDagen hvor Jesus ifølge + biblen blev korsfæstet. Dagen hedder \"lang-fredag\"\, fordi det var en + lang og smertefuld dag for Jesus. Han blev pint og plaget til døde af af + de romerske soldater.\n\n-----------------------------\n\nPå Langfredag + er gudstjenesten koncentreret omkring Jesu domfældelse og død. + Gudstjenesten den dag har mange steder en særlig udformning.\n\nKilde: + http://www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nDer flages på halv stang til + solnedgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125213Z +UID: + BE25D121-F8E3-4BD4-905B-352FFD4270BF-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Kr. Himmelfart* +DTSTART;VALUE=DATE:20060525 +DTEND;VALUE=DATE:20060526 +DESCRIPTION:Kr. Himmelfart.\n\nKristi Himmelfartsdag er en + Søgnehelligdag\, hvor der holdes fri fra arbejde m.m. hele dagen.\n\n40 + dage efter påskedag\, hvor Jesus genopstod fra de døde og blev levende + igen\, stiger han denne dag til himmels og efterlader sine disciple med + besked på at vente på hjælp og støtte fra Helligånden\, som viser + sig 10 dage senere (50 dage efter påskedag) + Pinsedag.\n\n-----------------------------\n\nKristi Himmelfartsdag 40 + dage efter påske er festdagen for Jesu ophøjelse til Faderens højre + hånd.\n\nKilde: http://www.folkekirken.dk\n\nKristi himmelfartsdag\, der + fejres til minde om Kristi optagelse i himlen falder torsdag i den 6. uge + efter påske. Dagen er officiel helligdag i Danmark.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060425T154132Z +UID: + 0A56FE79-6784-4C90-8E7A-736A58BB2876-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Sommertid begynder +RRULE:FREQ=YEARLY;UNTIL=20150326;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 +DTSTART;VALUE=DATE:20060326 +DTEND;VALUE=DATE:20060327 +DESCRIPTION:Sommertid begynder.\n\nDanmark har haft sommertid i enkelte + perioder fra 1916 og fast fra 1980.\n\nFra 1996 er sommertiden ensartet + inden for EU.\n\nSommertiden\, der oprindeligt blev indført af + energimæssige årsager\, begynder ultimo marts og slutter ultimo + oktober.\n\nKilde: http://www.kkb.bib.dk\n\nOm foråret stilles uret + frem fra kl. 02.00 til 03.00. Om efteråret (Vintertid) stilles uret + tilbage igen - fra kl. 03.00 til 02.00.\n\nEn god huskeregel er + havemøblerne som skal frem om foråret og tilbage om efteråret.\n\nLæs + mere om sommertid på Tycho Brahe Planetariums website.\n\nKilde: http: + //www.tycho.dk/ +SEQUENCE:11 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131745Z +UID: + A25B471C-F144-4010-9DFB-4FC5B75D1852-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets korteste dag +DTSTART;VALUE=DATE:20081221 +DTEND;VALUE=DATE:20081222 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets korteste dag - også kaldet \"Vintersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nVintersolhverv er det tidspunkt + på året\, hvor dagen er kortest og solen står lavest på himlen kl. 12 + middag. Begge dele skyldes\, at solen står lodret over den sydlige + vendekreds (\"Stenbukkens Vendekreds\") ved middagstid netop den + dag.\n\nKilde: http://da.wikipedia.org/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121224Z +UID: + 1B0591C5-96B0-491B-9806-31498D2B280B-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Forårsjævndøgn +DTSTART;VALUE=DATE:20130320 +DTEND;VALUE=DATE:20130321 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Forårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060425T154150Z +UID: + FD48B429-300C-4A3D-BC8D-583DE2169E46-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Sommertid ender +RRULE:FREQ=YEARLY;UNTIL=20151029;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 +DTSTART;VALUE=DATE:20061029 +DTEND;VALUE=DATE:20061030 +DESCRIPTION:Sommertid ender.\n\nDanmark har haft sommertid i enkelte + perioder fra 1916 og fast fra 1980.\n\nFra 1996 er sommertiden ensartet + inden for EU.\n\nSommertiden\, der oprindeligt blev indført af + energimæssige årsager\, begynder ultimo marts og slutter ultimo + oktober.\n\nKilde: http://www.kkb.bib.dk\n\nOm foråret stilles uret + frem fra kl. 02.00 til 03.00. Om efteråret (Vintertid) stilles uret + tilbage igen - fra kl. 03.00 til 02.00.\n\nEn god huskeregel er + havemøblerne som skal frem om foråret og tilbage om efteråret.\n\nLæs + mere om sommertid på Tycho Brahe Planetariums website.\n\nKilde: http: + //www.tycho.dk +SEQUENCE:11 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114817Z +UID: + A9011842-61C5-4321-9F7F-FB142C4D6748-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. søndag i Advent +DTSTART;VALUE=DATE:20071209 +DTEND;VALUE=DATE:20071210 +DESCRIPTION:2. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T225624Z +UID: + D9439178-D233-4677-BD2C-2B99EB533732-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Sct. Lucia +RRULE:FREQ=YEARLY;UNTIL=20151213;INTERVAL=1 +DTSTART;VALUE=DATE:20061213 +DTEND;VALUE=DATE:20061214 +DESCRIPTION:Sct. Lucia.\n\nDagen knytter sig til legenden om martyren + Lucia fra Syrakus\, som blev henrettet\, formodentlig under Kejser + Diokletians kristenforfølgelser omkring år 200 efter Kristi + fødsel.\n\nDagen er forbundet med mange skikke og traditioner\, herunder + Luciaoptog med hvidklædte piger anført af en Luciabrud med en krans med + lys på hovedet. \n\nSkikken kom til Danmark fra Sverige i 1944\, hvor + det første Luciaoptog blev arrangeret i København.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T124936Z +UID: + 81CA5DEB-49F8-403C-BF6E-2FD494CA3FD7-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:St. Bededag* +DTSTART;VALUE=DATE:20090508 +DTEND;VALUE=DATE:20090509 +DESCRIPTION:St. Bededag.\n\nStore Bededag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele + dagen.\n\n-----------------------------\n\nStore Bededag falder fredag i + den fjerde uge efter påske.\n\nDagen blev indført i Danmark ved + kongelig forordning af 27. marts 1686 til afløsning af et umådeligt + stort antal bods- og bededage. \n\nTorsdag aften kl. 18 standsede alt + arbejde og al selskabelighed\, og man fastede indtil gudstjenesten på + bededagen\, fredag\, var forbi. \n\nDagen er officiel helligdag\, men kun + de folkelige traditioner med spadseretur på Københavns volde og + spisning af varme hveder holdes i hævd.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122049Z +UID: + 7A5F94BF-DC52-4D2C-A6F5-6BAF75174D9E-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Påskedag +DTSTART;VALUE=DATE:20060417 +DTEND;VALUE=DATE:20060418 +DESCRIPTION:2. Påskedag.\n\n2. Påskedag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele dagen.\n\n2. Påskedag er en + forlængelse af påsken. I kirken fejres dagen selvfølgelig. De fleste + vælger dog at slappe af efter en til tider hektisk påske og lade op til + en ny række arbejdsdage.\n\n-----------------------------\n\nPåskedag + er den vigtigste af kirkeårets højtider (også selv om julen fejres af + flere). Det er festen for Jesu opstandelse.\n\nPåsken består egentligt + ikke kun af de to påskedage\, men af hele tiden frem til pinse\, + søndagene efter påske.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121749Z +UID: + 3EE23A58-1A67-4E1B-9542-F978CD4869AD-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Palmesøndag +DTSTART;VALUE=DATE:20110417 +DTEND;VALUE=DATE:20110418 +DESCRIPTION:Palmesøndag\n\nPalmesøndag fejres indtoget i Jerusalem og + starter påskeugen.\n\nKilde: http://www.folkekirken.dk\n\nHvorfor hedder + dagen ”Palmesøndag”?\n\nDen dag\, der indleder påskeugen - også + kaldet \"den stille uge\" - hedder \"palmesøndag\". Forklaringen er + ligetil - og dog...\n\nPalmesøndag er den dag\, Jesus red ind i + Jerusalem for at fejre påske og blev modtaget som en konge (af de samme + mennesker\, som korsfæstede ham mindre end en uge senere!).\n\nMatthæus + skriver i bibelteksten\, at \"den store folkeskare bredte deres kapper ud + på vejen\, andre skar grene af træerne og strøede dem på vejen\". Og + vi plejer at forestille os\, at disse grene var palmegrene\, fordi + palmegrenen er et gammelt tegn på hyldest.\n\nMEN - der vokser bare ikke + palmer i og omkring Jerusalem\, og har aldrig gjort det... Så nogen + burde i virkeligheden finde på et bedre navn til dagen!\n\nKilde: + www.skole-kirke.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114515Z +UID: + 39556A18-88F8-4601-A1A4-BCA8CBF3C720-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:1. søndag i Advent +DTSTART;VALUE=DATE:20081130 +DTEND;VALUE=DATE:20081201 +DESCRIPTION:1. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, Omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T112651Z +UID: + CB2AE0ED-59F4-41F2-858D-ED432CC1FC91-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Pinsedag +DTSTART;VALUE=DATE:20070528 +DTEND;VALUE=DATE:20070529 +DESCRIPTION:2. Pinsedag.\n\n2. Pinsedag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n2. Pinsedag er en forlængelse + af pinsen. Førhen giftede mange sig i øvrigt ved pinsetide. 2. Pinsedag + falder 50 dage efter 2. Påskedag.\n\n-----------------------\n\nPinse + kommer af det græske ord \"pentekoste\"\, den + halvtredssindstyvende.\n\nI pinsen fejres Helligåndens komme og den + kristne kirkes fødsel.\n\nSøndag efter pinse fejres Trinitatis søndag + eller Hellig Trefoldigheds fest\, festdagen for Gud som den treenige + Gud\, Fader\, Søn og Helligånd.\n\nKilde: http: + //www.folkekirken.dk/leksikon.htm\n\n-----------------------\n\nFør i + tiden var det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet + blev derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122733Z +UID: + 7CA8FE75-888B-4406-AB88-7484163A4723-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Langfredag* +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +DESCRIPTION:Langfredag\n\nLangfredag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\nDagen hvor Jesus ifølge + biblen blev korsfæstet. Dagen hedder \"lang-fredag\"\, fordi det var en + lang og smertefuld dag for Jesus. Han blev pint og plaget til døde af af + de romerske soldater.\n\n-----------------------------\n\nPå Langfredag + er gudstjenesten koncentreret omkring Jesu domfældelse og død. + Gudstjenesten den dag har mange steder en særlig udformning.\n\nKilde: + http://www.folkekirken.dk/\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nDer flages på halv stang til + solnedgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115436Z +UID: + 3EFF4485-0B63-4A41-B9D6-2730CA5AEFE5-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:3. søndag i Advent +DTSTART;VALUE=DATE:20101212 +DTEND;VALUE=DATE:20101213 +DESCRIPTION:3. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131810Z +UID: + D7638FDA-5D57-42E3-B4C8-BB30983FD706-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets korteste dag +DTSTART;VALUE=DATE:20101222 +DTEND;VALUE=DATE:20101223 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets korteste dag - også kaldet \"Vintersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nVintersolhverv er det tidspunkt + på året\, hvor dagen er kortest og solen står lavest på himlen kl. 12 + middag. Begge dele skyldes\, at solen står lodret over den sydlige + vendekreds (\"Stenbukkens Vendekreds\") ved middagstid netop den + dag.\n\nKilde: http://da.wikipedia.org/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130107Z +UID: + F0E93946-C9B5-4FF0-82D4-58EC9912A978-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Pinsedag* +DTSTART;VALUE=DATE:20150524 +DTEND;VALUE=DATE:20150525 +DESCRIPTION:Pinsedag.\n\nPinsedag er 10 dage efter Kristi Himmelfartsdag. + Da Jesus steg til himmels bad han sine disciple missionere og til at + hjælpe dem lovede han at sende Helligånden ned til dem. Det skete denne + dag 50 dage efter Påskedag.\n\nDa de tolv disciple\, (nu benævnt + \"apostle\") med hjælp fra Helligånden\, nu kunne missionere\, ses + denne dag som kirkens + fødselsdag.\n\n-----------------------------\n\nPinse kommer af det + græske ord \"pentekoste\"\, den halvtredssindstyvende.\n\nI pinsen + fejres Helligåndens komme og den kristne kirkes fødsel.\n\nSøndag + efter pinse fejres Trinitatis søndag eller Hellig Trefoldigheds fest\, + festdagen for Gud som den treenige Gud\, Fader\, Søn og + Helligånd.\n\nKilde: http: + //www.folkekirken.dk/\n\n-----------------------------\n\nFør i tiden + var det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet blev + derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk\n\n-----------------------\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114609Z +UID: + 967BF41D-8487-4A58-8FD7-F3C1C06EE75E-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:1. søndag i Advent +DTSTART;VALUE=DATE:20101128 +DTEND;VALUE=DATE:20101129 +DESCRIPTION:1. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, Omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131317Z +UID: + 57F5510E-D2DC-40F6-B0FE-FC11EB61BBED-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Efterårsjævndøgn +DTSTART;VALUE=DATE:20140923 +DTEND;VALUE=DATE:20140924 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Efterårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115944Z +UID: + 6B30A803-4D06-4B62-B753-BAF09C276593-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:4. søndag i Advent +DTSTART;VALUE=DATE:20111218 +DTEND;VALUE=DATE:20111219 +DESCRIPTION:4. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060423T204425Z +UID: + 02CB0204-86C1-425E-BB78-296DD1B0ED55-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Påskedag* +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +DESCRIPTION:Påskedag\n\nPåskesøndag fejres det at Jesus genopstod fra + de døde og blev levende igen. Jesus forblev på jorden de næste 40 dage + frem til Kristi himmelfartsdag.\n\n-----------------------\n\nPåskedag + er den vigtigste af kirkeårets højtider (også selv om julen fejres af + flere). Det er festen for Jesu opstandelse.\n\nPåsken består egentligt + ikke kun af de to påskedage\, men af hele tiden frem til pinse\, + søndagene efter påske.\n\nKilde: http: + //www.folkekirken.dk/leksikon.htm\n\nPåskedagene\, der altså markerer + centrale begivenheder i Kristi lidelseshistorie\, fejres til + minde om Kristi død og opstandelse. \n\nPåsken indtræffer + den første søndag efter fuldmåne efter forårsjævndøgn\, + hvilket vil sige mellem 22. marts og 25. april.\n\nForuden de kirkelige + traditioner har der gennem tiderne været knyttet utallige folkelige + skikke til påsken. Mange af dem eksisterer stadig\, men i mindre + omfang.\n\nMaden\, herunder især dekorerede æg\, spiller en stor + rolle\, og mange familier samles til frokost påskedag.\n\nBordpynten er + holdt i gult\, og man giver hinanden påskeæg. I slutningen af + 1800-tallet optræder chokoladeæg som gaveobjekt første gang.\n\nKilde: + http://www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122247Z +UID: + C9F61C5B-78BB-4CA0-BB93-A2DE86937943-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Langfredag* +DTSTART;VALUE=DATE:20080321 +DTEND;VALUE=DATE:20080322 +DESCRIPTION:Langfredag\n\nLangfredag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\nDagen hvor Jesus ifølge + biblen blev korsfæstet. Dagen hedder \"lang-fredag\"\, fordi det var en + lang og smertefuld dag for Jesus. Han blev pint og plaget til døde af af + de romerske soldater.\n\n-----------------------------\n\nPå Langfredag + er gudstjenesten koncentreret omkring Jesu domfældelse og død. + Gudstjenesten den dag har mange steder en særlig udformning.\n\nKilde: + http://www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nDer flages på halv stang til + solnedgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115645Z +UID: + 19591EA7-6DF3-41ED-8E37-A329E1328B71-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:3. søndag i Advent +DTSTART;VALUE=DATE:20151213 +DTEND;VALUE=DATE:20151214 +DESCRIPTION:3. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122656Z +UID: + 42A2F4B6-1A81-41FC-9DC6-78C72EA807D7-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Påskedag* +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +DESCRIPTION:Påskedag\n\nPåskesøndag fejres det at Jesus genopstod fra + de døde og blev levende igen. Jesus forblev på jorden de næste 40 dage + frem til Kristi + himmelfartsdag.\n\n-----------------------------\n\nPåskedag er den + vigtigste af kirkeårets højtider (også selv om julen fejres af flere). + Det er festen for Jesu opstandelse.\n\nPåsken består egentligt ikke kun + af de to påskedage\, men af hele tiden frem til pinse\, søndagene efter + påske.\n\nKilde: http://www.folkekirken.dk\n\nPåskedagene\, der altså + markerer centrale begivenheder i Kristi lidelseshistorie\, + fejres til minde om Kristi død og opstandelse. \n\nPåsken + indtræffer den første søndag efter fuldmåne efter + forårsjævndøgn\, hvilket vil sige mellem 22. marts og 25. + april.\n\nForuden de kirkelige traditioner har der gennem tiderne været + knyttet utallige folkelige skikke til påsken. Mange af dem eksisterer + stadig\, men i mindre omfang.\n\nMaden\, herunder især dekorerede æg\, + spiller en stor rolle\, og mange familier samles til frokost + påskedag.\n\nBordpynten er holdt i gult\, og man giver hinanden + påskeæg. I slutningen af 1800-tallet optræder chokoladeæg som + gaveobjekt første gang.\n\nKilde: http://www.kkb.bib.dk\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122724Z +UID: + 99F6CECC-8AE6-4175-BCA8-CD1DD7B4AEE8-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skærtorsdag +DTSTART;VALUE=DATE:20130328 +DTEND;VALUE=DATE:20130329 +DESCRIPTION:Skærtorsdag\n\nSkærtorsdag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n\"Skær\" er et gammelt dansk + ord\, der betyder ren og renset. Skærtorsdag spiste Jesus et jødisk + påskemåltid med lammesteg sammen med sine disciple. Inden de satte sig + til bords\, vaskede Jesus disciplenes fødder\, hvorfor dagen blev til + \"Skær-torsdag\".\n\n-----------------------------\n\nSkærtorsdag + mindes vi Jesu indstiftelse af nadveren.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122746Z +UID: + FD94BC66-6081-4C72-B1DE-C9FA6CF13153-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Påskedag* +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +DESCRIPTION:Påskedag\n\nPåskesøndag fejres det at Jesus genopstod fra + de døde og blev levende igen. Jesus forblev på jorden de næste 40 dage + frem til Kristi + himmelfartsdag.\n\n-----------------------------\n\nPåskedag er den + vigtigste af kirkeårets højtider (også selv om julen fejres af flere). + Det er festen for Jesu opstandelse.\n\nPåsken består egentligt ikke kun + af de to påskedage\, men af hele tiden frem til pinse\, søndagene efter + påske.\n\nKilde: http://www.folkekirken.dk\n\nPåskedagene\, der altså + markerer centrale begivenheder i Kristi lidelseshistorie\, + fejres til minde om Kristi død og opstandelse. \n\nPåsken + indtræffer den første søndag efter fuldmåne efter + forårsjævndøgn\, hvilket vil sige mellem 22. marts og 25. + april.\n\nForuden de kirkelige traditioner har der gennem tiderne været + knyttet utallige folkelige skikke til påsken. Mange af dem eksisterer + stadig\, men i mindre omfang.\n\nMaden\, herunder især dekorerede æg\, + spiller en stor rolle\, og mange familier samles til frokost + påskedag.\n\nBordpynten er holdt i gult\, og man giver hinanden + påskeæg. I slutningen af 1800-tallet optræder chokoladeæg som + gaveobjekt første gang.\n\nKilde: http://www.kkb.bib.dk\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121542Z +UID: + DD214923-144F-433A-A525-F643855FFF25-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Palmesøndag +DTSTART;VALUE=DATE:20060409 +DTEND;VALUE=DATE:20060410 +DESCRIPTION:Palmesøndag\n\nPalmesøndag fejres indtoget i Jerusalem og + starter påskeugen.\n\nKilde: http://www.folkekirken.dk\n\nHvorfor hedder + dagen ”Palmesøndag”?\n\nDen dag\, der indleder påskeugen - også + kaldet \"den stille uge\" - hedder \"palmesøndag\". Forklaringen er + ligetil - og dog...\n\nPalmesøndag er den dag\, Jesus red ind i + Jerusalem for at fejre påske og blev modtaget som en konge (af de samme + mennesker\, som korsfæstede ham mindre end en uge senere!).\n\nMatthæus + skriver i bibelteksten\, at \"den store folkeskare bredte deres kapper ud + på vejen\, andre skar grene af træerne og strøede dem på vejen\". Og + vi plejer at forestille os\, at disse grene var palmegrene\, fordi + palmegrenen er et gammelt tegn på hyldest.\n\nMEN - der vokser bare ikke + palmer i og omkring Jerusalem\, og har aldrig gjort det... Så nogen + burde i virkeligheden finde på et bedre navn til dagen!\n\nKilde: + www.skole-kirke.dk +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125858Z +UID: + EED2F00F-B6A9-48C0-947A-61338B13DB9E-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Pinsedag* +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +DESCRIPTION:Pinsedag.\n\nPinsedag er 10 dage efter Kristi Himmelfartsdag. + Da Jesus steg til himmels bad han sine disciple missionere og til at + hjælpe dem lovede han at sende Helligånden ned til dem. Det skete denne + dag 50 dage efter Påskedag.\n\nDa de tolv disciple\, (nu benævnt + \"apostle\") med hjælp fra Helligånden\, nu kunne missionere\, ses + denne dag som kirkens + fødselsdag.\n\n-----------------------------\n\nPinse kommer af det + græske ord \"pentekoste\"\, den halvtredssindstyvende.\n\nI pinsen + fejres Helligåndens komme og den kristne kirkes fødsel.\n\nSøndag + efter pinse fejres Trinitatis søndag eller Hellig Trefoldigheds fest\, + festdagen for Gud som den treenige Gud\, Fader\, Søn og + Helligånd.\n\nKilde: http: + //www.folkekirken.dk\n\n-----------------------------\n\nFør i tiden var + det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet blev + derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk\n\n-----------------------\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T112929Z +UID: + F1AFDADF-9013-4109-BE15-58068BD06430-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Pinsedag +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +DESCRIPTION:2. Pinsedag.\n\n2. Pinsedag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n2. Pinsedag er en forlængelse + af pinsen. Førhen giftede mange sig i øvrigt ved pinsetide. 2. Pinsedag + falder 50 dage efter 2. Påskedag.\n\n-----------------------\n\nPinse + kommer af det græske ord \"pentekoste\"\, den + halvtredssindstyvende.\n\nI pinsen fejres Helligåndens komme og den + kristne kirkes fødsel.\n\nSøndag efter pinse fejres Trinitatis søndag + eller Hellig Trefoldigheds fest\, festdagen for Gud som den treenige + Gud\, Fader\, Søn og Helligånd.\n\nKilde: http: + //www.folkekirken.dk/leksikon.htm\n\n-----------------------\n\nFør i + tiden var det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet + blev derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125527Z +UID: + E15D7C60-514F-4DAF-ABB6-00B3AD88B381-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Kr. Himmelfart* +DTSTART;VALUE=DATE:20150514 +DTEND;VALUE=DATE:20150515 +DESCRIPTION:Kr. Himmelfart.\n\nKristi Himmelfartsdag er en + Søgnehelligdag\, hvor der holdes fri fra arbejde m.m. hele dagen.\n\n40 + dage efter påskedag\, hvor Jesus genopstod fra de døde og blev levende + igen\, stiger han denne dag til himmels og efterlader sine disciple med + besked på at vente på hjælp og støtte fra Helligånden\, som viser + sig 10 dage senere (50 dage efter påskedag) + Pinsedag.\n\n-----------------------------\n\nKristi Himmelfartsdag 40 + dage efter påske er festdagen for Jesu ophøjelse til Faderens højre + hånd.\n\nKilde: http://www.folkekirken.dk\n\nKristi himmelfartsdag\, der + fejres til minde om Kristi optagelse i himlen falder torsdag i den 6. uge + efter påske. Dagen er officiel helligdag i Danmark.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114911Z +UID: + 97C753AE-4B80-4DCC-B411-B7816AED33D9-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. søndag i Advent +DTSTART;VALUE=DATE:20081207 +DTEND;VALUE=DATE:20081208 +DESCRIPTION:2. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T224018Z +UID: + 79AFBC67-6DD5-46E1-B95F-4A27DF5E1399-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:FN-dag +RRULE:FREQ=YEARLY;UNTIL=20151024;INTERVAL=1 +DTSTART;VALUE=DATE:20061024 +DTEND;VALUE=DATE:20061025 +DESCRIPTION:FN-dag.\n\nDenne dag fejres til minde om oprettelsen af De + Forenede Nationers pagt i 1945.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:10 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121849Z +UID: + 34E6176B-B890-447D-9252-1A6950917879-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Palmesøndag +DTSTART;VALUE=DATE:20140413 +DTEND;VALUE=DATE:20140414 +DESCRIPTION:Palmesøndag\n\nPalmesøndag fejres indtoget i Jerusalem og + starter påskeugen.\n\nKilde: http://www.folkekirken.dk\n\nHvorfor hedder + dagen ”Palmesøndag”?\n\nDen dag\, der indleder påskeugen - også + kaldet \"den stille uge\" - hedder \"palmesøndag\". Forklaringen er + ligetil - og dog...\n\nPalmesøndag er den dag\, Jesus red ind i + Jerusalem for at fejre påske og blev modtaget som en konge (af de samme + mennesker\, som korsfæstede ham mindre end en uge senere!).\n\nMatthæus + skriver i bibelteksten\, at \"den store folkeskare bredte deres kapper ud + på vejen\, andre skar grene af træerne og strøede dem på vejen\". Og + vi plejer at forestille os\, at disse grene var palmegrene\, fordi + palmegrenen er et gammelt tegn på hyldest.\n\nMEN - der vokser bare ikke + palmer i og omkring Jerusalem\, og har aldrig gjort det... Så nogen + burde i virkeligheden finde på et bedre navn til dagen!\n\nKilde: + www.skole-kirke.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115146Z +UID: + BCD04221-74E8-4200-8E94-1E47DB720196-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. søndag i Advent +DTSTART;VALUE=DATE:20131208 +DTEND;VALUE=DATE:20131209 +DESCRIPTION:2. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122139Z +UID: + F4A2E94D-0161-4B01-BAED-670FFCF93C17-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Påskedag* +DTSTART;VALUE=DATE:20070408 +DTEND;VALUE=DATE:20070409 +DESCRIPTION:Påskedag\n\nPåskesøndag fejres det at Jesus genopstod fra + de døde og blev levende igen. Jesus forblev på jorden de næste 40 dage + frem til Kristi + himmelfartsdag.\n\n-----------------------------\n\nPåskedag er den + vigtigste af kirkeårets højtider (også selv om julen fejres af flere). + Det er festen for Jesu opstandelse.\n\nPåsken består egentligt ikke kun + af de to påskedage\, men af hele tiden frem til pinse\, søndagene efter + påske.\n\nKilde: http://www.folkekirken.dk\n\nPåskedagene\, der altså + markerer centrale begivenheder i Kristi lidelseshistorie\, + fejres til minde om Kristi død og opstandelse. \n\nPåsken + indtræffer den første søndag efter fuldmåne efter + forårsjævndøgn\, hvilket vil sige mellem 22. marts og 25. + april.\n\nForuden de kirkelige traditioner har der gennem tiderne været + knyttet utallige folkelige skikke til påsken. Mange af dem eksisterer + stadig\, men i mindre omfang.\n\nMaden\, herunder især dekorerede æg\, + spiller en stor rolle\, og mange familier samles til frokost + påskedag.\n\nBordpynten er holdt i gult\, og man giver hinanden + påskeæg. I slutningen af 1800-tallet optræder chokoladeæg som + gaveobjekt første gang.\n\nKilde: http://www.kkb.bib.dk\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060423T195207Z +UID: + 33F50902-0630-411F-97F5-DB8410C38FC5-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Fastelavn +DTSTART;VALUE=DATE:20140302 +DTEND;VALUE=DATE:20140303 +DESCRIPTION:Fastelavn.\n\nFastelavn er 7. søndag før + Påske\n\nFastelavn eller fasteaften var oprindelig betegnelsen for + aftenen før den kristne faste\, som indledtes onsdag i den syvende uge + før påskedag.\n\nDagen kaldes stadig askeonsdag. I Danmark blev + fastelavn betegnelsen for de 3 forudgående dage\, hvor man spiste og + drak umådeholdent for at have noget at stå imod med.\n\nMed + reformationen ophørte fastepligten i Danmark\, og fastelavn blev + efterhånden alene en verdslig fest.\n\nMange af de gamle + fastelavnsskikke så som tøndeslagning\, biden til bolle\, udklædning + og raslen ved dørene lever i bedste velGående i dag\, men kun i + børnenes verden.\n\nFastelavnsmandag var helt frem til 1960'erne + skolefridag i Danmark.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T112856Z +UID: + D14D2802-D6AB-4230-AD6F-03B764A821DF-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Pinsedag +DTSTART;VALUE=DATE:20100524 +DTEND;VALUE=DATE:20100525 +DESCRIPTION:2. Pinsedag.\n\n2. Pinsedag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n2. Pinsedag er en forlængelse + af pinsen. Førhen giftede mange sig i øvrigt ved pinsetide. 2. Pinsedag + falder 50 dage efter 2. Påskedag.\n\n-----------------------\n\nPinse + kommer af det græske ord \"pentekoste\"\, den + halvtredssindstyvende.\n\nI pinsen fejres Helligåndens komme og den + kristne kirkes fødsel.\n\nSøndag efter pinse fejres Trinitatis søndag + eller Hellig Trefoldigheds fest\, festdagen for Gud som den treenige + Gud\, Fader\, Søn og Helligånd.\n\nKilde: http: + //www.folkekirken.dk/leksikon.htm\n\n-----------------------\n\nFør i + tiden var det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet + blev derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131845Z +UID: + D57A3AAA-B70B-47DA-B8E1-79282C60EA23-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets korteste dag +DTSTART;VALUE=DATE:20121221 +DTEND;VALUE=DATE:20121222 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets korteste dag - også kaldet \"Vintersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nVintersolhverv er det tidspunkt + på året\, hvor dagen er kortest og solen står lavest på himlen kl. 12 + middag. Begge dele skyldes\, at solen står lodret over den sydlige + vendekreds (\"Stenbukkens Vendekreds\") ved middagstid netop den + dag.\n\nKilde: http://da.wikipedia.org/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115416Z +UID: + 1E3C2725-EA54-4E6D-AF2E-5919D6D430E7-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:3. søndag i Advent +DTSTART;VALUE=DATE:20091213 +DTEND;VALUE=DATE:20091214 +DESCRIPTION:3. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115308Z +UID: + 966A5BF0-8229-4E52-87D9-A50D874B9E9E-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:3. søndag i Advent +DTSTART;VALUE=DATE:20071216 +DTEND;VALUE=DATE:20071217 +DESCRIPTION:3. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130737Z +UID: + 18F69F25-1376-4D27-8B59-BA1BE6334F7C-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets længste dag +DTSTART;VALUE=DATE:20110621 +DTEND;VALUE=DATE:20110622 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets længste dag - også kaldet \"Sommersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nSommersolhverv er det tidspunkt + på året\, hvor dagen er længst og solen står højest på himlen kl. + 12 middag (som svarer til kl. 13 under sommertid). Begge dele skyldes\, + at solen står lodret over den nordlige vendekreds (\"Krebsens + Vendekreds\") ved middagstid netop den dag.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121805Z +UID: + EAE6F66B-EDD3-4CF3-A5A1-675A36FE3650-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Palmesøndag +DTSTART;VALUE=DATE:20120401 +DTEND;VALUE=DATE:20120402 +DESCRIPTION:Palmesøndag\n\nPalmesøndag fejres indtoget i Jerusalem og + starter påskeugen.\n\nKilde: http://www.folkekirken.dk\n\nHvorfor hedder + dagen ”Palmesøndag”?\n\nDen dag\, der indleder påskeugen - også + kaldet \"den stille uge\" - hedder \"palmesøndag\". Forklaringen er + ligetil - og dog...\n\nPalmesøndag er den dag\, Jesus red ind i + Jerusalem for at fejre påske og blev modtaget som en konge (af de samme + mennesker\, som korsfæstede ham mindre end en uge senere!).\n\nMatthæus + skriver i bibelteksten\, at \"den store folkeskare bredte deres kapper ud + på vejen\, andre skar grene af træerne og strøede dem på vejen\". Og + vi plejer at forestille os\, at disse grene var palmegrene\, fordi + palmegrenen er et gammelt tegn på hyldest.\n\nMEN - der vokser bare ikke + palmer i og omkring Jerusalem\, og har aldrig gjort det... Så nogen + burde i virkeligheden finde på et bedre navn til dagen!\n\nKilde: + www.skole-kirke.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125025Z +UID: + EDCEC8F0-A11B-4161-8437-1D81E4E4F9A2-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:St. Bededag* +DTSTART;VALUE=DATE:20120504 +DTEND;VALUE=DATE:20120505 +DESCRIPTION:St. Bededag.\n\nStore Bededag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele + dagen.\n\n-----------------------------\n\nStore Bededag falder fredag i + den fjerde uge efter påske.\n\nDagen blev indført i Danmark ved + kongelig forordning af 27. marts 1686 til afløsning af et umådeligt + stort antal bods- og bededage. \n\nTorsdag aften kl. 18 standsede alt + arbejde og al selskabelighed\, og man fastede indtil gudstjenesten på + bededagen\, fredag\, var forbi. \n\nDagen er officiel helligdag\, men kun + de folkelige traditioner med spadseretur på Københavns volde og + spisning af varme hveder holdes i hævd.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114726Z +UID: + F1FF5F86-2E17-4A79-9457-DBB912A684F0-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:1. søndag i Advent +DTSTART;VALUE=DATE:20141130 +DTEND;VALUE=DATE:20141201 +DESCRIPTION:1. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, Omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114545Z +UID: + E3942017-058A-4A08-BFFC-1A3F97D0B368-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:1. søndag i Advent +DTSTART;VALUE=DATE:20091129 +DTEND;VALUE=DATE:20091130 +DESCRIPTION:1. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, Omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T113030Z +UID: + 4163CDF5-564E-4DA5-A467-F9B9FFCB8368-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Pinsedag +DTSTART;VALUE=DATE:20130520 +DTEND;VALUE=DATE:20130521 +DESCRIPTION:2. Pinsedag.\n\n2. Pinsedag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n2. Pinsedag er en forlængelse + af pinsen. Førhen giftede mange sig i øvrigt ved pinsetide. 2. Pinsedag + falder 50 dage efter 2. Påskedag.\n\n-----------------------\n\nPinse + kommer af det græske ord \"pentekoste\"\, den + halvtredssindstyvende.\n\nI pinsen fejres Helligåndens komme og den + kristne kirkes fødsel.\n\nSøndag efter pinse fejres Trinitatis søndag + eller Hellig Trefoldigheds fest\, festdagen for Gud som den treenige + Gud\, Fader\, Søn og Helligånd.\n\nKilde: http: + //www.folkekirken.dk/leksikon.htm\n\n-----------------------\n\nFør i + tiden var det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet + blev derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125511Z +UID: + E1ABF1C2-43EE-47F5-AF45-3DB102A40079-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Kr. Himmelfart* +DTSTART;VALUE=DATE:20140529 +DTEND;VALUE=DATE:20140530 +DESCRIPTION:Kr. Himmelfart.\n\nKristi Himmelfartsdag er en + Søgnehelligdag\, hvor der holdes fri fra arbejde m.m. hele dagen.\n\n40 + dage efter påskedag\, hvor Jesus genopstod fra de døde og blev levende + igen\, stiger han denne dag til himmels og efterlader sine disciple med + besked på at vente på hjælp og støtte fra Helligånden\, som viser + sig 10 dage senere (50 dage efter påskedag) + Pinsedag.\n\n-----------------------------\n\nKristi Himmelfartsdag 40 + dage efter påske er festdagen for Jesu ophøjelse til Faderens højre + hånd.\n\nKilde: http://www.folkekirken.dk\n\nKristi himmelfartsdag\, der + fejres til minde om Kristi optagelse i himlen falder torsdag i den 6. uge + efter påske. Dagen er officiel helligdag i Danmark.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T113330Z +UID: + 6CA180FA-A3D6-481E-96AA-97B068A9CBB9-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Nytårsdag* +RRULE:FREQ=YEARLY;UNTIL=20150101;INTERVAL=1 +DTSTART;VALUE=DATE:20060101 +DTEND;VALUE=DATE:20060102 +DESCRIPTION:Nytårsdag.\n\nNytårsdag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele + dagen.\n\n-----------------------------\n\nNytårsdag er kirkeligt set + mere en fest for Jesu navngivelse på 8. dagen end for + årsskiftet.\n\nKilde: http://www.folkekirken.dk\n\nNytårsdag er + helligdag i Danmark. Dagen blev tidligere brugt som betalingsdag for + årets arbejde eller som skiftedag\, hvor tyende eller svend kunne flytte + fra husbond eller mester.\n\nUtallige skikke og traditioner med bund i + folkeovertroen er knyttet til fejringen af nytåret.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:12 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125730Z +UID: + C7D161AE-8225-4525-BCE2-17ACEDB087C5-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Pinsedag +DTSTART;VALUE=DATE:20060605 +DTEND;VALUE=DATE:20060606 +DESCRIPTION:2. Pinsedag.\n\n2. Pinsedag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n2. Pinsedag er en forlængelse + af pinsen. Førhen giftede mange sig i øvrigt ved pinsetide. 2. Pinsedag + falder 50 dage efter 2. + Påskedag.\n\n-----------------------------\n\nPinse kommer af det + græske ord \"pentekoste\"\, den halvtredssindstyvende.\n\nI pinsen + fejres Helligåndens komme og den kristne kirkes fødsel.\n\nSøndag + efter pinse fejres Trinitatis søndag eller Hellig Trefoldigheds fest\, + festdagen for Gud som den treenige Gud\, Fader\, Søn og + Helligånd.\n\nKilde: http: + //www.folkekirken.dk\n\n-----------------------------\n\nFør i tiden var + det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet blev + derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130629Z +UID: + E4636433-6AC3-41C5-9CF0-A034A0919A60-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets længste dag +DTSTART;VALUE=DATE:20090621 +DTEND;VALUE=DATE:20090622 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets længste dag - også kaldet \"Sommersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nSommersolhverv er det tidspunkt + på året\, hvor dagen er længst og solen står højest på himlen kl. + 12 middag (som svarer til kl. 13 under sommertid). Begge dele skyldes\, + at solen står lodret over den nordlige vendekreds (\"Krebsens + Vendekreds\") ved middagstid netop den dag.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125118Z +UID: + 48B58CD7-04E4-4B85-8AD2-452F03835E3A-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:St. Bededag* +DTSTART;VALUE=DATE:20150501 +DTEND;VALUE=DATE:20150502 +DESCRIPTION:St. Bededag.\n\nStore Bededag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele + dagen.\n\n-----------------------------\n\nStore Bededag falder fredag i + den fjerde uge efter påske.\n\nDagen blev indført i Danmark ved + kongelig forordning af 27. marts 1686 til afløsning af et umådeligt + stort antal bods- og bededage. \n\nTorsdag aften kl. 18 standsede alt + arbejde og al selskabelighed\, og man fastede indtil gudstjenesten på + bededagen\, fredag\, var forbi. \n\nDagen er officiel helligdag\, men kun + de folkelige traditioner med spadseretur på Københavns volde og + spisning af varme hveder holdes i hævd.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130243Z +UID: + B8C6B979-599A-48CE-8F97-CB5CFE358252-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Grundlovsdag* +RRULE:FREQ=YEARLY;UNTIL=20150605;INTERVAL=1 +DTSTART;VALUE=DATE:20060605 +DTEND;VALUE=DATE:20060606 +DESCRIPTION:Grundlovsdag.\n\nGrundlovsdag er siden år 2000 efterhånden + blevet at betragte som en Søgnehelligdag\, hvor der holdes fri fra + arbejde m.m. hele dagen. Visse steder er det dog stadig kun en halv + fridag.\n\n-----------------------------\n\nDen 5. juni 1849 blev + Danmarks første frie forfatning underskrevet af Frederik 7.\n\nOgså de + senere grundlove fra 1915 og 1953 er dateret denne dato. Med grundloven + af 1953 blev tokammersystemet afskaffet\, og der indførtes kvindelig + arvefølge.\n\nDagen er officiel fest- og flagdag og markeres bl.a. med + politiske møder landet over. 5. juni er desuden hel eller delvis fridag + i Danmark.\n\n5. juni er også Fars Dag. Skikken\, der ligesom Mors Dag + stammer fra USA\, blev indført i Danmark i 1935.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:10 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060429T110551Z +UID: + F85D5E13-8C58-4708-B130-B428E59F7A75-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Lyse nætter begynder +RRULE:FREQ=YEARLY;UNTIL=20140504;INTERVAL=1 +DTSTART;VALUE=DATE:20060505 +DTEND;VALUE=DATE:20060506 +DESCRIPTION:Lyse nætter\n\nNår solen ved midnat står mindre end 18° + under horisonten\, går aftendæmringen over i morgendæmringen\, og + natten siges at høre til de lyse nætter. I Danmark fra ca. 5. maj til + 8. august og med den største lysstyrke ved sommersolhverv den 21. juni\, + når solen står kun 11° under horisonten.\n\nKilde: http: + //da.wikipedia.org +SEQUENCE:10 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131200Z +UID: + 0887E708-BBF7-4653-AEFD-0ABFEA1C2D28-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Efterårsjævndøgn +DTSTART;VALUE=DATE:20070923 +DTEND;VALUE=DATE:20070924 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Efterårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T225906Z +UID: + 449F230A-B83F-4CBB-B098-8069BA13021C-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:4. søndag i Advent +DTSTART;VALUE=DATE:20061224 +DTEND;VALUE=DATE:20061225 +DESCRIPTION:4. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T224627Z +UID: + 1F588C30-889F-4B2A-9122-7935C1892BF7-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Allehelgensdag +RRULE:FREQ=YEARLY;UNTIL=20151105;INTERVAL=1;BYDAY=1SU;BYMONTH=11 +DTSTART;VALUE=DATE:20061105 +DTEND;VALUE=DATE:20061106 +DESCRIPTION:Allehelgensdag.\n\nFra omkring år 800 har 1. november været + almen festdag for de helgener\, der ikke har en speciel dag.\n\nI 1770 + blev dagen flyttet til den første søndag i november og afskaffet som + officiel helligdag. \n\nDagen bliver fejret med + Allehelgensgudstjeneste.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130039Z +UID: + 879A0F61-6B70-44F7-9C69-12703B5E4FEA-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Pinsedag* +DTSTART;VALUE=DATE:20140608 +DTEND;VALUE=DATE:20140609 +DESCRIPTION:Pinsedag.\n\nPinsedag er 10 dage efter Kristi Himmelfartsdag. + Da Jesus steg til himmels bad han sine disciple missionere og til at + hjælpe dem lovede han at sende Helligånden ned til dem. Det skete denne + dag 50 dage efter Påskedag.\n\nDa de tolv disciple\, (nu benævnt + \"apostle\") med hjælp fra Helligånden\, nu kunne missionere\, ses + denne dag som kirkens + fødselsdag.\n\n-----------------------------\n\nPinse kommer af det + græske ord \"pentekoste\"\, den halvtredssindstyvende.\n\nI pinsen + fejres Helligåndens komme og den kristne kirkes fødsel.\n\nSøndag + efter pinse fejres Trinitatis søndag eller Hellig Trefoldigheds fest\, + festdagen for Gud som den treenige Gud\, Fader\, Søn og + Helligånd.\n\nKilde: http: + //www.folkekirken.dk\n\n-----------------------------\n\nFør i tiden var + det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet blev + derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk\n\n-----------------------\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T124839Z +UID: + 0FDFD08C-308F-4E9C-A0C4-3A9C69124959-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:St. Bededag* +DTSTART;VALUE=DATE:20070504 +DTEND;VALUE=DATE:20070505 +DESCRIPTION:St. Bededag.\n\nStore Bededag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele + dagen.\n\n-----------------------------\n\nStore Bededag falder fredag i + den fjerde uge efter påske.\n\nDagen blev indført i Danmark ved + kongelig forordning af 27. marts 1686 til afløsning af et umådeligt + stort antal bods- og bededage. \n\nTorsdag aften kl. 18 standsede alt + arbejde og al selskabelighed\, og man fastede indtil gudstjenesten på + bededagen\, fredag\, var forbi. \n\nDagen er officiel helligdag\, men kun + de folkelige traditioner med spadseretur på Københavns volde og + spisning af varme hveder holdes i hævd.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121644Z +UID: + 8070E488-9A72-4FA4-BEC9-A7E273A0944A-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Palmesøndag +DTSTART;VALUE=DATE:20080316 +DTEND;VALUE=DATE:20080317 +DESCRIPTION:Palmesøndag\n\nPalmesøndag fejres indtoget i Jerusalem og + starter påskeugen.\n\nKilde: http://www.folkekirken.dk\n\nHvorfor hedder + dagen ”Palmesøndag”?\n\nDen dag\, der indleder påskeugen - også + kaldet \"den stille uge\" - hedder \"palmesøndag\". Forklaringen er + ligetil - og dog...\n\nPalmesøndag er den dag\, Jesus red ind i + Jerusalem for at fejre påske og blev modtaget som en konge (af de samme + mennesker\, som korsfæstede ham mindre end en uge senere!).\n\nMatthæus + skriver i bibelteksten\, at \"den store folkeskare bredte deres kapper ud + på vejen\, andre skar grene af træerne og strøede dem på vejen\". Og + vi plejer at forestille os\, at disse grene var palmegrene\, fordi + palmegrenen er et gammelt tegn på hyldest.\n\nMEN - der vokser bare ikke + palmer i og omkring Jerusalem\, og har aldrig gjort det... Så nogen + burde i virkeligheden finde på et bedre navn til dagen!\n\nKilde: + www.skole-kirke.dk +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131934Z +UID: + 772B61C5-398B-47F8-A5A6-B647403A89E3-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets korteste dag +DTSTART;VALUE=DATE:20151222 +DTEND;VALUE=DATE:20151223 +URL;VALUE=URI:http://www.crh.noaa.gov/ind/seasons.txt +DESCRIPTION:Årets korteste dag - også kaldet \"Vintersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //www.crh.noaa.gov/ind/seasons.txt\n\n-----------------------------\n\nSol + hverv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nVintersolhverv er det tidspunkt + på året\, hvor dagen er kortest og solen står lavest på himlen kl. 12 + middag. Begge dele skyldes\, at solen står lodret over den sydlige + vendekreds (\"Stenbukkens Vendekreds\") ved middagstid netop den + dag.\n\nKilde: http://da.wikipedia.org/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125009Z +UID: + 92A9316F-19D8-415B-BFD0-7AAAEA029CB1-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:St. Bededag* +DTSTART;VALUE=DATE:20110520 +DTEND;VALUE=DATE:20110521 +DESCRIPTION:St. Bededag.\n\nStore Bededag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele + dagen.\n\n-----------------------------\n\nStore Bededag falder fredag i + den fjerde uge efter påske.\n\nDagen blev indført i Danmark ved + kongelig forordning af 27. marts 1686 til afløsning af et umådeligt + stort antal bods- og bededage. \n\nTorsdag aften kl. 18 standsede alt + arbejde og al selskabelighed\, og man fastede indtil gudstjenesten på + bededagen\, fredag\, var forbi. \n\nDagen er officiel helligdag\, men kun + de folkelige traditioner med spadseretur på Københavns volde og + spisning af varme hveder holdes i hævd.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T124822Z +UID: + 5B3E403C-3003-4703-B73A-76862B2C3A3D-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:St. Bededag* +DTSTART;VALUE=DATE:20060512 +DTEND;VALUE=DATE:20060513 +DESCRIPTION:St. Bededag.\n\nStore Bededag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele + dagen.\n\n-----------------------------\n\nStore Bededag falder fredag i + den fjerde uge efter påske.\n\nDagen blev indført i Danmark ved + kongelig forordning af 27. marts 1686 til afløsning af et umådeligt + stort antal bods- og bededage. \n\nTorsdag aften kl. 18 standsede alt + arbejde og al selskabelighed\, og man fastede indtil gudstjenesten på + bededagen\, fredag\, var forbi. \n\nDagen er officiel helligdag\, men kun + de folkelige traditioner med spadseretur på Københavns volde og + spisning af varme hveder holdes i hævd.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T113318Z +UID: + 24D1C9B8-FD4F-463A-BB6F-DF5677DF2F18-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Helligtrekongersdag +RRULE:FREQ=YEARLY;UNTIL=20150106;INTERVAL=1 +DTSTART;VALUE=DATE:20060106 +DTEND;VALUE=DATE:20060107 +DESCRIPTION:Helligtrekongersdag\n\nHelligtrekongersdag er en helligdag\, + hvor der ikke holdes fri fra arbejde + m.m.\n\n-----------------------------\n\nHelligtrekongersdag d. 6. januar + er traditionelt julens afslutning. Den er knyttet til evangeliet om + vismændene fra Østerland.\n\nKilde: http://www.folkekirken.dk\n\nDagen + kaldtes tidligere trettendedagen og markerede dermed julens afslutning. + Julens 12 dage var de egentlige festdage\, hvor man tog varsler af vejret + for det kommende år.\n\nDagen\, der var helligdag i Danmark indtil + 1770\, har navn efter de hellige tre konger\, der fandt det nyfødte + Jesusbarn.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:11 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121904Z +UID: + DD9AD6FC-8C2F-40D2-94C5-BF370CAC239E-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Palmesøndag +DTSTART;VALUE=DATE:20150329 +DTEND;VALUE=DATE:20150330 +DESCRIPTION:Palmesøndag\n\nPalmesøndag fejres indtoget i Jerusalem og + starter påskeugen.\n\nKilde: http://www.folkekirken.dk\n\nHvorfor hedder + dagen ”Palmesøndag”?\n\nDen dag\, der indleder påskeugen - også + kaldet \"den stille uge\" - hedder \"palmesøndag\". Forklaringen er + ligetil - og dog...\n\nPalmesøndag er den dag\, Jesus red ind i + Jerusalem for at fejre påske og blev modtaget som en konge (af de samme + mennesker\, som korsfæstede ham mindre end en uge senere!).\n\nMatthæus + skriver i bibelteksten\, at \"den store folkeskare bredte deres kapper ud + på vejen\, andre skar grene af træerne og strøede dem på vejen\". Og + vi plejer at forestille os\, at disse grene var palmegrene\, fordi + palmegrenen er et gammelt tegn på hyldest.\n\nMEN - der vokser bare ikke + palmer i og omkring Jerusalem\, og har aldrig gjort det... Så nogen + burde i virkeligheden finde på et bedre navn til dagen!\n\nKilde: + www.skole-kirke.dk +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114958Z +UID: + EB2CDD06-9C49-43F8-9685-EF7F31BB7216-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. søndag i Advent +DTSTART;VALUE=DATE:20101205 +DTEND;VALUE=DATE:20101206 +DESCRIPTION:2. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122123Z +UID: + BCA96923-A99B-4A25-AA6B-C48CDBE1B05A-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Langfredag* +DTSTART;VALUE=DATE:20070406 +DTEND;VALUE=DATE:20070407 +DESCRIPTION:Langfredag\n\nLangfredag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\nDagen hvor Jesus ifølge + biblen blev korsfæstet. Dagen hedder \"lang-fredag\"\, fordi det var en + lang og smertefuld dag for Jesus. Han blev pint og plaget til døde af af + de romerske soldater.\n\n-----------------------------\n\nPå Langfredag + er gudstjenesten koncentreret omkring Jesu domfældelse og død. + Gudstjenesten den dag har mange steder en særlig udformning.\n\nKilde: + http://www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nDer flages på halv stang til + solnedgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131643Z +UID: + EF9197C6-5295-41E3-9C57-919A958112A6-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Juleaften +RRULE:FREQ=YEARLY;UNTIL=20151224;INTERVAL=1 +DTSTART;VALUE=DATE:20061224 +DTEND;VALUE=DATE:20061225 +DESCRIPTION:Juleaften.\n\nJuleaftensdag er siden år 2000 efterhånden + blevet at betragte som en Søgnehelligdag\, hvor der holdes fri fra + arbejde m.m. hele dagen. Visse steder er det dog stadig kun en halv + fridag.\n\n-----------------------------\n\nJul er festen for Jesu + fødsel. Fejringen af juleaften er af forholdsvis ny dato. Den egentlige + festdag er juledag d. 25. dec.\, som også kaldes Kristi fødsels + dag.\n\nAnden juledag\, som også kaldes Skt. Stefans dag\, er en fejring + af Skt. Stefan\, den første kristne martyr\, og dermed for alle\, som er + døde for troens skyld. Det kan være lidt vanskeligt at holde dette + sammen med forventningen om en julegudstjeneste.\n\nhttp: + //www.folkekirken.dk/leksikon.htm\n\nJuleaften fejres som en udpræget + familiefest i Danmark.\n\nFor mange begynder julen med gudstjeneste om + eftermiddagen. \n\nHerefter samles familien om julemiddagen\, hvor der + serveres and\, gås\, kalkun eller flæskesteg. \n\nDesserten er typisk + ris á l'amande med mandelgave til den heldige\, der finder den hele + mandel i sin portion.\n\nEfter middagen går man i ring omkring det + pyntede juletræ under afsyngning af julens salmer og sange.\n\nTil slut + deles gaverne ud\, og der serveres juleknas og frugt.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060423T205100Z +UID: + 03E82904-2577-4059-A815-10B66AFFD3F4-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Påskedag +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +DESCRIPTION:2. Påskedag.\n\n2. Påskedag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele dagen.\n\n2. Påskedag er en + forlængelse af påsken. I kirken fejres dagen selvfølgelig. De fleste + vælger dog at slappe af efter en til tider hektisk påske og lade op til + en ny række arbejdsdage.\n\n-----------------------\n\nPåskedag er den + vigtigste af kirkeårets højtider (også selv om julen fejres af flere). + Det er festen for Jesu opstandelse.\n\nPåsken består egentligt ikke kun + af de to påskedage\, men af hele tiden frem til pinse\, søndagene efter + påske.\n\nKilde: http: + //www.folkekirken.dk/leksikon.htm\n\nPåskedagene\, der altså markerer + centrale begivenheder i Kristi lidelseshistorie\, fejres til + minde om Kristi død og opstandelse. \n\nPåsken indtræffer + den første søndag efter fuldmåne efter forårsjævndøgn\, + hvilket vil sige mellem 22. marts og 25. april.\n\nForuden de kirkelige + traditioner har der gennem tiderne været knyttet utallige folkelige + skikke til påsken. Mange af dem eksisterer stadig\, men i mindre + omfang.\n\nMaden\, herunder især dekorerede æg\, spiller en stor + rolle\, og mange familier samles til frokost påskedag.\n\nBordpynten er + holdt i gult\, og man giver hinanden påskeæg. I slutningen af + 1800-tallet optræder chokoladeæg som gaveobjekt første gang.\n\nKilde: + http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121141Z +UID: + C530906A-245E-4436-AF1E-CB4AC0171013-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Forårsjævndøgn +DTSTART;VALUE=DATE:20100320 +DTEND;VALUE=DATE:20100321 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Forårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131821Z +UID: + 2368F6EB-A4E8-4B52-85DD-3A370C709142-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets korteste dag +DTSTART;VALUE=DATE:20111222 +DTEND;VALUE=DATE:20111223 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets korteste dag - også kaldet \"Vintersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nVintersolhverv er det tidspunkt + på året\, hvor dagen er kortest og solen står lavest på himlen kl. 12 + middag. Begge dele skyldes\, at solen står lodret over den sydlige + vendekreds (\"Stenbukkens Vendekreds\") ved middagstid netop den + dag.\n\nKilde: http://da.wikipedia.org/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T120036Z +UID: + 02C0A1CB-BC7A-4401-950A-7FFD0F4C306A-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:4. søndag i Advent +DTSTART;VALUE=DATE:20131222 +DTEND;VALUE=DATE:20131223 +DESCRIPTION:4. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060423T194509Z +UID: + F66C64D2-41DD-42D9-B46B-93053DB0ADF0-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Fastelavn +DTSTART;VALUE=DATE:20100214 +DTEND;VALUE=DATE:20100215 +DESCRIPTION:Fastelavn.\n\nFastelavn er 7. søndag før + Påske\n\nFastelavn eller fasteaften var oprindelig betegnelsen for + aftenen før den kristne faste\, som indledtes onsdag i den syvende uge + før påskedag.\n\nDagen kaldes stadig askeonsdag. I Danmark blev + fastelavn betegnelsen for de 3 forudgående dage\, hvor man spiste og + drak umådeholdent for at have noget at stå imod med.\n\nMed + reformationen ophørte fastepligten i Danmark\, og fastelavn blev + efterhånden alene en verdslig fest.\n\nMange af de gamle + fastelavnsskikke så som tøndeslagning\, biden til bolle\, udklædning + og raslen ved dørene lever i bedste velGående i dag\, men kun i + børnenes verden.\n\nFastelavnsmandag var helt frem til 1960'erne + skolefridag i Danmark.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T123444Z +UID: + EF5DC88C-89DD-470E-BF55-E63101127DF3-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Lyse nætter begynder +RRULE:FREQ=YEARLY;UNTIL=20150505;INTERVAL=1 +DTSTART;VALUE=DATE:20140505 +DTEND;VALUE=DATE:20140506 +DESCRIPTION:Lyse nætter\n\nNår solen ved midnat står mindre end 18° + under horisonten\, går aftendæmringen over i morgendæmringen\, og + natten siges at høre til de lyse nætter. I Danmark fra ca. 5. maj til + 8. august og med den største lysstyrke ved sommersolhverv den 21. juni\, + når solen står kun 11° under horisonten.\n\nKilde: http: + //da.wikipedia.org +SEQUENCE:14 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130753Z +UID: + 3C3C3D8E-D1B1-4B36-A001-A085EF0D030A-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets længste dag +DTSTART;VALUE=DATE:20120621 +DTEND;VALUE=DATE:20120622 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets længste dag - også kaldet \"Sommersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nSommersolhverv er det tidspunkt + på året\, hvor dagen er længst og solen står højest på himlen kl. + 12 middag (som svarer til kl. 13 under sommertid). Begge dele skyldes\, + at solen står lodret over den nordlige vendekreds (\"Krebsens + Vendekreds\") ved middagstid netop den dag.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121935Z +UID: + DB16B898-2EEB-43BB-A271-9BF4C86E7202-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skærtorsdag +DTSTART;VALUE=DATE:20060413 +DTEND;VALUE=DATE:20060414 +DESCRIPTION:Skærtorsdag\n\nSkærtorsdag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n\"Skær\" er et gammelt dansk + ord\, der betyder ren og renset. Skærtorsdag spiste Jesus et jødisk + påskemåltid med lammesteg sammen med sine disciple. Inden de satte sig + til bords\, vaskede Jesus disciplenes fødder\, hvorfor dagen blev til + \"Skær-torsdag\".\n\n-----------------------------\n\nSkærtorsdag + mindes vi Jesu indstiftelse af nadveren.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122342Z +UID: + 043A354B-598F-47CA-B9EB-236BCB0B88A9-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Langfredag* +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +DESCRIPTION:Langfredag\n\nLangfredag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\nDagen hvor Jesus ifølge + biblen blev korsfæstet. Dagen hedder \"lang-fredag\"\, fordi det var en + lang og smertefuld dag for Jesus. Han blev pint og plaget til døde af af + de romerske soldater.\n\n-----------------------------\n\nPå Langfredag + er gudstjenesten koncentreret omkring Jesu domfældelse og død. + Gudstjenesten den dag har mange steder en særlig udformning.\n\nKilde: + http://www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nDer flages på halv stang til + solnedgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122707Z +UID: + D0764332-04DE-4CB0-B2A9-18E151082C9D-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Påskedag +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +DESCRIPTION:2. Påskedag.\n\n2. Påskedag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele dagen.\n\n2. Påskedag er en + forlængelse af påsken. I kirken fejres dagen selvfølgelig. De fleste + vælger dog at slappe af efter en til tider hektisk påske og lade op til + en ny række arbejdsdage.\n\n-----------------------------\n\nPåskedag + er den vigtigste af kirkeårets højtider (også selv om julen fejres af + flere). Det er festen for Jesu opstandelse.\n\nPåsken består egentligt + ikke kun af de to påskedage\, men af hele tiden frem til pinse\, + søndagene efter påske.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131858Z +UID: + DFD19023-E1B0-43CB-8864-7FFF4B391AAA-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets korteste dag +DTSTART;VALUE=DATE:20131221 +DTEND;VALUE=DATE:20131222 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets korteste dag - også kaldet \"Vintersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nVintersolhverv er det tidspunkt + på året\, hvor dagen er kortest og solen står lavest på himlen kl. 12 + middag. Begge dele skyldes\, at solen står lodret over den sydlige + vendekreds (\"Stenbukkens Vendekreds\") ved middagstid netop den + dag.\n\nKilde: http://da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060423T203619Z +UID: + 88F2DBBF-DB29-4077-AB2E-D7B5500A25CB-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Langfredag* +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +DESCRIPTION:Langfredag\n\nLangfredag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\nDagen hvor Jesus ifølge + biblen blev korsfæstet. Dagen hedder \"lang-fredag\"\, fordi det var en + lang og smertefuld dag for Jesus. Han blev pint og plaget til døde af af + de romerske soldater.\n\n-----------------------\n\nPå Langfredag er + gudstjenesten koncentreret omkring Jesu domfældelse og død. + Gudstjenesten den dag har mange steder en særlig udformning.\n\nKilde: + http://www.folkekirken.dk/leksikon.htm\n\nPåskedagene\, der altså + markerer centrale begivenheder i Kristi lidelseshistorie\, + fejres til minde om Kristi død og opstandelse. \n\nPåsken + indtræffer den første søndag efter fuldmåne efter + forårsjævndøgn\, hvilket vil sige mellem 22. marts og 25. + april.\n\nForuden de kirkelige traditioner har der gennem tiderne været + knyttet utallige folkelige skikke til påsken. Mange af dem eksisterer + stadig\, men i mindre omfang.\n\nMaden\, herunder især dekorerede æg\, + spiller en stor rolle\, og mange familier samles til frokost + påskedag.\n\nBordpynten er holdt i gult\, og man giver hinanden + påskeæg. I slutningen af 1800-tallet optræder chokoladeæg som + gaveobjekt første gang.\n\nKilde: http://www.kkb.bib.dk\n\n*) + Flagdag\nDer flages på halv stang til solnedgang.\n\nKilde: http: + //www.spejderportal.dk/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122405Z +UID: + 2B8A4C0F-9B07-40A7-8970-B891073738F9-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Påskedag +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +DESCRIPTION:2. Påskedag.\n\n2. Påskedag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele dagen.\n\n2. Påskedag er en + forlængelse af påsken. I kirken fejres dagen selvfølgelig. De fleste + vælger dog at slappe af efter en til tider hektisk påske og lade op til + en ny række arbejdsdage.\n\n-----------------------------\n\nPåskedag + er den vigtigste af kirkeårets højtider (også selv om julen fejres af + flere). Det er festen for Jesu opstandelse.\n\nPåsken består egentligt + ikke kun af de to påskedage\, men af hele tiden frem til pinse\, + søndagene efter påske.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T113231Z +UID: + 7E615695-A3D7-4B5C-BF1E-55EEA345FE79-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Pinsedag +DTSTART;VALUE=DATE:20150525 +DTEND;VALUE=DATE:20150526 +DESCRIPTION:2. Pinsedag.\n\n2. Pinsedag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n2. Pinsedag er en forlængelse + af pinsen. Førhen giftede mange sig i øvrigt ved pinsetide. 2. Pinsedag + falder 50 dage efter 2. Påskedag.\n\n-----------------------\n\nPinse + kommer af det græske ord \"pentekoste\"\, den + halvtredssindstyvende.\n\nI pinsen fejres Helligåndens komme og den + kristne kirkes fødsel.\n\nSøndag efter pinse fejres Trinitatis søndag + eller Hellig Trefoldigheds fest\, festdagen for Gud som den treenige + Gud\, Fader\, Søn og Helligånd.\n\nKilde: http: + //www.folkekirken.dk/leksikon.htm\n\n-----------------------\n\nFør i + tiden var det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet + blev derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060423T194930Z +UID: + 94BAA145-6CE6-41F4-9D3A-BEF24E9F790C-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Fastelavn +DTSTART;VALUE=DATE:20120219 +DTEND;VALUE=DATE:20120220 +DESCRIPTION:Fastelavn.\n\nFastelavn er 7. søndag før + Påske\n\nFastelavn eller fasteaften var oprindelig betegnelsen for + aftenen før den kristne faste\, som indledtes onsdag i den syvende uge + før påskedag.\n\nDagen kaldes stadig askeonsdag. I Danmark blev + fastelavn betegnelsen for de 3 forudgående dage\, hvor man spiste og + drak umådeholdent for at have noget at stå imod med.\n\nMed + reformationen ophørte fastepligten i Danmark\, og fastelavn blev + efterhånden alene en verdslig fest.\n\nMange af de gamle + fastelavnsskikke så som tøndeslagning\, biden til bolle\, udklædning + og raslen ved dørene lever i bedste velGående i dag\, men kun i + børnenes verden.\n\nFastelavnsmandag var helt frem til 1960'erne + skolefridag i Danmark.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125327Z +UID: + B9091241-B59B-4A04-93CA-3C8DDD029A10-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Kr. Himmelfart* +DTSTART;VALUE=DATE:20090521 +DTEND;VALUE=DATE:20090522 +DESCRIPTION:Kr. Himmelfart.\n\nKristi Himmelfartsdag er en + Søgnehelligdag\, hvor der holdes fri fra arbejde m.m. hele dagen.\n\n40 + dage efter påskedag\, hvor Jesus genopstod fra de døde og blev levende + igen\, stiger han denne dag til himmels og efterlader sine disciple med + besked på at vente på hjælp og støtte fra Helligånden\, som viser + sig 10 dage senere (50 dage efter påskedag) + Pinsedag.\n\n-----------------------------\n\nKristi Himmelfartsdag 40 + dage efter påske er festdagen for Jesu ophøjelse til Faderens højre + hånd.\n\nKilde: http://www.folkekirken.dk\n\nKristi himmelfartsdag\, der + fejres til minde om Kristi optagelse i himlen falder torsdag i den 6. uge + efter påske. Dagen er officiel helligdag i Danmark.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130459Z +UID: + AC932194-F45D-47B5-9937-6FDF2E3B50D2-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skt. Hans dag +RRULE:FREQ=YEARLY;UNTIL=20150624;INTERVAL=1 +DTSTART;VALUE=DATE:20060624 +DTEND;VALUE=DATE:20060625 +DESCRIPTION:Skt. Hans dag.\n\nSkt. Hans dag er en helligdag\, hvor der + ikke holdes fri fra arbejde + m.m.\n\n-----------------------------\n\nMidsommerdagen er blevet fejret + gennem århundreder som en særlig festdag for sommerens komme.\n\nDen + 24. juni er angiveligt Johannes Døberens fødselsdag (deraf Skt. + Hans).\n\nSct. Hans Dag blev i 1771 afskaffet som helligdag i Danmark. + Mange steder holdt almuen dog fast ved de gamle helligdage.\n\nKilde: + http://www.kkb.bib.dk +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131712Z +UID: + 170138CA-B237-4A59-B3AD-431A65A7111C-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets korteste dag +DTSTART;VALUE=DATE:20061222 +DTEND;VALUE=DATE:20061223 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets korteste dag - også kaldet \"Vintersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nVintersolhverv er det tidspunkt + på året\, hvor dagen er kortest og solen står lavest på himlen kl. 12 + middag. Begge dele skyldes\, at solen står lodret over den sydlige + vendekreds (\"Stenbukkens Vendekreds\") ved middagstid netop den + dag.\n\nKilde: http://da.wikipedia.org/ +SEQUENCE:15 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T120122Z +UID: + 762058F1-47AF-4F52-B528-E06DE85FF473-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:4. søndag i Advent +DTSTART;VALUE=DATE:20151220 +DTEND;VALUE=DATE:20151221 +DESCRIPTION:4. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125238Z +UID: + 68940D41-AF03-4EA1-BA44-A8CEC3B0B2AD-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Kr. Himmelfart* +DTSTART;VALUE=DATE:20070517 +DTEND;VALUE=DATE:20070518 +DESCRIPTION:Kr. Himmelfart.\n\nKristi Himmelfartsdag er en + Søgnehelligdag\, hvor der holdes fri fra arbejde m.m. hele dagen.\n\n40 + dage efter påskedag\, hvor Jesus genopstod fra de døde og blev levende + igen\, stiger han denne dag til himmels og efterlader sine disciple med + besked på at vente på hjælp og støtte fra Helligånden\, som viser + sig 10 dage senere (50 dage efter påskedag) + Pinsedag.\n\n-----------------------------\n\nKristi Himmelfartsdag 40 + dage efter påske er festdagen for Jesu ophøjelse til Faderens højre + hånd.\n\nKilde: http://www.folkekirken.dk\n\nKristi himmelfartsdag\, der + fejres til minde om Kristi optagelse i himlen falder torsdag i den 6. uge + efter påske. Dagen er officiel helligdag i Danmark.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130440Z +UID: + A77E14C6-0D5D-486C-814D-8B0BD0D5DF62-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets længste dag +DTSTART;VALUE=DATE:20060621 +DTEND;VALUE=DATE:20060622 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets længste dag - også kaldet \"Sommersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nSommersolhverv er det tidspunkt + på året\, hvor dagen er længst og solen står højest på himlen kl. + 12 middag (som svarer til kl. 13 under sommertid). Begge dele skyldes\, + at solen står lodret over den nordlige vendekreds (\"Krebsens + Vendekreds\") ved middagstid netop den dag.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:19 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122843Z +UID: + 4412A69C-B462-495E-8788-506E2931F3CD-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Påskedag* +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +DESCRIPTION:Påskedag\n\nPåskesøndag fejres det at Jesus genopstod fra + de døde og blev levende igen. Jesus forblev på jorden de næste 40 dage + frem til Kristi + himmelfartsdag.\n\n-----------------------------\n\nPåskedag er den + vigtigste af kirkeårets højtider (også selv om julen fejres af flere). + Det er festen for Jesu opstandelse.\n\nPåsken består egentligt ikke kun + af de to påskedage\, men af hele tiden frem til pinse\, søndagene efter + påske.\n\nKilde: http://www.folkekirken.dk\n\nPåskedagene\, der altså + markerer centrale begivenheder i Kristi lidelseshistorie\, + fejres til minde om Kristi død og opstandelse. \n\nPåsken + indtræffer den første søndag efter fuldmåne efter + forårsjævndøgn\, hvilket vil sige mellem 22. marts og 25. + april.\n\nForuden de kirkelige traditioner har der gennem tiderne været + knyttet utallige folkelige skikke til påsken. Mange af dem eksisterer + stadig\, men i mindre omfang.\n\nMaden\, herunder især dekorerede æg\, + spiller en stor rolle\, og mange familier samles til frokost + påskedag.\n\nBordpynten er holdt i gult\, og man giver hinanden + påskeæg. I slutningen af 1800-tallet optræder chokoladeæg som + gaveobjekt første gang.\n\nKilde: http://www.kkb.bib.dk\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121106Z +UID: + E118FDB2-0018-4C3A-B42F-C6C89ED73E16-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Forårsjævndøgn +DTSTART;VALUE=DATE:20080320 +DTEND;VALUE=DATE:20080321 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Forårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T172216Z +UID: + F117C4EF-D602-4E00-A1FF-E9CEE8911D42-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Kvindernes internationale kampdag +RRULE:FREQ=YEARLY;UNTIL=20150308;INTERVAL=1 +DTSTART;VALUE=DATE:20060308 +DTEND;VALUE=DATE:20060309 +DESCRIPTION:Kvindernes internationale kampdag\n\nDette er dagen\, hvor + den nyere kvindebevægelse manifesterer sig.\n\nDagen har været markeret + i Danmark siden 1974.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T210157Z +UID: + ECB25266-6456-4934-BC23-81883BEE03DE-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Danmarks befrielsesaften +RRULE:FREQ=YEARLY;UNTIL=20150504;INTERVAL=1 +DTSTART;VALUE=DATE:20060504 +DTEND;VALUE=DATE:20060505 +DESCRIPTION:Danmarks befrielsesaften.\n\nDen 4. maj 1945 kl. 20.35 + meddeltes det i BBC's danske udsendelse fra London\, at de tyske tropper + i Danmark\, Holland og Nordvesttyskland havde overgivet sig.\n\nDen + majaften for over 60 år siden\, da frihedsbudskabet lød i radioen\, rev + folk de forhadte mørklægningsgardiner ned og stillede stearinlys i + vinduerne. Det gør mange stadigvæk\, også de unge som aldrig har + oplevet de mørke år. Den officielle dag for Danmarks Befrielse er d. 5. + maj.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:12 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122212Z +UID: + 82806CBB-3FDB-4AFB-AB6D-A333BC7509FA-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Påskedag +DTSTART;VALUE=DATE:20070409 +DTEND;VALUE=DATE:20070410 +DESCRIPTION:2. Påskedag.\n\n2. Påskedag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele dagen.\n\n2. Påskedag er en + forlængelse af påsken. I kirken fejres dagen selvfølgelig. De fleste + vælger dog at slappe af efter en til tider hektisk påske og lade op til + en ny række arbejdsdage.\n\n-----------------------------\n\nPåskedag + er den vigtigste af kirkeårets højtider (også selv om julen fejres af + flere). Det er festen for Jesu opstandelse.\n\nPåsken består egentligt + ikke kun af de to påskedage\, men af hele tiden frem til pinse\, + søndagene efter påske.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122331Z +UID: + DBF1133E-E521-4C9E-B71D-400C4B7E2607-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skærtorsdag +DTSTART;VALUE=DATE:20090409 +DTEND;VALUE=DATE:20090410 +DESCRIPTION:Skærtorsdag\n\nSkærtorsdag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n\"Skær\" er et gammelt dansk + ord\, der betyder ren og renset. Skærtorsdag spiste Jesus et jødisk + påskemåltid med lammesteg sammen med sine disciple. Inden de satte sig + til bords\, vaskede Jesus disciplenes fødder\, hvorfor dagen blev til + \"Skær-torsdag\".\n\n-----------------------------\n\nSkærtorsdag + mindes vi Jesu indstiftelse af nadveren.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T124730Z +UID: + B28D5940-E4DA-47FD-A754-CB56CF548ACF-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:St. Bededag* +DTSTART;VALUE=DATE:20140516 +DTEND;VALUE=DATE:20140517 +DESCRIPTION:St. Bededag.\n\nStore Bededag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele + dagen.\n\n-----------------------------\n\nStore Bededag falder fredag i + den fjerde uge efter påske.\n\nDagen blev indført i Danmark ved + kongelig forordning af 27. marts 1686 til afløsning af et umådeligt + stort antal bods- og bededage. \n\nTorsdag aften kl. 18 standsede alt + arbejde og al selskabelighed\, og man fastede indtil gudstjenesten på + bededagen\, fredag\, var forbi. \n\nDagen er officiel helligdag\, men kun + de folkelige traditioner med spadseretur på Københavns volde og + spisning af varme hveder holdes i hævd.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T125927Z +UID: + A1A4E3E9-2048-495B-9D8A-7818D046740E-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Pinsedag* +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +DESCRIPTION:Pinsedag.\n\nPinsedag er 10 dage efter Kristi Himmelfartsdag. + Da Jesus steg til himmels bad han sine disciple missionere og til at + hjælpe dem lovede han at sende Helligånden ned til dem. Det skete denne + dag 50 dage efter Påskedag.\n\nDa de tolv disciple\, (nu benævnt + \"apostle\") med hjælp fra Helligånden\, nu kunne missionere\, ses + denne dag som kirkens + fødselsdag.\n\n-----------------------------\n\nPinse kommer af det + græske ord \"pentekoste\"\, den halvtredssindstyvende.\n\nI pinsen + fejres Helligåndens komme og den kristne kirkes fødsel.\n\nSøndag + efter pinse fejres Trinitatis søndag eller Hellig Trefoldigheds fest\, + festdagen for Gud som den treenige Gud\, Fader\, Søn og + Helligånd.\n\nKilde: http: + //www.folkekirken.dk\n\n-----------------------------\n\nFør i tiden var + det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet blev + derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk\n\n-----------------------\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115121Z +UID: + 0C07E739-740D-4E74-A1CF-F7A38489C52E-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. søndag i Advent +DTSTART;VALUE=DATE:20121209 +DTEND;VALUE=DATE:20121210 +DESCRIPTION:2. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130010Z +UID: + 7C88F20D-91CF-4B5A-A425-99601C40A582-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Pinsedag* +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +DESCRIPTION:Pinsedag.\n\nPinsedag er 10 dage efter Kristi Himmelfartsdag. + Da Jesus steg til himmels bad han sine disciple missionere og til at + hjælpe dem lovede han at sende Helligånden ned til dem. Det skete denne + dag 50 dage efter Påskedag.\n\nDa de tolv disciple\, (nu benævnt + \"apostle\") med hjælp fra Helligånden\, nu kunne missionere\, ses + denne dag som kirkens + fødselsdag.\n\n-----------------------------\n\nPinse kommer af det + græske ord \"pentekoste\"\, den halvtredssindstyvende.\n\nI pinsen + fejres Helligåndens komme og den kristne kirkes fødsel.\n\nSøndag + efter pinse fejres Trinitatis søndag eller Hellig Trefoldigheds fest\, + festdagen for Gud som den treenige Gud\, Fader\, Søn og + Helligånd.\n\nKilde: http: + //www.folkekirken.dk\n\n-----------------------------\n\nFør i tiden var + det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet blev + derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk\n\n-----------------------\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115834Z +UID: + 02F8E776-4CD5-4B7A-9A27-235A40817CCF-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:4. søndag i Advent +DTSTART;VALUE=DATE:20081221 +DTEND;VALUE=DATE:20081222 +DESCRIPTION:4. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114744Z +UID: + D030AC44-E22A-43D8-B6F7-581F82736461-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:1. søndag i Advent +DTSTART;VALUE=DATE:20151129 +DTEND;VALUE=DATE:20151130 +DESCRIPTION:1. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, Omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131238Z +UID: + 5BBE1C7A-8113-4188-B5CB-32F5D479589B-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Efterårsjævndøgn +DTSTART;VALUE=DATE:20100923 +DTEND;VALUE=DATE:20100924 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Efterårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122423Z +UID: + 71B8937C-6A7C-478C-914E-F58D0468D760-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skærtorsdag +DTSTART;VALUE=DATE:20100401 +DTEND;VALUE=DATE:20100402 +DESCRIPTION:Skærtorsdag\n\nSkærtorsdag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n\"Skær\" er et gammelt dansk + ord\, der betyder ren og renset. Skærtorsdag spiste Jesus et jødisk + påskemåltid med lammesteg sammen med sine disciple. Inden de satte sig + til bords\, vaskede Jesus disciplenes fødder\, hvorfor dagen blev til + \"Skær-torsdag\".\n\n-----------------------------\n\nSkærtorsdag + mindes vi Jesu indstiftelse af nadveren.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121157Z +UID: + 2C761FF4-77C2-4DF6-8D10-BCA8D28C066F-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Forårsjævndøgn +DTSTART;VALUE=DATE:20110321 +DTEND;VALUE=DATE:20110322 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Forårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T113004Z +UID: + 7A140932-E486-4711-BC04-E35D1477559A-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Pinsedag +DTSTART;VALUE=DATE:20120528 +DTEND;VALUE=DATE:20120529 +DESCRIPTION:2. Pinsedag.\n\n2. Pinsedag er en Søgnehelligdag\, hvor der + holdes fri fra arbejde m.m. hele dagen.\n\n2. Pinsedag er en forlængelse + af pinsen. Førhen giftede mange sig i øvrigt ved pinsetide. 2. Pinsedag + falder 50 dage efter 2. Påskedag.\n\n-----------------------\n\nPinse + kommer af det græske ord \"pentekoste\"\, den + halvtredssindstyvende.\n\nI pinsen fejres Helligåndens komme og den + kristne kirkes fødsel.\n\nSøndag efter pinse fejres Trinitatis søndag + eller Hellig Trefoldigheds fest\, festdagen for Gud som den treenige + Gud\, Fader\, Søn og Helligånd.\n\nKilde: http: + //www.folkekirken.dk/leksikon.htm\n\n-----------------------\n\nFør i + tiden var det vigtigt at bære nyt tøj ved kirkegangen pinsedag. Tøjet + blev derved også velsignet og holdt således længere. Ordet pinsesnit + stammer fra denne tradition.\n\nNutidens folkelige traditioner begynder + allerede dagen før pinse\, hvor der festes til den lyse morgen. Ifølge + dansk folketro kan man nemlig se pinsesolen danse + pinsemorgen.\n\nPinselørdag er det ligeledes skik at tage på skovtur + med madkurv eller deltage i de mange pinsearrangementer landet over. + Siden 1980'erne har der været afholdt pinsekarneval i større danske + byer.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130809Z +UID: + BF550894-5FAB-4F68-A9B0-DA0910B1FFD0-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets længste dag +DTSTART;VALUE=DATE:20130621 +DTEND;VALUE=DATE:20130622 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets længste dag - også kaldet \"Sommersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nSommersolhverv er det tidspunkt + på året\, hvor dagen er længst og solen står højest på himlen kl. + 12 middag (som svarer til kl. 13 under sommertid). Begge dele skyldes\, + at solen står lodret over den nordlige vendekreds (\"Krebsens + Vendekreds\") ved middagstid netop den dag.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131651Z +UID: + 0A1E902C-C936-4BA0-BE6B-40D4A3B635FF-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Juledag* +RRULE:FREQ=YEARLY;UNTIL=20151225;INTERVAL=1 +DTSTART;VALUE=DATE:20061225 +DTEND;VALUE=DATE:20061226 +DESCRIPTION:Juledag.\n\nJuledag er en Søgnehelligdag\, hvor der holdes + fri fra arbejde m.m. hele dagen.\n\n-----------------------------\n\nJul + er festen for Jesu fødsel. Fejringen af juleaften er af forholdsvis ny + dato. Den egentlige festdag er juledag d. 25. dec.\, som også kaldes + Kristi fødsels dag.\n\nhttp://www.folkekirken.dk/leksikon.htm\n\nJuledag + fejres som Kristi fødselsdag med gudstjeneste i alle landets + kirker.\n\nHerefter samles familien til julefrokost\, som traditionen tro + kan vare resten af dagen.\n\nDer serveres mange kolde og lune retter + ledsaget af øl og snaps.\n\nI mange familier er der tradition for ganske + bestemte retter.\n\nKilde: http://www.kkb.bib.dk\n\n*) Flagdag\nFlaget + hejses kl. 0800 og hales ved solnedgang. På dage\, hvor solen står op + efter kl. 0800\, hejses flaget først ved solopgang.\n\nKilde: http: + //www.spejderportal.dk/ +SEQUENCE:10 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121713Z +UID: + A54DCEA8-1800-4734-9B10-EFFA2B44CA14-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Palmesøndag +DTSTART;VALUE=DATE:20090405 +DTEND;VALUE=DATE:20090406 +DESCRIPTION:Palmesøndag\n\nPalmesøndag fejres indtoget i Jerusalem og + starter påskeugen.\n\nKilde: http://www.folkekirken.dk\n\nHvorfor hedder + dagen ”Palmesøndag”?\n\nDen dag\, der indleder påskeugen - også + kaldet \"den stille uge\" - hedder \"palmesøndag\". Forklaringen er + ligetil - og dog...\n\nPalmesøndag er den dag\, Jesus red ind i + Jerusalem for at fejre påske og blev modtaget som en konge (af de samme + mennesker\, som korsfæstede ham mindre end en uge senere!).\n\nMatthæus + skriver i bibelteksten\, at \"den store folkeskare bredte deres kapper ud + på vejen\, andre skar grene af træerne og strøede dem på vejen\". Og + vi plejer at forestille os\, at disse grene var palmegrene\, fordi + palmegrenen er et gammelt tegn på hyldest.\n\nMEN - der vokser bare ikke + palmer i og omkring Jerusalem\, og har aldrig gjort det... Så nogen + burde i virkeligheden finde på et bedre navn til dagen!\n\nKilde: + www.skole-kirke.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T114444Z +UID: + 55C441A7-EF08-4D85-9D3E-2237D1C780B8-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:1. søndag i Advent +DTSTART;VALUE=DATE:20071202 +DTEND;VALUE=DATE:20071203 +DESCRIPTION:1. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, Omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T124914Z +UID: + 7A53389B-5E2C-4582-B7C3-1F9D3F02BB40-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:St. Bededag* +DTSTART;VALUE=DATE:20080418 +DTEND;VALUE=DATE:20080419 +DESCRIPTION:St. Bededag.\n\nStore Bededag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele + dagen.\n\n-----------------------------\n\nStore Bededag falder fredag i + den fjerde uge efter påske.\n\nDagen blev indført i Danmark ved + kongelig forordning af 27. marts 1686 til afløsning af et umådeligt + stort antal bods- og bededage. \n\nTorsdag aften kl. 18 standsede alt + arbejde og al selskabelighed\, og man fastede indtil gudstjenesten på + bededagen\, fredag\, var forbi. \n\nDagen er officiel helligdag\, men kun + de folkelige traditioner med spadseretur på Københavns volde og + spisning af varme hveder holdes i hævd.\n\nKilde: http: + //www.kkb.bib.dk\n\n*) Flagdag\nFlaget hejses kl. 0800 og hales ved + solnedgang. På dage\, hvor solen står op efter kl. 0800\, hejses flaget + først ved solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T222347Z +UID: + CC5DDFF7-1FBE-42E6-97FE-3A29D0AA4362-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Skt. Hans aften +RRULE:FREQ=YEARLY;UNTIL=20150623;INTERVAL=1 +DTSTART;VALUE=DATE:20060623 +DTEND;VALUE=DATE:20060624 +DESCRIPTION:Skt. Hans aften.\n\nPå Sankt Hans aften fejres midsommer i + Danmark\, selvom sommersolhverv falder den 21. juni.\n\nIfølge + folketroen var denne nat ladet med en særlig kraft\, og den var + forbundet med adskillige skikke og traditioner.\n\nSkikken med at samles + omkring bålet ved skov eller strand er bevaret til vore + dage.\n\nTraditionen med afsyngning af Holger Drachmanns midsommervise er + begyndt i 1900-tallet.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131257Z +UID: + 574E0E9F-19E3-41AD-B901-19EE62FCDE14-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Efterårsjævndøgn +DTSTART;VALUE=DATE:20120922 +DTEND;VALUE=DATE:20120923 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Efterårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060423T194200Z +UID: + F5E51E87-7381-4AD0-B718-F316C6A39B1D-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Fastelavn +DTSTART;VALUE=DATE:20080203 +DTEND;VALUE=DATE:20080204 +DESCRIPTION:Fastelavn.\n\nFastelavn er 7. søndag før + Påske\n\nFastelavn eller fasteaften var oprindelig betegnelsen for + aftenen før den kristne faste\, som indledtes onsdag i den syvende uge + før påskedag.\n\nDagen kaldes stadig askeonsdag. I Danmark blev + fastelavn betegnelsen for de 3 forudgående dage\, hvor man spiste og + drak umådeholdent for at have noget at stå imod med.\n\nMed + reformationen ophørte fastepligten i Danmark\, og fastelavn blev + efterhånden alene en verdslig fest.\n\nMange af de gamle + fastelavnsskikke så som tøndeslagning\, biden til bolle\, udklædning + og raslen ved dørene lever i bedste velGående i dag\, men kun i + børnenes verden.\n\nFastelavnsmandag var helt frem til 1960'erne + skolefridag i Danmark.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122355Z +UID: + 24C78BF0-1930-4140-98CE-B1802EF4429C-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Påskedag* +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +DESCRIPTION:Påskedag\n\nPåskesøndag fejres det at Jesus genopstod fra + de døde og blev levende igen. Jesus forblev på jorden de næste 40 dage + frem til Kristi + himmelfartsdag.\n\n-----------------------------\n\nPåskedag er den + vigtigste af kirkeårets højtider (også selv om julen fejres af flere). + Det er festen for Jesu opstandelse.\n\nPåsken består egentligt ikke kun + af de to påskedage\, men af hele tiden frem til pinse\, søndagene efter + påske.\n\nKilde: http://www.folkekirken.dk\n\nPåskedagene\, der altså + markerer centrale begivenheder i Kristi lidelseshistorie\, + fejres til minde om Kristi død og opstandelse. \n\nPåsken + indtræffer den første søndag efter fuldmåne efter + forårsjævndøgn\, hvilket vil sige mellem 22. marts og 25. + april.\n\nForuden de kirkelige traditioner har der gennem tiderne været + knyttet utallige folkelige skikke til påsken. Mange af dem eksisterer + stadig\, men i mindre omfang.\n\nMaden\, herunder især dekorerede æg\, + spiller en stor rolle\, og mange familier samles til frokost + påskedag.\n\nBordpynten er holdt i gult\, og man giver hinanden + påskeæg. I slutningen af 1800-tallet optræder chokoladeæg som + gaveobjekt første gang.\n\nKilde: http://www.kkb.bib.dk\n\n*) + Flagdag\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, hvor + solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131215Z +UID: + 1DA7738E-1200-4A75-9195-CA42C284EAEA-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Efterårsjævndøgn +DTSTART;VALUE=DATE:20080922 +DTEND;VALUE=DATE:20080923 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Efterårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T130516Z +UID: + 71CB697D-5836-447A-B058-B63C16DD10E6-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Årets længste dag +DTSTART;VALUE=DATE:20070621 +DTEND;VALUE=DATE:20070622 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Solstice +DESCRIPTION:Årets længste dag - også kaldet \"Sommersolhverv\" - + falder i år på denne dato.\n\nKilde: http: + //en.wikipedia.org/wiki/Solstice\n\n-----------------------------\n\nSolhv + erv kommer fra oldnordisk hverfa = vende.\n\nDe to tidspunkter på + året\, hvor solen har størst deklination\, nordlig 21. juni eller 22. + juni\, sydlig 21. december eller 22. december.\n\nPå den nordlige + halvkugle er den første dato den længste dag og kaldes sommersolhverv\, + den sidste dato den korteste og kaldes vintersolhverv. På den sydlige + halvkugle er forholdet det omvendte.\n\nSommersolhverv er det tidspunkt + på året\, hvor dagen er længst og solen står højest på himlen kl. + 12 middag (som svarer til kl. 13 under sommertid). Begge dele skyldes\, + at solen står lodret over den nordlige vendekreds (\"Krebsens + Vendekreds\") ved middagstid netop den dag.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T184228Z +UID: + B9FB8ADF-6BE4-4AAA-B021-66D4F908B9DC-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Slaget på Reden* +RRULE:FREQ=YEARLY;UNTIL=20150402;INTERVAL=1 +DTSTART;VALUE=DATE:20060402 +DTEND;VALUE=DATE:20060403 +DESCRIPTION:Slaget på Reden\n\nI 1801 forhindrede danskerne englænderne + i at indtage København i det berømte søslag på Reden under ledelse af + Lord Nelson og Olfert Fischer og Willemoes.\n\n*) Flagdag\nMilitær + flagdag\, hvor offentlige og militære institutioner flager. Som + privatperson er man altid velkommen til at flage på militære + flagdage.\n\nFlaget hejses kl. 0800 og hales ved solnedgang. På dage\, + hvor solen står op efter kl. 0800\, hejses flaget først ved + solopgang.\n\nKilde: http://www.spejderportal.dk/ +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131307Z +UID: + C6E63B15-667A-4706-892C-5C65AB59B9BE-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Efterårsjævndøgn +DTSTART;VALUE=DATE:20130922 +DTEND;VALUE=DATE:20130923 +URL;VALUE=URI:http://en.wikipedia.org/wiki/Equinox +DESCRIPTION:Efterårsjævndøgn - falder i år på denne dato.\n\nKilde: + http: + //en.wikipedia.org/wiki/Equinox\n\n-----------------------------\n\nJævnd + øgn er de to døgn om året hvor dag og nat er lige lange over hele + Jorden\, forårsjævndøgn (på den nordlige halvkugle) cirka 21. marts + og efterårsjævndøgn (ligeledes) cirka 23. september. Solen passerer da + himlens ækvator og har dermed deklinationen 0 grader.\n\nDet er + almindeligt på den nordlige halvkugle at lade sommerhalvåret starte ved + forårsjævndøgn og vinterhalvåret tilsvarende ved efterårsjævndøgn + - og modsat på den sydlige halvkugle. De to \"halvår\" efter denne + definition er ikke lige lange\, idet sommerhalvåret - hvis man tæller + dage - er næsten en uge længere. Det skyldes\, at jordens bane om solen + er elliptisk\, og at vi er i en periode\, hvor den nordlige del af + jordens akse hælder mod solen (hvilket giver den nordlige halvkugle + sommer)\, mens jorden er i den fjerneste del af sin bane.\n\nKilde: http: + //da.wikipedia.org/ +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T230512Z +UID: + 85A3218E-FE37-4AB2-906D-CF2D5DA84F02-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Nytårsaften +RRULE:FREQ=YEARLY;UNTIL=20151231;INTERVAL=1 +DTSTART;VALUE=DATE:20061231 +DTEND;VALUE=DATE:20070101 +DESCRIPTION:Nytårsaften.\n\nÅrets sidste aften fejres med familie eller + venner.\n\nKl. 18 bringer tv dronningens nytårstale\, hvorefter man + samles om middagen\, som denne aften er særlig festlig.\n\nFør i tiden + var det tradition at spise nytårstorsk\, men efterhånden har mange + andre retter vundet indpas.\n\nKl. 24 ringer rådhusklokkerne det nye år + ind i radio og tv.\n\nDer skåles på det nye år\, og umiddelbart + herefter starter nytårsfyrværkeriet overalt.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T131011Z +UID: + C77F3D74-6D0B-4E8E-A5B6-E7B502E63401-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Lyse nætter slutter +RRULE:FREQ=YEARLY;UNTIL=20150808;INTERVAL=1 +DTSTART;VALUE=DATE:20060808 +DTEND;VALUE=DATE:20060809 +DESCRIPTION:Lyse nætter\n\nNår solen ved midnat står mindre end 18° + under horisonten\, går aftendæmringen over i morgendæmringen\, og + natten siges at høre til de lyse nætter. I Danmark fra ca. 5. maj til + 8. august og med den største lysstyrke ved sommersolhverv den 21. juni\, + når solen står kun 11° under horisonten.\n\nKilde: http: + //da.wikipedia.org +SEQUENCE:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060422T220852Z +UID: + A4BFE7A9-F870-43A1-96A2-4E09E1008671-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Valdemarsdag* +RRULE:FREQ=YEARLY;UNTIL=20150615;INTERVAL=1 +DTSTART;VALUE=DATE:20060615 +DTEND;VALUE=DATE:20060616 +DESCRIPTION:Valdemarsdag.\n\nSagnet om Dannebrog \"der faldt ned fra + himlen\" stammer fra slaget ved Lyndanisse den 15. juni 1219\, under + Valdemar Sejrs korstog til Estland.\n\nDerfor er Valdemarsdag Dannebrogs + årlige festdag.\n\nHvis Dannebrog har været anvendt allerede i + begyndelsen af 1200-tallet\, er det helt bestemt det ældste flag i + verden\, som uden at være afskaffet eller ændret\, stadig er i + brug.\n\nMen hvis det stammer fra Valdemar Atterdags tid\, som var fra + 1340 - 1375\, hvorfra man har det ældste vidnesbyrd om Dannebrog\, er + det det Østrigske og Engelske flag der er de ældste.\n\nDagen er + desuden mindedag for Sønderjyllands genforening med Danmark i + 1920.\n\nKilde: http://www.spejderportal.dk\n\n*) Flagdag\nFlaget hejses + kl. 0800 og hales ved solnedgang. På dage\, hvor solen står op efter + kl. 0800\, hejses flaget først ved solopgang.\n\nKilde: http: + //www.spejderportal.dk/ +SEQUENCE:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T121731Z +UID: + 4E12A6BC-EB3D-461D-A5F4-F71EC1D2A7D9-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Palmesøndag +DTSTART;VALUE=DATE:20100328 +DTEND;VALUE=DATE:20100329 +DESCRIPTION:Palmesøndag\n\nPalmesøndag fejres indtoget i Jerusalem og + starter påskeugen.\n\nKilde: http://www.folkekirken.dk\n\nHvorfor hedder + dagen ”Palmesøndag”?\n\nDen dag\, der indleder påskeugen - også + kaldet \"den stille uge\" - hedder \"palmesøndag\". Forklaringen er + ligetil - og dog...\n\nPalmesøndag er den dag\, Jesus red ind i + Jerusalem for at fejre påske og blev modtaget som en konge (af de samme + mennesker\, som korsfæstede ham mindre end en uge senere!).\n\nMatthæus + skriver i bibelteksten\, at \"den store folkeskare bredte deres kapper ud + på vejen\, andre skar grene af træerne og strøede dem på vejen\". Og + vi plejer at forestille os\, at disse grene var palmegrene\, fordi + palmegrenen er et gammelt tegn på hyldest.\n\nMEN - der vokser bare ikke + palmer i og omkring Jerusalem\, og har aldrig gjort det... Så nogen + burde i virkeligheden finde på et bedre navn til dagen!\n\nKilde: + www.skole-kirke.dk +SEQUENCE:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060423T195319Z +UID: + 296633CC-3D06-4EA6-A465-D947E0B9CC74-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:Fastelavn +DTSTART;VALUE=DATE:20150215 +DTEND;VALUE=DATE:20150216 +DESCRIPTION:Fastelavn.\n\nFastelavn er 7. søndag før + Påske\n\nFastelavn eller fasteaften var oprindelig betegnelsen for + aftenen før den kristne faste\, som indledtes onsdag i den syvende uge + før påskedag.\n\nDagen kaldes stadig askeonsdag. I Danmark blev + fastelavn betegnelsen for de 3 forudgående dage\, hvor man spiste og + drak umådeholdent for at have noget at stå imod med.\n\nMed + reformationen ophørte fastepligten i Danmark\, og fastelavn blev + efterhånden alene en verdslig fest.\n\nMange af de gamle + fastelavnsskikke så som tøndeslagning\, biden til bolle\, udklædning + og raslen ved dørene lever i bedste velGående i dag\, men kun i + børnenes verden.\n\nFastelavnsmandag var helt frem til 1960'erne + skolefridag i Danmark.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060427T122455Z +UID: + 97863646-1561-47F3-8033-CB506E42D955-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:2. Påskedag +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +DESCRIPTION:2. Påskedag.\n\n2. Påskedag er en Søgnehelligdag\, hvor + der holdes fri fra arbejde m.m. hele dagen.\n\n2. Påskedag er en + forlængelse af påsken. I kirken fejres dagen selvfølgelig. De fleste + vælger dog at slappe af efter en til tider hektisk påske og lade op til + en ny række arbejdsdage.\n\n-----------------------------\n\nPåskedag + er den vigtigste af kirkeårets højtider (også selv om julen fejres af + flere). Det er festen for Jesu opstandelse.\n\nPåsken består egentligt + ikke kun af de to påskedage\, men af hele tiden frem til pinse\, + søndagene efter påske.\n\nKilde: http: + //www.folkekirken.dk\n\nPåskedagene\, der altså markerer centrale + begivenheder i Kristi lidelseshistorie\, fejres til minde om + Kristi død og opstandelse. \n\nPåsken indtræffer den første + søndag efter fuldmåne efter forårsjævndøgn\, hvilket vil + sige mellem 22. marts og 25. april.\n\nForuden de kirkelige traditioner + har der gennem tiderne været knyttet utallige folkelige skikke til + påsken. Mange af dem eksisterer stadig\, men i mindre omfang.\n\nMaden\, + herunder især dekorerede æg\, spiller en stor rolle\, og mange familier + samles til frokost påskedag.\n\nBordpynten er holdt i gult\, og man + giver hinanden påskeæg. I slutningen af 1800-tallet optræder + chokoladeæg som gaveobjekt første gang.\n\nKilde: http: + //www.kkb.bib.dk +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T115627Z +UID: + 48E0C8BF-16B6-457F-AF06-B2487D05D394-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:3. søndag i Advent +DTSTART;VALUE=DATE:20141214 +DTEND;VALUE=DATE:20141215 +DESCRIPTION:3. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20061207T154827Z +LAST-MODIFIED:20061207T154827Z +DTSTAMP:20060424T120014Z +UID: + A59B0B06-6471-491B-BA82-FEAD40348C42-E66E723F-E22E-4A69-8470-6EE5C9033962 + +SUMMARY:4. søndag i Advent +DTSTART;VALUE=DATE:20121223 +DTEND;VALUE=DATE:20121224 +DESCRIPTION:4. søndag i Advent.\n\nAdvent\, som er indledningen på + kirkeåret\, omfatter de 4 søndage før 25. december.\n\nBåde i + kirker\, institutioner og private hjem markeres advent med en + adventskrans.\n\nAdventskransen var oprindelig en grankrans med 4 lys + ophængt i røde bånd. Skikken blev indført fra Tyskland omkring år + 1900.\n\nVore dages adventskrans ses i mange fantasifulde udformninger og + farver. Der tændes et nyt lys hver søndag\, og det er skik at samles + til glögg og æbleskiver.\n\nKilde: http://www.kkb.bib.dk +SEQUENCE:3 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/DutchHolidays.ics b/media/caldata/DutchHolidays.ics new file mode 100644 index 00000000000..ad5c096905e --- /dev/null +++ b/media/caldata/DutchHolidays.ics @@ -0,0 +1,632 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Europe/Amsterdam +X-LIC-LOCATION:Europe/Amsterdam +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20101114T120902Z +LAST-MODIFIED:20101114T120917Z +DTSTAMP:20101114T120902Z +UID:f106ecdf-c716-43ef-9d94-4e6f19f2fcfb +SUMMARY:Goede Vrijdag +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120920Z +LAST-MODIFIED:20101114T120929Z +DTSTAMP:20101114T120920Z +UID:9969c4a2-d2e7-4bd2-a79d-a986c3fd422f +SUMMARY:Eerste Paasdag +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120933Z +LAST-MODIFIED:20101114T120941Z +DTSTAMP:20101114T120933Z +UID:f8bb188c-0748-4945-b924-7b5bba453af3 +SUMMARY:Tweede paasdag +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120956Z +LAST-MODIFIED:20101114T121004Z +DTSTAMP:20101114T120956Z +UID:170b2a65-540b-4851-96bb-b7db71f160e8 +SUMMARY:Hemelvaartsdag +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121023Z +LAST-MODIFIED:20101114T121031Z +DTSTAMP:20101114T121023Z +UID:b59fd2c5-b46c-4aec-82f7-79c3537821ab +SUMMARY:Eerste pinksterdag +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121035Z +LAST-MODIFIED:20101114T121045Z +DTSTAMP:20101114T121035Z +UID:6a7338ac-fbbe-4c60-bceb-ceba20aabda8 +SUMMARY:Tweede pinksterdag +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121111Z +LAST-MODIFIED:20101114T121119Z +DTSTAMP:20101114T121111Z +UID:0d10f83f-0337-4ed4-b387-b29e61e57667 +SUMMARY:Goede vrijdag +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121126Z +LAST-MODIFIED:20101114T121134Z +DTSTAMP:20101114T121126Z +UID:168620c6-3aea-40c2-8f19-6ea380fe8201 +SUMMARY:Eerste paasdag +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121136Z +LAST-MODIFIED:20101114T121156Z +DTSTAMP:20101114T121136Z +UID:b1912e9e-e0f3-444b-bd64-e057823e9f1b +SUMMARY:Tweede paasdag +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +X-MOZ-GENERATION:2 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121213Z +LAST-MODIFIED:20101114T121223Z +DTSTAMP:20101114T121213Z +UID:e507d046-5af7-44ca-b77f-a5a8e4d95b10 +SUMMARY:Hemelvaartsdag +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121258Z +LAST-MODIFIED:20101114T121307Z +DTSTAMP:20101114T121258Z +UID:f936d4ed-6882-47e0-8aee-d0979f4d5cdb +SUMMARY:Eerste pinksterdag +DTSTART;VALUE=DATE:20120527 +DTEND;VALUE=DATE:20120528 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121312Z +LAST-MODIFIED:20101114T121324Z +DTSTAMP:20101114T121312Z +UID:d9fd5bf9-6f1c-4d91-814a-a47272c048d1 +SUMMARY:Tweede pinksterdag +DTSTART;VALUE=DATE:20120528 +DTEND;VALUE=DATE:20120529 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121353Z +LAST-MODIFIED:20101114T121359Z +DTSTAMP:20101114T121353Z +UID:2951ebb4-1c83-48a2-9ab8-1d5040ddb9c0 +SUMMARY:Goede vrijdag +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121406Z +LAST-MODIFIED:20101114T121432Z +DTSTAMP:20101114T121406Z +UID:be4c27bb-869b-4897-8388-1542299805d0 +SUMMARY:Eerste paasdag +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121435Z +LAST-MODIFIED:20101114T121444Z +DTSTAMP:20101114T121435Z +UID:aff9333b-d99c-421d-9172-c8eb592dd2e4 +SUMMARY:Tweede paasdag +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121540Z +LAST-MODIFIED:20101114T121549Z +DTSTAMP:20101114T121540Z +UID:09073467-02b6-40c2-acfa-a4a8b67f1297 +SUMMARY:Hemelvaartsdag +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121553Z +LAST-MODIFIED:20101114T121600Z +DTSTAMP:20101114T121553Z +UID:c4f39915-1b2f-4b4e-8185-a83b6e5a1a17 +SUMMARY:Eerste pinksterdag +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T121603Z +LAST-MODIFIED:20101114T121611Z +DTSTAMP:20101114T121603Z +UID:49391aac-0dd6-44bf-bacb-8698941b663e +SUMMARY:Tweede pinksterdag +DTSTART;VALUE=DATE:20130520 +DTEND;VALUE=DATE:20130521 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T123551Z +LAST-MODIFIED:20101114T123559Z +DTSTAMP:20101114T123551Z +UID:79e75b09-b1dd-4123-b08c-261fceb21f8d +SUMMARY:Goede vrijdag +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T123602Z +LAST-MODIFIED:20101114T123610Z +DTSTAMP:20101114T123602Z +UID:1842b5ed-fa2d-4818-8499-3ef83f78b019 +SUMMARY:Eerste paasdag +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T123614Z +LAST-MODIFIED:20101114T123622Z +DTSTAMP:20101114T123614Z +UID:655aebc2-a7cf-4703-bd1d-a95bae30a074 +SUMMARY:Tweede paasdag +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T123640Z +LAST-MODIFIED:20101114T123647Z +DTSTAMP:20101114T123640Z +UID:4f3a6c4d-e07a-477b-86d6-048ffb199e7f +SUMMARY:Hemelvaartsdag +DTSTART;VALUE=DATE:20140529 +DTEND;VALUE=DATE:20140530 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T123710Z +LAST-MODIFIED:20101114T123717Z +DTSTAMP:20101114T123710Z +UID:5daf7edb-4ee0-414e-971c-ab35eef876a9 +SUMMARY:Eerste pinksterdag +DTSTART;VALUE=DATE:20140608 +DTEND;VALUE=DATE:20140609 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T123720Z +LAST-MODIFIED:20101114T123728Z +DTSTAMP:20101114T123720Z +UID:2370261c-2368-43a3-a99c-c9ab74bf33c5 +SUMMARY:Tweede pinksterdag +DTSTART;VALUE=DATE:20140609 +DTEND;VALUE=DATE:20140610 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T125230Z +LAST-MODIFIED:20101114T125238Z +DTSTAMP:20101114T125230Z +UID:c8b061ab-965f-499c-b270-fcbe08456869 +SUMMARY:Goede vrijdag +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T125241Z +LAST-MODIFIED:20101114T125247Z +DTSTAMP:20101114T125241Z +UID:b4228585-cd00-4f25-aae1-661a1b11670c +SUMMARY:Eerste paasdag +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T125323Z +LAST-MODIFIED:20101114T125331Z +DTSTAMP:20101114T125323Z +UID:8e20ca9a-2c93-4f60-ac22-ce623a713cb6 +SUMMARY:Hemelvaartsdag +DTSTART;VALUE=DATE:20150514 +DTEND;VALUE=DATE:20150515 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T125337Z +LAST-MODIFIED:20101114T125357Z +DTSTAMP:20101114T125337Z +UID:958add11-5ac1-4b36-b2d3-8194a987b597 +SUMMARY:Eerste pinksterdag +DTSTART;VALUE=DATE:20150524 +DTEND;VALUE=DATE:20150525 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T125400Z +LAST-MODIFIED:20101114T125408Z +DTSTAMP:20101114T125400Z +UID:4ee3ff03-3e6f-4241-9e5d-2c27e488bba0 +SUMMARY:Tweede pinksterdag +DTSTART;VALUE=DATE:20150525 +DTEND;VALUE=DATE:20150526 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T125250Z +LAST-MODIFIED:20101114T130157Z +DTSTAMP:20101114T125250Z +UID:ab59656e-540c-4fdf-8d4d-cd121593e308 +SUMMARY:Tweede paasdag +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T130302Z +LAST-MODIFIED:20101114T130313Z +DTSTAMP:20101114T130302Z +UID:fe1d2b1b-97aa-4888-aee0-1a1f81226c0f +SUMMARY:Goede vrijdag +DTSTART;VALUE=DATE:20160325 +DTEND;VALUE=DATE:20160326 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T130318Z +LAST-MODIFIED:20101114T130355Z +DTSTAMP:20101114T130318Z +UID:4cf2ebc0-0a8f-46a3-8d22-258b306afddf +SUMMARY:Eerste paasdag +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T130335Z +LAST-MODIFIED:20101114T130408Z +DTSTAMP:20101114T130335Z +UID:fec292ec-6903-4ed3-a534-e2908803ff8f +SUMMARY:Tweede paasdag +DTSTART;VALUE=DATE:20160328 +DTEND;VALUE=DATE:20160329 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T130427Z +LAST-MODIFIED:20101114T130435Z +DTSTAMP:20101114T130427Z +UID:bd39ff2b-b118-474b-b48d-2d8d06ba90eb +SUMMARY:Hemelvaartsdag +DTSTART;VALUE=DATE:20160505 +DTEND;VALUE=DATE:20160506 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T130445Z +LAST-MODIFIED:20101114T130452Z +DTSTAMP:20101114T130445Z +UID:eea3d7f4-e3c6-4313-964a-c31095919611 +SUMMARY:Eerste pinksterdag +DTSTART;VALUE=DATE:20160515 +DTEND;VALUE=DATE:20160516 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T130518Z +LAST-MODIFIED:20101114T130525Z +DTSTAMP:20101114T130518Z +UID:1b04a46e-e2ab-463a-990f-2ed62992fbcf +SUMMARY:Tweede pinksterdag +DTSTART;VALUE=DATE:20160516 +DTEND;VALUE=DATE:20160517 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T131226Z +LAST-MODIFIED:20101114T131233Z +DTSTAMP:20101114T131226Z +UID:287993d1-2ec7-4b5e-807e-dae018192da8 +SUMMARY:Goede vrijdag +DTSTART;VALUE=DATE:20170414 +DTEND;VALUE=DATE:20170415 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T131237Z +LAST-MODIFIED:20101114T131242Z +DTSTAMP:20101114T131237Z +UID:29e18034-5686-4378-a898-2735d4b31711 +SUMMARY:Eerste paasdag +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T131245Z +LAST-MODIFIED:20101114T131250Z +DTSTAMP:20101114T131245Z +UID:e710631e-8158-4ad6-98f8-cc92eee973a1 +SUMMARY:Tweede paasdag +DTSTART;VALUE=DATE:20170417 +DTEND;VALUE=DATE:20170418 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T131313Z +LAST-MODIFIED:20101114T131321Z +DTSTAMP:20101114T131313Z +UID:39c215a0-ff22-49b1-a2d8-6dc9cace2cd3 +SUMMARY:Hemelvaartsdag +DTSTART;VALUE=DATE:20170525 +DTEND;VALUE=DATE:20170526 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T131329Z +LAST-MODIFIED:20101114T131337Z +DTSTAMP:20101114T131329Z +UID:0fae6b14-1661-41f6-8f02-856a70c4495a +SUMMARY:Eerste pinksterdag +DTSTART;VALUE=DATE:20170604 +DTEND;VALUE=DATE:20170605 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T131340Z +LAST-MODIFIED:20101114T131346Z +DTSTAMP:20101114T131340Z +UID:901dee4d-8e6c-4fe0-931d-e82ceb7680f9 +SUMMARY:Tweede pinksterdag +DTSTART;VALUE=DATE:20170605 +DTEND;VALUE=DATE:20170606 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T131411Z +LAST-MODIFIED:20101114T131419Z +DTSTAMP:20101114T131411Z +UID:358dbfe6-1284-40d6-8f67-e224c2963f9d +SUMMARY:Goede vrijdag +DTSTART;VALUE=DATE:20180330 +DTEND;VALUE=DATE:20180331 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T131423Z +LAST-MODIFIED:20101114T131430Z +DTSTAMP:20101114T131423Z +UID:684e1af9-3fab-4698-8061-1db0f2707534 +SUMMARY:Eerste paasdag +DTSTART;VALUE=DATE:20180401 +DTEND;VALUE=DATE:20180402 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T131432Z +LAST-MODIFIED:20101114T131437Z +DTSTAMP:20101114T131432Z +UID:3cf277c0-5bea-4cb2-b2a1-b187b5c783f4 +SUMMARY:Tweede paasdag +DTSTART;VALUE=DATE:20180402 +DTEND;VALUE=DATE:20180403 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T131449Z +LAST-MODIFIED:20101114T131459Z +DTSTAMP:20101114T131449Z +UID:7d7190ad-a67f-4f0f-b322-236ff2d1d50d +SUMMARY:Hemelvaartsdag +DTSTART;VALUE=DATE:20180510 +DTEND;VALUE=DATE:20180511 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T131508Z +LAST-MODIFIED:20101114T131516Z +DTSTAMP:20101114T131508Z +UID:2c7d02c3-3868-423b-8283-75d8b316a779 +SUMMARY:Eerste pinksterdag +DTSTART;VALUE=DATE:20180520 +DTEND;VALUE=DATE:20180521 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T131519Z +LAST-MODIFIED:20101114T131524Z +DTSTAMP:20101114T131519Z +UID:f2f35ade-4bcc-4551-9826-f590afd75bb0 +SUMMARY:Tweede pinksterdag +DTSTART;VALUE=DATE:20180521 +DTEND;VALUE=DATE:20180522 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120049Z +LAST-MODIFIED:20101114T120100Z +DTSTAMP:20101114T120049Z +UID:f33c464d-f37f-46b2-9b38-60b705d26ab7 +SUMMARY:Nieuwjaarsdag +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:20110102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120156Z +LAST-MODIFIED:20101114T120220Z +DTSTAMP:20101114T120156Z +UID:cad2e433-73ef-4433-94aa-15949072162b +SUMMARY:Eerste Kerstdag +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120225Z +LAST-MODIFIED:20101114T120245Z +DTSTAMP:20101114T120225Z +UID:af605d9b-89e3-462d-a7f5-8d4e00c06687 +SUMMARY:Tweede Kerstdag +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20111226 +DTEND;VALUE=DATE:20111227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120314Z +LAST-MODIFIED:20101114T120324Z +DTSTAMP:20101114T120314Z +UID:b05b7d5e-7078-412a-87bd-223d69751e5c +SUMMARY:Bevrijdingsdag +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20110505 +DTEND;VALUE=DATE:20110506 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120300Z +LAST-MODIFIED:20101114T120334Z +DTSTAMP:20101114T120300Z +UID:6e6833cf-e5a8-4912-bd98-bfd489af9686 +SUMMARY:Koninginnedag +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20110430 +DTEND;VALUE=DATE:20110501 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120421Z +LAST-MODIFIED:20101114T120447Z +DTSTAMP:20101114T120421Z +UID:e29f0cf3-e694-4e7b-8162-759d94081df8 +SUMMARY:Dodenherdenking +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;TZID=Europe/Amsterdam:20110504T190000 +DTEND;TZID=Europe/Amsterdam:20110504T210000 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120459Z +LAST-MODIFIED:20101114T120510Z +DTSTAMP:20101114T120459Z +UID:98104774-36f9-4992-824e-468704e4f541 +SUMMARY:Dierendag +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20111004 +DTEND;VALUE=DATE:20111005 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120528Z +LAST-MODIFIED:20101114T120546Z +DTSTAMP:20101114T120528Z +UID:70ea2890-213c-4201-a42e-4b129f9e7ff0 +SUMMARY:Sint Maarten +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;TZID=Europe/Amsterdam:20111111T180000 +DTEND;TZID=Europe/Amsterdam:20111111T200000 +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120553Z +LAST-MODIFIED:20101114T120603Z +DTSTAMP:20101114T120553Z +UID:ff9fef4f-d61d-4f79-9f32-1bb632b332e6 +SUMMARY:Sinterklaas +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20111205 +DTEND;VALUE=DATE:20111206 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120747Z +LAST-MODIFIED:20101114T120809Z +DTSTAMP:20101114T120747Z +UID:013b172a-b879-4c7c-950b-949bd6f87fe8 +SUMMARY:Moederdag +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=5 +DTSTART;VALUE=DATE:20110508 +DTEND;VALUE=DATE:20110509 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T120826Z +LAST-MODIFIED:20101114T120848Z +DTSTAMP:20101114T120826Z +UID:5d76bdf3-1690-4e1d-b185-111ced654419 +SUMMARY:Vaderdag +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=3SU;BYMONTH=6 +DTSTART;VALUE=DATE:20110619 +DTEND;VALUE=DATE:20110620 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T125754Z +LAST-MODIFIED:20101114T130003Z +DTSTAMP:20101114T125754Z +UID:2c9b81ae-c888-43e8-bf88-a354aacfdb8c +SUMMARY:Overgang wintertijd naar zomertijd +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 +DTSTART;TZID=Europe/Amsterdam:20110327T015900 +DTEND;TZID=Europe/Amsterdam:20110327T015900 +DESCRIPTION:Klok gaat vooruit\, van 02.00 naar 03.00. +END:VEVENT +BEGIN:VEVENT +CREATED:20101114T130023Z +LAST-MODIFIED:20101114T130107Z +DTSTAMP:20101114T130023Z +UID:5e6a0ac8-61d4-48d0-a9b1-10e33dfa4764 +SUMMARY:Overgang zomertijd naar wintertijd +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 +DTSTART;TZID=Europe/Amsterdam:20111030T020000 +DTEND;TZID=Europe/Amsterdam:20111030T020000 +DESCRIPTION:Klok gaat een uur achteruit\, van 03.00 naar 02.00 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/EnglishHolidays.ics b/media/caldata/EnglishHolidays.ics new file mode 100644 index 00000000000..a76fa8d5387 --- /dev/null +++ b/media/caldata/EnglishHolidays.ics @@ -0,0 +1,1155 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Atlantic/Canary +X-LIC-LOCATION:Atlantic/Canary +BEGIN:DAYLIGHT +TZOFFSETFROM:+0000 +TZOFFSETTO:+0100 +TZNAME:WEST +DTSTART:19700329T010000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0100 +TZOFFSETTO:+0000 +TZNAME:WET +DTSTART:19701025T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176898847300 +SUMMARY:Good Friday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20050325 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20050326 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176898883487 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20050328 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20050329 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899014972 +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20050502 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20050503 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899042581 +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20050530 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20050531 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899236253 +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20050829 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20050830 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899318550 +SUMMARY:Boxing Day +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20051226 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20051227 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899343628 +SUMMARY:Christmas Day (Substitute) +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20051227 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20051228 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899378847 +SUMMARY:New Year's Day (Substitute) +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20060102 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20060103 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899395143 +SUMMARY:Good Friday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20060414 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20060415 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899402253 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20060417 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20060418 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899413862 +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20060501 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20060502 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899427409 +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20060529 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20060530 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899444878 +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20060828 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20060829 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899470550 +SUMMARY:Christmas Day +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20061225 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20061226 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899477831 +SUMMARY:Boxing Day +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20061226 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20061227 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899497112 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20070101 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20070102 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176898799581 +SUMMARY:New Year's Day (Substitute) +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20050103 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20050104 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899569518 +SUMMARY:Good Friday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20070406 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20070407 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899576800 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20070409 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20070410 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899596550 +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20070507 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20070508 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899606659 +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20070528 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20070529 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899629800 +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20070827 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20070828 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899655628 +SUMMARY:Christmas Day +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20071225 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20071226 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899663222 +SUMMARY:Boxing Day +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20071226 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20071227 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899686362 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20080101 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20080102 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899702503 +SUMMARY:Good Friday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20080321 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20080322 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176899710284 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20080324 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20080325 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900147956 +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20080505 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20080506 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900172097 +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20090504 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20090505 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900180675 +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20100503 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20100504 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900201331 +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20100531 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20100601 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900221206 +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20090525 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20090526 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900230862 +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20080526 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20080527 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900259565 +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20080825 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20080826 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900274597 +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20090831 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20090901 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900284378 +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20100830 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20100831 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900311175 +SUMMARY:Christmas Day +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20081225 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20081226 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900328956 +SUMMARY:Christmas Day +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20091225 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20091226 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900349565 +SUMMARY:Christmas Day (Substitute) +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20101228 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20101229 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20090128T151702Z +DTSTAMP:20070418T125313Z +UID:uuid1176900363534 +SUMMARY:Boxing Day (Substitute) +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20101227 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20101228 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900387284 +SUMMARY:Boxing Day (Substitute) +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20091228 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20091229 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900397128 +SUMMARY:Boxing Day +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20081226 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20081227 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900429300 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20090101 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20090102 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900438503 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20100101 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20100102 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900496378 +SUMMARY:Good Friday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20100402 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20100403 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900506768 +SUMMARY:Good Friday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20090410 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20090411 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900551862 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20090413 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20090414 +END:VEVENT +BEGIN:VEVENT +CREATED:20070418T125313Z +LAST-MODIFIED:20070418T125313Z +DTSTAMP:20070418T125313Z +UID:uuid1176900565315 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE;TZID=Atlantic/Canary:20100405 +DTEND;VALUE=DATE;TZID=Atlantic/Canary:20100406 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141220Z +LAST-MODIFIED:20090128T141256Z +DTSTAMP:20090128T141220Z +UID:7a8defba-af0f-42a7-a9f9-13a00b43b5c2 +SUMMARY:New Year's Day (Substitute) +DTSTART;VALUE=DATE:20110103 +DTEND;VALUE=DATE:20110104 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141325Z +LAST-MODIFIED:20090128T141342Z +DTSTAMP:20090128T141325Z +UID:6506ad5b-f5b4-4712-8cae-c2057e1bd9da +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141347Z +LAST-MODIFIED:20090128T141356Z +DTSTAMP:20090128T141347Z +UID:bed5f081-04d8-4122-8767-570222f08ed1 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141439Z +LAST-MODIFIED:20090128T141449Z +DTSTAMP:20090128T141439Z +UID:aae5b673-4a7e-4e33-b027-d52a18658651 +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE:20110502 +DTEND;VALUE=DATE:20110503 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141457Z +LAST-MODIFIED:20090128T141506Z +DTSTAMP:20090128T141457Z +UID:0fd95178-ccf2-4c4e-9d30-daacd863554d +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE:20110530 +DTEND;VALUE=DATE:20110531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141523Z +LAST-MODIFIED:20090128T141531Z +DTSTAMP:20090128T141523Z +UID:5d1cb37f-20c4-42aa-affa-ebb7e32ad9c8 +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE:20110829 +DTEND;VALUE=DATE:20110830 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141611Z +LAST-MODIFIED:20090128T141629Z +DTSTAMP:20090128T141611Z +UID:7f06b275-c182-4eca-be8a-5927d90bea20 +SUMMARY:Boxing Day +DTSTART;VALUE=DATE:20111226 +DTEND;VALUE=DATE:20111227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141631Z +LAST-MODIFIED:20090128T141645Z +DTSTAMP:20090128T141631Z +UID:0f06fca9-7028-4201-8333-5e1bb7088996 +SUMMARY:Christmas Day (Substitute) +DTSTART;VALUE=DATE:20111227 +DTEND;VALUE=DATE:20111228 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141904Z +LAST-MODIFIED:20090128T141925Z +DTSTAMP:20090128T141904Z +UID:3a0970c7-0730-40c1-b9c5-31416fb6e2f9 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20020101 +DTEND;VALUE=DATE:20020102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141933Z +LAST-MODIFIED:20090128T141940Z +DTSTAMP:20090128T141933Z +UID:41abf32a-336f-4188-b967-f88dac2f83f4 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20020329 +DTEND;VALUE=DATE:20020330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141942Z +LAST-MODIFIED:20090128T141949Z +DTSTAMP:20090128T141942Z +UID:6ea57336-371e-4a73-a143-6565cc85d688 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20020401 +DTEND;VALUE=DATE:20020402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142004Z +LAST-MODIFIED:20090128T142026Z +DTSTAMP:20090128T142004Z +UID:17ce503b-bfa7-4c93-b31b-4cbfe0ba3fc7 +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE:20020506 +DTEND;VALUE=DATE:20020507 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142042Z +LAST-MODIFIED:20090128T142056Z +DTSTAMP:20090128T142042Z +UID:01c5a69e-9dfa-45e0-9541-d8a8ca677d63 +SUMMARY:Golden Jubilee Bank Holiday +DTSTART;VALUE=DATE:20020603 +DTEND;VALUE=DATE:20020604 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142058Z +LAST-MODIFIED:20090128T142106Z +DTSTAMP:20090128T142058Z +UID:545d5f09-329d-494c-b0a8-eabb13edef71 +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE:20020604 +DTEND;VALUE=DATE:20020605 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142118Z +LAST-MODIFIED:20090128T142127Z +DTSTAMP:20090128T142118Z +UID:e47ae62e-5c22-4ec9-abc0-bc0f59fb1e1e +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE:20020826 +DTEND;VALUE=DATE:20020827 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142142Z +LAST-MODIFIED:20090128T142150Z +DTSTAMP:20090128T142142Z +UID:5bcff307-50ab-4725-b451-7066bd179dcd +SUMMARY:Christmas Day +DTSTART;VALUE=DATE:20021225 +DTEND;VALUE=DATE:20021226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142154Z +LAST-MODIFIED:20090128T142200Z +DTSTAMP:20090128T142154Z +UID:35b9786d-ec08-4b5d-999e-5596612f40f5 +SUMMARY:Boxing Day +DTSTART;VALUE=DATE:20021226 +DTEND;VALUE=DATE:20021227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142240Z +LAST-MODIFIED:20090128T142250Z +DTSTAMP:20090128T142240Z +UID:c7f7d72d-ecbf-4ea2-8120-61a6793d4d42 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20030101 +DTEND;VALUE=DATE:20030102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142308Z +LAST-MODIFIED:20090128T142314Z +DTSTAMP:20090128T142308Z +UID:2fad7bb2-61ae-4808-9c13-8cc63c6bd0d8 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20030418 +DTEND;VALUE=DATE:20030419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142317Z +LAST-MODIFIED:20090128T142323Z +DTSTAMP:20090128T142317Z +UID:4cc088ba-487c-49ed-bb5f-9fde0bee5047 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20030421 +DTEND;VALUE=DATE:20030422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142334Z +LAST-MODIFIED:20090128T142343Z +DTSTAMP:20090128T142334Z +UID:e3681ce1-7fcf-4cb6-bee4-5507e2a3decf +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE:20030505 +DTEND;VALUE=DATE:20030506 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142347Z +LAST-MODIFIED:20090128T142357Z +DTSTAMP:20090128T142347Z +UID:0a5bd010-4b84-448e-be8a-9b713dc1b806 +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE:20030526 +DTEND;VALUE=DATE:20030527 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142413Z +LAST-MODIFIED:20090128T142421Z +DTSTAMP:20090128T142413Z +UID:ec20e7a7-8193-4d9a-95a0-fe1145e81916 +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE:20030825 +DTEND;VALUE=DATE:20030826 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142428Z +LAST-MODIFIED:20090128T142442Z +DTSTAMP:20090128T142428Z +UID:c73386aa-2ff5-4b31-bc6c-85f215cc1864 +SUMMARY:Christmas Day +DTSTART;VALUE=DATE:20031225 +DTEND;VALUE=DATE:20031226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142446Z +LAST-MODIFIED:20090128T142452Z +DTSTAMP:20090128T142446Z +UID:13c72107-db20-4873-ad43-d496737a2c65 +SUMMARY:Boxing Day +DTSTART;VALUE=DATE:20031226 +DTEND;VALUE=DATE:20031227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142456Z +LAST-MODIFIED:20090128T142505Z +DTSTAMP:20090128T142456Z +UID:231f4a2e-679d-4c82-b179-d8849334c62b +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20040101 +DTEND;VALUE=DATE:20040102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142516Z +LAST-MODIFIED:20090128T142522Z +DTSTAMP:20090128T142516Z +UID:dae5cc6d-195a-49a5-a7d3-d36a78b605ea +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20040409 +DTEND;VALUE=DATE:20040410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142526Z +LAST-MODIFIED:20090128T142531Z +DTSTAMP:20090128T142526Z +UID:63e03e21-d89b-45f9-8564-689b131560d5 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20040412 +DTEND;VALUE=DATE:20040413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142544Z +LAST-MODIFIED:20090128T142552Z +DTSTAMP:20090128T142544Z +UID:788a9e73-c025-4f12-b18d-c7b11640558e +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE:20040503 +DTEND;VALUE=DATE:20040504 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T142559Z +LAST-MODIFIED:20090128T142608Z +DTSTAMP:20090128T142559Z +UID:c429e2e2-3698-45d0-b815-70f3bb671149 +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE:20040531 +DTEND;VALUE=DATE:20040601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T143435Z +LAST-MODIFIED:20090128T143447Z +DTSTAMP:20090128T143435Z +UID:f4f4a0b6-6ca3-4474-9e6a-b3d86efb14d1 +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE:20040830 +DTEND;VALUE=DATE:20040831 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T143506Z +LAST-MODIFIED:20090128T143521Z +DTSTAMP:20090128T143506Z +UID:4c7ac64d-d5cd-45be-b71e-82d2e9f8dfdc +SUMMARY:Boxing Day (Substitute) +DTSTART;VALUE=DATE:20041227 +DTEND;VALUE=DATE:20041228 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T143523Z +LAST-MODIFIED:20090128T143535Z +DTSTAMP:20090128T143523Z +UID:30e4a00b-a91a-4aeb-ad88-f68ee81a956f +SUMMARY:Christmas Day (Substitute) +DTSTART;VALUE=DATE:20041228 +DTEND;VALUE=DATE:20041229 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141325Z +LAST-MODIFIED:20110313T112548Z +DTSTAMP:20110313T112548Z +UID:6ddf7c3a-a228-43f5-9b9d-b4f74936776c +SUMMARY:Royal Wedding +DTSTART;VALUE=DATE:20110429 +DTEND;VALUE=DATE:20110430 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141220Z +LAST-MODIFIED:20111123T213631Z +DTSTAMP:20111123T213631Z +UID:bdba8633-a08a-4f15-b383-eebb4e3e609f +SUMMARY:New Year's Day (Substitute) +DTSTART;VALUE=DATE:20120102 +DTEND;VALUE=DATE:20120103 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141220Z +LAST-MODIFIED:20111123T213809Z +DTSTAMP:20111123T213809Z +UID:da559d68-6249-41ff-ad94-7bb78470d141 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141220Z +LAST-MODIFIED:20111123T213843Z +DTSTAMP:20111123T213843Z +UID:8a5864cb-586f-43e6-b72a-5ded29e40ee4 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141439Z +LAST-MODIFIED:20111123T213939Z +DTSTAMP:20111123T213939Z +UID:2876ea66-5f48-4cd9-8cb9-a3576c54c913 +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE:20120507 +DTEND;VALUE=DATE:20120508 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141439Z +LAST-MODIFIED:20111123T214031Z +DTSTAMP:20111123T214031Z +UID:e3aed010-4535-4304-b3a2-b5f79b3eabd5 +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE:20120604 +DTEND;VALUE=DATE:20120605 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141439Z +LAST-MODIFIED:20111123T223852Z +DTSTAMP:20111123T223852Z +UID:34efe6a6-756c-40a7-89bf-b0a79a4982e8 +SUMMARY:Queen's Diamond Jubilee +DTSTART;VALUE=DATE:20120605 +DTEND;VALUE=DATE:20120606 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141439Z +LAST-MODIFIED:20111123T214229Z +DTSTAMP:20111123T214229Z +UID:d08471d2-78d1-4617-bb5c-9c1debedada8 +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE:20120827 +DTEND;VALUE=DATE:20120828 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141611Z +LAST-MODIFIED:20111123T220252Z +DTSTAMP:20111123T220252Z +UID:eb0e9e4c-f516-4b6a-86ec-a03b384ff01f +SUMMARY:Boxing Day +DTSTART;VALUE=DATE:20121226 +DTEND;VALUE=DATE:20121227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141611Z +LAST-MODIFIED:20111123T220311Z +DTSTAMP:20111123T220311Z +UID:b61cf75e-1972-4861-aaaf-b89d8b2a0a62 +SUMMARY:Christmas Day +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141220Z +LAST-MODIFIED:20111123T220843Z +DTSTAMP:20111123T220843Z +UID:f65ac3f6-9952-42c8-a101-78e814c257af +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20130101 +DTEND;VALUE=DATE:20130102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141220Z +LAST-MODIFIED:20111123T220930Z +DTSTAMP:20111123T220930Z +UID:6ecae6e7-c5c3-4d2b-b246-a2d0f1cceacd +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141220Z +LAST-MODIFIED:20111123T220959Z +DTSTAMP:20111123T220959Z +UID:d2f57253-d989-4aaa-8767-b768bc933b45 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141220Z +LAST-MODIFIED:20111123T221048Z +DTSTAMP:20111123T221048Z +UID:d954c6e2-4727-4304-ba31-d03c51c4e7cf +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE:20130506 +DTEND;VALUE=DATE:20130507 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141220Z +LAST-MODIFIED:20111123T221116Z +DTSTAMP:20111123T221116Z +UID:ac3c5836-57e9-42a2-ab32-34aaaf35fd3f +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE:20130527 +DTEND;VALUE=DATE:20130528 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141220Z +LAST-MODIFIED:20111123T221159Z +DTSTAMP:20111123T221159Z +UID:1e490a08-6238-4e9a-ba16-1048534d2c76 +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE:20130826 +DTEND;VALUE=DATE:20130827 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141220Z +LAST-MODIFIED:20111123T221242Z +DTSTAMP:20111123T221242Z +UID:de8cfea4-3caf-4184-a3d6-a2485b711d92 +SUMMARY:Christmas Day +DTSTART;VALUE=DATE:20131225 +DTEND;VALUE=DATE:20131226 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20090128T141220Z +LAST-MODIFIED:20111123T221302Z +DTSTAMP:20111123T221302Z +UID:a3050f75-4a1f-4225-bf22-c1cb3e4191a9 +SUMMARY:Boxing Day +DTSTART;VALUE=DATE:20131226 +DTEND;VALUE=DATE:20131227 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224039Z +LAST-MODIFIED:20111123T224110Z +DTSTAMP:20111123T224110Z +UID:15be17df-f30a-4f7c-9afa-d59baefa88e1 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20140101 +DTEND;VALUE=DATE:20140102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224039Z +LAST-MODIFIED:20111123T224144Z +DTSTAMP:20111123T224144Z +UID:b331a78f-b5c2-4c6a-a866-f91bfdce5ef6 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20150101 +DTEND;VALUE=DATE:20150102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224254Z +DTSTAMP:20111123T224254Z +UID:fdfd7b26-c620-4304-90e4-0ecb029ea828 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224323Z +DTSTAMP:20111123T224323Z +UID:8398c1c7-c530-4fbe-beed-30e507604f26 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224412Z +DTSTAMP:20111123T224412Z +UID:2c4e063b-8616-4831-bc53-89fe74f52e36 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224436Z +DTSTAMP:20111123T224436Z +UID:ca4bfac9-6af9-4a64-b040-3390234ebb34 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224517Z +DTSTAMP:20111123T224517Z +UID:df7c027c-6937-44a5-9ec9-e5c2f16d58f7 +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE:20140505 +DTEND;VALUE=DATE:20140506 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224540Z +DTSTAMP:20111123T224540Z +UID:c2588d6a-7f29-403a-9bfe-7b12591544b7 +SUMMARY:Early May Bank Holiday +DTSTART;VALUE=DATE:20150504 +DTEND;VALUE=DATE:20150505 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224621Z +DTSTAMP:20111123T224621Z +UID:24e9bf2c-bdb8-4665-808a-cbc5cd9f3280 +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE:20140526 +DTEND;VALUE=DATE:20140527 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224646Z +DTSTAMP:20111123T224646Z +UID:2bc2f208-f8cc-4601-a3ca-316efcb5ee68 +SUMMARY:Spring Bank Holiday +DTSTART;VALUE=DATE:20150525 +DTEND;VALUE=DATE:20150526 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224724Z +DTSTAMP:20111123T224724Z +UID:ae633e59-63b3-4340-bc52-1f78b53ad2de +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE:20140825 +DTEND;VALUE=DATE:20140826 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224751Z +DTSTAMP:20111123T224751Z +UID:8ee78e23-a33f-4cd3-bf51-1fed7f3503c3 +SUMMARY:Summer Bank Holiday +DTSTART;VALUE=DATE:20150831 +DTEND;VALUE=DATE:20150901 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224824Z +DTSTAMP:20111123T224824Z +UID:d3e16484-ce87-4fc7-a536-3876f8a419f2 +SUMMARY:Christmas Day +DTSTART;VALUE=DATE:20141225 +DTEND;VALUE=DATE:20141226 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224845Z +DTSTAMP:20111123T224845Z +UID:46881975-0729-4f67-86ff-ac195af73c5b +SUMMARY:Christmas Day +DTSTART;VALUE=DATE:20151225 +DTEND;VALUE=DATE:20151226 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T224919Z +DTSTAMP:20111123T224919Z +UID:5ded2e73-14cc-452e-afa4-7e875eea57a4 +SUMMARY:Boxing Day +DTSTART;VALUE=DATE:20141226 +DTEND;VALUE=DATE:20141227 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20111123T224212Z +LAST-MODIFIED:20111123T225005Z +DTSTAMP:20111123T225005Z +UID:91ee709e-4fb5-45a6-8061-0e4bb4d06d20 +SUMMARY:Boxing Day (Substitute) +DTSTART;VALUE=DATE:20151228 +DTEND;VALUE=DATE:20151229 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:7 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/EstoniaHolidays.ics b/media/caldata/EstoniaHolidays.ics new file mode 100644 index 00000000000..89c4cefefd8 --- /dev/null +++ b/media/caldata/EstoniaHolidays.ics @@ -0,0 +1,1830 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20090224T142606Z +LAST-MODIFIED:20090224T142619Z +DTSTAMP:20090224T142619Z +UID:6c0e3adb-db68-4f26-b43a-f8a2cbb8e7a2 +SUMMARY:2. ülestõusmispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143018Z +LAST-MODIFIED:20090224T143032Z +DTSTAMP:20090224T143032Z +UID:8e0a5843-8e0b-42d4-bf84-c86beaac4cb0 +SUMMARY:2. ülestõusmispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143131Z +LAST-MODIFIED:20090224T143142Z +DTSTAMP:20090224T143142Z +UID:e497b8ee-14f9-45c8-866a-0daafc694c9e +SUMMARY:Palmipuudepüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-urbepaev.php +DTSTART;VALUE=DATE:20100328 +DTEND;VALUE=DATE:20100329 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T142546Z +LAST-MODIFIED:20090224T143216Z +DTSTAMP:20090224T143216Z +UID:28656000-4498-42f9-b093-4a36357fdf09 +SUMMARY:Palmipuudepüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-urbepaev.php +DTSTART;VALUE=DATE:20090405 +DTEND;VALUE=DATE:20090406 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143427Z +LAST-MODIFIED:20090224T143440Z +DTSTAMP:20090224T143440Z +UID:750c1c35-254e-4794-9008-c33f8e622a99 +SUMMARY:2. ülestõusmispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143503Z +LAST-MODIFIED:20090224T143529Z +DTSTAMP:20090224T143529Z +UID:d7f0febd-f67d-4e71-94a9-d75f67392d95 +SUMMARY:Palmipuudepüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-urbepaev.php +DTSTART;VALUE=DATE:20110417 +DTEND;VALUE=DATE:20110418 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143613Z +LAST-MODIFIED:20090224T143625Z +DTSTAMP:20090224T143625Z +UID:de0032c7-3641-4ae3-a0e3-a68dec738321 +SUMMARY:Palmipuudepüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-urbepaev.php +DTSTART;VALUE=DATE:20120401 +DTEND;VALUE=DATE:20120402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143652Z +LAST-MODIFIED:20090224T143703Z +DTSTAMP:20090224T143703Z +UID:e9dec0a8-6f6e-4dce-8c85-a639b3b9eef4 +SUMMARY:2. ülestõusmispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143809Z +LAST-MODIFIED:20090224T143822Z +DTSTAMP:20090224T143822Z +UID:dbfc4075-f344-4bfd-ab2e-b80231a57d64 +SUMMARY:2. ülestõusmispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143850Z +LAST-MODIFIED:20090224T143902Z +DTSTAMP:20090224T143902Z +UID:cfd3747d-80e6-4144-83fb-7d93eb14fd68 +SUMMARY:Palmipuudepüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-urbepaev.php +DTSTART;VALUE=DATE:20130324 +DTEND;VALUE=DATE:20130325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T153040Z +LAST-MODIFIED:20090224T153102Z +DTSTAMP:20090224T153102Z +UID:f8bc35b7-712d-4d1c-bd65-e50a7eb458f0 +SUMMARY:Vastlapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-vastlapaev.php +DTSTART;VALUE=DATE:20090224 +DTEND;VALUE=DATE:20090225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T153115Z +LAST-MODIFIED:20090224T153234Z +DTSTAMP:20090224T153234Z +UID:9c0ef223-d68b-4a2a-9b1b-897924cc3e14 +SUMMARY:Tuhkapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-tuhkapaev.php +DTSTART;VALUE=DATE:20090225 +DTEND;VALUE=DATE:20090226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T153431Z +LAST-MODIFIED:20090224T153451Z +DTSTAMP:20090224T153451Z +UID:a8348792-26bd-4b32-bfc5-feedbfbf3dad +SUMMARY:Vastlapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-vastlapaev.php +DTSTART;VALUE=DATE:20100216 +DTEND;VALUE=DATE:20100217 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T153453Z +LAST-MODIFIED:20090224T153507Z +DTSTAMP:20090224T153507Z +UID:4f14d739-c167-4446-9210-ce39462a14bf +SUMMARY:Tuhkapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-tuhkapaev.php +DTSTART;VALUE=DATE:20100217 +DTEND;VALUE=DATE:20100218 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T153553Z +LAST-MODIFIED:20090224T153644Z +DTSTAMP:20090224T153644Z +UID:8e36518d-7896-44f3-940d-29d50746d6cf +SUMMARY:Vastlapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-vastlapaev.php +DTSTART;VALUE=DATE:20110308 +DTEND;VALUE=DATE:20110309 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T153646Z +LAST-MODIFIED:20090224T153701Z +DTSTAMP:20090224T153701Z +UID:150295f6-71dd-4632-a77c-287b6b281fe0 +SUMMARY:Tuhkapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-tuhkapaev.php +DTSTART;VALUE=DATE:20110309 +DTEND;VALUE=DATE:20110310 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T153759Z +LAST-MODIFIED:20090224T153812Z +DTSTAMP:20090224T153812Z +UID:a7520885-f938-432b-8da9-8112600f7672 +SUMMARY:Vastlapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-vastlapaev.php +DTSTART;VALUE=DATE:20120221 +DTEND;VALUE=DATE:20120222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T153814Z +LAST-MODIFIED:20090224T153826Z +DTSTAMP:20090224T153826Z +UID:923f632b-83ed-4922-8f73-65b50c0dbae8 +SUMMARY:Tuhkapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-tuhkapaev.php +DTSTART;VALUE=DATE:20120222 +DTEND;VALUE=DATE:20120223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T153906Z +LAST-MODIFIED:20090224T153921Z +DTSTAMP:20090224T153921Z +UID:89d244a6-2cbe-40f8-a20a-8c621ab3d895 +SUMMARY:Vastlapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-vastlapaev.php +DTSTART;VALUE=DATE:20130212 +DTEND;VALUE=DATE:20130213 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T153923Z +LAST-MODIFIED:20090224T153936Z +DTSTAMP:20090224T153936Z +UID:24da46d9-cbf8-46a7-a525-d2d686bae267 +SUMMARY:Tuhkapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-tuhkapaev.php +DTSTART;VALUE=DATE:20130213 +DTEND;VALUE=DATE:20130214 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T154406Z +LAST-MODIFIED:20090224T154419Z +DTSTAMP:20090224T154419Z +UID:0bef8ea1-c9f4-46ae-9720-56a304f482e4 +SUMMARY:Suur neljapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-suurneljapaev.php +DTSTART;VALUE=DATE:20130328 +DTEND;VALUE=DATE:20130329 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T154431Z +LAST-MODIFIED:20090224T154443Z +DTSTAMP:20090224T154443Z +UID:b9e1f033-b187-4854-a0f8-af73607b182a +SUMMARY:Suur neljapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-suurneljapaev.php +DTSTART;VALUE=DATE:20120405 +DTEND;VALUE=DATE:20120406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T154454Z +LAST-MODIFIED:20090224T154504Z +DTSTAMP:20090224T154504Z +UID:8ddc3909-2bca-4673-a11b-416bea5d4195 +SUMMARY:Suur neljapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-suurneljapaev.php +DTSTART;VALUE=DATE:20110421 +DTEND;VALUE=DATE:20110422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T154515Z +LAST-MODIFIED:20090224T154525Z +DTSTAMP:20090224T154525Z +UID:2f2fe2a1-af46-4374-b6a2-9f97c0365db3 +SUMMARY:Suur neljapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-suurneljapaev.php +DTSTART;VALUE=DATE:20100401 +DTEND;VALUE=DATE:20100402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T154532Z +LAST-MODIFIED:20090224T154542Z +DTSTAMP:20090224T154542Z +UID:a1531442-2fa6-4e43-8717-6e6cdb721689 +SUMMARY:Suur neljapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-suurneljapaev.php +DTSTART;VALUE=DATE:20090409 +DTEND;VALUE=DATE:20090410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T154904Z +LAST-MODIFIED:20090224T154930Z +DTSTAMP:20090224T154930Z +UID:115e59ec-8903-418d-a279-62434a82da51 +SUMMARY:Taevaminemispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-ristipaev.php +DTSTART;VALUE=DATE:20090521 +DTEND;VALUE=DATE:20090522 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155024Z +LAST-MODIFIED:20090224T155034Z +DTSTAMP:20090224T155034Z +UID:931726c1-d4e7-4bc4-9fdf-69fe9e43ed8f +SUMMARY:Taevaminemispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-ristipaev.php +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155052Z +LAST-MODIFIED:20090224T155105Z +DTSTAMP:20090224T155105Z +UID:87cb49d4-b5df-4bba-baad-db1d7f15f3ed +SUMMARY:Taevaminemispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-ristipaev.php +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155130Z +LAST-MODIFIED:20090224T155144Z +DTSTAMP:20090224T155144Z +UID:8850b16b-ce60-4327-bdf8-1c484b9299d7 +SUMMARY:Taevaminemispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-ristipaev.php +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155205Z +LAST-MODIFIED:20090224T155217Z +DTSTAMP:20090224T155217Z +UID:88a3c12f-6fb0-4440-982e-bcdad8274fdd +SUMMARY:Taevaminemispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-ristipaev.php +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155252Z +LAST-MODIFIED:20090224T155303Z +DTSTAMP:20090224T155303Z +UID:bd3f6c5a-bd03-4de7-96e8-e8ee2f3f88a4 +SUMMARY:Leheristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-leheristipaev.php +DTSTART;VALUE=DATE:20130502 +DTEND;VALUE=DATE:20130503 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155313Z +LAST-MODIFIED:20090224T155322Z +DTSTAMP:20090224T155322Z +UID:ddeb4a80-60a9-4fb6-a278-e4b007abc32a +SUMMARY:Leheristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-leheristipaev.php +DTSTART;VALUE=DATE:20120510 +DTEND;VALUE=DATE:20120511 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155329Z +LAST-MODIFIED:20090224T155339Z +DTSTAMP:20090224T155339Z +UID:62e4089a-f79e-4b23-9fb7-80ea6ef27cf5 +SUMMARY:Leheristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-leheristipaev.php +DTSTART;VALUE=DATE:20110526 +DTEND;VALUE=DATE:20110527 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155353Z +LAST-MODIFIED:20090224T155402Z +DTSTAMP:20090224T155402Z +UID:a2a29b4d-7100-4d81-9cec-a241c54fa8f8 +SUMMARY:Leheristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-leheristipaev.php +DTSTART;VALUE=DATE:20100506 +DTEND;VALUE=DATE:20100507 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155409Z +LAST-MODIFIED:20090224T155419Z +DTSTAMP:20090224T155419Z +UID:44765ae2-aa27-4a28-8c8f-57af3b3a7e36 +SUMMARY:Leheristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-leheristipaev.php +DTSTART;VALUE=DATE:20090514 +DTEND;VALUE=DATE:20090515 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155453Z +LAST-MODIFIED:20090224T155503Z +DTSTAMP:20090224T155503Z +UID:fdfbb6ed-f676-49b5-9b3b-7f9f9854a2b9 +SUMMARY:Linnuristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-linnuristipaev.php +DTSTART;VALUE=DATE:20090507 +DTEND;VALUE=DATE:20090508 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155512Z +LAST-MODIFIED:20090224T155522Z +DTSTAMP:20090224T155522Z +UID:3d4ae630-4605-4149-8905-96ca46088881 +SUMMARY:Linnuristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-linnuristipaev.php +DTSTART;VALUE=DATE:20100429 +DTEND;VALUE=DATE:20100430 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155533Z +LAST-MODIFIED:20090224T155545Z +DTSTAMP:20090224T155545Z +UID:50b86367-97d7-44d9-8593-0d34c580dd15 +SUMMARY:Linnuristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-linnuristipaev.php +DTSTART;VALUE=DATE:20110519 +DTEND;VALUE=DATE:20110520 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155630Z +LAST-MODIFIED:20090224T155659Z +DTSTAMP:20090224T155659Z +UID:9165ac2b-25b9-4800-91de-1d3ebc65936c +SUMMARY:Linnuristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-linnuristipaev.php +DTSTART;VALUE=DATE:20120503 +DTEND;VALUE=DATE:20120504 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155708Z +LAST-MODIFIED:20090224T155723Z +DTSTAMP:20090224T155723Z +UID:a8505eef-862b-4ea3-9974-eb71433fad9d +SUMMARY:Linnuristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-linnuristipaev.php +DTSTART;VALUE=DATE:20130425 +DTEND;VALUE=DATE:20130426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155758Z +LAST-MODIFIED:20090224T155808Z +DTSTAMP:20090224T155808Z +UID:ba4b38e9-c47f-41ba-9c8a-4e22e8b782a3 +SUMMARY:Tuuleristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-tuuleristipaev.php +DTSTART;VALUE=DATE:20090430 +DTEND;VALUE=DATE:20090501 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155819Z +LAST-MODIFIED:20090224T155827Z +DTSTAMP:20090224T155827Z +UID:0f0d3b46-6f53-41c5-b78a-6f66f5dcec7b +SUMMARY:Tuuleristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-tuuleristipaev.php +DTSTART;VALUE=DATE:20100422 +DTEND;VALUE=DATE:20100423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155841Z +LAST-MODIFIED:20090224T155852Z +DTSTAMP:20090224T155852Z +UID:ec073888-606f-4573-b2ee-7327fe8f38bf +SUMMARY:Tuuleristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-tuuleristipaev.php +DTSTART;VALUE=DATE:20110512 +DTEND;VALUE=DATE:20110513 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155904Z +LAST-MODIFIED:20090224T155914Z +DTSTAMP:20090224T155914Z +UID:595befda-2e06-4d0e-a3e6-f17b4fb97f3f +SUMMARY:Tuuleristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-tuuleristipaev.php +DTSTART;VALUE=DATE:20120426 +DTEND;VALUE=DATE:20120427 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T155919Z +LAST-MODIFIED:20090224T155928Z +DTSTAMP:20090224T155928Z +UID:d73d635b-42af-43a0-87a6-c2333a68833c +SUMMARY:Tuuleristipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-tuuleristipaev.php +DTSTART;VALUE=DATE:20130418 +DTEND;VALUE=DATE:20130419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T161742Z +LAST-MODIFIED:20090224T161754Z +DTSTAMP:20090224T161754Z +UID:e08e08f8-2b2a-4d98-92ae-ca153b3c5e56 +SUMMARY:2. nelipüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-nelipuhad.php +DTSTART;VALUE=DATE:20130520 +DTEND;VALUE=DATE:20130521 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T161847Z +LAST-MODIFIED:20090224T161921Z +DTSTAMP:20090224T161921Z +UID:e1036192-2f96-440f-833e-5143b879564f +SUMMARY:2. nelipüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-nelipuhad.php +DTSTART;VALUE=DATE:20120528 +DTEND;VALUE=DATE:20120529 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T162011Z +LAST-MODIFIED:20090224T162021Z +DTSTAMP:20090224T162021Z +UID:84e0f1a0-c478-4e27-b547-4e1831a237cb +SUMMARY:2. nelipüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-nelipuhad.php +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T162056Z +LAST-MODIFIED:20090224T162110Z +DTSTAMP:20090224T162110Z +UID:36895404-594d-4c81-baf0-0897260974e6 +SUMMARY:2. nelipüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-nelipuhad.php +DTSTART;VALUE=DATE:20100524 +DTEND;VALUE=DATE:20100525 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T162248Z +LAST-MODIFIED:20090224T162302Z +DTSTAMP:20090224T162302Z +UID:c23cdabf-0f94-4267-82de-3d3b7ddd6068 +SUMMARY:2. nelipüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-nelipuhad.php +DTSTART;VALUE=DATE:20090601 +DTEND;VALUE=DATE:20090602 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T163721Z +LAST-MODIFIED:20090224T163733Z +DTSTAMP:20090224T163733Z +UID:3ac509af-2843-4286-a549-7d41a00c8f2a +SUMMARY:4. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20131222 +DTEND;VALUE=DATE:20131223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T163735Z +LAST-MODIFIED:20090224T163754Z +DTSTAMP:20090224T163754Z +UID:fceae0cb-9d3a-40c2-b2bd-672e68a3f63e +SUMMARY:3. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20131215 +DTEND;VALUE=DATE:20131216 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T163756Z +LAST-MODIFIED:20090224T163808Z +DTSTAMP:20090224T163808Z +UID:f780ca93-a077-4b45-9ab7-d96357fb24e8 +SUMMARY:2. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20131208 +DTEND;VALUE=DATE:20131209 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T163809Z +LAST-MODIFIED:20090224T163820Z +DTSTAMP:20090224T163820Z +UID:005845c5-7813-4eb3-88dd-aee14f371469 +SUMMARY:1. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20131201 +DTEND;VALUE=DATE:20131202 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T163910Z +LAST-MODIFIED:20090224T163922Z +DTSTAMP:20090224T163922Z +UID:d4e77c6f-06b5-4187-a7c0-0d8bb1535d0b +SUMMARY:4. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20121223 +DTEND;VALUE=DATE:20121224 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T163923Z +LAST-MODIFIED:20090224T163934Z +DTSTAMP:20090224T163934Z +UID:6718ace4-0a83-43a5-b778-a490c0bcec2f +SUMMARY:3. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20121216 +DTEND;VALUE=DATE:20121217 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T163936Z +LAST-MODIFIED:20090224T163946Z +DTSTAMP:20090224T163946Z +UID:e8325203-bd0d-4e42-896f-8098ebf7c778 +SUMMARY:2. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20121209 +DTEND;VALUE=DATE:20121210 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T163948Z +LAST-MODIFIED:20090224T164014Z +DTSTAMP:20090224T164014Z +UID:3b2fe241-5c79-44fd-94ff-0a6c8b998c4c +SUMMARY:1. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20121202 +DTEND;VALUE=DATE:20121203 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T164101Z +LAST-MODIFIED:20090224T164114Z +DTSTAMP:20090224T164114Z +UID:f334c992-9d91-461e-93a3-b5f2dea5f8a6 +SUMMARY:4. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20111218 +DTEND;VALUE=DATE:20111219 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T164116Z +LAST-MODIFIED:20090224T164131Z +DTSTAMP:20090224T164131Z +UID:04169d91-612d-4589-aa89-10cb9ef1e336 +SUMMARY:3. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20111211 +DTEND;VALUE=DATE:20111212 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T164133Z +LAST-MODIFIED:20090224T164148Z +DTSTAMP:20090224T164148Z +UID:31c762b0-c292-401f-aa1f-6ee581993689 +SUMMARY:2. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20111204 +DTEND;VALUE=DATE:20111205 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T164153Z +LAST-MODIFIED:20090224T164207Z +DTSTAMP:20090224T164207Z +UID:48229b25-9bd8-43f6-86bf-ca5da845bdb3 +SUMMARY:1. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20111127 +DTEND;VALUE=DATE:20111128 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T164221Z +LAST-MODIFIED:20090224T164233Z +DTSTAMP:20090224T164233Z +UID:10db68f7-14de-47e3-9f42-2ae5deead271 +SUMMARY:4. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20101219 +DTEND;VALUE=DATE:20101220 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T164235Z +LAST-MODIFIED:20090224T164247Z +DTSTAMP:20090224T164247Z +UID:33910bbe-e1d7-4216-9030-671037958ca0 +SUMMARY:3. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20101212 +DTEND;VALUE=DATE:20101213 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T164249Z +LAST-MODIFIED:20090224T164302Z +DTSTAMP:20090224T164302Z +UID:6caa6b69-8341-4aa1-bff0-86de306adcd4 +SUMMARY:2. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20101205 +DTEND;VALUE=DATE:20101206 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T164306Z +LAST-MODIFIED:20090224T164317Z +DTSTAMP:20090224T164317Z +UID:7f7818bc-bba0-487a-8c47-3f1e8f7fd4c7 +SUMMARY:1. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20101128 +DTEND;VALUE=DATE:20101129 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T164332Z +LAST-MODIFIED:20090224T164348Z +DTSTAMP:20090224T164348Z +UID:d9efea44-ecad-4dcb-86b3-652e0ed6e4e1 +SUMMARY:4. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20091220 +DTEND;VALUE=DATE:20091221 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T164350Z +LAST-MODIFIED:20090224T164401Z +DTSTAMP:20090224T164401Z +UID:449ed19b-85e8-4c06-85e6-c674bdf7b878 +SUMMARY:3. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20091213 +DTEND;VALUE=DATE:20091214 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T164404Z +LAST-MODIFIED:20090224T164413Z +DTSTAMP:20090224T164413Z +UID:ce5e2d63-690e-4a88-82c7-a615b4170778 +SUMMARY:2. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20091206 +DTEND;VALUE=DATE:20091207 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T164417Z +LAST-MODIFIED:20090224T164427Z +DTSTAMP:20090224T164427Z +UID:57dc549b-76d8-4242-b5b6-25025583dc74 +SUMMARY:1. advent +ATTACH:http://www.folklore.ee/Berta/tahtpaev-advent.php +DTSTART;VALUE=DATE:20091129 +DTEND;VALUE=DATE:20091130 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T142709Z +LAST-MODIFIED:20090224T175853Z +DTSTAMP:20090224T175853Z +UID:d7c17df8-d809-4110-b9d1-fa999bed8460 +SUMMARY:Suur reede +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T142957Z +LAST-MODIFIED:20090224T175901Z +DTSTAMP:20090224T175901Z +UID:77ae2100-54fb-4afd-aa70-a38c759d5255 +SUMMARY:Suur reede +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143448Z +LAST-MODIFIED:20090224T175909Z +DTSTAMP:20090224T175909Z +UID:0e0ec2ad-96eb-4bfc-b806-549ac524c903 +SUMMARY:Suur reede +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143707Z +LAST-MODIFIED:20090224T175918Z +DTSTAMP:20090224T175918Z +UID:f1d602c1-df5f-4177-aefa-1f7de0a15bb0 +SUMMARY:Suur reede +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143826Z +LAST-MODIFIED:20090224T175926Z +DTSTAMP:20090224T175926Z +UID:e808ac88-7b8f-40df-8ec6-048d311a53c9 +SUMMARY:Suur reede +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T142357Z +LAST-MODIFIED:20090224T180108Z +DTSTAMP:20090224T180108Z +UID:5571fedc-09f1-441c-91b8-1f5fb87428d1 +SUMMARY:1. ülestõusmispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T142904Z +LAST-MODIFIED:20090224T180116Z +DTSTAMP:20090224T180116Z +UID:eaa19ee3-e47d-42eb-a287-c5e9ecab2fe3 +SUMMARY:1. ülestõusmispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143304Z +LAST-MODIFIED:20090224T180125Z +DTSTAMP:20090224T180125Z +UID:c9196511-ac69-40b4-ae30-293407499cd6 +SUMMARY:1. ülestõusmispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143638Z +LAST-MODIFIED:20090224T180133Z +DTSTAMP:20090224T180133Z +UID:57437f25-0e7e-454d-9de2-d2d53cb2026b +SUMMARY:1. ülestõusmispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T143748Z +LAST-MODIFIED:20090224T180140Z +DTSTAMP:20090224T180140Z +UID:187f9e79-531d-4493-9b3b-fbedea60ef2c +SUMMARY:1. ülestõusmispüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lihavotted.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T162234Z +LAST-MODIFIED:20090224T180230Z +DTSTAMP:20090224T180230Z +UID:6683df33-27a4-4b02-9ecb-4ebec699040b +SUMMARY:1. nelipüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-nelipuhad.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20090531 +DTEND;VALUE=DATE:20090601 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T162042Z +LAST-MODIFIED:20090224T180239Z +DTSTAMP:20090224T180239Z +UID:f79d5f9b-b7bd-4ed5-8f08-5d03ed5fe57b +SUMMARY:1. nelipüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-nelipuhad.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T161953Z +LAST-MODIFIED:20090224T180248Z +DTSTAMP:20090224T180248Z +UID:d880d792-30b4-42f3-86ad-fc45815ef3a5 +SUMMARY:1. nelipüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-nelipuhad.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T161831Z +LAST-MODIFIED:20090224T180255Z +DTSTAMP:20090224T180255Z +UID:d0ebd7bd-70bb-4dab-8781-df8df8a9cd13 +SUMMARY:1. nelipüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-nelipuhad.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20120527 +DTEND;VALUE=DATE:20120528 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T161716Z +LAST-MODIFIED:20090224T180302Z +DTSTAMP:20090224T180302Z +UID:30038975-2120-44c0-9ba8-7938f6638117 +SUMMARY:1. nelipüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-nelipuhad.php +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T131450Z +LAST-MODIFIED:20090224T131539Z +DTSTAMP:20090224T131539Z +UID:bbb0c54d-73bd-490c-b420-2f5ab0fb1449 +SUMMARY:Kolmekuningapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-kolmekungingapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=6;BYMONTH=1 +DTSTART;VALUE=DATE:20090106 +DTEND;VALUE=DATE:20090107 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T132042Z +LAST-MODIFIED:20090224T132209Z +DTSTAMP:20090224T132209Z +UID:5684334c-e258-4b82-b6e2-74b84d3646ca +SUMMARY:Taliharjapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-taliharjapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=14;BYMONTH=1 +DTSTART;VALUE=DATE:20090114 +DTEND;VALUE=DATE:20090115 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T132225Z +LAST-MODIFIED:20090224T132258Z +DTSTAMP:20090224T132258Z +UID:e3dea9be-9b9f-49c8-8b84-3b78e1f41eab +SUMMARY:Tõnisepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-tonisepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=17;BYMONTH=1 +DTSTART;VALUE=DATE:20090117 +DTEND;VALUE=DATE:20090118 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T132503Z +LAST-MODIFIED:20090224T132543Z +DTSTAMP:20090224T132543Z +UID:a5ccc584-72ee-4f59-8121-8e9da34b49a6 +SUMMARY:Paavlipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-paavlipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=25;BYMONTH=1 +DTSTART;VALUE=DATE:20090125 +DTEND;VALUE=DATE:20090126 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T131604Z +LAST-MODIFIED:20090224T132744Z +DTSTAMP:20090224T132744Z +UID:7eee856e-725d-420b-aa0f-d3667ca88972 +SUMMARY:Nuudipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-nuudipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=13;BYMONTH=1 +DTSTART;VALUE=DATE:20090113 +DTEND;VALUE=DATE:20090114 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T132758Z +LAST-MODIFIED:20090224T132828Z +DTSTAMP:20090224T132828Z +UID:ce4a2c35-c48c-4bef-a1b2-5172f0c0e0f3 +SUMMARY:Küünlapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-kuunlapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=2;BYMONTH=2 +DTSTART;VALUE=DATE:20090202 +DTEND;VALUE=DATE:20090203 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T132854Z +LAST-MODIFIED:20090224T132957Z +DTSTAMP:20090224T132957Z +UID:38165c60-420d-4bcc-9f6c-ed50a74f60dc +SUMMARY:Luuvalupäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-luuvalupaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=9;BYMONTH=2 +DTSTART;VALUE=DATE:20090209 +DTEND;VALUE=DATE:20090210 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T133050Z +LAST-MODIFIED:20090224T133126Z +DTSTAMP:20090224T133126Z +UID:0195f1d5-f4f1-462f-a1d4-48ac83d9f280 +SUMMARY:Valentinipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-valentinipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=14;BYMONTH=2 +DTSTART;VALUE=DATE:20090214 +DTEND;VALUE=DATE:20090215 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T133146Z +LAST-MODIFIED:20090224T133213Z +DTSTAMP:20090224T133213Z +UID:3e5ebef2-dd54-4956-8ffd-cd947afb0380 +SUMMARY:Peetripäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-peetripaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=22;BYMONTH=2 +DTSTART;VALUE=DATE:20090222 +DTEND;VALUE=DATE:20090223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T133225Z +LAST-MODIFIED:20090224T133259Z +DTSTAMP:20090224T133259Z +UID:c2f549db-2a3d-404e-8a59-658428d70d69 +SUMMARY:Madisepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-madisepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=24;BYMONTH=2 +DTSTART;VALUE=DATE:20090224 +DTEND;VALUE=DATE:20090225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T133654Z +LAST-MODIFIED:20090224T133724Z +DTSTAMP:20090224T133724Z +UID:0cba8e6d-6689-4519-be96-a2ee3fc397cc +SUMMARY:Naistepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-naistepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=8;BYMONTH=3 +DTSTART;VALUE=DATE:20090308 +DTEND;VALUE=DATE:20090309 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T133756Z +LAST-MODIFIED:20090224T133824Z +DTSTAMP:20090224T133824Z +UID:4910dab3-e89e-4c46-b940-dcddd5a057b3 +SUMMARY:Korjusepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-korjusepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=12;BYMONTH=3 +DTSTART;VALUE=DATE:20090312 +DTEND;VALUE=DATE:20090313 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T134053Z +LAST-MODIFIED:20090224T134116Z +DTSTAMP:20090224T134116Z +UID:b386e08c-046a-4a9d-b846-2b17ec478720 +SUMMARY:Käädripäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-kaadripaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=17;BYMONTH=3 +DTSTART;VALUE=DATE:20090317 +DTEND;VALUE=DATE:20090318 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T134133Z +LAST-MODIFIED:20090224T134202Z +DTSTAMP:20090224T134202Z +UID:54abb94d-9420-45bd-9ece-3f1a8d07eb76 +SUMMARY:Pendipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-pendipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=21;BYMONTH=3 +DTSTART;VALUE=DATE:20090321 +DTEND;VALUE=DATE:20090322 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T134224Z +LAST-MODIFIED:20090224T134259Z +DTSTAMP:20090224T134259Z +UID:f29a135a-3e5d-4c54-9a1d-12e066f2f031 +SUMMARY:Paastumaarjapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-maarjapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=25;BYMONTH=3 +DTSTART;VALUE=DATE:20090325 +DTEND;VALUE=DATE:20090326 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T134314Z +LAST-MODIFIED:20090224T134339Z +DTSTAMP:20090224T134339Z +UID:f5c50cbb-0dee-493e-ba0b-a82018d75154 +SUMMARY:Naljapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-naljapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=1;BYMONTH=4 +DTSTART;VALUE=DATE:20090401 +DTEND;VALUE=DATE:20090402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T134359Z +LAST-MODIFIED:20090224T134506Z +DTSTAMP:20090224T134506Z +UID:6d6d35c2-7bec-47d7-8dcb-28280b7ea7fd +RDATE;VALUE=DATE:20090401 +EXDATE;VALUE=DATE:20090401 +DTSTART;VALUE=DATE:20090401 +DTEND;VALUE=DATE:20090402 +X-MOZ-FAKED-MASTER:1 +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T134507Z +LAST-MODIFIED:20090224T134533Z +DTSTAMP:20090224T134533Z +UID:015a221e-8848-41f9-b3b7-8eb9a19b666d +SUMMARY:Karjalaskepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-karjalaskepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=1;BYMONTH=4 +DTSTART;VALUE=DATE:20090401 +DTEND;VALUE=DATE:20090402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T134628Z +LAST-MODIFIED:20090224T134651Z +DTSTAMP:20090224T134651Z +UID:1ea2c7bb-5bb9-42c5-8e56-70ee032a49cf +SUMMARY:Künnipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-kunnipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=14;BYMONTH=4 +DTSTART;VALUE=DATE:20090414 +DTEND;VALUE=DATE:20090415 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T134658Z +LAST-MODIFIED:20090224T134724Z +DTSTAMP:20090224T134724Z +UID:bcb1c018-000f-46bb-9dd1-29c556daed62 +SUMMARY:Jüripäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-juripaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=23;BYMONTH=4 +DTSTART;VALUE=DATE:20090423 +DTEND;VALUE=DATE:20090424 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T134808Z +LAST-MODIFIED:20090224T134830Z +DTSTAMP:20090224T134830Z +UID:105cbf7a-e319-4ea0-bc24-1ea580ecca29 +SUMMARY:Volbripäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-volbripaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=1;BYMONTH=5 +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T134942Z +LAST-MODIFIED:20090224T135009Z +DTSTAMP:20090224T135009Z +UID:eaad1012-525a-49a1-9107-5dfef4e120cb +SUMMARY:Urbanipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-urbanipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=25;BYMONTH=5 +DTSTART;VALUE=DATE:20090525 +DTEND;VALUE=DATE:20090526 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T135123Z +LAST-MODIFIED:20090224T135152Z +DTSTAMP:20090224T135152Z +UID:3d6617b3-5953-4dbb-99cc-2c03f539994f +SUMMARY:Seitsmemagajapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-seitsmemagajapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=27;BYMONTH=6 +DTSTART;VALUE=DATE:20090627 +DTEND;VALUE=DATE:20090628 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T135201Z +LAST-MODIFIED:20090224T135234Z +DTSTAMP:20090224T135234Z +UID:2a6d7f6e-43cb-407c-a497-1eaaa0ec8085 +SUMMARY:Peetripäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-suvinepeetripaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=29;BYMONTH=6 +DTSTART;VALUE=DATE:20090629 +DTEND;VALUE=DATE:20090630 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T135327Z +LAST-MODIFIED:20090224T135358Z +DTSTAMP:20090224T135358Z +UID:ddcc3a5c-491a-4872-bcd2-dd1b65aad3bf +SUMMARY:Heinamaarjapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-heinamaarjapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=2;BYMONTH=7 +DTSTART;VALUE=DATE:20090702 +DTEND;VALUE=DATE:20090703 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T135413Z +LAST-MODIFIED:20090224T135440Z +DTSTAMP:20090224T135440Z +UID:2256dad8-d10f-475f-a6b9-647f937ae037 +SUMMARY:Seitsmevennapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-seitsmevennapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=10;BYMONTH=7 +DTSTART;VALUE=DATE:20090710 +DTEND;VALUE=DATE:20090711 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T135531Z +LAST-MODIFIED:20090224T135558Z +DTSTAMP:20090224T135558Z +UID:934c1576-59c6-4b05-bd56-35510f1b6469 +SUMMARY:Jaagupipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-jaagupipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=25;BYMONTH=7 +DTSTART;VALUE=DATE:20090725 +DTEND;VALUE=DATE:20090726 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T135608Z +LAST-MODIFIED:20090224T135633Z +DTSTAMP:20090224T135633Z +UID:450c093c-88da-4059-bca4-58e5bd244c71 +SUMMARY:Annepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-annepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=26;BYMONTH=7 +DTSTART;VALUE=DATE:20090726 +DTEND;VALUE=DATE:20090727 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T135644Z +LAST-MODIFIED:20090224T135712Z +DTSTAMP:20090224T135712Z +UID:4901ff29-262e-44c5-9aa2-e1fd7e100159 +SUMMARY:Olevipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-olevipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=29;BYMONTH=7 +DTSTART;VALUE=DATE:20090729 +DTEND;VALUE=DATE:20090730 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T135754Z +LAST-MODIFIED:20090224T135817Z +DTSTAMP:20090224T135817Z +UID:3d3e7eac-a597-44b7-a791-f39dca10e9f1 +SUMMARY:Lauritsapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-lauritsapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=10;BYMONTH=8 +DTSTART;VALUE=DATE:20090810 +DTEND;VALUE=DATE:20090811 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T135928Z +LAST-MODIFIED:20090224T135956Z +DTSTAMP:20090224T135956Z +UID:63bc4939-0129-4f4a-a480-c0f6f5e4d015 +SUMMARY:Rukkimaarjapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-rukkimaarjapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=15;BYMONTH=8 +DTSTART;VALUE=DATE:20090815 +DTEND;VALUE=DATE:20090816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T140041Z +LAST-MODIFIED:20090224T140104Z +DTSTAMP:20090224T140104Z +UID:bde46696-788b-4695-afd8-67658cf563af +SUMMARY:Pärtlipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-partlipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=24;BYMONTH=8 +DTSTART;VALUE=DATE:20090824 +DTEND;VALUE=DATE:20090825 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T140236Z +LAST-MODIFIED:20090224T140304Z +DTSTAMP:20090224T140304Z +UID:dc08d925-675b-4dff-a412-dc540113316b +SUMMARY:Ussimaarjapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-ussimaarjapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=8;BYMONTH=9 +DTSTART;VALUE=DATE:20090908 +DTEND;VALUE=DATE:20090909 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T140315Z +LAST-MODIFIED:20090224T140345Z +DTSTAMP:20090224T140345Z +UID:89ed3591-40ea-4f89-8fea-7b4f7cfde5e3 +SUMMARY:Madisepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-sugisenemadisepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=21;BYMONTH=9 +DTSTART;VALUE=DATE:20090921 +DTEND;VALUE=DATE:20090922 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T140355Z +LAST-MODIFIED:20090224T140421Z +DTSTAMP:20090224T140421Z +UID:862b33da-ce2f-4acf-bd56-7205a4b07668 +SUMMARY:Mihklipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-mihklipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=29;BYMONTH=9 +DTSTART;VALUE=DATE:20090929 +DTEND;VALUE=DATE:20090930 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T140519Z +LAST-MODIFIED:20090224T140604Z +DTSTAMP:20090224T140604Z +UID:f6ff4861-c7b6-40f3-8105-b0261f4daa3e +SUMMARY:Õpetajate päev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-opetajatepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=5;BYMONTH=10 +DTSTART;VALUE=DATE:20091005 +DTEND;VALUE=DATE:20091006 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T140622Z +LAST-MODIFIED:20090224T140644Z +DTSTAMP:20090224T140644Z +UID:7eab6b83-3d69-428b-b412-bd44ac0f1802 +SUMMARY:Kolletamispäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-kolletamispaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=14;BYMONTH=10 +DTSTART;VALUE=DATE:20091014 +DTEND;VALUE=DATE:20091015 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T140732Z +LAST-MODIFIED:20090224T140802Z +DTSTAMP:20090224T140802Z +UID:de6d9d07-8784-465c-9631-7d15cf9911e8 +SUMMARY:Simunapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-simunapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=28;BYMONTH=10 +DTSTART;VALUE=DATE:20091028 +DTEND;VALUE=DATE:20091029 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T140933Z +LAST-MODIFIED:20090224T141005Z +DTSTAMP:20090224T141005Z +UID:a7c95892-950f-4660-9590-14be20ff8cf7 +SUMMARY:Halloween +ATTACH:http://www.folklore.ee/Berta/tahtpaev-simunapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=31;BYMONTH=10 +DTSTART;VALUE=DATE:20091031 +DTEND;VALUE=DATE:20091101 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T141036Z +LAST-MODIFIED:20090224T141057Z +DTSTAMP:20090224T141057Z +UID:aefa6c59-2487-4569-97b4-8337785147b6 +SUMMARY:Hingedepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-hingedepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=2;BYMONTH=11 +DTSTART;VALUE=DATE:20091102 +DTEND;VALUE=DATE:20091103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T141108Z +LAST-MODIFIED:20090224T141136Z +DTSTAMP:20090224T141136Z +UID:801ef9c7-e219-41c8-87b3-39fdb11882a4 +SUMMARY:Mardipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-mardipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=10;BYMONTH=11 +DTSTART;VALUE=DATE:20091110 +DTEND;VALUE=DATE:20091111 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T141143Z +LAST-MODIFIED:20090224T141206Z +DTSTAMP:20090224T141206Z +UID:096dbc4f-e39b-440a-b29f-855daec1d144 +SUMMARY:Kadripäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-kadripaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=25;BYMONTH=11 +DTSTART;VALUE=DATE:20091125 +DTEND;VALUE=DATE:20091126 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T141221Z +LAST-MODIFIED:20090224T141307Z +DTSTAMP:20090224T141307Z +UID:6b86ae1e-40e4-43c4-8c72-e3bbbe760706 +SUMMARY:Andresepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-andresepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=30;BYMONTH=11 +DTSTART;VALUE=DATE:20091130 +DTEND;VALUE=DATE:20091201 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T141352Z +LAST-MODIFIED:20090224T141415Z +DTSTAMP:20090224T141415Z +UID:a91b46f5-d91f-4034-91d2-97666570a0e4 +SUMMARY:Nigulapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-detsnigulapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=6;BYMONTH=12 +DTSTART;VALUE=DATE:20091206 +DTEND;VALUE=DATE:20091207 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T141451Z +LAST-MODIFIED:20090224T141513Z +DTSTAMP:20090224T141513Z +UID:19b4e255-69ed-40ae-8109-975e029ad5a2 +SUMMARY:Luutsinapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-luutsipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=13;BYMONTH=12 +DTSTART;VALUE=DATE:20091213 +DTEND;VALUE=DATE:20091214 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T141529Z +LAST-MODIFIED:20090224T141555Z +DTSTAMP:20090224T141555Z +UID:e01b3f7a-e95b-4d2d-8e16-78a48f48671d +SUMMARY:Toomapäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-toomapaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=21;BYMONTH=12 +DTSTART;VALUE=DATE:20091221 +DTEND;VALUE=DATE:20091222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T141705Z +LAST-MODIFIED:20090224T141729Z +DTSTAMP:20090224T141729Z +UID:2bf0855f-1b19-443b-a732-4952186559e5 +SUMMARY:1. jõulupüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-joulud.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=25;BYMONTH=12 +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T141731Z +LAST-MODIFIED:20090224T141755Z +DTSTAMP:20090224T141755Z +UID:dbd6d41a-3264-4224-8805-97760c65a218 +SUMMARY:2. jõulupüha +ATTACH:http://www.folklore.ee/Berta/tahtpaev-joulud.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=26;BYMONTH=12 +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T141837Z +LAST-MODIFIED:20090224T141908Z +DTSTAMP:20090224T141908Z +UID:4717559e-de3a-4e86-ae60-d6ec668115d4 +SUMMARY:Süütalastepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-suutlastepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=28;BYMONTH=12 +DTSTART;VALUE=DATE:20091228 +DTEND;VALUE=DATE:20091229 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T165311Z +LAST-MODIFIED:20090224T165348Z +DTSTAMP:20090224T165348Z +UID:e57095c1-05e8-4ac6-be19-1116b5b737a4 +SUMMARY:Üleminek talveajale +RRULE:FREQ=YEARLY;COUNT=5;BYDAY=-1SU;BYMONTH=10 +DTSTART;VALUE=DATE:20091025 +DTEND;VALUE=DATE:20091026 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T165406Z +LAST-MODIFIED:20090224T165444Z +DTSTAMP:20090224T165444Z +UID:8469d6d8-9219-413e-a742-a63b906ef5e8 +SUMMARY:Üleminek suveajale +RRULE:FREQ=YEARLY;COUNT=5;BYDAY=-1SU;BYMONTH=3 +DTSTART;VALUE=DATE:20090329 +DTEND;VALUE=DATE:20090330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T170904Z +LAST-MODIFIED:20090224T170927Z +DTSTAMP:20090224T170927Z +UID:f6bde042-f463-47e3-91ec-f23aba69a4c4 +SUMMARY:Vabadussõjas võidelnute mälestuspäev +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=3;BYMONTH=1 +CATEGORIES:Lipupäev +DTSTART;VALUE=DATE:20090103 +DTEND;VALUE=DATE:20090104 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T170949Z +LAST-MODIFIED:20090224T171020Z +DTSTAMP:20090224T171020Z +UID:f7f5739e-772b-44d2-86fb-1c30f629ad2a +SUMMARY:Tartu rahulepingu aastapäev +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=2;BYMONTH=2 +CATEGORIES:Lipupäev +DTSTART;VALUE=DATE:20090202 +DTEND;VALUE=DATE:20090203 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T133834Z +LAST-MODIFIED:20090224T171204Z +DTSTAMP:20090224T171204Z +UID:2d97e697-d064-4c55-a343-0f36bedcc581 +SUMMARY:Emakeelepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-emakeelepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=14;BYMONTH=3 +CATEGORIES:Lipupäev +DTSTART;VALUE=DATE:20090314 +DTEND;VALUE=DATE:20090315 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T163333Z +LAST-MODIFIED:20090224T171231Z +DTSTAMP:20090224T171231Z +UID:6b8df115-2c54-4eaa-a641-5a7535a16066 +SUMMARY:Emadepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-emadepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYDAY=2SU;BYMONTH=5 +CATEGORIES:Lipupäev +DTSTART;VALUE=DATE:20090510 +DTEND;VALUE=DATE:20090511 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T171350Z +LAST-MODIFIED:20090224T171425Z +DTSTAMP:20090224T171425Z +UID:22c5c76e-7dcf-4237-85d7-9bb9cf872a8d +SUMMARY:Euroopa päev +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=9;BYMONTH=5 +CATEGORIES:Lipupäev +DTSTART;VALUE=DATE:20090509 +DTEND;VALUE=DATE:20090510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T171517Z +LAST-MODIFIED:20090224T171541Z +DTSTAMP:20090224T171541Z +UID:f37f5c06-8e62-4401-b91f-dbb473f915c3 +SUMMARY:Eesti lipu päev +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=4;BYMONTH=6 +CATEGORIES:Lipupäev +DTSTART;VALUE=DATE:20090604 +DTEND;VALUE=DATE:20090605 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T171609Z +LAST-MODIFIED:20090224T171634Z +DTSTAMP:20090224T171634Z +UID:e4b8ecf3-ca13-42e5-9656-56438226c057 +SUMMARY:Leinapäev +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=14;BYMONTH=6 +CATEGORIES:Lipupäev +DTSTART;VALUE=DATE:20090614 +DTEND;VALUE=DATE:20090615 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T135039Z +LAST-MODIFIED:20090224T171715Z +DTSTAMP:20090224T171715Z +UID:5e4073b7-f3a5-4f6d-9df6-e212dd8085cd +SUMMARY:Jaanipäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-jaanipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=24;BYMONTH=6 +CATEGORIES:Puhkepäev +CATEGORIES:Lipupäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20090624 +DTEND;VALUE=DATE:20090625 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T170531Z +LAST-MODIFIED:20090224T171734Z +DTSTAMP:20090224T171734Z +UID:afe75047-25c9-4fcb-97b9-70a780813e43 +SUMMARY:Taasiseseisvumispäev +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=20;BYMONTH=8 +CATEGORIES:Puhkepäev +CATEGORIES:Lipupäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20090820 +DTEND;VALUE=DATE:20090821 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T140147Z +LAST-MODIFIED:20090224T171744Z +DTSTAMP:20090224T171744Z +UID:a9dfdae8-72c9-4ca0-9afa-7fb83f36692a +SUMMARY:Teadmistepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-esimenekoolipaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=1;BYMONTH=9 +CATEGORIES:Lipupäev +DTSTART;VALUE=DATE:20090901 +DTEND;VALUE=DATE:20090902 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T163448Z +LAST-MODIFIED:20090224T171827Z +DTSTAMP:20090224T171827Z +UID:37a62847-c544-4540-ac6c-c54dc6fe99ee +SUMMARY:Isadepäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-isadepaev.php +RRULE:FREQ=YEARLY;COUNT=5;BYDAY=2SU;BYMONTH=11 +CATEGORIES:Lipupäev +DTSTART;VALUE=DATE:20091108 +DTEND;VALUE=DATE:20091109 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T170010Z +LAST-MODIFIED:20090224T180208Z +DTSTAMP:20090224T180208Z +UID:b30b5bb6-aa81-41ba-8984-eb96cf5d2802 +SUMMARY:Kevadpüha +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=1;BYMONTH=5 +CATEGORIES:Puhkepäev +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T103026Z +LAST-MODIFIED:20090224T182854Z +DTSTAMP:20090224T182854Z +UID:711f55b5-91f0-47a9-8cd3-33c18321e1e2 +SUMMARY:Uusaasta +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=1;BYMONTH=1 +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:9 +SEQUENCE:2 +DESCRIPTION:Uusaastale vahetult eelnevat tööpäeva lühendatakse kolme t + unni võrra. +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T170210Z +LAST-MODIFIED:20090224T183016Z +DTSTAMP:20090224T183016Z +UID:5728ef7c-06df-43b8-9b0c-9c674d3199de +SUMMARY:Võidupüha +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=23;BYMONTH=6 +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20090623 +DTEND;VALUE=DATE:20090624 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +DESCRIPTION:Võidupühale vahetult eelnevat tööpäeva lühendatakse kolm + e tunni võrra. +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T141634Z +LAST-MODIFIED:20090224T183040Z +DTSTAMP:20090224T183040Z +UID:84fbf893-3470-4e99-ab58-b0bc2579fc69 +SUMMARY:Jõululaupäev +ATTACH:http://www.folklore.ee/Berta/tahtpaev-joulud.php +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=24;BYMONTH=12 +CATEGORIES:Riigipüha +DTSTART;VALUE=DATE:20091224 +DTEND;VALUE=DATE:20091225 +TRANSP:TRANSPARENT +DESCRIPTION:Jõululaupäevale vahetult eelnevat tööpäeva lühendatakse + kolme tunni võrra. +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090224T171103Z +LAST-MODIFIED:20090224T171142Z +DTSTAMP:20090224T171142Z +UID:a47830aa-2932-43b5-8883-54d538ef9eda +SUMMARY:Eesti Vabariigi aastapäev +RRULE:FREQ=YEARLY;COUNT=5;BYMONTHDAY=24;BYMONTH=2 +CATEGORIES:Puhkepäev +CATEGORIES:Rahvuspüha +CATEGORIES:Lipupäev +DTSTART;VALUE=DATE:20090224 +DTEND;VALUE=DATE:20090225 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/FinlandHolidays.ics b/media/caldata/FinlandHolidays.ics new file mode 100644 index 00000000000..506852697c8 --- /dev/null +++ b/media/caldata/FinlandHolidays.ics @@ -0,0 +1,1445 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Europe/Helsinki +X-LIC-LOCATION:Europe/Helsinki +BEGIN:DAYLIGHT +TZOFFSETFROM:+0200 +TZOFFSETTO:+0300 +TZNAME:EEST +DTSTART:19700329T030000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0300 +TZOFFSETTO:+0200 +TZNAME:EET +DTSTART:19701025T040000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191704Z +UID:uuid1173902329173 +SUMMARY:Laskiaissunnuntai +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070218 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070219 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191704Z +UID:uuid1173902521400 +SUMMARY:Pitkäperjantai +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070406 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070407 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191704Z +UID:uuid1173902679858 +SUMMARY:Palmusunnuntai +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070401 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070402 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191704Z +UID:uuid1173902703892 +SUMMARY:Pääsiäispäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070408 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070409 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191704Z +UID:uuid1173902720596 +SUMMARY:2. pääsiäispäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070409 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070410 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191704Z +UID:uuid1173902797747 +SUMMARY:Helatorstai +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070517 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070518 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191704Z +UID:uuid1173902826809 +SUMMARY:Helluntaipäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070527 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070528 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191704Z +UID:uuid1173902901066 +SUMMARY:Juhannuspäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070623 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070624 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191704Z +UID:uuid1173903578279 +SUMMARY:Pyhäinpäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071103 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071104 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191704Z +UID:uuid1173904211991 +SUMMARY:Kaatuneiden muistopäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070520 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070521 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T181707Z +DTSTAMP:20080102T191704Z +UID:uuid1173903838634 +SUMMARY:Talvipäivänseisaus +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071222 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T182142Z +LAST-MODIFIED:20080102T182210Z +DTSTAMP:20080102T191704Z +UID:6a6d8ec1-cc31-4f5d-b29b-680ff180a592 +SUMMARY:Laskiaissunnuntai +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080203 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080204 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T182838Z +LAST-MODIFIED:20080102T182904Z +DTSTAMP:20080102T191704Z +UID:d8d0678f-288a-482d-b771-29357737c979 +SUMMARY:Pääsiäispäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080323 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080324 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T182915Z +LAST-MODIFIED:20080102T182937Z +DTSTAMP:20080102T191704Z +UID:479bcd2a-d3a3-4d54-8945-098d10df2f18 +SUMMARY:Pitkäperjantai +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080321 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080322 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T183032Z +LAST-MODIFIED:20080102T183115Z +DTSTAMP:20080102T191704Z +UID:c81db456-f410-458c-af6c-39d2cc812a46 +SUMMARY:2. pääsiäispäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080324 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T183148Z +LAST-MODIFIED:20080102T183207Z +DTSTAMP:20080102T191704Z +UID:473447c1-5d9e-4dd6-9f9f-4c664afcec94 +SUMMARY:Helatorstai +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080501 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T183326Z +LAST-MODIFIED:20080102T183425Z +DTSTAMP:20080102T191704Z +UID:d1f13d2f-1c7c-4a74-8ee8-62ac9efcd1aa +SUMMARY:Helluntaipäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080511 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080512 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T184134Z +DTSTAMP:20080102T191704Z +UID:uuid1173904035186 +SUMMARY:Kesäpäivän seisaus +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070621 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T184148Z +LAST-MODIFIED:20080102T184206Z +DTSTAMP:20080102T191704Z +UID:260ccb4f-3cdd-4a47-884f-201f9d7f551a +SUMMARY:Juhannuspäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080621 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T184210Z +LAST-MODIFIED:20080102T184229Z +DTSTAMP:20080102T191704Z +UID:8fd5014e-8686-40d5-abbe-322f06922624 +SUMMARY:Juhannusaatto +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080620 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080621 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T184246Z +LAST-MODIFIED:20080102T184308Z +DTSTAMP:20080102T191704Z +UID:b9214b26-1db8-4f02-9ecd-e4feabe8152b +SUMMARY:Kesäpäivänseisaus +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080621 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T184635Z +LAST-MODIFIED:20080102T184658Z +DTSTAMP:20080102T191704Z +UID:de4fd81a-c953-4484-84bc-7bf490f4153f +SUMMARY:Syyspäiväntasaus +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080922 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080923 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T185139Z +LAST-MODIFIED:20080102T185200Z +DTSTAMP:20080102T191704Z +UID:0fb158c5-3029-45cd-9ca5-2846f9d171bd +SUMMARY:Mikkelinpäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20081005 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20081006 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T185425Z +LAST-MODIFIED:20080102T185446Z +DTSTAMP:20080102T191704Z +UID:ed561567-f9ba-49cd-9546-80f08b34ed17 +SUMMARY:Mikkelinpäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071104 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071105 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T185548Z +LAST-MODIFIED:20080102T185628Z +DTSTAMP:20080102T191704Z +UID:640ec471-4970-419f-9bcb-f8a00211067b +SUMMARY:Pyhäinpäivä +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20081101 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20081102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T190903Z +LAST-MODIFIED:20080102T190924Z +DTSTAMP:20080102T191704Z +UID:4137184c-d07d-42be-a8ab-e2ea07bea95c +SUMMARY:1. adventtisunnuntai +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20081130 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20081201 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T190952Z +LAST-MODIFIED:20080102T191016Z +DTSTAMP:20080102T191704Z +UID:7bd114fe-0c02-485e-b161-9c25815f42b2 +SUMMARY:2. adventtisunnuntai +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20081207 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20081208 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T191050Z +LAST-MODIFIED:20080102T191117Z +DTSTAMP:20080102T191704Z +UID:74b1e961-6048-4fce-9088-ceaf4a0bc5ed +SUMMARY:3. adventtisunnuntai +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20081214 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20081215 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T191141Z +LAST-MODIFIED:20080102T191213Z +DTSTAMP:20080102T191704Z +UID:b725f491-bc76-40b1-8782-b4f9f42d6085 +SUMMARY:4. adventtisunnuntai +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20081221 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20081222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T055853Z +LAST-MODIFIED:20081223T055912Z +DTSTAMP:20081223T055912Z +UID:68a4aa5e-a290-498d-a820-1f30d03d2c46 +SUMMARY:Talvipäivänseisaus +DTSTART;VALUE=DATE:20081221 +DTEND;VALUE=DATE:20081222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T055853Z +LAST-MODIFIED:20081223T060348Z +DTSTAMP:20081223T060348Z +UID:23717c45-cee8-48c6-ac74-1d009a77d7be +SUMMARY:Talvipäivänseisaus +DTSTART;VALUE=DATE:20091221 +DTEND;VALUE=DATE:20091222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T055853Z +LAST-MODIFIED:20081223T060411Z +DTSTAMP:20081223T060411Z +UID:04339833-a55f-4d76-87c8-7d8afdda9c5f +SUMMARY:Talvipäivänseisaus +DTSTART;VALUE=DATE:20101222 +DTEND;VALUE=DATE:20101223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T055853Z +LAST-MODIFIED:20081223T060417Z +DTSTAMP:20081223T060417Z +UID:b0a03de9-57ba-4cc2-89f2-54b0144273a8 +SUMMARY:Talvipäivänseisaus +DTSTART;VALUE=DATE:20111222 +DTEND;VALUE=DATE:20111223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T055853Z +LAST-MODIFIED:20081223T060422Z +DTSTAMP:20081223T060422Z +UID:1f243a4e-1731-4970-b973-a84f79a23089 +SUMMARY:Talvipäivänseisaus +DTSTART;VALUE=DATE:20121221 +DTEND;VALUE=DATE:20121222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T182142Z +LAST-MODIFIED:20081223T060731Z +DTSTAMP:20081223T060731Z +UID:093c59dc-3859-493f-84d1-1fe26fe47aab +SUMMARY:Laskiaissunnuntai +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20090222 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20090223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061128Z +LAST-MODIFIED:20081223T061140Z +DTSTAMP:20081223T061140Z +UID:f7a90fca-1dcf-4bc3-b02a-f56eb2910377 +SUMMARY:Kevätpäiväntasaus +DTSTART;VALUE=DATE:20090320 +DTEND;VALUE=DATE:20090321 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061337Z +LAST-MODIFIED:20081223T061349Z +DTSTAMP:20081223T061349Z +UID:123d57f6-b87a-4485-835d-47f7c81bca3a +SUMMARY:Palmusunnuntai +DTSTART;VALUE=DATE:20090405 +DTEND;VALUE=DATE:20090406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061416Z +LAST-MODIFIED:20081223T061427Z +DTSTAMP:20081223T061427Z +UID:10e9309a-3934-4aba-9fba-4aaf6b0bc67d +SUMMARY:Pitkäperjantai +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061501Z +LAST-MODIFIED:20081223T061516Z +DTSTAMP:20081223T061516Z +UID:8d7ce620-450a-4859-bcaa-935d854e518e +SUMMARY:Pääsiäispäivä +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061559Z +LAST-MODIFIED:20081223T061617Z +DTSTAMP:20081223T061617Z +UID:dc013c35-1101-4416-8673-9182b8bf9c20 +SUMMARY:2. pääsiäispäivä +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061645Z +LAST-MODIFIED:20081223T061659Z +DTSTAMP:20081223T061659Z +UID:1f0b491b-3793-434d-8377-342dbaebb0f3 +SUMMARY:Helatorstai +DTSTART;VALUE=DATE:20090521 +DTEND;VALUE=DATE:20090522 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061758Z +LAST-MODIFIED:20081223T061815Z +DTSTAMP:20081223T061815Z +UID:fc1ee8c9-e7af-4680-9020-e651faa5e737 +SUMMARY:Helluntaipäivä +DTSTART;VALUE=DATE:20090531 +DTEND;VALUE=DATE:20090601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061843Z +LAST-MODIFIED:20081223T061900Z +DTSTAMP:20081223T061900Z +UID:f2fea8cb-4a70-482a-8a06-a57d1c302bc7 +SUMMARY:Juhannuspäivä +DTSTART;VALUE=DATE:20090620 +DTEND;VALUE=DATE:20090621 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061914Z +LAST-MODIFIED:20081223T061928Z +DTSTAMP:20081223T061928Z +UID:4fd08064-8ba1-4d55-9a33-0b0d83d3e4eb +SUMMARY:Juhannusaatto +DTSTART;VALUE=DATE:20090619 +DTEND;VALUE=DATE:20090620 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T062023Z +LAST-MODIFIED:20081223T062031Z +DTSTAMP:20081223T062031Z +UID:f6ef8660-0a66-4c4f-9abb-42d254226517 +SUMMARY:Kesäpäivänseisaus +DTSTART;VALUE=DATE:20090621 +DTEND;VALUE=DATE:20090622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T062213Z +LAST-MODIFIED:20081223T062228Z +DTSTAMP:20081223T062228Z +UID:910e4390-9ca2-4de5-b81f-72ab5e3a2862 +SUMMARY:Syyspäiväntasaus +DTSTART;VALUE=DATE:20090923 +DTEND;VALUE=DATE:20090924 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T062255Z +LAST-MODIFIED:20081223T062307Z +DTSTAMP:20081223T062307Z +UID:9889cac6-0bea-4554-a8cc-112e56cc3fed +SUMMARY:Pyhäinpäivä +DTSTART;VALUE=DATE:20091031 +DTEND;VALUE=DATE:20091101 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T062505Z +LAST-MODIFIED:20081223T062525Z +DTSTAMP:20081223T062525Z +UID:4b25fdc1-2e44-402b-a2eb-2c3b8db60487 +SUMMARY:1. adventtisunnuntai +DTSTART;VALUE=DATE:20091129 +DTEND;VALUE=DATE:20091130 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T062505Z +LAST-MODIFIED:20081223T062717Z +DTSTAMP:20081223T062717Z +UID:65367f72-be7f-4175-85f5-be7ffde97160 +SUMMARY:2. adventtisunnuntai +DTSTART;VALUE=DATE:20091206 +DTEND;VALUE=DATE:20091207 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T062505Z +LAST-MODIFIED:20081223T062742Z +DTSTAMP:20081223T062742Z +UID:ba253a68-41ae-4fd8-a1f2-459fcbd8bae6 +SUMMARY:3. adventtisunnuntai +DTSTART;VALUE=DATE:20091213 +DTEND;VALUE=DATE:20091214 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T062505Z +LAST-MODIFIED:20081223T062801Z +DTSTAMP:20081223T062801Z +UID:b5f3b99c-767c-4ce5-98d3-c1fe513101f0 +SUMMARY:4. adventtisunnuntai +DTSTART;VALUE=DATE:20091220 +DTEND;VALUE=DATE:20091221 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T063018Z +LAST-MODIFIED:20081223T063029Z +DTSTAMP:20081223T063029Z +UID:e9f868fd-2d3c-4a7c-9d04-4e14cded7214 +SUMMARY:Laskiaistiistai +DTSTART;VALUE=DATE:20090224 +DTEND;VALUE=DATE:20090225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T063537Z +LAST-MODIFIED:20081223T063551Z +DTSTAMP:20081223T063551Z +UID:24e26456-1a18-437a-b29b-94a02e45ba5d +SUMMARY:Mikkelinpäivä +DTSTART;VALUE=DATE:20091004 +DTEND;VALUE=DATE:20091005 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T210752Z +LAST-MODIFIED:20091205T211016Z +DTSTAMP:20091205T211016Z +UID:ee87e625-440f-4025-b006-b807dc1428e0 +SUMMARY:Pääsiäispäivä +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211107Z +LAST-MODIFIED:20091205T211128Z +DTSTAMP:20091205T211128Z +UID:a6103548-e601-41c1-aba9-3b00c5d47268 +SUMMARY:2. pääsiäispäivä +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211203Z +LAST-MODIFIED:20091205T211219Z +DTSTAMP:20091205T211219Z +UID:8df89a50-9709-4a3f-a057-923cc0278b17 +SUMMARY:Helatorstai +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211343Z +LAST-MODIFIED:20091205T211408Z +DTSTAMP:20091205T211408Z +UID:487748a6-a423-491f-af1a-f664b52ca3f3 +SUMMARY:Helluntaipäivä +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211556Z +LAST-MODIFIED:20091205T211621Z +DTSTAMP:20091205T211621Z +UID:fae1a689-1345-4ff7-8f36-959e734be6ea +SUMMARY:Juhannuspäivä +DTSTART;VALUE=DATE:20100626 +DTEND;VALUE=DATE:20100627 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211644Z +LAST-MODIFIED:20091205T211701Z +DTSTAMP:20091205T211701Z +UID:73c8c5a1-a2f7-445a-9b3a-0b74bd39e578 +SUMMARY:Juhannusatto +DTSTART;VALUE=DATE:20100625 +DTEND;VALUE=DATE:20100626 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211944Z +LAST-MODIFIED:20091205T212010Z +DTSTAMP:20091205T212010Z +UID:a7f5c87d-628a-4029-98fc-c8b0e15bc09b +SUMMARY:Syyspäiväntasaus +DTSTART;VALUE=DATE:20100923 +DTEND;VALUE=DATE:20100924 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T212137Z +LAST-MODIFIED:20091205T212158Z +DTSTAMP:20091205T212158Z +UID:8091b7ea-570f-4f8f-8796-aae8c63837ad +SUMMARY:Pyhäinpäivä +DTSTART;VALUE=DATE:20101106 +DTEND;VALUE=DATE:20101107 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T212525Z +LAST-MODIFIED:20091205T212550Z +DTSTAMP:20091205T212550Z +UID:c6613547-5d80-4d43-a5fb-5bf6fe7aa9ad +SUMMARY:1. adventtisunnuntai +DTSTART;VALUE=DATE:20101128 +DTEND;VALUE=DATE:20101129 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T212642Z +LAST-MODIFIED:20091205T212706Z +DTSTAMP:20091205T212706Z +UID:d123ccec-8f0c-4af3-b5d8-4f0f9c005272 +SUMMARY:2. adventtisunnuntai +DTSTART;VALUE=DATE:20101205 +DTEND;VALUE=DATE:20101206 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T212726Z +LAST-MODIFIED:20091205T212739Z +DTSTAMP:20091205T212739Z +UID:2c0fade3-abde-4def-bf06-07d647ee2c6c +SUMMARY:3. adventtisunnuntai +DTSTART;VALUE=DATE:20101212 +DTEND;VALUE=DATE:20101213 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T212757Z +LAST-MODIFIED:20091205T212840Z +DTSTAMP:20091205T212840Z +UID:4984470b-7937-4a9b-b177-ea94e159f33f +SUMMARY:4. adventtisunnuntai +DTSTART;VALUE=DATE:20101219 +DTEND;VALUE=DATE:20101220 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T210632Z +LAST-MODIFIED:20091205T213127Z +DTSTAMP:20091205T213127Z +UID:232de986-a010-4031-aa4d-57c3e7c366c9 +SUMMARY:Palmusunnuntai +DTSTART;VALUE=DATE:20100328 +DTEND;VALUE=DATE:20100329 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T210732Z +LAST-MODIFIED:20091205T213340Z +DTSTAMP:20091205T213340Z +UID:76f0ed00-fbd3-4e9f-b2d2-aeb6a3fa9e09 +SUMMARY:Pitkäperjantai +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T213715Z +LAST-MODIFIED:20091205T213737Z +DTSTAMP:20091205T213737Z +UID:3e3395ad-dd56-457e-ba78-5f80e062bd52 +SUMMARY:Kesäpäivänseisaus +DTSTART;VALUE=DATE:20100621 +DTEND;VALUE=DATE:20100622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T213820Z +LAST-MODIFIED:20091205T213837Z +DTSTAMP:20091205T213837Z +UID:167c0769-12c2-4f8a-a0a8-a7a263bf82fb +SUMMARY:Kevätpäiväntasaus +DTSTART;VALUE=DATE:20100320 +DTEND;VALUE=DATE:20100321 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T213930Z +LAST-MODIFIED:20091205T213946Z +DTSTAMP:20091205T213946Z +UID:484e386b-6fdc-4a2d-b012-909afa64ffa0 +SUMMARY:Laskiaissunnuntai +DTSTART;VALUE=DATE:20100214 +DTEND;VALUE=DATE:20100215 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T214030Z +LAST-MODIFIED:20091205T214050Z +DTSTAMP:20091205T214050Z +UID:be93f747-8a3c-4b28-a366-2292e75cebb3 +SUMMARY:Laskiaistiistai +DTSTART;VALUE=DATE:20100216 +DTEND;VALUE=DATE:20100217 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T201214Z +LAST-MODIFIED:20101214T201351Z +DTSTAMP:20101214T201351Z +UID:d76951d9-2baf-4a5c-b640-0ac97f37f4a5 +SUMMARY:Laskiaissunnuntai +DTSTART;VALUE=DATE:20110306 +DTEND;VALUE=DATE:20110307 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T201415Z +LAST-MODIFIED:20101214T201436Z +DTSTAMP:20101214T201436Z +UID:969b5b1c-fd6d-4411-b128-cd5620480a1c +SUMMARY:Laskiaistiistai +STATUS:CONFIRMED +DTSTART;VALUE=DATE:20110308 +DTEND;VALUE=DATE:20110309 +SEQUENCE:0 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T201509Z +LAST-MODIFIED:20101214T201546Z +DTSTAMP:20101214T201546Z +UID:e59aa78c-1838-4649-a009-7bb7d2fd1b74 +SUMMARY:Kevätpäiväntasaus +STATUS:CONFIRMED +DTSTART;VALUE=DATE:20110321 +DTEND;VALUE=DATE:20110322 +SEQUENCE:0 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T201615Z +LAST-MODIFIED:20101214T201626Z +DTSTAMP:20101214T201626Z +UID:b244cf43-bdc1-4e8e-b283-cb7112641acb +SUMMARY:Palmusunnuntai +DTSTART;VALUE=DATE:20110417 +DTEND;VALUE=DATE:20110418 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T201636Z +LAST-MODIFIED:20101214T201647Z +DTSTAMP:20101214T201647Z +UID:89ca5652-0a19-41cc-8430-68c34e0e1f45 +SUMMARY:Pitkäperjantai +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T201657Z +LAST-MODIFIED:20101214T201713Z +DTSTAMP:20101214T201713Z +UID:e95220f7-09ab-4f05-9645-011200aa622b +SUMMARY:Pääsiäispäivä +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T201719Z +LAST-MODIFIED:20101214T201730Z +DTSTAMP:20101214T201730Z +UID:5ea70c17-4f6d-4379-b1e4-335df00852a3 +SUMMARY:2. pääsiäispäivä +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T201823Z +LAST-MODIFIED:20101214T201834Z +DTSTAMP:20101214T201834Z +UID:87957d2e-3c7c-4095-967d-6575158165e8 +SUMMARY:Helatorstai +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T201908Z +LAST-MODIFIED:20101214T201930Z +DTSTAMP:20101214T201930Z +UID:3e547970-bbb1-40c5-9a1c-450bb4713fea +SUMMARY:Juhannusaatto +DTSTART;VALUE=DATE:20110624 +DTEND;VALUE=DATE:20110625 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T201939Z +LAST-MODIFIED:20101214T201954Z +DTSTAMP:20101214T201954Z +UID:ef4a8e2b-85f9-4a59-a28a-9d55e9a8eebf +SUMMARY:Juhannuspäivä +DTSTART;VALUE=DATE:20110625 +DTEND;VALUE=DATE:20110626 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T202006Z +LAST-MODIFIED:20101214T202017Z +DTSTAMP:20101214T202017Z +UID:16788959-de77-4051-b2cb-7631366a524e +SUMMARY:Helluntaipäivä +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T202142Z +LAST-MODIFIED:20101214T202200Z +DTSTAMP:20101214T202200Z +UID:b7e0abe7-b259-4828-b46e-1a7dd772cc15 +SUMMARY:Pyhäinpäivä +DTSTART;VALUE=DATE:20111105 +DTEND;VALUE=DATE:20111106 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T202243Z +LAST-MODIFIED:20101214T202306Z +DTSTAMP:20101214T202306Z +UID:cbe14fee-9c26-428e-a93e-b14f8b06c8fb +SUMMARY:1. adventtisunnuntai +DTSTART;VALUE=DATE:20111127 +DTEND;VALUE=DATE:20111128 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T202316Z +LAST-MODIFIED:20101214T202332Z +DTSTAMP:20101214T202332Z +UID:273d4ce7-85fb-4b86-ae9a-b7c403cfc585 +SUMMARY:2. adventtisunnuntai +DTSTART;VALUE=DATE:20111204 +DTEND;VALUE=DATE:20111205 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T202340Z +LAST-MODIFIED:20101214T202352Z +DTSTAMP:20101214T202352Z +UID:1b7b3e36-19da-4083-b673-78ee016f50d8 +SUMMARY:3. adventtisunnuntai +DTSTART;VALUE=DATE:20111211 +DTEND;VALUE=DATE:20111212 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T202355Z +LAST-MODIFIED:20101214T202407Z +DTSTAMP:20101214T202407Z +UID:011b63e0-34b7-4e70-ab7f-f9a5f2a173de +SUMMARY:4. adventtisunnuntai +DTSTART;VALUE=DATE:20111218 +DTEND;VALUE=DATE:20111219 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184829Z +LAST-MODIFIED:20111205T184901Z +DTSTAMP:20111205T184901Z +UID:10a5b6ce-f97c-472f-88ce-64b27fa25a45 +SUMMARY:Laskiaissunnuntai +DTSTART;VALUE=DATE:20120219 +DTEND;VALUE=DATE:20120220 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184904Z +LAST-MODIFIED:20111205T184917Z +DTSTAMP:20111205T184917Z +UID:66fa8777-7fe6-4b03-8da6-de42344b3283 +SUMMARY:Laskiaistiistai +DTSTART;VALUE=DATE:20120221 +DTEND;VALUE=DATE:20120222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T185006Z +LAST-MODIFIED:20111205T185021Z +DTSTAMP:20111205T185021Z +UID:4d2ca235-1a9d-495c-a7f1-d478f0bb039d +SUMMARY:Kevätpäiväntasaus +DTSTART;VALUE=DATE:20120320 +DTEND;VALUE=DATE:20120321 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T185100Z +LAST-MODIFIED:20111205T185108Z +DTSTAMP:20111205T185108Z +UID:872fe33f-6082-4bea-81cc-ffe68de5ac3f +SUMMARY:Palmusunnuntai +DTSTART;VALUE=DATE:20120401 +DTEND;VALUE=DATE:20120402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T185137Z +LAST-MODIFIED:20111205T185146Z +DTSTAMP:20111205T185146Z +UID:dca28b64-f562-494b-ad13-5a55574dbaa3 +SUMMARY:Pitkäperjantai +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T185223Z +LAST-MODIFIED:20111205T185233Z +DTSTAMP:20111205T185233Z +UID:1deedf5c-0f09-4631-8eb3-6d45f1da3a81 +SUMMARY:Pääsiäispäivä +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T185236Z +LAST-MODIFIED:20111205T185249Z +DTSTAMP:20111205T185249Z +UID:59a8cb15-2714-439e-8645-c153b56a40a2 +SUMMARY:2. pääsiäispäivä +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T185339Z +LAST-MODIFIED:20111205T185348Z +DTSTAMP:20111205T185348Z +UID:7eb1aa05-265a-46fe-bb16-c2b79e3c2d4f +SUMMARY:Helatorstai +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T185358Z +LAST-MODIFIED:20111205T185406Z +DTSTAMP:20111205T185406Z +UID:8443d1aa-4d9c-40a9-9af2-d02c3aee0b72 +SUMMARY:Helluntaipäivä +DTSTART;VALUE=DATE:20120527 +DTEND;VALUE=DATE:20120528 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T185501Z +LAST-MODIFIED:20111205T185622Z +DTSTAMP:20111205T185622Z +UID:3b0672ae-a118-4fdc-8b9e-7edea29f5a09 +SUMMARY:Kesäpäivänseisaus +DTSTART;VALUE=DATE:20120621 +DTEND;VALUE=DATE:20120622 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T201849Z +LAST-MODIFIED:20111205T185636Z +DTSTAMP:20111205T185636Z +UID:058462b0-3ea7-431b-84db-e22fcb489716 +SUMMARY:Kesäpäivänseisaus +DTSTART;VALUE=DATE:20110621 +DTEND;VALUE=DATE:20110622 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T185720Z +LAST-MODIFIED:20111205T185728Z +DTSTAMP:20111205T185728Z +UID:e5cdd29e-fb29-4e0f-a5b3-0497c4995b5a +SUMMARY:Juhannusaatto +DTSTART;VALUE=DATE:20120622 +DTEND;VALUE=DATE:20120623 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T185732Z +LAST-MODIFIED:20111205T185746Z +DTSTAMP:20111205T185746Z +UID:66e9bcd9-600c-4052-823a-27650f391183 +SUMMARY:Juhannuspäivä +DTSTART;VALUE=DATE:20120623 +DTEND;VALUE=DATE:20120624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T185838Z +LAST-MODIFIED:20111205T185947Z +DTSTAMP:20111205T185947Z +UID:30ec7d78-bc01-4d6f-92a5-39a4751320aa +SUMMARY:Syyspäiväntasaus +DTSTART;VALUE=DATE:20120922 +DTEND;VALUE=DATE:20120923 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T202030Z +LAST-MODIFIED:20111205T185958Z +DTSTAMP:20111205T185958Z +UID:83d03e60-50b0-4845-adc3-315349ff3fbb +SUMMARY:Syyspäiväntasaus +DTSTART;VALUE=DATE:20110923 +DTEND;VALUE=DATE:20110924 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20111205T190008Z +DTSTAMP:20111205T190008Z +UID:uuid1173903924447 +SUMMARY:Syyspäiväntasaus +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070923 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070924 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T190224Z +LAST-MODIFIED:20111205T190232Z +DTSTAMP:20111205T190232Z +UID:7cc31343-4ff8-4655-ab40-5725b6b5e599 +SUMMARY:Pyhäinpäivä +DTSTART;VALUE=DATE:20121103 +DTEND;VALUE=DATE:20121104 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T190404Z +LAST-MODIFIED:20111205T190427Z +DTSTAMP:20111205T190427Z +UID:5b624d96-b4f4-4800-9f0b-3c43b3d1a806 +SUMMARY:1. adventtisunnuntai +DTSTART;VALUE=DATE:20121202 +DTEND;VALUE=DATE:20121203 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T190430Z +LAST-MODIFIED:20111205T190446Z +DTSTAMP:20111205T190446Z +UID:5c1fca19-0891-40c1-958c-6929dca85414 +SUMMARY:2. adventtisunnuntai +DTSTART;VALUE=DATE:20121209 +DTEND;VALUE=DATE:20121210 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T190452Z +LAST-MODIFIED:20111205T190500Z +DTSTAMP:20111205T190500Z +UID:e6f0bcc9-f6ca-44ce-afe5-49e3294ff41e +SUMMARY:3. adventtisunnuntai +DTSTART;VALUE=DATE:20121216 +DTEND;VALUE=DATE:20121217 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T190504Z +LAST-MODIFIED:20111205T190511Z +DTSTAMP:20111205T190511Z +UID:b0267025-4fce-48ac-913e-2614c337066d +SUMMARY:4. adventtisunnuntai +DTSTART;VALUE=DATE:20121223 +DTEND;VALUE=DATE:20121224 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210029Z +LAST-MODIFIED:20121217T210049Z +DTSTAMP:20121217T210049Z +UID:5b5bc4ba-d984-4cf7-8cbc-eb8b8c514281 +SUMMARY:Laskiaistiistai +DTSTART;VALUE=DATE:20130212 +DTEND;VALUE=DATE:20130213 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210052Z +LAST-MODIFIED:20121217T210104Z +DTSTAMP:20121217T210104Z +UID:eb8a06fc-8e0b-44a5-aeec-540876db2853 +SUMMARY:Laskiaissunnuntai +DTSTART;VALUE=DATE:20130210 +DTEND;VALUE=DATE:20130211 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210441Z +LAST-MODIFIED:20121217T210502Z +DTSTAMP:20121217T210502Z +UID:0c391a2e-4da1-4f48-8de0-98581e16d5c5 +SUMMARY:Kevätpäiväntasaus +DTSTART;VALUE=DATE:20130320 +DTEND;VALUE=DATE:20130321 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210509Z +LAST-MODIFIED:20121217T210518Z +DTSTAMP:20121217T210518Z +UID:abb2cf14-8b80-40cc-985d-4e808b19e4ea +SUMMARY:Palmusunnuntai +DTSTART;VALUE=DATE:20130324 +DTEND;VALUE=DATE:20130325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210523Z +LAST-MODIFIED:20121217T210533Z +DTSTAMP:20121217T210533Z +UID:8fc3e039-a6bc-416e-8ae5-7a3a6a9e66c5 +SUMMARY:Pitkäperjantai +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210623Z +LAST-MODIFIED:20121217T210633Z +DTSTAMP:20121217T210633Z +UID:b7bf0916-35d8-428b-a19a-f6978169a293 +SUMMARY:2. pääsiäispäivä +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210708Z +LAST-MODIFIED:20121217T210716Z +DTSTAMP:20121217T210716Z +UID:03d87b3b-c2db-45c6-9e56-9fa294dd8b3b +SUMMARY:Helatorstai +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210721Z +LAST-MODIFIED:20121217T210727Z +DTSTAMP:20121217T210727Z +UID:0ed69963-e019-4677-b69f-869eb3f4e1ef +SUMMARY:Helluntaipäivä +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210750Z +LAST-MODIFIED:20121217T210808Z +DTSTAMP:20121217T210808Z +UID:f1f1970a-88b8-447e-aa4f-8682942e4882 +SUMMARY:Kesäpäivänseisaus +DTSTART;VALUE=DATE:20130621 +DTEND;VALUE=DATE:20130622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210813Z +LAST-MODIFIED:20121217T210825Z +DTSTAMP:20121217T210825Z +UID:0b5f65b3-ac2a-4b19-9e67-12c2ee0ab4b1 +SUMMARY:Juhannusaatto +DTSTART;VALUE=DATE:20130621 +DTEND;VALUE=DATE:20130622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210829Z +LAST-MODIFIED:20121217T210847Z +DTSTAMP:20121217T210847Z +UID:1ee5e5a7-8072-4e0d-9d43-e197838808b5 +SUMMARY:Juhannuspäivä +DTSTART;VALUE=DATE:20130622 +DTEND;VALUE=DATE:20130623 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210931Z +LAST-MODIFIED:20121217T210944Z +DTSTAMP:20121217T210944Z +UID:96da0dda-bb8c-4232-8de7-7bf7d96d53b5 +SUMMARY:Syyspäiväntasaus +DTSTART;VALUE=DATE:20130922 +DTEND;VALUE=DATE:20130923 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T211059Z +LAST-MODIFIED:20121217T211106Z +DTSTAMP:20121217T211106Z +UID:59c152a5-fbcf-4b5b-9201-8642af043f80 +SUMMARY:Pyhäinpäivä +DTSTART;VALUE=DATE:20131102 +DTEND;VALUE=DATE:20131103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T211137Z +LAST-MODIFIED:20121217T211154Z +DTSTAMP:20121217T211154Z +UID:b78c0912-e5df-4217-9f97-803214f44a79 +SUMMARY:1. adventtisunnuntai +DTSTART;VALUE=DATE:20131201 +DTEND;VALUE=DATE:20131202 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T211226Z +LAST-MODIFIED:20121217T211240Z +DTSTAMP:20121217T211240Z +UID:97addef8-c27a-4484-b40f-210d2efbf498 +SUMMARY:Talvipäivänseisaus +DTSTART;VALUE=DATE:20131221 +DTEND;VALUE=DATE:20131222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T211405Z +LAST-MODIFIED:20121217T211451Z +DTSTAMP:20121217T211451Z +UID:0b9a40c1-9840-416a-aec1-a4c23877ae3a +SUMMARY:Pääsiäispäivä +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T172837Z +DTSTAMP:20080102T191704Z +UID:uuid1173904352072 +SUMMARY:Uudenvuoden päivä +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070101 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070102 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T172853Z +DTSTAMP:20080102T191704Z +UID:uuid1173904370248 +SUMMARY:Loppiainen +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070106 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T173716Z +LAST-MODIFIED:20080102T173733Z +DTSTAMP:20080102T191704Z +UID:3efb2264-6af2-4a14-a884-bd782c4db846 +SUMMARY:Ystävänpäivä +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070214 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070215 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T174336Z +DTSTAMP:20080102T191704Z +UID:uuid1173904290944 +SUMMARY:Kesäaika alkaa +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070325 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070326 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T174620Z +LAST-MODIFIED:20080102T174908Z +DTSTAMP:20080102T191704Z +UID:91312106-7a42-47e7-bb08-932df2e5bb8e +SUMMARY:Vapunaatto +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070430 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070501 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T175025Z +DTSTAMP:20080102T191704Z +UID:uuid1173902771209 +SUMMARY:Vappu +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070501 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070502 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T175328Z +DTSTAMP:20080102T191704Z +UID:uuid1173904176169 +SUMMARY:Äitienpäivä +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=5 +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070513 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070514 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T180508Z +DTSTAMP:20080102T191704Z +UID:uuid1173903515119 +SUMMARY:Kesäaika päättyy +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071028 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071029 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T181136Z +DTSTAMP:20080102T191704Z +UID:uuid1173903607401 +SUMMARY:Isänpäivä +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=11 +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071111 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071112 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T181439Z +DTSTAMP:20080102T191704Z +UID:uuid1173903722337 +SUMMARY:Itsenäisyyspäivä +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071206 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071207 +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T181622Z +LAST-MODIFIED:20080102T181654Z +DTSTAMP:20080102T191704Z +UID:7e288df4-770c-4899-a220-9da337943e5a +SUMMARY:Lucian päivä +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071213 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071214 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T181745Z +LAST-MODIFIED:20080102T181820Z +DTSTAMP:20080102T191704Z +UID:9cd77dfc-1995-43f0-9bcf-7a40f87363c7 +SUMMARY:Jouluaatto +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071224 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T181900Z +LAST-MODIFIED:20080102T182004Z +DTSTAMP:20080102T191704Z +UID:c46a14c1-034a-4b37-85f0-5c4a42a31db7 +SUMMARY:Uudenvuodenaatto +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071231 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080101 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T191259Z +DTSTAMP:20080102T191704Z +UID:uuid1173903783765 +SUMMARY:Joulupäivä +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071225 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071226 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T191326Z +DTSTAMP:20080102T191704Z +UID:uuid1173903799728 +SUMMARY:Tapaninpäivä +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071226 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071227 +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210148Z +LAST-MODIFIED:20121217T210427Z +DTSTAMP:20121217T210427Z +UID:55954496-9c99-4eeb-871e-b015d0f8ce40 +SUMMARY:Naistenpäivä +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:19750308 +DTEND;VALUE=DATE:19750309 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/FinlandHolidaysSwedish.ics b/media/caldata/FinlandHolidaysSwedish.ics new file mode 100644 index 00000000000..690cb90493f --- /dev/null +++ b/media/caldata/FinlandHolidaysSwedish.ics @@ -0,0 +1,1454 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Europe/Helsinki +X-LIC-LOCATION:Europe/Helsinki +BEGIN:DAYLIGHT +TZOFFSETFROM:+0200 +TZOFFSETTO:+0300 +TZNAME:EEST +DTSTART:19700329T030000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0300 +TZOFFSETTO:+0200 +TZNAME:EET +DTSTART:19701025T040000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191643Z +UID:uuid1172902329173 +SUMMARY:Fastlagssöndagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070218 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070219 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191643Z +UID:uuid1143902521400 +SUMMARY:Långfredagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070406 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070407 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191643Z +UID:uuid1173962679858 +SUMMARY:Palmsöndagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070401 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070402 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191643Z +UID:uuid1173902713892 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070408 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070409 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191643Z +UID:uuid1173902020596 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070409 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070410 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191643Z +UID:uuid1173902926809 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070527 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070528 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191643Z +UID:uuid1173903588279 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071103 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071104 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20070314T203413Z +DTSTAMP:20080102T191643Z +UID:uuid1173900211991 +SUMMARY:De stupades dag +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070520 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070521 +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T170608Z +LAST-MODIFIED:20080102T172410Z +DTSTAMP:20080102T191643Z +UID:59595d73-3c53-4e2d-ae32-9cb733be0b5f +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070623 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T175845Z +DTSTAMP:20080102T191643Z +UID:uuid1373904035186 +SUMMARY:Sommarsolståndet +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070621 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T175926Z +DTSTAMP:20080102T191643Z +UID:uuid1173003924447 +SUMMARY:Höstdagjämningen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070923 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070924 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T181717Z +DTSTAMP:20080102T191643Z +UID:uuid1173903829634 +SUMMARY:Vintersolståndet +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071222 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T182121Z +LAST-MODIFIED:20080102T182139Z +DTSTAMP:20080102T191643Z +UID:f8117674-5729-4a09-92ce-33c3337f6251 +SUMMARY:Fastlagssöndagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080203 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080204 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T182811Z +LAST-MODIFIED:20080102T182836Z +DTSTAMP:20080102T191643Z +UID:409f001c-ad72-40ec-8ef6-03d62f2e2468 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080323 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080324 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T182943Z +LAST-MODIFIED:20080102T182958Z +DTSTAMP:20080102T191643Z +UID:1392e19f-da28-4922-8df6-69b595b5554c +SUMMARY:Långfredagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080321 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080322 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T183009Z +LAST-MODIFIED:20080102T183026Z +DTSTAMP:20080102T191643Z +UID:23cd1089-7e5c-41d7-af36-b9e9f585114b +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080324 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T183210Z +LAST-MODIFIED:20080102T183251Z +DTSTAMP:20080102T191643Z +UID:5ea96ffe-8557-43ff-be4d-933f67717d87 +SUMMARY:Kristi himmelsfärdsdag +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080501 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T183431Z +LAST-MODIFIED:20080102T183449Z +DTSTAMP:20080102T191643Z +UID:835bfae6-03d7-4adf-9bd9-6d3d999f443f +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080511 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080512 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T184320Z +LAST-MODIFIED:20080102T184339Z +DTSTAMP:20080102T191643Z +UID:f7cf1caa-8907-4112-9012-abc098a088eb +SUMMARY:Midsommarafton +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080620 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080621 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T184343Z +LAST-MODIFIED:20080102T184403Z +DTSTAMP:20080102T191643Z +UID:9c2462d4-2428-4f4f-be52-562c528453c3 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080621 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T184410Z +LAST-MODIFIED:20080102T184433Z +DTSTAMP:20080102T191643Z +UID:8542ad7b-617e-4847-9f68-08c29e117227 +SUMMARY:Sommarsolståndet +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080621 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T184557Z +LAST-MODIFIED:20080102T184633Z +DTSTAMP:20080102T191643Z +UID:98b9a78b-61f7-4188-a845-4edf111bc00c +SUMMARY:Höstdagjämningen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20080922 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080923 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T185203Z +LAST-MODIFIED:20080102T185223Z +DTSTAMP:20080102T191643Z +UID:7a7a4c37-2cbb-42f3-9734-1949ec0c4caa +SUMMARY:Mikaelidagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20081005 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20081006 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T185448Z +LAST-MODIFIED:20080102T185501Z +DTSTAMP:20080102T191643Z +UID:09f84c33-a22e-4837-97bb-0746bbe4cf49 +SUMMARY:Mikaelidagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071104 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071105 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T185635Z +LAST-MODIFIED:20080102T185655Z +DTSTAMP:20080102T191643Z +UID:e1ee0e6b-ee26-4860-9bb7-eaf2cb0e4eeb +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20081101 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20081102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T185749Z +LAST-MODIFIED:20080102T190753Z +DTSTAMP:20080102T191643Z +UID:ee85156e-eada-4574-a7f5-5180073a0e9b +SUMMARY:1:a advent +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20081130 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20081201 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T191019Z +LAST-MODIFIED:20080102T191036Z +DTSTAMP:20080102T191643Z +UID:55ca68ff-41a4-4a40-9a9a-6b35b52b9648 +SUMMARY:3:e advent +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20081214 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20081215 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T190934Z +LAST-MODIFIED:20080102T191046Z +DTSTAMP:20080102T191643Z +UID:27970a62-3081-4b41-a75d-ade6a7d09f37 +SUMMARY:2:a advent +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20081207 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20081208 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T191125Z +LAST-MODIFIED:20080102T191139Z +DTSTAMP:20080102T191643Z +UID:ea70c07a-dbf4-479d-aae0-fb380647c0f2 +SUMMARY:4:e advent +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20081221 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20081222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T055752Z +LAST-MODIFIED:20081223T055823Z +DTSTAMP:20081223T055823Z +UID:161aaa14-35a4-4de0-aace-0169c9beface +SUMMARY:Vintersolsståndet +DTSTART;VALUE=DATE:20081221 +DTEND;VALUE=DATE:20081222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T055752Z +LAST-MODIFIED:20081223T060226Z +DTSTAMP:20081223T060226Z +UID:390e95c4-7e60-4927-b706-d2dd1d55af4b +SUMMARY:Vintersolsståndet +DTSTART;VALUE=DATE:20091221 +DTEND;VALUE=DATE:20091222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T055752Z +LAST-MODIFIED:20081223T060256Z +DTSTAMP:20081223T060256Z +UID:880302c7-8df6-47d7-8284-c295f593df3c +SUMMARY:Vintersolsståndet +DTSTART;VALUE=DATE:20101222 +DTEND;VALUE=DATE:20101223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T055752Z +LAST-MODIFIED:20081223T060310Z +DTSTAMP:20081223T060310Z +UID:95dccbac-632b-47e2-9363-c3b8a2188328 +SUMMARY:Vintersolsståndet +DTSTART;VALUE=DATE:20111222 +DTEND;VALUE=DATE:20111223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T055752Z +LAST-MODIFIED:20081223T060323Z +DTSTAMP:20081223T060323Z +UID:fb061b27-b1e0-4bdb-bfe5-9a1951ffb62e +SUMMARY:Vintersolsståndet +DTSTART;VALUE=DATE:20121221 +DTEND;VALUE=DATE:20121222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T182121Z +LAST-MODIFIED:20081223T060744Z +DTSTAMP:20081223T060744Z +UID:98cb2df6-a37a-4bfe-878f-6eb31b90df41 +SUMMARY:Fastlagssöndagen +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20090222 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20090223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061058Z +LAST-MODIFIED:20081223T061123Z +DTSTAMP:20081223T061123Z +UID:95ccbc42-86cb-41c1-850a-e42ea54c24af +SUMMARY:Vårdagjämningen +DTSTART;VALUE=DATE:20090320 +DTEND;VALUE=DATE:20090321 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061310Z +LAST-MODIFIED:20081223T061331Z +DTSTAMP:20081223T061331Z +UID:5fcd56cd-0b48-4864-a542-31f224e0337e +SUMMARY:Palmsöndagen +DTSTART;VALUE=DATE:20090405 +DTEND;VALUE=DATE:20090406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061431Z +LAST-MODIFIED:20081223T061439Z +DTSTAMP:20081223T061439Z +UID:caba4c1a-8798-4b9d-a94d-829ed81b2acb +SUMMARY:Långfredagen +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061443Z +LAST-MODIFIED:20081223T061455Z +DTSTAMP:20081223T061455Z +UID:3fcabf7b-5c6e-4298-8d6b-2db2cdb3bde9 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061549Z +LAST-MODIFIED:20081223T061556Z +DTSTAMP:20081223T061556Z +UID:5c6ad27f-7dae-4989-878b-4b3d49b738a5 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061702Z +LAST-MODIFIED:20081223T063247Z +DTSTAMP:20081223T063247Z +UID:03c74771-f5b1-4efe-81a2-8209dae9abc0 +SUMMARY:Kristi himmelsfärdsdag +DTSTART;VALUE=DATE:20090521 +DTEND;VALUE=DATE:20090522 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061817Z +LAST-MODIFIED:20081223T061825Z +DTSTAMP:20081223T061825Z +UID:f89fc8f2-f66e-4794-bfa7-09ac90b287f6 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20090531 +DTEND;VALUE=DATE:20090601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061902Z +LAST-MODIFIED:20081223T061911Z +DTSTAMP:20081223T061911Z +UID:cdaf05e1-2332-4a1f-a70f-cdf061911288 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20090620 +DTEND;VALUE=DATE:20090621 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T061956Z +LAST-MODIFIED:20081223T062006Z +DTSTAMP:20081223T062006Z +UID:2b8cdd68-7e09-4c33-bc35-61be8ba4ce20 +SUMMARY:Midsommarafton +DTSTART;VALUE=DATE:20090619 +DTEND;VALUE=DATE:20090620 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T062033Z +LAST-MODIFIED:20081223T062049Z +DTSTAMP:20081223T062049Z +UID:0f90cf70-15ec-4464-a6a9-cf88897b6585 +SUMMARY:Sommarsolståndet +DTSTART;VALUE=DATE:20090621 +DTEND;VALUE=DATE:20090622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T062200Z +LAST-MODIFIED:20081223T062210Z +DTSTAMP:20081223T062210Z +UID:d621253c-75ed-46ac-9046-068c03d4a0cf +SUMMARY:Höstdagjämningen +DTSTART;VALUE=DATE:20090923 +DTEND;VALUE=DATE:20090924 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T062309Z +LAST-MODIFIED:20081223T062320Z +DTSTAMP:20081223T062320Z +UID:e474e4fd-10d6-4637-89e9-fe1b6df7f7b9 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20091031 +DTEND;VALUE=DATE:20091101 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T190934Z +LAST-MODIFIED:20081223T062610Z +DTSTAMP:20081223T062610Z +UID:31f56e10-35ce-4334-b9fa-ab05ff3dce30 +SUMMARY:2:a advent +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20091206 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20091207 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T190934Z +LAST-MODIFIED:20081223T062622Z +DTSTAMP:20081223T062622Z +UID:b1110181-e312-43bd-b431-f94516d4b0db +SUMMARY:3:e advent +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20091213 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20091214 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T190934Z +LAST-MODIFIED:20081223T062633Z +DTSTAMP:20081223T062633Z +UID:7519f448-91db-4068-ad27-0ce52adcbdd8 +SUMMARY:4:e advent +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20091220 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20091221 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T190934Z +LAST-MODIFIED:20081223T062656Z +DTSTAMP:20081223T062656Z +UID:158ee46b-0f81-46d1-a1f8-c25c20d3fbe0 +SUMMARY:1:a advent +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20091129 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20091130 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T062959Z +LAST-MODIFIED:20081223T063016Z +DTSTAMP:20081223T063016Z +UID:c6e4e912-6af8-41d7-880e-31c3269dec6e +SUMMARY:Fastlagstisdagen +DTSTART;VALUE=DATE:20090224 +DTEND;VALUE=DATE:20090225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T063554Z +LAST-MODIFIED:20081223T063608Z +DTSTAMP:20081223T063608Z +UID:e0aa117b-1dd8-4831-b576-abd64febd0e0 +SUMMARY:Mikaelidagen +DTSTART;VALUE=DATE:20091004 +DTEND;VALUE=DATE:20091005 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211021Z +LAST-MODIFIED:20091205T211045Z +DTSTAMP:20091205T211045Z +UID:31a694dd-9a83-4285-87cc-a83e06a19881 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211048Z +LAST-MODIFIED:20091205T211105Z +DTSTAMP:20091205T211105Z +UID:c4df102f-1fed-4c9d-a893-1bfbd170ca17 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211251Z +LAST-MODIFIED:20091205T211315Z +DTSTAMP:20091205T211315Z +UID:4130920a-c17f-460d-ab40-91c23f6d5893 +SUMMARY:Kristi himmelsfärdsdag +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211324Z +LAST-MODIFIED:20091205T211340Z +DTSTAMP:20091205T211340Z +UID:b3382c4e-4458-48e4-83b9-89ff3dba0114 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211523Z +LAST-MODIFIED:20091205T211554Z +DTSTAMP:20091205T211554Z +UID:025e3044-c884-4b22-8a20-c8b9fcbbdcf8 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20100626 +DTEND;VALUE=DATE:20100627 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211626Z +LAST-MODIFIED:20091205T211641Z +DTSTAMP:20091205T211641Z +UID:7fe099f7-00ba-4f51-b30b-b932a2ef5969 +SUMMARY:Midsommarafton +DTSTART;VALUE=DATE:20100625 +DTEND;VALUE=DATE:20100626 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T211857Z +LAST-MODIFIED:20091205T211925Z +DTSTAMP:20091205T211925Z +UID:f2b14bd8-278a-4241-90db-c999ba70d615 +SUMMARY:Höstdagjämning +DTSTART;VALUE=DATE:20100923 +DTEND;VALUE=DATE:20100924 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T212248Z +LAST-MODIFIED:20091205T212307Z +DTSTAMP:20091205T212307Z +UID:932863e3-825c-4249-9c0c-e05f2e0eda9b +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20101106 +DTEND;VALUE=DATE:20101107 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T212626Z +LAST-MODIFIED:20091205T212639Z +DTSTAMP:20091205T212639Z +UID:102dc7e7-f88a-40f6-80e6-cf8e4ee9ddd7 +SUMMARY:1:a advent +DTSTART;VALUE=DATE:20101128 +DTEND;VALUE=DATE:20101129 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T212709Z +LAST-MODIFIED:20091205T212721Z +DTSTAMP:20091205T212721Z +UID:ddb2648b-6e19-4443-99a3-1370b48c6614 +SUMMARY:2:a advent +DTSTART;VALUE=DATE:20101205 +DTEND;VALUE=DATE:20101206 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T212743Z +LAST-MODIFIED:20091205T212754Z +DTSTAMP:20091205T212754Z +UID:2fd40694-76e6-48d2-8d9f-8d47b6177454 +SUMMARY:3:e advent +DTSTART;VALUE=DATE:20101212 +DTEND;VALUE=DATE:20101213 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T212844Z +LAST-MODIFIED:20091205T212859Z +DTSTAMP:20091205T212859Z +UID:81c2cbc4-a6b4-4d1c-a337-3e8a1ccb8dad +SUMMARY:4:e advent +DTSTART;VALUE=DATE:20101219 +DTEND;VALUE=DATE:20101220 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T210555Z +LAST-MODIFIED:20091205T213114Z +DTSTAMP:20091205T213114Z +UID:196fe4d6-f90c-4095-af83-3a1d68fa1c2c +SUMMARY:Palmsöndagen +DTSTART;VALUE=DATE:20100328 +DTEND;VALUE=DATE:20100329 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T210659Z +LAST-MODIFIED:20091205T213356Z +DTSTAMP:20091205T213356Z +UID:7f2e8faf-4ba3-463e-bc2b-cc220630d991 +SUMMARY:Långfredagen +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T213739Z +LAST-MODIFIED:20091205T213751Z +DTSTAMP:20091205T213751Z +UID:e437655f-98ad-442e-8ab8-45b83628879d +SUMMARY:Sommarsolståndet +DTSTART;VALUE=DATE:20100621 +DTEND;VALUE=DATE:20100622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T213839Z +LAST-MODIFIED:20091205T213903Z +DTSTAMP:20091205T213903Z +UID:361f965e-17a9-4b56-923c-1010a887100b +SUMMARY:Vårdagjämning +DTSTART;VALUE=DATE:20100320 +DTEND;VALUE=DATE:20100321 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T213948Z +LAST-MODIFIED:20091205T214003Z +DTSTAMP:20091205T214003Z +UID:a7e74536-219d-4919-8a4e-c937baf1e502 +SUMMARY:Fastlagssöndag +DTSTART;VALUE=DATE:20100214 +DTEND;VALUE=DATE:20100215 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T214007Z +LAST-MODIFIED:20091207T194429Z +DTSTAMP:20091207T194429Z +UID:f634345a-573a-4119-b3bd-caa514bc8b63 +SUMMARY:Fastlagstisdagen +DTSTART;VALUE=DATE:20100216 +DTEND;VALUE=DATE:20100217 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T195205Z +LAST-MODIFIED:20101214T195407Z +DTSTAMP:20101214T195407Z +UID:99528130-8d21-49dd-ab71-8645543295d0 +SUMMARY:Fastlagssöndagen +DTSTART;VALUE=DATE:20110306 +DTEND;VALUE=DATE:20110307 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T195248Z +LAST-MODIFIED:20101214T195421Z +DTSTAMP:20101214T195421Z +UID:c0651248-6b6e-4d47-bc70-134ac6dcd662 +SUMMARY:Fastlagstisdagen +DTSTART;VALUE=DATE:20110308 +DTEND;VALUE=DATE:20110309 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T195453Z +LAST-MODIFIED:20101214T195501Z +DTSTAMP:20101214T195501Z +UID:b610f6d7-37fd-4957-81b5-b74203bebaf1 +SUMMARY:Palmsöndagen +DTSTART;VALUE=DATE:20110417 +DTEND;VALUE=DATE:20110418 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T195509Z +LAST-MODIFIED:20101214T195519Z +DTSTAMP:20101214T195519Z +UID:0af699b8-dba3-49fc-a50e-55ad8b0bd3cc +SUMMARY:Långfredagen +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T195524Z +LAST-MODIFIED:20101214T195532Z +DTSTAMP:20101214T195532Z +UID:14cdaaa6-f4e5-4d63-84a2-25e34a510668 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T195542Z +LAST-MODIFIED:20101214T195552Z +DTSTAMP:20101214T195552Z +UID:2d2be2f4-266a-4724-874f-f22335e2fe33 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T195629Z +LAST-MODIFIED:20101214T195650Z +DTSTAMP:20101214T195650Z +UID:a82571c6-ea59-437e-b303-ffa16bb601ff +SUMMARY:Kristi himmelsfärdsdag +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T195654Z +LAST-MODIFIED:20101214T195710Z +DTSTAMP:20101214T195710Z +UID:4fc5a40d-05d0-4ab1-a389-91df504a1461 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T195732Z +LAST-MODIFIED:20101214T195739Z +DTSTAMP:20101214T195739Z +UID:efd5ff81-6a9c-46c9-8c61-a3be24807ee6 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20110625 +DTEND;VALUE=DATE:20110626 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T195742Z +LAST-MODIFIED:20101214T195750Z +DTSTAMP:20101214T195750Z +UID:4b56d2be-634e-45e9-8c3a-969d2b27532e +SUMMARY:Midsommarafton +DTSTART;VALUE=DATE:20110624 +DTEND;VALUE=DATE:20110625 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T195907Z +LAST-MODIFIED:20101214T195927Z +DTSTAMP:20101214T195927Z +UID:d1db579d-a955-4420-a69e-af4f8a2a3ed6 +SUMMARY:Vårdagjämningen +DTSTART;VALUE=DATE:20110321 +DTEND;VALUE=DATE:20110322 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T195834Z +LAST-MODIFIED:20101214T200019Z +DTSTAMP:20101214T200019Z +UID:173208da-067a-482b-b3d8-c924cd6f1ca0 +SUMMARY:Höstdagjämningen +DTSTART;VALUE=DATE:20110923 +DTEND;VALUE=DATE:20110924 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T200137Z +LAST-MODIFIED:20101214T200150Z +DTSTAMP:20101214T200150Z +UID:912edf01-6e7e-4125-b899-0a6aaa8316c4 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20111105 +DTEND;VALUE=DATE:20111106 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T200216Z +LAST-MODIFIED:20101214T200226Z +DTSTAMP:20101214T200226Z +UID:6fc10728-0d0b-4390-962b-2a8570554bed +SUMMARY:1:a advent +DTSTART;VALUE=DATE:20111127 +DTEND;VALUE=DATE:20111128 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T200230Z +LAST-MODIFIED:20101214T200240Z +DTSTAMP:20101214T200240Z +UID:48f65395-1861-4ac9-8636-92e8ea5f79e9 +SUMMARY:2:a advent +DTSTART;VALUE=DATE:20111204 +DTEND;VALUE=DATE:20111205 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T200245Z +LAST-MODIFIED:20101214T200259Z +DTSTAMP:20101214T200259Z +UID:799a8364-e73c-47e1-b740-97c24091bf9e +SUMMARY:3:e advent +DTSTART;VALUE=DATE:20111211 +DTEND;VALUE=DATE:20111212 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T200302Z +LAST-MODIFIED:20101214T200314Z +DTSTAMP:20101214T200314Z +UID:1fcbdc60-5496-4d06-b622-5be75958d499 +SUMMARY:4:e advent +DTSTART;VALUE=DATE:20111218 +DTEND;VALUE=DATE:20111219 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T200457Z +LAST-MODIFIED:20101214T200513Z +DTSTAMP:20101214T200513Z +UID:c909b441-7d06-43b3-8c67-84a3140e2c5d +SUMMARY:Sommarsolståndet +DTSTART;VALUE=DATE:20110621 +DTEND;VALUE=DATE:20110622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20101214T200850Z +DTSTAMP:20101214T200850Z +UID:uuid1173902897747 +SUMMARY:Kristi himmelsfärdsdag +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070517 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070518 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T183936Z +LAST-MODIFIED:20111205T184009Z +DTSTAMP:20111205T184009Z +UID:1c503ace-177f-4e58-9449-50edc6ccf034 +SUMMARY:Fastlagssöndagen +DTSTART;VALUE=DATE:20120219 +DTEND;VALUE=DATE:20120220 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184013Z +LAST-MODIFIED:20111205T184022Z +DTSTAMP:20111205T184022Z +UID:9f7a2603-9fd0-4d85-ac4a-77c8ae4cd62f +SUMMARY:Fastlagstisdagen +DTSTART;VALUE=DATE:20120221 +DTEND;VALUE=DATE:20120222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184037Z +LAST-MODIFIED:20111205T184111Z +DTSTAMP:20111205T184111Z +UID:a85ae391-639f-4809-98b5-2d73d8dc1e2b +SUMMARY:Vårdagjämningen +DTSTART;VALUE=DATE:20120320 +DTEND;VALUE=DATE:20120321 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184121Z +LAST-MODIFIED:20111205T184131Z +DTSTAMP:20111205T184131Z +UID:b7911c30-c8da-4b4a-b7f6-6a2c69e26728 +SUMMARY:Långfredagen +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184134Z +LAST-MODIFIED:20111205T184142Z +DTSTAMP:20111205T184142Z +UID:022cbd6b-f5ce-4e48-8177-3ec3b88d5d47 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184147Z +LAST-MODIFIED:20111205T184156Z +DTSTAMP:20111205T184156Z +UID:1bb11f89-c092-446d-9f10-bab319a2fd73 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184233Z +LAST-MODIFIED:20111205T184259Z +DTSTAMP:20111205T184259Z +UID:a19bc173-aa98-4587-8f22-acad4673764d +SUMMARY:Kristi himmelsfärdsdag +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184305Z +LAST-MODIFIED:20111205T184321Z +DTSTAMP:20111205T184321Z +UID:a1b92164-f556-43b5-b270-19c7cb68e345 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20120527 +DTEND;VALUE=DATE:20120528 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184347Z +LAST-MODIFIED:20111205T184358Z +DTSTAMP:20111205T184358Z +UID:16a6720c-4ca0-45f9-944f-7312f61934b8 +SUMMARY:Sommarsolståndet +DTSTART;VALUE=DATE:20120621 +DTEND;VALUE=DATE:20120622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184403Z +LAST-MODIFIED:20111205T184409Z +DTSTAMP:20111205T184409Z +UID:08c7fe29-0205-4675-966a-38af2dcfca50 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20120623 +DTEND;VALUE=DATE:20120624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184412Z +LAST-MODIFIED:20111205T184419Z +DTSTAMP:20111205T184419Z +UID:0086afbf-f8f4-4094-98c0-e2eecaa9eaff +SUMMARY:Midsommarafton +DTSTART;VALUE=DATE:20120622 +DTEND;VALUE=DATE:20120623 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184504Z +LAST-MODIFIED:20111205T184517Z +DTSTAMP:20111205T184517Z +UID:8d426c9e-fd3b-45a9-a93c-ceee00a24dce +SUMMARY:Höstdagjämningen +DTSTART;VALUE=DATE:20120922 +DTEND;VALUE=DATE:20120923 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T184622Z +LAST-MODIFIED:20111205T184631Z +DTSTAMP:20111205T184631Z +UID:ae5a3d1e-9e4a-4043-b1ed-3d95c26aff1f +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20121103 +DTEND;VALUE=DATE:20121104 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T185112Z +LAST-MODIFIED:20111205T185123Z +DTSTAMP:20111205T185123Z +UID:15f28fa1-b94b-4de3-a2d6-e39edab66061 +SUMMARY:Palmsöndagen +DTSTART;VALUE=DATE:20120401 +DTEND;VALUE=DATE:20120402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T190307Z +LAST-MODIFIED:20111205T190318Z +DTSTAMP:20111205T190318Z +UID:20a1d33e-f513-461a-af89-5c22006e775b +SUMMARY:1:a advent +DTSTART;VALUE=DATE:20121202 +DTEND;VALUE=DATE:20121203 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T190322Z +LAST-MODIFIED:20111205T190331Z +DTSTAMP:20111205T190331Z +UID:c539b227-58db-49f6-9374-f7dd6ca34406 +SUMMARY:2:a advent +DTSTART;VALUE=DATE:20121209 +DTEND;VALUE=DATE:20121210 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T190333Z +LAST-MODIFIED:20111205T190347Z +DTSTAMP:20111205T190347Z +UID:40f5c585-a0ee-4f74-9207-7307b8cc07f2 +SUMMARY:3:e advent +DTSTART;VALUE=DATE:20121216 +DTEND;VALUE=DATE:20121217 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111205T190349Z +LAST-MODIFIED:20111205T190358Z +DTSTAMP:20111205T190358Z +UID:c5b04f65-2a07-47ca-beda-6ec2cd7a3182 +SUMMARY:4:e advent +DTSTART;VALUE=DATE:20121223 +DTEND;VALUE=DATE:20121224 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T204135Z +LAST-MODIFIED:20121217T204213Z +DTSTAMP:20121217T204213Z +UID:86783fe9-9ab0-4076-9c77-73143ea84041 +SUMMARY:Fastlagssöndagen +DTSTART;VALUE=DATE:20130210 +DTEND;VALUE=DATE:20130211 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T204217Z +LAST-MODIFIED:20121217T204232Z +DTSTAMP:20121217T204232Z +UID:5bb2d27a-b29f-4a36-b303-a283a9db8e0c +SUMMARY:Fastlagstisdagen +DTSTART;VALUE=DATE:20130212 +DTEND;VALUE=DATE:20130213 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T204300Z +LAST-MODIFIED:20121217T204312Z +DTSTAMP:20121217T204312Z +UID:da3f0b9d-0cb6-49c9-a6d3-f532dd589072 +SUMMARY:Vårdagjämningen +DTSTART;VALUE=DATE:20130320 +DTEND;VALUE=DATE:20130321 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T204316Z +LAST-MODIFIED:20121217T204343Z +DTSTAMP:20121217T204343Z +UID:a270c7ca-881e-4d3c-9f15-610f9fc41293 +SUMMARY:Palmsöndagen +DTSTART;VALUE=DATE:20130324 +DTEND;VALUE=DATE:20130325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T204352Z +LAST-MODIFIED:20121217T204400Z +DTSTAMP:20121217T204400Z +UID:6c009093-4a80-445e-b75d-1544400d3ba9 +SUMMARY:Långfredagen +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T204408Z +LAST-MODIFIED:20121217T204422Z +DTSTAMP:20121217T204422Z +UID:c7bc0ea4-9ad7-4061-b2c8-41dab1ae4c7d +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T204539Z +LAST-MODIFIED:20121217T204552Z +DTSTAMP:20121217T204552Z +UID:a84bc8a4-0bbe-49df-82da-ecfa51e6e208 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T204601Z +LAST-MODIFIED:20121217T204618Z +DTSTAMP:20121217T204618Z +UID:c7346026-dc9d-4b08-9d8b-a11b6b2025f8 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T204656Z +LAST-MODIFIED:20121217T204705Z +DTSTAMP:20121217T204705Z +UID:48638db8-6bad-4060-afc0-a840d34e87cb +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20130622 +DTEND;VALUE=DATE:20130623 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T204711Z +LAST-MODIFIED:20121217T204725Z +DTSTAMP:20121217T204725Z +UID:43e4baa8-5c8a-4093-b2c2-4d3bd56333d3 +SUMMARY:Sommarsolståndet +DTSTART;VALUE=DATE:20130621 +DTEND;VALUE=DATE:20130622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T204729Z +LAST-MODIFIED:20121217T204735Z +DTSTAMP:20121217T204735Z +UID:0aedf80c-4224-4049-8e07-5d6f50506215 +SUMMARY:Midsommarafton +DTSTART;VALUE=DATE:20130621 +DTEND;VALUE=DATE:20130622 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T205304Z +LAST-MODIFIED:20121217T205406Z +DTSTAMP:20121217T205406Z +UID:04cf7b2c-5d74-409d-a87b-eee74c98b475 +SUMMARY:Höstdagjämningen +DTSTART;VALUE=DATE:20130922 +DTEND;VALUE=DATE:20130923 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T205507Z +LAST-MODIFIED:20121217T205519Z +DTSTAMP:20121217T205519Z +UID:c9c7e16a-1ce3-4b1b-9308-a2b044d20468 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20131102 +DTEND;VALUE=DATE:20131103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T205639Z +LAST-MODIFIED:20121217T205647Z +DTSTAMP:20121217T205647Z +UID:81d57216-ade1-4702-b031-cd6889835e47 +SUMMARY:1:a advent +DTSTART;VALUE=DATE:20131201 +DTEND;VALUE=DATE:20131202 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T211249Z +LAST-MODIFIED:20121217T211259Z +DTSTAMP:20121217T211259Z +UID:98a3d32b-a666-4a43-b8af-a718a787b371 +SUMMARY:Vintersolståndet +DTSTART;VALUE=DATE:20131221 +DTEND;VALUE=DATE:20131222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T204500Z +LAST-MODIFIED:20121217T211515Z +DTSTAMP:20121217T211515Z +UID:3dd5c6eb-7bc8-4768-b442-c8f70bee9481 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T172536Z +DTSTAMP:20080102T191643Z +UID:uuid1173903796828 +SUMMARY:Annandag jul +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071226 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071227 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T172821Z +DTSTAMP:20080102T191643Z +UID:uuid1173904351072 +SUMMARY:Nyårsdagen +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070101 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070102 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T172909Z +DTSTAMP:20080102T191643Z +UID:uuid1173914370248 +SUMMARY:Trettondagen +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070106 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T173358Z +LAST-MODIFIED:20080102T173546Z +DTSTAMP:20080102T191643Z +UID:637f8b00-19a0-43d6-b90c-c99187b24496 +SUMMARY:Alla hjärtans dag +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070214 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070215 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T174448Z +DTSTAMP:20080102T191643Z +UID:uuid1173904291944 +SUMMARY:Sommartiden börjar +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070325 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070326 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T174921Z +LAST-MODIFIED:20080102T174948Z +DTSTAMP:20080102T191643Z +UID:a59a1bfd-082b-4715-aaf9-429a7b078c46 +SUMMARY:Valborgsmässoafton +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070430 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070501 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T175008Z +DTSTAMP:20080102T191643Z +UID:uuid1173902772209 +SUMMARY:Första maj +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070501 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070502 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20081223T063219Z +DTSTAMP:20081223T063219Z +UID:uuid1173004176169 +SUMMARY:Mors dag +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=5 +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20070513 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20070514 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T180600Z +DTSTAMP:20080102T191643Z +UID:uuid1173903615119 +SUMMARY:Sommartiden slutar +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071028 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071029 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20081223T063707Z +DTSTAMP:20081223T063707Z +UID:uuid1173903608901 +SUMMARY:Fars dag +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=11 +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071111 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071112 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T181451Z +DTSTAMP:20080102T191643Z +UID:uuid1173903723337 +SUMMARY:Självständighetsdagen +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071206 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071207 +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T181508Z +LAST-MODIFIED:20080102T181528Z +DTSTAMP:20080102T191643Z +UID:694047ee-5333-4576-9661-fffe8b635a07 +SUMMARY:Lucia +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071213 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071214 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T181723Z +LAST-MODIFIED:20080102T181739Z +DTSTAMP:20080102T191643Z +UID:4afc4495-82bf-46de-ac2b-48e759dfd8ad +SUMMARY:Julafton +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071224 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080102T181837Z +LAST-MODIFIED:20080102T181853Z +DTSTAMP:20080102T191643Z +UID:c5f4e801-27ec-4ccc-b2be-89587118a2dc +SUMMARY:Nyårsafton +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071231 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20080101 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070314T203413Z +LAST-MODIFIED:20080102T191310Z +DTSTAMP:20080102T191643Z +UID:uuid1173903183765 +SUMMARY:Juldagen +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Europe/Helsinki:20071225 +DTEND;VALUE=DATE;TZID=Europe/Helsinki:20071226 +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T062337Z +LAST-MODIFIED:20081223T062355Z +DTSTAMP:20081223T062355Z +UID:222356e7-e1af-45cb-bb75-dd8280f6c942 +SUMMARY:Svenska dagen +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20091106 +DTEND;VALUE=DATE:20091107 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121217T210205Z +LAST-MODIFIED:20121217T210410Z +DTSTAMP:20121217T210410Z +UID:5ef37a2e-6d7f-4ed4-ab1a-793b7d2f83a5 +SUMMARY:Kvinnodagen +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:19750308 +DTEND;VALUE=DATE:19750309 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/FlandersHolidays.ics b/media/caldata/FlandersHolidays.ics new file mode 100644 index 00000000000..ebf5aa5a20f --- /dev/null +++ b/media/caldata/FlandersHolidays.ics @@ -0,0 +1,1337 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Europe/Brussels +X-LIC-LOCATION:Europe/Brussels +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20110602T061240Z +LAST-MODIFIED:20110602T061252Z +DTSTAMP:20110602T061252Z +UID:3305d48e-5988-4233-afc1-b2cc68905aa4 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20110603 +DTEND;VALUE=DATE:20110604 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062432Z +LAST-MODIFIED:20110602T062450Z +DTSTAMP:20110602T062450Z +UID:5178db50-92ac-48b3-aad7-494a6da87afa +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20120518 +DTEND;VALUE=DATE:20120519 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062534Z +LAST-MODIFIED:20110602T062548Z +DTSTAMP:20110602T062548Z +UID:c55bae88-d738-462d-8bca-543e1931a798 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20130510 +DTEND;VALUE=DATE:20130511 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T062615Z +LAST-MODIFIED:20110602T062625Z +DTSTAMP:20110602T062625Z +UID:b84f4c42-12e5-4956-b309-08fb9f8ebbf0 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20140530 +DTEND;VALUE=DATE:20140531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063151Z +LAST-MODIFIED:20110602T063214Z +DTSTAMP:20110602T063214Z +UID:35d0773c-6c15-42de-9d89-c6ff44324a5f +SUMMARY:Lang Weekend +DTSTART;VALUE=DATE:20120526 +DTEND;VALUE=DATE:20120529 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063306Z +LAST-MODIFIED:20110602T063321Z +DTSTAMP:20110602T063321Z +UID:34641fe9-6072-42e7-8064-49983c8ec7f0 +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20130518 +DTEND;VALUE=DATE:20130521 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063358Z +LAST-MODIFIED:20110602T063412Z +DTSTAMP:20110602T063412Z +UID:298c8b69-9bc2-41e4-a600-1d4a4f7186af +SUMMARY:Lang Weekend +DTSTART;VALUE=DATE:20140607 +DTEND;VALUE=DATE:20140610 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063449Z +LAST-MODIFIED:20110602T063458Z +DTSTAMP:20110602T063458Z +UID:2040f8a0-8d51-48b9-940c-fa405b8ef2ff +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20121231 +DTEND;VALUE=DATE:20130101 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063602Z +LAST-MODIFIED:20110602T063613Z +DTSTAMP:20110602T063613Z +UID:abcc51ac-bba3-4524-b049-3de060c39199 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20121102 +DTEND;VALUE=DATE:20121103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063739Z +LAST-MODIFIED:20110602T063750Z +DTSTAMP:20110602T063750Z +UID:35466d7c-efad-4772-a84c-a6322ac52fa4 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20141226 +DTEND;VALUE=DATE:20141227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063822Z +LAST-MODIFIED:20110602T063859Z +DTSTAMP:20110602T063859Z +UID:74c7e6e4-a8f5-45e6-a541-85d7d302785c +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20150102 +DTEND;VALUE=DATE:20150103 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T064946Z +LAST-MODIFIED:20110602T064955Z +DTSTAMP:20110602T064955Z +UID:26415861-244b-4dc2-993e-fb80d16b1f71 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20181231 +DTEND;VALUE=DATE:20190101 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065129Z +LAST-MODIFIED:20110602T065139Z +DTSTAMP:20110602T065139Z +UID:7b17071c-c7d4-4862-91a1-2c8eadc66db3 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20150515 +DTEND;VALUE=DATE:20150516 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065327Z +LAST-MODIFIED:20110602T065348Z +DTSTAMP:20110602T065348Z +UID:5ec1f83e-59cc-43d8-92df-e71832d4679c +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20150523 +DTEND;VALUE=DATE:20150526 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065516Z +LAST-MODIFIED:20110602T065531Z +DTSTAMP:20110602T065531Z +UID:1d2037ff-34d9-4c1d-8b52-271d1bf0c85b +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20160506 +DTEND;VALUE=DATE:20160507 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065625Z +LAST-MODIFIED:20110602T065642Z +DTSTAMP:20110602T065642Z +UID:cbdde3f3-5a78-4c70-98a1-69aa75e57e60 +SUMMARY:Lang Weekend +DTSTART;VALUE=DATE:20160514 +DTEND;VALUE=DATE:20160517 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065828Z +LAST-MODIFIED:20110602T065837Z +DTSTAMP:20110602T065837Z +UID:67ca9cf8-5bab-4e86-b45e-8996ad823435 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20170526 +DTEND;VALUE=DATE:20170527 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065856Z +LAST-MODIFIED:20110602T065913Z +DTSTAMP:20110602T065913Z +UID:1db9ae9c-de94-45c1-b75b-d8f07d02410f +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20170603 +DTEND;VALUE=DATE:20170606 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063536Z +LAST-MODIFIED:20110602T071627Z +DTSTAMP:20110602T071627Z +UID:c2b2e8f8-f2b4-4896-8f8a-f5d1f7b30179 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20111031 +DTEND;VALUE=DATE:20111101 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T072942Z +LAST-MODIFIED:20110602T072951Z +DTSTAMP:20110602T072951Z +UID:f0e1e0c8-86c1-493c-bbcd-9f7094253005 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20180430 +DTEND;VALUE=DATE:20180501 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T072955Z +LAST-MODIFIED:20110602T073011Z +DTSTAMP:20110602T073011Z +UID:6c6973d6-ce98-40df-8b90-edbbb2b1375b +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20180428 +DTEND;VALUE=DATE:20180502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074533Z +LAST-MODIFIED:20110602T074541Z +DTSTAMP:20110602T074541Z +UID:9f638a32-c03e-4d98-a374-667caa45328d +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20220527 +DTEND;VALUE=DATE:20220528 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074640Z +LAST-MODIFIED:20110602T074656Z +DTSTAMP:20110602T074656Z +UID:8b64f5e6-8a9e-4bdb-a63e-317832993941 +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20220604 +DTEND;VALUE=DATE:20220607 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074732Z +LAST-MODIFIED:20110602T074738Z +DTSTAMP:20110602T074738Z +UID:964e322a-9680-49ed-bb0b-af62a4b46c56 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20210514 +DTEND;VALUE=DATE:20210515 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074806Z +LAST-MODIFIED:20110602T074819Z +DTSTAMP:20110602T074819Z +UID:76ec56fb-7144-4c92-a0b3-72afa810768e +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20210522 +DTEND;VALUE=DATE:20210525 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074925Z +LAST-MODIFIED:20110602T074933Z +DTSTAMP:20110602T074933Z +UID:71d3c880-a85c-4484-92aa-4942884b3f9d +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20200522 +DTEND;VALUE=DATE:20200523 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T075009Z +LAST-MODIFIED:20110602T075024Z +DTSTAMP:20110602T075024Z +UID:370ecbc0-6f3f-4527-ac4d-8edfb41d644e +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20200530 +DTEND;VALUE=DATE:20200602 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070318Z +LAST-MODIFIED:20110602T075110Z +DTSTAMP:20110602T075110Z +UID:b5c41c0a-265b-422d-843b-7c404b0682c7 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20190524 +DTEND;VALUE=DATE:20190525 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070431Z +LAST-MODIFIED:20110602T075118Z +DTSTAMP:20110602T075118Z +UID:48d28699-fa44-4c52-a7e4-a16c5f0ce476 +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20190601 +DTEND;VALUE=DATE:20190604 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070044Z +LAST-MODIFIED:20110602T075143Z +DTSTAMP:20110602T075143Z +UID:7c5e4416-0492-441d-8721-79bdc6f19409 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20180511 +DTEND;VALUE=DATE:20180512 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070134Z +LAST-MODIFIED:20110602T075148Z +DTSTAMP:20110602T075148Z +UID:9c1c7c44-71d3-4738-a4af-8e7de54d8dc0 +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20180519 +DTEND;VALUE=DATE:20180522 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T075205Z +LAST-MODIFIED:20110602T075251Z +DTSTAMP:20110602T075251Z +UID:a6d01a79-1696-4af5-97d4-b8531bc9ea5f +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20170429 +DTEND;VALUE=DATE:20170502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T075338Z +LAST-MODIFIED:20110602T075350Z +DTSTAMP:20110602T075350Z +UID:6be32093-5b4b-4334-a248-34b245d8ee00 +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20150501 +DTEND;VALUE=DATE:20150504 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T075402Z +LAST-MODIFIED:20110602T075410Z +DTSTAMP:20110602T075410Z +UID:2445c9e0-870b-4562-b51c-0f61ab95ee45 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20140502 +DTEND;VALUE=DATE:20140503 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T075412Z +LAST-MODIFIED:20110602T075426Z +DTSTAMP:20110602T075426Z +UID:19bb917a-0fb2-435b-b873-d4e39a157b33 +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20140501 +DTEND;VALUE=DATE:20140505 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T075451Z +LAST-MODIFIED:20110602T075458Z +DTSTAMP:20110602T075458Z +UID:1616fcc7-c6ab-477b-9d22-e1f22646028b +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20120430 +DTEND;VALUE=DATE:20120501 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T075500Z +LAST-MODIFIED:20110602T075554Z +DTSTAMP:20110602T075554Z +UID:e4cbe7b7-2ee5-416b-9d26-9a1aa4d6673d +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20120428 +DTEND;VALUE=DATE:20120502 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063103Z +LAST-MODIFIED:20110602T075712Z +DTSTAMP:20110602T075712Z +UID:455c95a7-e676-40a4-a11e-b4d97bf08572 +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20110611 +DTEND;VALUE=DATE:20110614 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082156Z +LAST-MODIFIED:20110602T082208Z +DTSTAMP:20110602T082208Z +UID:c6157ea3-4e77-4a85-b42e-e3f0d9327eb1 +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20131109 +DTEND;VALUE=DATE:20131112 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082231Z +LAST-MODIFIED:20110602T082242Z +DTSTAMP:20110602T082242Z +UID:b42332bd-f661-4246-9cdb-459b4a49c21c +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20111111 +DTEND;VALUE=DATE:20111114 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082331Z +LAST-MODIFIED:20110602T082340Z +DTSTAMP:20110602T082340Z +UID:569234a8-d31e-4b5a-ab03-862038f90d1d +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20141110 +DTEND;VALUE=DATE:20141111 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082344Z +LAST-MODIFIED:20110602T082404Z +DTSTAMP:20110602T082404Z +UID:195fb03d-bb48-4263-966d-f4ba8ac26c29 +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20141108 +DTEND;VALUE=DATE:20141112 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082541Z +LAST-MODIFIED:20110602T082551Z +DTSTAMP:20110602T082551Z +UID:83a6d049-4dd6-46bb-925e-81b31a0695da +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20161111 +DTEND;VALUE=DATE:20161114 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082739Z +LAST-MODIFIED:20110602T082755Z +DTSTAMP:20110602T082755Z +UID:fb60d988-0422-4156-89ff-f9372275a28c +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20191109 +DTEND;VALUE=DATE:20191112 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082915Z +LAST-MODIFIED:20110602T082921Z +DTSTAMP:20110602T082921Z +UID:96ac3b29-49a5-46f4-86d0-2a29fec09776 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20211112 +DTEND;VALUE=DATE:20211113 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082923Z +LAST-MODIFIED:20110602T082942Z +DTSTAMP:20110602T082942Z +UID:e2a83d93-1ae2-4fd8-91fb-07c3e52e9450 +SUMMARY:Lang weekend +DTSTART;VALUE=DATE:20211111 +DTEND;VALUE=DATE:20211115 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T083907Z +LAST-MODIFIED:20110602T083918Z +DTSTAMP:20110602T083918Z +UID:e14eb7b7-ad7c-4cf7-819d-7086dd3509a4 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20190816 +DTEND;VALUE=DATE:20190817 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T083944Z +LAST-MODIFIED:20110602T083950Z +DTSTAMP:20110602T083950Z +UID:839b1c3d-9f91-4151-962b-1d22a455eb61 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20170814 +DTEND;VALUE=DATE:20170815 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T084016Z +LAST-MODIFIED:20110602T084022Z +DTSTAMP:20110602T084022Z +UID:1b56e729-ecf2-4f0b-bd38-9d57896643e1 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20130816 +DTEND;VALUE=DATE:20130817 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T084132Z +LAST-MODIFIED:20110602T084140Z +DTSTAMP:20110602T084140Z +UID:486ccdd4-160b-4233-9b95-b23bd70f33bc +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20110722 +DTEND;VALUE=DATE:20110723 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T084215Z +LAST-MODIFIED:20110602T084222Z +DTSTAMP:20110602T084222Z +UID:a34f2d3f-deba-44d4-ad14-d092a51a4efc +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20150720 +DTEND;VALUE=DATE:20150721 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T084239Z +LAST-MODIFIED:20110602T084246Z +DTSTAMP:20110602T084246Z +UID:104a2292-1b9c-4d32-9d37-ce30f7f052d7 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20160722 +DTEND;VALUE=DATE:20160723 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T084318Z +LAST-MODIFIED:20110602T084324Z +DTSTAMP:20110602T084324Z +UID:08bec8dc-00cb-4b49-a335-149440b2688a +SUMMARY:Brugdag +DTSTART;TZID=Europe/Brussels:20200720T110000 +DTEND;TZID=Europe/Brussels:20200720T130000 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T084340Z +LAST-MODIFIED:20110602T084348Z +DTSTAMP:20110602T084348Z +UID:1167edf6-485e-46af-b005-877c61a2554a +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20220722 +DTEND;VALUE=DATE:20220723 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110613T160613Z +LAST-MODIFIED:20110613T160628Z +DTSTAMP:20110613T160628Z +UID:6e612b90-0aa8-430c-bca7-9a9ffa669820 +SUMMARY:Brugdag +DTSTART;VALUE=DATE:20181224 +DTEND;VALUE=DATE:20181225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T072053Z +LAST-MODIFIED:20110622T091607Z +DTSTAMP:20110622T091607Z +UID:ce3139b4-c754-4953-a4d8-fa4b65885905 +SUMMARY:Paasvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20120331 +DTEND;VALUE=DATE:20120402 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T072235Z +LAST-MODIFIED:20110622T091620Z +DTSTAMP:20110622T091620Z +UID:c1ce801b-a801-4e6d-a336-ac99f8968811 +SUMMARY:Paasvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20130330 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T072311Z +LAST-MODIFIED:20110622T091627Z +DTSTAMP:20110622T091627Z +UID:6edc48e3-a6c4-430a-9fe5-14266d7a568b +SUMMARY:Paasvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20140405 +DTEND;VALUE=DATE:20140407 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T072327Z +LAST-MODIFIED:20110622T091636Z +DTSTAMP:20110622T091636Z +UID:aaa0b7d7-07de-463f-8e42-541d25bc966a +SUMMARY:Paasvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T072355Z +LAST-MODIFIED:20110622T091643Z +DTSTAMP:20110622T091643Z +UID:e003ca99-d0b4-48bf-a413-a66897555298 +SUMMARY:Paasvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20150404 +DTEND;VALUE=DATE:20150406 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T072923Z +LAST-MODIFIED:20110622T091651Z +DTSTAMP:20110622T091651Z +UID:134ef350-4f1b-4b46-950f-3a8fa1edac21 +SUMMARY:Paasvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20180331 +DTEND;VALUE=DATE:20180402 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074017Z +LAST-MODIFIED:20110622T091659Z +DTSTAMP:20110622T091659Z +UID:d236716a-6035-44d2-b484-2a43ca4fd4a6 +SUMMARY:Paasvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20190406 +DTEND;VALUE=DATE:20190423 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T071327Z +LAST-MODIFIED:20110622T091709Z +DTSTAMP:20110622T091709Z +UID:1f39ecab-d647-438c-aae9-efbdf3aa23ec +SUMMARY:Paasvakanite +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20110409 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T071109Z +LAST-MODIFIED:20110622T091804Z +DTSTAMP:20110622T091804Z +UID:fa8baf03-0455-47d7-a376-5fed538d2af2 +SUMMARY:Krokusvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20120220 +DTEND;VALUE=DATE:20120227 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T071249Z +LAST-MODIFIED:20110622T091815Z +DTSTAMP:20110622T091815Z +UID:af3e97f7-aeb0-4ce7-a90a-db2d61bcfe71 +SUMMARY:Krokusvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20110305 +DTEND;VALUE=DATE:20110314 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T075853Z +LAST-MODIFIED:20110622T091822Z +DTSTAMP:20110622T091822Z +UID:938a945d-eec7-4b37-9210-6411648e3bf3 +SUMMARY:Krokusvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20130209 +DTEND;VALUE=DATE:20130218 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080004Z +LAST-MODIFIED:20110622T091829Z +DTSTAMP:20110622T091829Z +UID:4f843d7c-ea74-44a0-98ad-14d2d1472e00 +SUMMARY:Krokusvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20140301 +DTEND;VALUE=DATE:20140310 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080133Z +LAST-MODIFIED:20110622T091836Z +DTSTAMP:20110622T091836Z +UID:c0968f11-6fc8-4cfe-bc0f-f2cd7d725465 +SUMMARY:Krokusvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20150207 +DTEND;VALUE=DATE:20150216 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080217Z +LAST-MODIFIED:20110622T091843Z +DTSTAMP:20110622T091843Z +UID:a370ba0b-309d-4721-b6d0-5893cb60c249 +SUMMARY:Krokusvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20160206 +DTEND;VALUE=DATE:20160215 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080404Z +LAST-MODIFIED:20110622T091851Z +DTSTAMP:20110622T091851Z +UID:7e7bb99e-1b0c-4121-bd67-59761d1a02e4 +SUMMARY:Krokusvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20170225 +DTEND;VALUE=DATE:20170306 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080536Z +LAST-MODIFIED:20110622T091859Z +DTSTAMP:20110622T091859Z +UID:8a6f1212-f11e-40ad-8384-5d81e6e46a94 +SUMMARY:Krokusvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20180210 +DTEND;VALUE=DATE:20180219 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080644Z +LAST-MODIFIED:20110622T091907Z +DTSTAMP:20110622T091907Z +UID:76305169-e0ff-4707-9534-826a12cb7889 +SUMMARY:Krokusvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20190302 +DTEND;VALUE=DATE:20190311 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080802Z +LAST-MODIFIED:20110622T091915Z +DTSTAMP:20110622T091915Z +UID:8cfa369f-41f5-4cb1-aaa8-f644a27e6d76 +SUMMARY:Krokusvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20200222 +DTEND;VALUE=DATE:20200302 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T080913Z +LAST-MODIFIED:20110622T091921Z +DTSTAMP:20110622T091921Z +UID:29fa0709-af3d-4906-a0a6-7273ecdfbc74 +SUMMARY:Krokusvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20210213 +DTEND;VALUE=DATE:20210222 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081012Z +LAST-MODIFIED:20110622T091929Z +DTSTAMP:20110622T091929Z +UID:069df2ef-6f00-4187-b3cc-cf3906edeeb6 +SUMMARY:Krokusvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20220226 +DTEND;VALUE=DATE:20220307 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081214Z +LAST-MODIFIED:20110622T092001Z +DTSTAMP:20110622T092001Z +UID:b5319702-d1f9-4fc2-8bf5-72615f4db8aa +SUMMARY:Kerstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20110110 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070910Z +LAST-MODIFIED:20110622T092009Z +DTSTAMP:20110622T092009Z +UID:4e21b91a-06c2-4ba3-a316-506cb7ab4109 +SUMMARY:Kerstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20111224 +DTEND;VALUE=DATE:20120109 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081317Z +LAST-MODIFIED:20110622T092015Z +DTSTAMP:20110622T092015Z +UID:6a69953d-196d-418b-b79a-9bdd9d6fd198 +SUMMARY:Kerstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20121222 +DTEND;VALUE=DATE:20130107 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081359Z +LAST-MODIFIED:20110622T092022Z +DTSTAMP:20110622T092022Z +UID:165c676e-aaa8-4e6f-848b-118e78bf0bff +SUMMARY:Kerstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20131221 +DTEND;VALUE=DATE:20140106 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081517Z +LAST-MODIFIED:20110622T092029Z +DTSTAMP:20110622T092029Z +UID:73cc2724-6ab5-4546-be51-b5f16da54237 +SUMMARY:Kerstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20151219 +DTEND;VALUE=DATE:20160104 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081436Z +LAST-MODIFIED:20110622T092038Z +DTSTAMP:20110622T092038Z +UID:02f4e0ad-9ca6-48dd-b7e9-7d1ea382ff5f +SUMMARY:Kerstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20141220 +DTEND;VALUE=DATE:20150105 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081612Z +LAST-MODIFIED:20110622T092045Z +DTSTAMP:20110622T092045Z +UID:dcbf2ff9-9039-4ce0-8aac-992fcc3497eb +SUMMARY:Kerstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20161224 +DTEND;VALUE=DATE:20170109 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081758Z +LAST-MODIFIED:20110622T092051Z +DTSTAMP:20110622T092051Z +UID:d9b0dcde-1bf1-4897-868a-a49b6da86404 +SUMMARY:Kerstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20191221 +DTEND;VALUE=DATE:20200106 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081650Z +LAST-MODIFIED:20110622T092057Z +DTSTAMP:20110622T092057Z +UID:3e271ff1-0cde-4f4b-bfad-837688e95068 +SUMMARY:Kerstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20171223 +DTEND;VALUE=DATE:20180108 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081732Z +LAST-MODIFIED:20110622T092107Z +DTSTAMP:20110622T092107Z +UID:c1b103d1-0b6c-4e21-8874-27f3ab2e9553 +SUMMARY:Kerstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20181222 +DTEND;VALUE=DATE:20190107 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081818Z +LAST-MODIFIED:20110622T092114Z +DTSTAMP:20110622T092114Z +UID:f21a8b5f-1c59-4ef5-8aa6-4d1e7f079d96 +SUMMARY:Kerstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20201219 +DTEND;VALUE=DATE:20210104 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T081854Z +LAST-MODIFIED:20110622T092123Z +DTSTAMP:20110622T092123Z +UID:f2218816-50b5-43df-a143-643aab3cfaac +SUMMARY:Kerstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20211225 +DTEND;VALUE=DATE:20220110 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070828Z +LAST-MODIFIED:20110622T092144Z +DTSTAMP:20110622T092144Z +UID:8407af3e-4867-47f6-b8a5-09fecb8a1a6a +SUMMARY:Herfstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20111029 +DTEND;VALUE=DATE:20111107 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082023Z +LAST-MODIFIED:20110622T092150Z +DTSTAMP:20110622T092150Z +UID:ef66eec6-9662-4855-9a05-3fb8987c0f38 +SUMMARY:Herstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20121027 +DTEND;VALUE=DATE:20121105 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082104Z +LAST-MODIFIED:20110622T092157Z +DTSTAMP:20110622T092157Z +UID:265b3972-13b6-4da4-9901-f86a73f825d6 +SUMMARY:Herfstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20131026 +DTEND;VALUE=DATE:20131104 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082425Z +LAST-MODIFIED:20110622T092204Z +DTSTAMP:20110622T092204Z +UID:7df847f9-814c-42a1-a381-02f7b977fa10 +SUMMARY:Herfstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20151031 +DTEND;VALUE=DATE:20151109 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082307Z +LAST-MODIFIED:20110622T092210Z +DTSTAMP:20110622T092210Z +UID:81d28637-d68a-4b1f-a262-64d6a9d1ebf2 +SUMMARY:Herfstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20141025 +DTEND;VALUE=DATE:20141103 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082524Z +LAST-MODIFIED:20110622T092215Z +DTSTAMP:20110622T092215Z +UID:e6d9706f-65e0-4fc9-bc14-55edec7ac55e +SUMMARY:Herfstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20161029 +DTEND;VALUE=DATE:20161107 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082601Z +LAST-MODIFIED:20110622T092222Z +DTSTAMP:20110622T092222Z +UID:ed3c069d-1f28-49e3-bc7b-0bd095157a4b +SUMMARY:Herfstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20171028 +DTEND;VALUE=DATE:20171106 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082646Z +LAST-MODIFIED:20110622T092229Z +DTSTAMP:20110622T092229Z +UID:dd646606-6267-40c9-bc39-6dae7cfaeab7 +SUMMARY:Herfstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20181027 +DTEND;VALUE=DATE:20181105 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082718Z +LAST-MODIFIED:20110622T092235Z +DTSTAMP:20110622T092235Z +UID:aacd82b9-402c-4b00-8c0f-a582d77d1fae +SUMMARY:Herfstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20191026 +DTEND;VALUE=DATE:20191104 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082803Z +LAST-MODIFIED:20110622T092243Z +DTSTAMP:20110622T092243Z +UID:3ad2687f-70c4-4e66-b56b-406de7b3e79a +SUMMARY:Herfstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20201031 +DTEND;VALUE=DATE:20201109 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T082855Z +LAST-MODIFIED:20110622T092249Z +DTSTAMP:20110622T092249Z +UID:d59ec695-fdd6-43f0-9d54-b2e0d68e0378 +SUMMARY:Herfstvakantie +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20211030 +DTEND;VALUE=DATE:20211108 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063031Z +LAST-MODIFIED:20110622T092443Z +DTSTAMP:20110622T092443Z +UID:0d6e7983-ecd6-40e0-8d91-56de1506e5eb +SUMMARY:Lang weekend +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110606 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063224Z +LAST-MODIFIED:20110622T092541Z +DTSTAMP:20110622T092541Z +UID:7046a0c1-c931-402f-8e7b-a75572a5acc1 +SUMMARY:Lang weekend +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120521 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063249Z +LAST-MODIFIED:20110622T092607Z +DTSTAMP:20110622T092607Z +UID:77b95b6b-0440-456f-903d-619d94c979f2 +SUMMARY:Lang weekend +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130513 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T063329Z +LAST-MODIFIED:20110622T092616Z +DTSTAMP:20110622T092616Z +UID:6d89e381-da75-4a52-8096-54dde10e594f +SUMMARY:Lang Weekend +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20140529 +DTEND;VALUE=DATE:20140602 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065141Z +LAST-MODIFIED:20110622T092642Z +DTSTAMP:20110622T092642Z +UID:601d01f5-9744-4e99-a7a0-86cfd76e79b0 +SUMMARY:Lang weekend +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20150514 +DTEND;VALUE=DATE:20150518 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065532Z +LAST-MODIFIED:20110622T092653Z +DTSTAMP:20110622T092653Z +UID:6c61710c-613a-42b5-b349-a4d09375b447 +SUMMARY:Lang weekend +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20160505 +DTEND;VALUE=DATE:20160509 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T065759Z +LAST-MODIFIED:20110622T092704Z +DTSTAMP:20110622T092704Z +UID:0fb87574-e568-45d7-819a-544af1cd1fe5 +SUMMARY:Lang weekend +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20170525 +DTEND;VALUE=DATE:20170529 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070057Z +LAST-MODIFIED:20110622T092731Z +DTSTAMP:20110622T092731Z +UID:58395615-2817-4a86-bde2-6c2ebe1c47e4 +SUMMARY:Lang weekend +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20180510 +DTEND;VALUE=DATE:20180514 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T070332Z +LAST-MODIFIED:20110622T092804Z +DTSTAMP:20110622T092804Z +UID:e3ab936a-fa37-4d25-9527-023ccb036e1d +SUMMARY:Lang weekend +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20190523 +DTEND;VALUE=DATE:20190527 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074934Z +LAST-MODIFIED:20110622T092839Z +DTSTAMP:20110622T092839Z +UID:5010d925-835f-4558-99f8-28f3c956554c +SUMMARY:Lang weekend +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20200521 +DTEND;VALUE=DATE:20200525 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074740Z +LAST-MODIFIED:20110622T092852Z +DTSTAMP:20110622T092852Z +UID:b28666e9-0750-41b2-bbb0-d3990f0d514e +SUMMARY:Lang weekend +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20210513 +DTEND;VALUE=DATE:20210517 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074543Z +LAST-MODIFIED:20110622T092902Z +DTSTAMP:20110622T092902Z +UID:91aeb84d-bace-41d0-89c9-4a18308faf8b +SUMMARY:Lang weekend +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;TZID=Europe/Brussels:20220526T100000 +DTEND;TZID=Europe/Brussels:20220529T120000 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T071444Z +LAST-MODIFIED:20110622T091558Z +DTSTAMP:20110622T091558Z +UID:fabb22d1-4456-446b-86cf-39554de9fb22 +SUMMARY:Zomervakantie +RRULE:FREQ=YEARLY;BYMONTHDAY=1;BYMONTH=7 +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20110701 +DTEND;VALUE=DATE:20110901 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T071957Z +LAST-MODIFIED:20110622T091612Z +DTSTAMP:20110622T091612Z +UID:0c386103-4eea-48a4-a5bc-2445487eb0a5 +SUMMARY:Paasvakantie +RRULE:FREQ=YEARLY;BYDAY=1MO;BYMONTH=4 +EXDATE;VALUE=DATE:20190401 +CATEGORIES:Schoolvakanties in Vlaanderen +DTSTART;VALUE=DATE:20120402 +DTEND;VALUE=DATE:20120416 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:13 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T072521Z +LAST-MODIFIED:20110602T072559Z +DTSTAMP:20110602T072559Z +UID:0c386103-4eea-48a4-a5bc-2445487eb0a5 +SUMMARY:Paasvakantie +RECURRENCE-ID:20160404T000000 +DTSTART;VALUE=DATE:20160326 +DTEND;VALUE=DATE:20160411 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:12 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T072638Z +LAST-MODIFIED:20110602T072834Z +DTSTAMP:20110602T072834Z +UID:0c386103-4eea-48a4-a5bc-2445487eb0a5 +SUMMARY:Paasvakantie +RECURRENCE-ID:20170403T000000 +DTSTART;VALUE=DATE:20170401 +DTEND;VALUE=DATE:20170418 +TRANSP:TRANSPARENT +SEQUENCE:3 +X-MOZ-GENERATION:12 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074039Z +LAST-MODIFIED:20110602T074102Z +DTSTAMP:20110602T074102Z +UID:0c386103-4eea-48a4-a5bc-2445487eb0a5 +SUMMARY:Paasvakantie +RECURRENCE-ID:20200406T000000 +DTSTART;VALUE=DATE:20200404 +DTEND;VALUE=DATE:20200420 +TRANSP:TRANSPARENT +SEQUENCE:3 +X-MOZ-GENERATION:12 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074119Z +LAST-MODIFIED:20110602T074147Z +DTSTAMP:20110602T074147Z +UID:0c386103-4eea-48a4-a5bc-2445487eb0a5 +SUMMARY:Paasvakantie +RECURRENCE-ID:20210405T000000 +DTSTART;VALUE=DATE:20210403 +DTEND;VALUE=DATE:20210419 +TRANSP:TRANSPARENT +SEQUENCE:3 +X-MOZ-GENERATION:12 +END:VEVENT +BEGIN:VEVENT +CREATED:20110602T074305Z +LAST-MODIFIED:20110602T074340Z +DTSTAMP:20110602T074340Z +UID:0c386103-4eea-48a4-a5bc-2445487eb0a5 +SUMMARY:Paasvakantie +RECURRENCE-ID:20220404T000000 +DTSTART;VALUE=DATE:20220402 +DTEND;VALUE=DATE:20220419 +TRANSP:TRANSPARENT +SEQUENCE:3 +X-MOZ-GENERATION:12 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/FrenchHolidays.ics b/media/caldata/FrenchHolidays.ics new file mode 100644 index 00000000000..7a5cdc5517f --- /dev/null +++ b/media/caldata/FrenchHolidays.ics @@ -0,0 +1,382 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +BEGIN:VTIMEZONE +TZID:/mozilla.org/20070129_1/Europe/Paris +X-LIC-LOCATION:Europe/Paris +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20070606T141629Z +LAST-MODIFIED:20070606T154611Z +DTSTAMP:20070607T120859Z +UID:5d1ae55f-3910-4de9-8b65-d652768fb2f2 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070409 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070410 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T161310Z +LAST-MODIFIED:20070606T161327Z +DTSTAMP:20070607T120859Z +UID:9e19b119-f077-4ae9-934e-cb62322ca81f +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20080501 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20080502 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070605T163903Z +LAST-MODIFIED:20070606T161656Z +DTSTAMP:20070607T120859Z +UID:c6a930d6-4ed5-45d8-bb3d-d3587a32b8aa +SUMMARY:Jour de l'an +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070101 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070102 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T141739Z +LAST-MODIFIED:20070606T161721Z +DTSTAMP:20070607T120859Z +UID:f439c81b-fd09-4b40-a629-3a9663dd29ff +SUMMARY:Fête du Travail +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070501 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070502 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T141853Z +LAST-MODIFIED:20070606T161731Z +DTSTAMP:20070607T120859Z +UID:b1c0e1ed-a09f-4fc2-aab1-170d3f661f13 +SUMMARY:Armistice 1945 +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070508 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070509 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T141932Z +LAST-MODIFIED:20070606T161741Z +DTSTAMP:20070607T120859Z +UID:5468e1a0-9dda-4fd2-88c0-dc3e727c1183 +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070517 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070518 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T154927Z +LAST-MODIFIED:20070606T161748Z +DTSTAMP:20070607T120859Z +UID:67a89bb6-9ad4-461b-951c-c4c8482d8618 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070528 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070529 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142033Z +LAST-MODIFIED:20070606T161758Z +DTSTAMP:20070607T120859Z +UID:00eb3adc-c059-47c8-a1c0-4ca7048051b9 +SUMMARY:Fête Nationale +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070714 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070715 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142112Z +LAST-MODIFIED:20070606T162012Z +DTSTAMP:20070607T120859Z +UID:854e5499-9276-4a96-9be3-bcbaa7caafcf +SUMMARY:Assomption +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070815 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070816 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142147Z +LAST-MODIFIED:20070606T162034Z +DTSTAMP:20070607T120859Z +UID:725c8c16-c37a-49f0-9d2e-dc976d6c3ea5 +SUMMARY:Toussaint +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20071101 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20071102 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142211Z +LAST-MODIFIED:20070606T162044Z +DTSTAMP:20070607T120859Z +UID:5218f724-6b66-434d-a8c5-138dfed64e07 +SUMMARY:Armistice 1918 +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20071111 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20071112 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T142243Z +LAST-MODIFIED:20070606T162054Z +DTSTAMP:20070607T120859Z +UID:18617cde-2d15-46c6-900f-b3341a7b7f98 +SUMMARY:Noël +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20071225 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20071226 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T150648Z +LAST-MODIFIED:20070606T162128Z +DTSTAMP:20070607T120859Z +UID:19d50a52-f5a9-4d70-8fd7-a2caa97f6959 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20080324 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20080325 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T105427Z +LAST-MODIFIED:20070607T105450Z +DTSTAMP:20070607T120859Z +UID:18c90b99-edfa-4418-9bc7-992a07384967 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20090413 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20090414 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T105613Z +LAST-MODIFIED:20070607T105630Z +DTSTAMP:20070607T120859Z +UID:b989d129-8f2f-42be-a027-183f6d81eb40 +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20090521 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20090522 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T105907Z +LAST-MODIFIED:20070607T105928Z +DTSTAMP:20070607T120859Z +UID:7c6fe35c-44a5-450b-aea6-dd2baef78f06 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20090601 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20090602 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T110046Z +LAST-MODIFIED:20070607T110100Z +DTSTAMP:20070607T120859Z +UID:98c1c381-8632-45ce-9b11-10757face7c4 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20100405 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20100406 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T110121Z +LAST-MODIFIED:20070607T110135Z +DTSTAMP:20070607T120859Z +UID:aaeb1ba5-60f0-4e49-a25a-c0ff949acdd9 +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20100513 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20100514 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T110144Z +LAST-MODIFIED:20070607T110201Z +DTSTAMP:20070607T120859Z +UID:1f68f978-969e-4791-a7e3-cb3011134a34 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20100524 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20100525 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T112820Z +LAST-MODIFIED:20070607T112836Z +DTSTAMP:20070607T120859Z +UID:fa0d4b5b-8eeb-4b98-b35c-b6a547b96953 +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20110602 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20110603 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T112846Z +LAST-MODIFIED:20070607T112906Z +DTSTAMP:20070607T120859Z +UID:5be6194a-9fbd-45da-8e3c-568cac66b997 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20110613 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20110614 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T112958Z +LAST-MODIFIED:20070607T113016Z +DTSTAMP:20070607T120859Z +UID:4162d242-5468-4007-8814-10286b9589a0 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20120409 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20120410 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113034Z +LAST-MODIFIED:20070607T113048Z +DTSTAMP:20070607T120859Z +UID:6d368a35-6b6d-4ec1-9f48-97c53b25502e +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20120517 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20120518 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113055Z +LAST-MODIFIED:20070607T113114Z +DTSTAMP:20070607T120859Z +UID:e8913a3d-3e84-447d-afb4-f0b082948449 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20120528 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20120529 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113205Z +LAST-MODIFIED:20070607T113229Z +DTSTAMP:20070607T120859Z +UID:ebc79872-a185-4641-bc22-1092d5139efb +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20130401 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20130402 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113245Z +LAST-MODIFIED:20070607T113257Z +DTSTAMP:20070607T120859Z +UID:9714bd39-429b-433c-ab5c-5fd6a67e658e +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20130509 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20130510 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113305Z +LAST-MODIFIED:20070607T113325Z +DTSTAMP:20070607T120859Z +UID:79f5f02f-e92d-417f-9637-9e2a88840583 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20130520 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20130521 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113408Z +LAST-MODIFIED:20070607T113426Z +DTSTAMP:20070607T120859Z +UID:172dcce6-6f95-4c1f-ada9-e8bf2a7e8245 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20140421 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20140422 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113439Z +LAST-MODIFIED:20070607T113452Z +DTSTAMP:20070607T120859Z +UID:6625ed89-bf9f-478a-9796-c3dc203ab5e6 +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20140529 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20140530 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113504Z +LAST-MODIFIED:20070607T113523Z +DTSTAMP:20070607T120859Z +UID:7abad826-ab68-447f-81b2-1e04a4c2ef88 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20140609 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20140610 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113606Z +LAST-MODIFIED:20070607T113622Z +DTSTAMP:20070607T120859Z +UID:cf42813f-4a74-422b-aa19-90dcefccc92d +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20150406 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20150407 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113643Z +LAST-MODIFIED:20070607T113657Z +DTSTAMP:20070607T120859Z +UID:e7d30f2b-d546-4b7e-8780-0754a46e6970 +SUMMARY:Ascension +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20150514 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20150515 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T113706Z +LAST-MODIFIED:20070607T113726Z +DTSTAMP:20070607T120859Z +UID:a8ccc771-4e8b-4594-ae30-33e9ce384ac9 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20150525 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20150526 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T162350Z +LAST-MODIFIED:20070607T115133Z +DTSTAMP:20070607T120859Z +UID:419f1bff-a820-4d07-bf4e-1a6ec139e3df +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20080512 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20080513 +CATEGORIES:Jours fériés +END:VEVENT +BEGIN:VEVENT +CREATED:20070607T112742Z +LAST-MODIFIED:20070607T115439Z +DTSTAMP:20070607T120859Z +UID:570d9fe7-cdc9-4fdf-9794-909edf520383 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20110425 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20110426 +CATEGORIES:Jours fériés +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/FrisianHolidays.ics b/media/caldata/FrisianHolidays.ics new file mode 100644 index 00000000000..03bee215083 --- /dev/null +++ b/media/caldata/FrisianHolidays.ics @@ -0,0 +1,927 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090110T091017Z +DTSTAMP:20090110T091017Z +UID:045fb310-7268-11da-b454-ffbee1fd377f +SUMMARY:Goedfreed +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090110T091137Z +DTSTAMP:20090110T091137Z +UID:0a1798b0-7268-11da-9538-863b20a66336 +SUMMARY:Earste Peaskedei +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T115822Z +DTSTAMP:20090109T115822Z +UID:0fac5900-7268-11da-8092-d3ea05a704d2 +SUMMARY:Twadde Peaskedei +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090110T091323Z +DTSTAMP:20090110T091323Z +UID:299432c0-7268-11da-99ea-e8e05d649bfa +SUMMARY:Himmelfeartsdei +DTSTART;VALUE=DATE:20090521 +DTEND;VALUE=DATE:20090522 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090106T134119Z +DTSTAMP:20090106T134119Z +UID:32ce9aa0-7268-11da-a611-c083124367c7 +SUMMARY:Earste Pinksterdei +DTSTART;VALUE=DATE:20090531 +DTEND;VALUE=DATE:20090601 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090106T134131Z +DTSTAMP:20090106T134131Z +UID:39596020-7268-11da-94fc-c0c180c10ec8 +SUMMARY:Twadde Pinksterdei +DTSTART;VALUE=DATE:20090601 +DTEND;VALUE=DATE:20090602 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T122625Z +DTSTAMP:20090109T122625Z +UID:47466090-7268-11da-975a-d6c994b58486 +SUMMARY:Goedfreed +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T122638Z +DTSTAMP:20090109T122638Z +UID:4d9714f0-7268-11da-bd1c-8e55cea4aca6 +SUMMARY:Earste Peaskedei +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T122645Z +DTSTAMP:20090109T122645Z +UID:57c90930-7268-11da-b7cb-afd4a6eef945 +SUMMARY:Twadde Peaskedei +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T122703Z +DTSTAMP:20090109T122703Z +UID:6431e800-7268-11da-a731-e1aee7561339 +SUMMARY:Himmelfeartsdei +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T122714Z +DTSTAMP:20090109T122714Z +UID:6ef37fe0-7268-11da-b256-892d5340e393 +SUMMARY:Earste Pinksterdei +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T122722Z +DTSTAMP:20090109T122722Z +UID:744ca7e0-7268-11da-b1f1-b1c5c3b4fa1e +SUMMARY:Twadde Pinksterdei +DTSTART;VALUE=DATE:20100524 +DTEND;VALUE=DATE:20100525 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T122822Z +DTSTAMP:20090109T122822Z +UID:94eb9790-7268-11da-bf71-bf24a93a5dc7 +SUMMARY:Goedfreed +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T122845Z +DTSTAMP:20090109T122845Z +UID:9f40b120-7268-11da-ae06-aa17e698fc63 +SUMMARY:Earste Peaskedei +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T122859Z +DTSTAMP:20090109T122859Z +UID:a7c85010-7268-11da-8676-ed8f6b2b5a26 +SUMMARY:Twadde Peaskedei +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T122912Z +DTSTAMP:20090109T122912Z +UID:d81eac70-7268-11da-bb3a-9e7e83574f86 +SUMMARY:Himmelfeartsdei +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T122923Z +DTSTAMP:20090109T122923Z +UID:df561e20-7268-11da-a223-8ad71fcb59ee +SUMMARY:Earste Pinksterdei +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T122930Z +DTSTAMP:20090109T122930Z +UID:e56b3a30-7268-11da-a636-b343bf6fbcb7 +SUMMARY:Twadde Pinksterdei +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T055644Z +LAST-MODIFIED:20090110T090455Z +DTSTAMP:20090110T090455Z +UID:c11c04ed-6e9d-42d4-873e-aa23ca6c38bc +SUMMARY:Karnaval +DTSTART;VALUE=DATE:20090222 +DTEND;VALUE=DATE:20090225 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T055751Z +LAST-MODIFIED:20090106T134446Z +DTSTAMP:20090106T134446Z +UID:1c7f1267-ccb1-4a3d-949c-f50f34d29059 +SUMMARY:Karnaval +DTSTART;VALUE=DATE:20100214 +DTEND;VALUE=DATE:20100217 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T055856Z +LAST-MODIFIED:20090109T122811Z +DTSTAMP:20090109T122811Z +UID:c60295bd-7c4e-4591-acaa-a13292a63b69 +SUMMARY:Karnaval +DTSTART;VALUE=DATE:20110306 +DTEND;VALUE=DATE:20110309 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T063256Z +LAST-MODIFIED:20090109T122117Z +DTSTAMP:20090109T122117Z +UID:a24dfe50-f2b3-487e-b61e-68b6cabd20e8 +SUMMARY:Sûkerfeest +DTSTART;VALUE=DATE:20090920 +DTEND;VALUE=DATE:20090921 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T063329Z +LAST-MODIFIED:20090109T122739Z +DTSTAMP:20090109T122739Z +UID:4304edbd-381c-4504-8955-a2cad2ffed76 +SUMMARY:Sûkerfeest +DTSTART;VALUE=DATE:20100910 +DTEND;VALUE=DATE:20100911 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T063359Z +LAST-MODIFIED:20090109T122941Z +DTSTAMP:20090109T122941Z +UID:3749ea78-2761-4cc7-9f1b-0b306e81a5fb +SUMMARY:Sûkerfeest +DTSTART;VALUE=DATE:20110830 +DTEND;VALUE=DATE:20110831 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103903Z +LAST-MODIFIED:20090109T115325Z +DTSTAMP:20090109T115325Z +UID:0c37ae20-725d-11da-998c-889b0e888119 +SUMMARY:Nijjiersdei +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103903Z +LAST-MODIFIED:20090109T121430Z +DTSTAMP:20090109T121430Z +UID:1f63dc60-725d-11da-8fe4-e8c3d5e7baf0 +SUMMARY:Falentynsdei +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20090214 +DTEND;VALUE=DATE:20090215 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103903Z +LAST-MODIFIED:20090109T121036Z +DTSTAMP:20090109T121036Z +UID:5493ef80-7264-11da-95ff-8c59aa5b78e9 +SUMMARY:Deadebetinking +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20090504 +DTEND;VALUE=DATE:20090505 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103903Z +LAST-MODIFIED:20090109T121224Z +DTSTAMP:20090109T121224Z +UID:5f13d250-7264-11da-977b-c6bd41146bbc +SUMMARY:Nasjonale Befrijingsdei +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20090505 +DTEND;VALUE=DATE:20090506 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T120222Z +DTSTAMP:20090109T120222Z +UID:73db0e00-7264-11da-8807-8058e59d7e88 +SUMMARY:Bistedei +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20091004 +DTEND;VALUE=DATE:20091005 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T120401Z +DTSTAMP:20090109T120401Z +UID:87fa3310-7264-11da-b516-cef580b12392 +SUMMARY:Earste Krystdei +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +END:VEVENT +BEGIN:VEVENT +CREATED:20070429T103904Z +LAST-MODIFIED:20090109T120414Z +DTSTAMP:20090109T120414Z +UID:9163f9c0-7264-11da-9c32-ad0c09cb4f67 +SUMMARY:Twadde Krystdei +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T060505Z +LAST-MODIFIED:20090109T115858Z +DTSTAMP:20090109T115858Z +UID:21ce420f-f686-4320-aa26-0787645e29ed +SUMMARY:Dei fan de Arbeid +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T060659Z +LAST-MODIFIED:20090109T120149Z +DTSTAMP:20090109T120149Z +UID:f31b1a9a-59bd-4935-8e05-bdf65e0ba896 +SUMMARY:Prinsedei +RRULE:FREQ=YEARLY;BYDAY=3TU;BYMONTH=9 +DTSTART;VALUE=DATE:20090915 +DTEND;VALUE=DATE:20090916 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T060738Z +LAST-MODIFIED:20090109T120253Z +DTSTAMP:20090109T120253Z +UID:8ac94556-4571-4c9e-b0de-82203c1567da +SUMMARY:Sinteklaasjûn +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20091205 +DTEND;VALUE=DATE:20091206 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T060755Z +LAST-MODIFIED:20090109T122314Z +DTSTAMP:20090109T122314Z +UID:1bd246b1-8c97-450e-bea9-217d5d16add3 +SUMMARY:Sinteklaas +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20091206 +DTEND;VALUE=DATE:20091207 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T070501Z +LAST-MODIFIED:20090109T115842Z +DTSTAMP:20090109T115842Z +UID:845de399-3993-46f4-8fa8-fa742395fb58 +SUMMARY:Keninginnedei +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20090430 +DTEND;VALUE=DATE:20090501 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T182749Z +LAST-MODIFIED:20090109T120321Z +DTSTAMP:20090109T120321Z +UID:5a5d5150-6b95-4c4f-bae3-eefb956d6d57 +SUMMARY:Keninkryksdei +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20091215 +DTEND;VALUE=DATE:20091216 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T063904Z +LAST-MODIFIED:20090109T115605Z +DTSTAMP:20090109T115605Z +UID:8c427823-9cfa-4dcc-992c-a8052a26de74 +SUMMARY:Trijekeningen +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20090106 +DTEND;VALUE=DATE:20090107 +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T063959Z +LAST-MODIFIED:20090109T131320Z +DTSTAMP:20090109T131320Z +UID:42b9fc0b-f115-42f3-9f49-45df56019c24 +SUMMARY:Sinte-Marten +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20091111 +DTEND;VALUE=DATE:20091112 +END:VEVENT +BEGIN:VEVENT +CREATED:20090103T072850Z +LAST-MODIFIED:20090109T120027Z +DTSTAMP:20090109T120027Z +UID:92a64366-1076-4468-8162-f8cddce97cb8 +SUMMARY:Memmedei +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=5 +DTSTART;VALUE=DATE:20090510 +DTEND;VALUE=DATE:20090511 +END:VEVENT +BEGIN:VEVENT +CREATED:20090103T072753Z +LAST-MODIFIED:20090109T120118Z +DTSTAMP:20090109T120118Z +UID:6d990518-6037-4177-9afc-6a599dabd01a +SUMMARY:Heitedei +RRULE:FREQ=YEARLY;BYDAY=3SU;BYMONTH=6 +DTSTART;VALUE=DATE:20090621 +DTEND;VALUE=DATE:20090622 +END:VEVENT +BEGIN:VEVENT +CREATED:20090109T122510Z +LAST-MODIFIED:20090109T122526Z +DTSTAMP:20090109T122526Z +UID:fbe84118-cae8-44e4-acf3-e11291b02dab +SUMMARY:Naturalisaasjedei +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20091215 +DTEND;VALUE=DATE:20091216 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090109T131226Z +LAST-MODIFIED:20090109T131300Z +DTSTAMP:20090109T131300Z +UID:ca52a50a-fcc3-43b0-81a8-b57ed0c56cf8 +SUMMARY:Sint-Piter +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20090222 +DTEND;VALUE=DATE:20090223 +LOCATION:Grou +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090109T132106Z +LAST-MODIFIED:20090109T132137Z +DTSTAMP:20090109T132137Z +UID:d47b5e01-2b7a-4653-aecf-23f5cbeaddd8 +SUMMARY:Slach by Warns +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20090926 +DTEND;VALUE=DATE:20090927 +LOCATION:Warns +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T100333 +LAST-MODIFIED:20090110T090257Z +DTSTAMP:20090110T090257Z +UID:gv75j99f0v7r0upi8hq3hji8k0 +SUMMARY:Sûkerfeest +STATUS:CONFIRMED +DTSTART;VALUE=DATE:20120819 +DTEND;VALUE=DATE:20120820 +TRANSP:TRANSPARENT +CLASS:DEFAULT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T090315Z +LAST-MODIFIED:20090110T090318Z +DTSTAMP:20090110T090318Z +UID:1edfeebd-641a-434c-ad72-e4e2b2f52e15 +SUMMARY:Sûkerfeest +DTSTART;VALUE=DATE:20130808 +DTEND;VALUE=DATE:20130809 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T090330Z +LAST-MODIFIED:20090110T090332Z +DTSTAMP:20090110T090332Z +UID:d297955d-2391-4cfb-b99e-78229935e439 +SUMMARY:Sûkerfeest +DTSTART;VALUE=DATE:20140728 +DTEND;VALUE=DATE:20140729 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T090350Z +LAST-MODIFIED:20090110T090352Z +DTSTAMP:20090110T090352Z +UID:af9ae6df-8559-4440-9dfc-c052f895efc3 +SUMMARY:Sûkerfeest +DTSTART;VALUE=DATE:20150717 +DTEND;VALUE=DATE:20150718 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T090730Z +LAST-MODIFIED:20090110T090838Z +DTSTAMP:20090110T090838Z +UID:7533706b-fddf-4b7a-9009-afe168e969cb +SUMMARY:Karnaval +DTSTART;VALUE=DATE:20120219 +DTEND;VALUE=DATE:20120222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T090858Z +LAST-MODIFIED:20090110T090906Z +DTSTAMP:20090110T090906Z +UID:60d05c56-f567-4217-b99c-2eadb7140147 +SUMMARY:Karnaval +DTSTART;VALUE=DATE:20130210 +DTEND;VALUE=DATE:20130213 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T090918Z +LAST-MODIFIED:20090110T090924Z +DTSTAMP:20090110T090924Z +UID:0176bcc1-f843-48db-9e90-dbcd7f758ca5 +SUMMARY:Karnaval +DTSTART;VALUE=DATE:20140302 +DTEND;VALUE=DATE:20140305 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T090942Z +LAST-MODIFIED:20090110T090947Z +DTSTAMP:20090110T090947Z +UID:6f935a98-c9f3-46a0-85fb-b450ff740cb1 +SUMMARY:Karnaval +DTSTART;VALUE=DATE:20150315 +DTEND;VALUE=DATE:20150318 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091045Z +LAST-MODIFIED:20090110T091047Z +DTSTAMP:20090110T091047Z +UID:f641d974-d8c3-4cd8-969e-ec8c6bd0695b +SUMMARY:Goedfreed +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091058Z +LAST-MODIFIED:20090110T091101Z +DTSTAMP:20090110T091101Z +UID:c7decde7-b4ad-463b-a046-dd6f726c72a6 +SUMMARY:Goedfreed +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091114Z +LAST-MODIFIED:20090110T091118Z +DTSTAMP:20090110T091118Z +UID:b7377321-e2ab-4adf-9445-0f402245a564 +SUMMARY:Goedfreed +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091123Z +LAST-MODIFIED:20090110T091126Z +DTSTAMP:20090110T091126Z +UID:bf0466df-28a4-497a-9b06-ade33409e60c +SUMMARY:Goedfreed +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091143Z +LAST-MODIFIED:20090110T091146Z +DTSTAMP:20090110T091146Z +UID:0ef1bebd-d3d4-4698-b72a-6ea33d231fad +SUMMARY:Earste Peaskedei +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091148Z +LAST-MODIFIED:20090110T091156Z +DTSTAMP:20090110T091156Z +UID:5705e985-3522-49c4-82b6-6c384a1c0d34 +SUMMARY:Twadde Peaskedei +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091204Z +LAST-MODIFIED:20090110T091207Z +DTSTAMP:20090110T091207Z +UID:f5110c41-4ba6-45ff-837e-e6dd9cafb552 +SUMMARY:Earste Peaskedei +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091208Z +LAST-MODIFIED:20090110T091215Z +DTSTAMP:20090110T091215Z +UID:fccd0358-34ba-4555-a9fe-07cc74851a5c +SUMMARY:Twadde Peaskedei +DTSTART:20130401T110000 +DTEND:20130401T120000 +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091220Z +LAST-MODIFIED:20090110T091223Z +DTSTAMP:20090110T091223Z +UID:f0f23223-83a0-4f5b-a65e-9fd31a8f169b +SUMMARY:Earste Peaskedei +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091224Z +LAST-MODIFIED:20090110T091232Z +DTSTAMP:20090110T091232Z +UID:a57f2b24-59ec-4404-aec8-04dcc430ce92 +SUMMARY:Twadde Peaskedei +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091237Z +LAST-MODIFIED:20090110T091242Z +DTSTAMP:20090110T091242Z +UID:4a9fa27a-6566-4d97-ba74-f05834571a8e +SUMMARY:Earste Peaskedei +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091244Z +LAST-MODIFIED:20090110T091250Z +DTSTAMP:20090110T091250Z +UID:09777972-8c5f-4397-9757-a637c0c1dfc7 +SUMMARY:Twadde Peaskedei +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091331Z +LAST-MODIFIED:20090110T091333Z +DTSTAMP:20090110T091333Z +UID:4c8b01c0-e875-4d2a-aabf-02ca04dc810c +SUMMARY:Himmelfeartsdei +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091340Z +LAST-MODIFIED:20090110T091342Z +DTSTAMP:20090110T091342Z +UID:048bee49-7784-4e78-a893-5d7b913ebb86 +SUMMARY:Himmelfeartsdei +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091348Z +LAST-MODIFIED:20090110T091351Z +DTSTAMP:20090110T091351Z +UID:04cc26b2-bb28-400e-85ff-b4bc4692513a +SUMMARY:Himmelfeartsdei +DTSTART;VALUE=DATE:20140529 +DTEND;VALUE=DATE:20140530 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091356Z +LAST-MODIFIED:20090110T091359Z +DTSTAMP:20090110T091359Z +UID:265c761b-61b4-4e4b-a38b-65c1b62bec3f +SUMMARY:Himmelfeartsdei +DTSTART;VALUE=DATE:20150514 +DTEND;VALUE=DATE:20150515 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090110T091525Z +LAST-MODIFIED:20090110T091534Z +DTSTAMP:20090110T091534Z +UID:34cd1598-7208-4fae-9fe8-b68a3536d11d +SUMMARY:Aldjiersdei +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20081231 +DTEND;VALUE=DATE:20090101 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T133357Z +LAST-MODIFIED:20090111T133435Z +DTSTAMP:20090111T133435Z +UID:c79e30d3-4d11-40d6-a914-9193028b588d +SUMMARY:Boufak Noard +DTSTART;VALUE=DATE:20090713 +DTEND;VALUE=DATE:20090801 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T133510Z +LAST-MODIFIED:20090111T133527Z +DTSTAMP:20090111T133527Z +UID:7be4cc68-b8ec-4628-b509-25eb0393b38a +SUMMARY:Boufak Noard +DTSTART;VALUE=DATE:20100726 +DTEND;VALUE=DATE:20100814 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T133547Z +LAST-MODIFIED:20090111T133601Z +DTSTAMP:20090111T133601Z +UID:57058291-86ee-4e18-94b0-2f38ab4ec52a +SUMMARY:Boufak Noard +DTSTART;VALUE=DATE:20110801 +DTEND;VALUE=DATE:20110820 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T133708Z +LAST-MODIFIED:20090111T133731Z +DTSTAMP:20090111T133731Z +UID:47612576-c4ef-44b0-8af3-3b4593f31b65 +SUMMARY:Start Boufak Midden +DTSTART;VALUE=DATE:20090720 +DTEND;VALUE=DATE:20090721 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T133733Z +LAST-MODIFIED:20090111T133750Z +DTSTAMP:20090111T133750Z +UID:f423f94e-7d26-4759-8e8a-31f2ef9f61f1 +SUMMARY:Start Boufak Súd +DTSTART;VALUE=DATE:20090727 +DTEND;VALUE=DATE:20090728 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T133854Z +LAST-MODIFIED:20090111T133902Z +DTSTAMP:20090111T133902Z +UID:e4e1c4f9-1492-45a3-b40e-b8416b003a95 +SUMMARY:Start Boufak Midden +DTSTART;VALUE=DATE:20100719 +DTEND;VALUE=DATE:20100720 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T133913Z +LAST-MODIFIED:20090111T133922Z +DTSTAMP:20090111T133922Z +UID:02155afd-03af-4b76-b807-75de487001c2 +SUMMARY:Start Boufak Súd +DTSTART;VALUE=DATE:20100802 +DTEND;VALUE=DATE:20100803 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T133958Z +LAST-MODIFIED:20090111T134006Z +DTSTAMP:20090111T134006Z +UID:61608252-00b9-404a-b917-dbcae1ebfa92 +SUMMARY:Start Boufak Midden +DTSTART;VALUE=DATE:20110718 +DTEND;VALUE=DATE:20110719 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T134008Z +LAST-MODIFIED:20090111T134011Z +DTSTAMP:20090111T134011Z +UID:cd368f87-2c4c-4889-99cf-120a8e0becfe +SUMMARY:Start Boufak Súd +DTSTART;VALUE=DATE:20110725 +DTEND;VALUE=DATE:20110726 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T134548Z +LAST-MODIFIED:20090111T135445Z +DTSTAMP:20090111T135445Z +UID:f85818d9-197e-4c84-bd39-5bf3a457f37f +SUMMARY:Foarjiersfakânsje Noard/Midden +DTSTART;VALUE=DATE:20090214 +DTEND;VALUE=DATE:20090223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T134658Z +LAST-MODIFIED:20090111T134841Z +DTSTAMP:20090111T134841Z +UID:55f48c06-215f-4420-930f-bb447e8aa4ef +SUMMARY:Maaiefakânsje +DTSTART;VALUE=DATE:20090425 +DTEND;VALUE=DATE:20090506 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T134947Z +LAST-MODIFIED:20090111T135621Z +DTSTAMP:20090111T135621Z +UID:cbf1171a-278f-41d7-a05f-751bd0e82f9e +SUMMARY:Simmerfakânsje basisûnderwiis +DTSTART;VALUE=DATE:20090704 +DTEND;VALUE=DATE:20090817 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T135036Z +LAST-MODIFIED:20090111T135231Z +DTSTAMP:20090111T135231Z +UID:5822fc1c-9a06-47d1-acd0-710bb936665e +SUMMARY:Simmerfakânsje foartset ûnderwiis +DTSTART;VALUE=DATE:20090704 +DTEND;VALUE=DATE:20090824 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T135312Z +LAST-MODIFIED:20090111T135329Z +DTSTAMP:20090111T135329Z +UID:21616dab-b741-43eb-b5f5-eca035911615 +SUMMARY:Hjerstfakânsje +DTSTART;VALUE=DATE:20091017 +DTEND;VALUE=DATE:20091026 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T135354Z +LAST-MODIFIED:20090111T135417Z +DTSTAMP:20090111T135417Z +UID:7c354075-511f-4532-9eb4-d9a1564ae283 +SUMMARY:Krystfakânsje +DTSTART;VALUE=DATE:20091219 +DTEND;VALUE=DATE:20100104 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T135504Z +LAST-MODIFIED:20090111T135516Z +DTSTAMP:20090111T135516Z +UID:81b7377a-411a-4095-aa7a-2710a32e49c8 +SUMMARY:Foarjiersfakânsje +DTSTART;VALUE=DATE:20100220 +DTEND;VALUE=DATE:20100301 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T135538Z +LAST-MODIFIED:20090111T135557Z +DTSTAMP:20090111T135557Z +UID:f347b6a1-c7b2-42dc-82f4-458d744c59b8 +SUMMARY:Maaiefakânsje +DTSTART;VALUE=DATE:20100430 +DTEND;VALUE=DATE:20100510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T135643Z +LAST-MODIFIED:20090111T135652Z +DTSTAMP:20090111T135652Z +UID:164f9a4c-028a-45e3-9acf-d0983141faea +SUMMARY:Simmerfakânsje basisûnderwiis +DTSTART;VALUE=DATE:20100710 +DTEND;VALUE=DATE:20100823 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T135655Z +LAST-MODIFIED:20090111T135712Z +DTSTAMP:20090111T135712Z +UID:222cafbc-7638-4dc0-8868-7171c5872753 +SUMMARY:Simmerfakânsje foartset ûnderwiis +DTSTART;VALUE=DATE:20100710 +DTEND;VALUE=DATE:20100830 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T135749Z +LAST-MODIFIED:20090111T135802Z +DTSTAMP:20090111T135802Z +UID:0538c0ac-02a7-4242-9da8-6872da4782d2 +SUMMARY:Hjerstfakânsje +DTSTART;VALUE=DATE:20101023 +DTEND;VALUE=DATE:20101101 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T135823Z +LAST-MODIFIED:20090111T135836Z +DTSTAMP:20090111T135836Z +UID:fae0b6cf-a162-46bc-9e98-b207b6f2f855 +SUMMARY:Krystfakânsje +DTSTART;VALUE=DATE:20101218 +DTEND;VALUE=DATE:20110103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T135918Z +LAST-MODIFIED:20090111T135948Z +DTSTAMP:20090111T135948Z +UID:0e114a7f-080c-4ae6-90e8-d8bce8e9efe3 +SUMMARY:Foarjiersfakânsje +DTSTART;VALUE=DATE:20110219 +DTEND;VALUE=DATE:20110228 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T140002Z +LAST-MODIFIED:20090111T140020Z +DTSTAMP:20090111T140020Z +UID:2f90ff8e-906c-4890-8cc9-8ef179e5403f +SUMMARY:Maaiefakânsje +DTSTART;VALUE=DATE:20110430 +DTEND;VALUE=DATE:20110509 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T140045Z +LAST-MODIFIED:20090111T140109Z +DTSTAMP:20090111T140109Z +UID:9a2e6ffb-007c-41dd-a314-16233d25f3aa +SUMMARY:Simmerfakânsje basisûnderwiis +DTSTART;VALUE=DATE:20110723 +DTEND;VALUE=DATE:20110905 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090111T140113Z +LAST-MODIFIED:20090111T140128Z +DTSTAMP:20090111T140128Z +UID:68324912-1ece-4416-acaa-2f499b656f2d +SUMMARY:Simmerfakânsje foartset ûnderwiis +DTSTART;VALUE=DATE:20110716 +DTEND;VALUE=DATE:20110905 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/GermanHolidays.ics b/media/caldata/GermanHolidays.ics new file mode 100644 index 00000000000..591dd60af5c --- /dev/null +++ b/media/caldata/GermanHolidays.ics @@ -0,0 +1,1507 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +X-WR-CALNAME:GermanHolidays +X-WR-TIMEZONE:Europe/Berlin +BEGIN:VEVENT +CREATED:20061023T132503Z +LAST-MODIFIED:20101205T150148Z +DTSTAMP:20101205T150148Z +UID:928286484 +SUMMARY:Neujahr +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=1 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20060101 +DTEND;VALUE=DATE:20060102 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132503Z +LAST-MODIFIED:20101214T141313Z +DTSTAMP:20101214T141313Z +UID:917544590 +SUMMARY:Heilige drei Könige +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=1 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20060106 +DTEND;VALUE=DATE:20060107 +DESCRIPTION:Christlicher Feiertag. Nur in Baden-Württemberg\, Bayern und + Sachsen-Anhalt. +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132503Z +LAST-MODIFIED:20101205T150247Z +DTSTAMP:20101205T150247Z +UID:959125914 +SUMMARY:Valentinstag +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=2 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20060214 +DTEND;VALUE=DATE:20060215 +DESCRIPTION:Christlicher Feiertag. Kein gesetzlicher Feiertag. +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T150304Z +DTSTAMP:20101205T150304Z +UID:999463355 +SUMMARY:Tag der Arbeit +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=5 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20060501 +DTEND;VALUE=DATE:20060502 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T150318Z +DTSTAMP:20101205T150318Z +UID:942159081 +SUMMARY:Friedensfest +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=8 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20060808 +DTEND;VALUE=DATE:20060809 +DESCRIPTION:Gesetzlicher Feiertag. Nur in der Stadt Augsburg (Bayern) +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T150341Z +DTSTAMP:20101205T150341Z +UID:932572589 +SUMMARY:Tag der Deutschen Einheit +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=10 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20061003 +DTEND;VALUE=DATE:20061004 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T150445Z +DTSTAMP:20101205T150445Z +UID:915905148 +SUMMARY:Nikolaus +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=12 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20061206 +DTEND;VALUE=DATE:20061207 +DESCRIPTION:Christlicher Feiertag. Kein gesetzlicher Feiertag. +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T150458Z +DTSTAMP:20101205T150458Z +UID:031bd550-c8d9-11da-9d0c-a4805e40b203 +SUMMARY:Heiliger Abend +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=12 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20061224 +DTEND;VALUE=DATE:20061225 +DESCRIPTION:Christlicher Feiertag. Nicht arbeitsfrei. +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:97f269a0-c8d9-11da-b420-f5a1afe01740 +SUMMARY:Silvester +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=12 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20061231 +DTEND;VALUE=DATE:20070101 +DESCRIPTION:Nicht arbeitsfrei. +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:984536863 +SUMMARY:2. Weihnachtstag +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=12 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20061226 +DTEND;VALUE=DATE:20061227 +DESCRIPTION:Christlicher Feiertag. +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T150512Z +DTSTAMP:20101205T150512Z +UID:982967580 +SUMMARY:1. Weihnachtstag +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=12 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20061225 +DTEND;VALUE=DATE:20061226 +DESCRIPTION:Christlicher Feiertag. +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:ff3759b0-c8ee-11da-acd9-ed295e87b219 +SUMMARY:Aschermittwoch +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20100217 +DTEND;VALUE=DATE:20100218 +DESCRIPTION:Christlicher Feiertag. Nicht arbeitsfrei. +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:070612f0-c8ef-11da-a72d-a4583b6823fe +SUMMARY:Rosenmontag +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20100215 +DTEND;VALUE=DATE:20100216 +DESCRIPTION:Karneval +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:52620920-c8ef-11da-a67c-d07ee9c733e4 +SUMMARY:Palmsonntag +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20100328 +DTEND;VALUE=DATE:20100329 +DESCRIPTION:Christlicher Feiertag +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T145041Z +DTSTAMP:20101205T145041Z +UID:5e56c5b0-c8ef-11da-8df4-e73c3b84ba44 +SUMMARY:Karfreitag +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +DESCRIPTION:Christlicher Feiertag +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:6a6a1200-c8ef-11da-b7f6-ff38c79a62e9 +SUMMARY:Ostermontag +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +DESCRIPTION:Christlicher Feiertag. +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T145050Z +DTSTAMP:20101205T145050Z +UID:62922da0-c8ef-11da-9b1e-89902011e8d0 +SUMMARY:Ostern +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +DESCRIPTION:Christlicher Feiertag +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:d02b2f50-c8ef-11da-b2c4-cdec8effa193 +SUMMARY:Muttertag +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20100509 +DTEND;VALUE=DATE:20100510 +DESCRIPTION:Kein gesetzlicher Feiertag +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T145129Z +DTSTAMP:20101205T145129Z +UID:eb5b9260-c8ef-11da-bfcf-c21c54abaed3 +SUMMARY:Christi Himmelfahrt +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +DESCRIPTION:Christlicher Feiertag +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T145235Z +DTSTAMP:20101205T145235Z +UID:03e0e8a0-c8f0-11da-9d99-f7cd36abcaab +SUMMARY:Pfingsten +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +DESCRIPTION:Christlicher Feiertag +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T145228Z +DTSTAMP:20101205T145228Z +UID:23e890c0-c8f0-11da-b726-ab52813e8e91 +SUMMARY:Pfingstmontag +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20100524 +DTEND;VALUE=DATE:20100525 +DESCRIPTION:Christlicher Feiertag +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:25bf5800-c8f1-11da-8235-e09ac6e6ef93 +SUMMARY:Buß- und Bettag +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20101117 +DTEND;VALUE=DATE:20101118 +DESCRIPTION:Nur in Sachsen. +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:41baf700-c8f1-11da-99c7-ac5bd910ab27 +SUMMARY:Totensonntag +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20101121 +DTEND;VALUE=DATE:20101122 +DESCRIPTION:Christlicher Feiertag. +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:5d1dc740-c8f1-11da-89a1-cf8de886af1e +SUMMARY:Erster Advent +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20101128 +DTEND;VALUE=DATE:20101129 +DESCRIPTION:Christlicher Feiertag. +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:63792df0-c8f1-11da-92e9-91ca53599e3e +SUMMARY:Zweiter Advent +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20101205 +DTEND;VALUE=DATE:20101206 +DESCRIPTION:Christlicher Feiertag. +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:6c0d0660-c8f1-11da-b841-cd0b2b008a9c +SUMMARY:Dritter Advent +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20101212 +DTEND;VALUE=DATE:20101213 +DESCRIPTION:Christlicher Feiertag. +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:7418df20-c8f1-11da-ae80-910833c1dace +SUMMARY:Vierter Advent +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20101219 +DTEND;VALUE=DATE:20101220 +DESCRIPTION:Christlicher Feiertag. +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T150327Z +DTSTAMP:20101205T150327Z +UID:948278340 +SUMMARY:Mariä Himmelfahrt +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=8 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20060815 +DTEND;VALUE=DATE:20060816 +DESCRIPTION:Christlicher Feiertag. Nur im Saarland\, in Bayern nur in Geme + inden mit überwiegend\nkatholischer Bevölkerung. +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T150351Z +DTSTAMP:20101205T150351Z +UID:996398531 +SUMMARY:Reformationstag +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=10 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20061031 +DTEND;VALUE=DATE:20061101 +DESCRIPTION:Nur in Brandenburg\, Mecklenburg-Vorpommern\, Sachsen\, Sachse + n-Anhalt und Thüringen. +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20101205T150408Z +DTSTAMP:20101205T150408Z +UID:970745861 +SUMMARY:Allerheiligen +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYMONTH=11 +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20061101 +DTEND;VALUE=DATE:20061102 +DESCRIPTION:Christlicher Feiertag. Nur in Baden-Württemberg\, Bayern\, No + rdrhein-Westfalen\,\nRheinland-Pfalz und Saarland. +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20061023T132504Z +LAST-MODIFIED:20061023T132504Z +DTSTAMP:20061023T132504Z +UID:36c54940-c8f0-11da-8cb4-8d3d560e0bb7 +SUMMARY:Fronleichnam +STATUS:CONFIRMED +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20100603 +DTEND;VALUE=DATE:20100604 +DESCRIPTION:Christlicher Feiertag. Nur in Baden-Württemberg\, Bayern\, He + ssen\, Nordrhein-Westfalen\,\nRheinland-Pfalz\, Saarland\, Sachsen (teilwe + ise) und Thüringen (teilweise). +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T145713Z +LAST-MODIFIED:20101205T150110Z +DTSTAMP:20101205T150110Z +UID:15dee583-d1e3-4bbc-aaeb-158934765508 +SUMMARY:Volkstrauertag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20101114 +DTEND;VALUE=DATE:20101115 +DESCRIPTION:Kein gesetzlicher Feiertag +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T151023Z +LAST-MODIFIED:20101205T151314Z +DTSTAMP:20101205T151314Z +UID:94a730e3-6512-41b0-8773-d51c32d4371a +SUMMARY:Rosenmontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20110307 +DTEND;VALUE=DATE:20110308 +DESCRIPTION:Rosenmontag\nKarneval +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T151210Z +LAST-MODIFIED:20101205T151306Z +DTSTAMP:20101205T151306Z +UID:faf4de51-36b6-414f-9dc0-d69c8fe6ebd6 +SUMMARY:Aschermittwoch +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20110309 +DTEND;VALUE=DATE:20110310 +DESCRIPTION:Christlicher Feiertag. Nicht arbeitsfrei. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T114519Z +LAST-MODIFIED:20101208T114606Z +DTSTAMP:20101208T114606Z +UID:3ea63d76-6356-46ee-99cc-cba15ae66407 +SUMMARY:Ostermontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T114611Z +LAST-MODIFIED:20101208T114652Z +DTSTAMP:20101208T114652Z +UID:ccca9aca-2170-401c-ab6b-f2daa0e565f1 +SUMMARY:Palmsonntag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20110417 +DTEND;VALUE=DATE:20110418 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T114656Z +LAST-MODIFIED:20101208T114729Z +DTSTAMP:20101208T114729Z +UID:eae67c4f-341f-49cc-8ebc-9615dfaea764 +SUMMARY:Karfreitag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T114733Z +LAST-MODIFIED:20101208T114804Z +DTSTAMP:20101208T114804Z +UID:bdeed958-88f5-4400-8547-7b58b271e20a +SUMMARY:Ostern +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T114816Z +LAST-MODIFIED:20101208T114848Z +DTSTAMP:20101208T114848Z +UID:467d4efe-293b-4a01-9f0a-cb4d15bcf975 +SUMMARY:Muttertag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20110508 +DTEND;VALUE=DATE:20110509 +DESCRIPTION:Kein gesetzlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T114852Z +LAST-MODIFIED:20101208T114930Z +DTSTAMP:20101208T114930Z +UID:e6ae9f64-0eb3-4d5e-9657-cb942159ae03 +SUMMARY:Christi Himmelfahrt +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T114949Z +LAST-MODIFIED:20101208T115008Z +DTSTAMP:20101208T115008Z +UID:0d4297e0-f45f-4694-9368-fbeac842052a +SUMMARY:Pfingsten +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T115011Z +LAST-MODIFIED:20101208T115037Z +DTSTAMP:20101208T115037Z +UID:8f0b154f-9268-4c51-a30e-47cf6f8076f3 +SUMMARY:Pfingstmontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T115043Z +LAST-MODIFIED:20101208T115119Z +DTSTAMP:20101208T115119Z +UID:b1fb550a-dfb2-4241-a92e-bd0fd06030fc +SUMMARY:Fronleichnam +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20110623 +DTEND;VALUE=DATE:20110624 +DESCRIPTION:Christlicher Feiertag. Nur in Baden-Württemberg\, Bayern\, He + ssen\, Nordrhein-Westfalen\,\nRheinland-Pfalz\, Saarland\, Sachsen (teilwe + ise) und Thüringen (teilweise). +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T120756Z +LAST-MODIFIED:20101208T120819Z +DTSTAMP:20101208T120819Z +UID:5e88f764-0691-4815-a789-bc33e7632c5a +SUMMARY:Buß- und Bettag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20111116 +DTEND;VALUE=DATE:20111117 +DESCRIPTION:Nur in Sachsen +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T120826Z +LAST-MODIFIED:20101208T120853Z +DTSTAMP:20101208T120853Z +UID:8a584710-1741-4276-8601-1f9b5b9a1eda +SUMMARY:Volkstrauertag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20111113 +DTEND;VALUE=DATE:20111114 +DESCRIPTION:Kein gesetzlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T120857Z +LAST-MODIFIED:20101208T120923Z +DTSTAMP:20101208T120923Z +UID:8f51ff07-cc6d-4494-acff-662362af16da +SUMMARY:Totensonntag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20111120 +DTEND;VALUE=DATE:20111121 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T120927Z +LAST-MODIFIED:20101208T121000Z +DTSTAMP:20101208T121000Z +UID:5926c63a-2fdd-4078-9921-b577cb1de5b4 +SUMMARY:Erster Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20111127 +DTEND;VALUE=DATE:20111128 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T122629Z +LAST-MODIFIED:20101208T122651Z +DTSTAMP:20101208T122651Z +UID:fa9a193c-6db7-42ed-a724-f9feb1060f55 +SUMMARY:Zweiter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20111204 +DTEND;VALUE=DATE:20111205 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T122658Z +LAST-MODIFIED:20101208T122720Z +DTSTAMP:20101208T122720Z +UID:e2563df5-a82c-4c85-8954-4fb7f2f8e939 +SUMMARY:Dritter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20111211 +DTEND;VALUE=DATE:20111212 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T122724Z +LAST-MODIFIED:20101208T122740Z +DTSTAMP:20101208T122740Z +UID:411572e6-2deb-40b2-941e-0f28e62a8d59 +SUMMARY:Vierter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20111218 +DTEND;VALUE=DATE:20111219 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T122802Z +LAST-MODIFIED:20101208T122901Z +DTSTAMP:20101208T122901Z +UID:ce38c3a9-d83f-4ee2-b3c9-f1191b488afa +SUMMARY:Rosenmontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20120220 +DTEND;VALUE=DATE:20120221 +DESCRIPTION:Karneval +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101208T122903Z +LAST-MODIFIED:20101208T122952Z +DTSTAMP:20101208T122952Z +UID:155ff9e5-2c01-48e5-8036-0ac757853c7f +SUMMARY:Aschermittwoch +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20120222 +DTEND;VALUE=DATE:20120223 +DESCRIPTION:Christlicher Feiertag. Nicht arbeitsfrei. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101209T145347Z +LAST-MODIFIED:20101209T145415Z +DTSTAMP:20101209T145415Z +UID:78ce046b-6078-4f03-8a8e-cd9376a9981b +SUMMARY:Palmsonntag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20120401 +DTEND;VALUE=DATE:20120402 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101209T145420Z +LAST-MODIFIED:20101209T145437Z +DTSTAMP:20101209T145437Z +UID:7192a187-b0f2-4c88-80b4-4d751ce427bb +SUMMARY:Karfreitag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101209T145441Z +LAST-MODIFIED:20101209T145456Z +DTSTAMP:20101209T145456Z +UID:6b81dcb2-35cb-44e7-acb2-85d9ab1e38d6 +SUMMARY:Ostern +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101209T145458Z +LAST-MODIFIED:20101209T145517Z +DTSTAMP:20101209T145517Z +UID:f7ec9c03-1150-4267-bb8a-cf229502165f +SUMMARY:Ostermontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101209T145529Z +LAST-MODIFIED:20101209T145558Z +DTSTAMP:20101209T145558Z +UID:2d5afad2-df09-402c-8fae-c800a14b2802 +SUMMARY:Muttertag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20120513 +DTEND;VALUE=DATE:20120514 +DESCRIPTION:Kein gesetzlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101209T145607Z +LAST-MODIFIED:20101209T145630Z +DTSTAMP:20101209T145630Z +UID:199b3e65-cae5-4dc0-bd85-3bacf51fe6b2 +SUMMARY:Christi Himmelfahrt +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101209T145636Z +LAST-MODIFIED:20101209T145654Z +DTSTAMP:20101209T145654Z +UID:e564065e-aa6c-4af9-b198-72319d51381d +SUMMARY:Pfingsten +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20120527 +DTEND;VALUE=DATE:20120528 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101209T145658Z +LAST-MODIFIED:20101209T145712Z +DTSTAMP:20101209T145712Z +UID:3c18e1c8-79f6-4f6d-bf5d-4dc664e450ab +SUMMARY:Pfingstmontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20120528 +DTEND;VALUE=DATE:20120529 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101209T145718Z +LAST-MODIFIED:20101209T145751Z +DTSTAMP:20101209T145751Z +UID:70c4b344-c8db-414c-a3ed-69e9eab8f4d9 +SUMMARY:Fronleichnam +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20120607 +DTEND;VALUE=DATE:20120608 +DESCRIPTION:Christlicher Feiertag. Nur in Baden-Württemberg\, Bayern\, He + ssen\, Nordrhein-Westfalen\,\nRheinland-Pfalz\, Saarland\, Sachsen (teilwe + ise) und Thüringen (teilweise). +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101209T145856Z +LAST-MODIFIED:20101209T145923Z +DTSTAMP:20101209T145923Z +UID:286dd6f8-ff87-4ef9-b45b-5891c6540cdb +SUMMARY:Volkstrauertag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20121118 +DTEND;VALUE=DATE:20121119 +DESCRIPTION:Kein gesetzlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101209T145926Z +LAST-MODIFIED:20101209T150000Z +DTSTAMP:20101209T150000Z +UID:f5407bf1-67d5-45b8-bb4e-a3ed187600ed +SUMMARY:Buß- und Bettag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20121121 +DTEND;VALUE=DATE:20121122 +DESCRIPTION:Nur in Sachsen +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101209T150006Z +LAST-MODIFIED:20101209T150036Z +DTSTAMP:20101209T150036Z +UID:46f69da6-d054-4f5a-bd93-79078c6bac2f +SUMMARY:Totensonntag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20121125 +DTEND;VALUE=DATE:20121126 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T114415Z +LAST-MODIFIED:20101214T114440Z +DTSTAMP:20101214T114440Z +UID:55dcea5c-f251-448b-9d10-c58396c2ef04 +SUMMARY:Erster Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20121202 +DTEND;VALUE=DATE:20121203 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T114449Z +LAST-MODIFIED:20101214T114504Z +DTSTAMP:20101214T114504Z +UID:2285edba-4934-4abe-803d-c8f087bd47be +SUMMARY:Zweiter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20121209 +DTEND;VALUE=DATE:20121210 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T114507Z +LAST-MODIFIED:20101214T114523Z +DTSTAMP:20101214T114523Z +UID:2532de86-d8b1-4bb2-b2f0-bd117b446578 +SUMMARY:Dritter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20121216 +DTEND;VALUE=DATE:20121217 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T114525Z +LAST-MODIFIED:20101214T114544Z +DTSTAMP:20101214T114544Z +UID:cd3672ac-db86-4e33-b476-39c69fe6b937 +SUMMARY:Vierter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20121223 +DTEND;VALUE=DATE:20121224 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T114602Z +LAST-MODIFIED:20101214T114626Z +DTSTAMP:20101214T114626Z +UID:b1e3b5d3-ffa6-4dad-a662-720760b336f3 +SUMMARY:Rosenmontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20130211 +DTEND;VALUE=DATE:20130212 +DESCRIPTION:Karneval +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T114629Z +LAST-MODIFIED:20101214T114713Z +DTSTAMP:20101214T114713Z +UID:8ce10dfa-5edc-4285-8044-ecea0d5a8cc2 +SUMMARY:Aschermittwoch +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20130213 +DTEND;VALUE=DATE:20130214 +DESCRIPTION:Christlicher Feiertag. Nicht arbeitsfrei. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T114721Z +LAST-MODIFIED:20101214T114742Z +DTSTAMP:20101214T114742Z +UID:ab93ddc2-f1be-4f73-b57a-4baa00f97fa2 +SUMMARY:Palmsonntag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20130324 +DTEND;VALUE=DATE:20130325 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T114744Z +LAST-MODIFIED:20101214T114757Z +DTSTAMP:20101214T114757Z +UID:51296a45-1bc2-47db-b2d2-56a0b1e1c33b +SUMMARY:Karfreitag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T114759Z +LAST-MODIFIED:20101214T114813Z +DTSTAMP:20101214T114813Z +UID:c1d947b4-1351-40f3-b8e0-24cd4d35bad4 +SUMMARY:Ostern +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T114821Z +LAST-MODIFIED:20101214T114835Z +DTSTAMP:20101214T114835Z +UID:94a2c8b8-9d04-412e-be05-f2d30d483ce3 +SUMMARY:Ostermontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T114908Z +LAST-MODIFIED:20101214T114927Z +DTSTAMP:20101214T114927Z +UID:ae5dd4ab-9d1b-4708-9e95-e2531a7ae251 +SUMMARY:Christi Himmelfahrt +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T114931Z +LAST-MODIFIED:20101214T114955Z +DTSTAMP:20101214T114955Z +UID:228a8aee-0db2-42f8-9480-46f6671a3296 +SUMMARY:Muttertag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20130512 +DTEND;VALUE=DATE:20130513 +DESCRIPTION:Kein gesetzlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T115010Z +LAST-MODIFIED:20101214T115024Z +DTSTAMP:20101214T115024Z +UID:f38bd233-2ab3-4754-a420-76d182aae225 +SUMMARY:Pfingsten +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T115026Z +LAST-MODIFIED:20101214T115041Z +DTSTAMP:20101214T115041Z +UID:34e445d3-3d39-421e-b75d-60d5b4592f85 +SUMMARY:Pfingstmontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20130520 +DTEND;VALUE=DATE:20130521 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T115043Z +LAST-MODIFIED:20101214T115116Z +DTSTAMP:20101214T115116Z +UID:c4de04ea-c7f1-423a-97ea-af7931427d42 +SUMMARY:Fronleichnam +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20130530 +DTEND;VALUE=DATE:20130531 +DESCRIPTION:Christlicher Feiertag. Nur in Baden-Württemberg\, Bayern\, He + ssen\, Nordrhein-Westfalen\,\nRheinland-Pfalz\, Saarland\, Sachsen (teilwe + ise) und Thüringen (teilweise).\n +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T115203Z +LAST-MODIFIED:20101214T115226Z +DTSTAMP:20101214T115226Z +UID:e8782116-a554-4107-a44c-d150a9f8bf38 +SUMMARY:Volkstrauertag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20131117 +DTEND;VALUE=DATE:20131118 +DESCRIPTION:Kein gesetzlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T115243Z +LAST-MODIFIED:20101214T115301Z +DTSTAMP:20101214T115301Z +UID:01f6c271-a2bb-4431-8f22-9e5139a109e8 +SUMMARY:Buß- und Bettag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20131120 +DTEND;VALUE=DATE:20131121 +DESCRIPTION:Nur in Sachsen +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T115314Z +LAST-MODIFIED:20101214T115328Z +DTSTAMP:20101214T115328Z +UID:9e4fe7c3-447f-42e9-a78c-f9e4d2e7157a +SUMMARY:Totensonntag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20131124 +DTEND;VALUE=DATE:20131125 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T115330Z +LAST-MODIFIED:20101214T115344Z +DTSTAMP:20101214T115344Z +UID:59ad8edd-782a-4a74-9442-2cc6fe296f95 +SUMMARY:Erster Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20131201 +DTEND;VALUE=DATE:20131202 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T115350Z +LAST-MODIFIED:20101214T125525Z +DTSTAMP:20101214T125525Z +UID:e52ef2cc-a60d-4404-b73d-9f789ffc09ca +SUMMARY:Zweiter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20131208 +DTEND;VALUE=DATE:20131209 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T115404Z +LAST-MODIFIED:20101214T115419Z +DTSTAMP:20101214T115419Z +UID:a992a714-b339-4bb1-9bf6-c542d60c928b +SUMMARY:Dritter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20131215 +DTEND;VALUE=DATE:20131216 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T115421Z +LAST-MODIFIED:20101214T115434Z +DTSTAMP:20101214T115434Z +UID:33bd92bd-1e53-475c-a59e-1fc758b88a3a +SUMMARY:Vierter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20131222 +DTEND;VALUE=DATE:20131223 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T123319Z +LAST-MODIFIED:20101214T123343Z +DTSTAMP:20101214T123343Z +UID:566584b7-85a3-4dc6-ba10-c093b77ac6f0 +SUMMARY:Rosenmontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20140303 +DTEND;VALUE=DATE:20140304 +DESCRIPTION:Karneval +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T123346Z +LAST-MODIFIED:20101214T123409Z +DTSTAMP:20101214T123409Z +UID:f4896b7b-65b3-4aed-bda7-08c3cbbc1c07 +SUMMARY:Aschermittwoch +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20140305 +DTEND;VALUE=DATE:20140306 +DESCRIPTION:Christlicher Feiertag. Nicht arbeitsfrei. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T123422Z +LAST-MODIFIED:20101214T123445Z +DTSTAMP:20101214T123445Z +UID:e7f2816c-28e0-4b2b-9fb1-54f07422c445 +SUMMARY:Palmsonntag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20140413 +DTEND;VALUE=DATE:20140414 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T123448Z +LAST-MODIFIED:20101214T123501Z +DTSTAMP:20101214T123501Z +UID:14bd91b2-157c-485a-bd7e-17886f74af41 +SUMMARY:Karfreitag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T123513Z +LAST-MODIFIED:20101214T123527Z +DTSTAMP:20101214T123527Z +UID:05e7d179-be95-457b-9bb7-558833bb8213 +SUMMARY:Ostern +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T123529Z +LAST-MODIFIED:20101214T123541Z +DTSTAMP:20101214T123541Z +UID:e7baf5f9-4b04-41e2-a2ad-1bb78d6da734 +SUMMARY:Ostermontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T123635Z +LAST-MODIFIED:20101214T123655Z +DTSTAMP:20101214T123655Z +UID:517f47d2-706c-4373-ac0a-30b8721a6d96 +SUMMARY:Muttertag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20140511 +DTEND;VALUE=DATE:20140512 +DESCRIPTION:Kein gesetzlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T123707Z +LAST-MODIFIED:20101214T123731Z +DTSTAMP:20101214T123731Z +UID:87547d9e-667e-4462-8589-abb73f82db12 +SUMMARY:Christi Himmelfahrt +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20140529 +DTEND;VALUE=DATE:20140530 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T123754Z +LAST-MODIFIED:20101214T123808Z +DTSTAMP:20101214T123808Z +UID:903646bc-c595-4528-a2a5-69bf8282889f +SUMMARY:Pfingsten +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20140608 +DTEND;VALUE=DATE:20140609 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T123810Z +LAST-MODIFIED:20101214T123823Z +DTSTAMP:20101214T123823Z +UID:d6089f35-d103-4328-812c-bc4b7c687b74 +SUMMARY:Pfingstmontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20140609 +DTEND;VALUE=DATE:20140610 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T123838Z +LAST-MODIFIED:20101214T123900Z +DTSTAMP:20101214T123900Z +UID:0f5c466e-9cd0-4df5-887f-5bff1b3ce58a +SUMMARY:Fronleichnam +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20140619 +DTEND;VALUE=DATE:20140620 +DESCRIPTION:Christlicher Feiertag. Nur in Baden-Württemberg\, Bayern\, He + ssen\, Nordrhein-Westfalen\,\nRheinland-Pfalz\, Saarland\, Sachsen (teilwe + ise) und Thüringen (teilweise). +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T123936Z +LAST-MODIFIED:20101214T123955Z +DTSTAMP:20101214T123955Z +UID:7b5084e3-15a5-4cbc-89b5-3e0b7ec8ec10 +SUMMARY:Buß- und Bettag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20141119 +DTEND;VALUE=DATE:20141120 +DESCRIPTION:Nur in Sachsen +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124009Z +LAST-MODIFIED:20101214T124027Z +DTSTAMP:20101214T124027Z +UID:7fc525da-9482-4022-b395-0adcb3b67bde +SUMMARY:Volkstrauertag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20141116 +DTEND;VALUE=DATE:20141117 +DESCRIPTION:Kein gesetzlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124044Z +LAST-MODIFIED:20101214T124105Z +DTSTAMP:20101214T124105Z +UID:387acb56-b3a4-410b-9d16-2b964919ff17 +SUMMARY:Totensonntag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20141123 +DTEND;VALUE=DATE:20141124 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124109Z +LAST-MODIFIED:20101214T124121Z +DTSTAMP:20101214T124121Z +UID:977cc2fd-f635-4570-93d9-ebdc0e7eba1d +SUMMARY:Erster Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20141130 +DTEND;VALUE=DATE:20141201 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124133Z +LAST-MODIFIED:20101214T124147Z +DTSTAMP:20101214T124147Z +UID:8c5c9ad5-1165-4cd3-89a9-627466adc2db +SUMMARY:Zweiter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20141207 +DTEND;VALUE=DATE:20141208 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124148Z +LAST-MODIFIED:20101214T124201Z +DTSTAMP:20101214T124201Z +UID:29dfcdb3-84cd-4e69-8d90-025e7cf9a523 +SUMMARY:Dritter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20141214 +DTEND;VALUE=DATE:20141215 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124202Z +LAST-MODIFIED:20101214T124213Z +DTSTAMP:20101214T124213Z +UID:c13b3803-ff14-4e05-97b7-b5d174c809dc +SUMMARY:Vierter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20141221 +DTEND;VALUE=DATE:20141222 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124242Z +LAST-MODIFIED:20101214T124300Z +DTSTAMP:20101214T124300Z +UID:504b47ed-51dd-40cb-8e86-c3d1c8da5fb3 +SUMMARY:Rosenmontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20150216 +DTEND;VALUE=DATE:20150217 +DESCRIPTION:Karneval +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124308Z +LAST-MODIFIED:20101214T124321Z +DTSTAMP:20101214T124321Z +UID:b7f15513-03da-4c83-9600-6a6e30c3f921 +SUMMARY:Aschermittwoch +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20150218 +DTEND;VALUE=DATE:20150219 +DESCRIPTION:Christlicher Feiertag. Nicht arbeitsfrei. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124340Z +LAST-MODIFIED:20101214T124403Z +DTSTAMP:20101214T124403Z +UID:0a43df68-772c-48e1-8c54-2821bf1a2584 +SUMMARY:Palmsonntag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20150329 +DTEND;VALUE=DATE:20150330 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124413Z +LAST-MODIFIED:20101214T124426Z +DTSTAMP:20101214T124426Z +UID:71eb7825-0e36-4af8-81d1-dd20e488b1a8 +SUMMARY:Karfreitag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124429Z +LAST-MODIFIED:20101214T124438Z +DTSTAMP:20101214T124438Z +UID:b0b3f77b-b259-4849-8a04-336f42a8091b +SUMMARY:Ostern +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124523Z +LAST-MODIFIED:20101214T124536Z +DTSTAMP:20101214T124536Z +UID:cd55f40f-e35e-41c4-826e-c08b0d75b6a1 +SUMMARY:Ostermontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124550Z +LAST-MODIFIED:20101214T124610Z +DTSTAMP:20101214T124610Z +UID:0c3b66c5-f439-4e2f-bfe9-3b943dc5b2ff +SUMMARY:Muttertag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20150510 +DTEND;VALUE=DATE:20150511 +DESCRIPTION:Kein gesetzlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124623Z +LAST-MODIFIED:20101214T124642Z +DTSTAMP:20101214T124642Z +UID:669904c0-9576-44b2-aa63-53f26ae44100 +SUMMARY:Christi Himmelfahrt +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20150514 +DTEND;VALUE=DATE:20150515 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124649Z +LAST-MODIFIED:20101214T124709Z +DTSTAMP:20101214T124709Z +UID:aaf9d355-589a-4575-bfaf-741ea6a05702 +SUMMARY:Pfingsten +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20150524 +DTEND;VALUE=DATE:20150525 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124711Z +LAST-MODIFIED:20101214T124726Z +DTSTAMP:20101214T124726Z +UID:94f53fb4-a700-4128-a2d3-a681befa4be3 +SUMMARY:Pfingstmontag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20150525 +DTEND;VALUE=DATE:20150526 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124738Z +LAST-MODIFIED:20101214T124759Z +DTSTAMP:20101214T124759Z +UID:2b3ec09f-a207-4356-b739-b997bc40a938 +SUMMARY:Fronleichnam +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20150604 +DTEND;VALUE=DATE:20150605 +DESCRIPTION:Christlicher Feiertag. Nur in Baden-Württemberg\, Bayern\, He + ssen\, Nordrhein-Westfalen\,\nRheinland-Pfalz\, Saarland\, Sachsen (teilwe + ise) und Thüringen (teilweise). +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124820Z +LAST-MODIFIED:20101214T124834Z +DTSTAMP:20101214T124834Z +UID:f96cc9da-50e8-48d9-83df-388d5fc5ae20 +SUMMARY:Buß- und Bettag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20151118 +DTEND;VALUE=DATE:20151119 +DESCRIPTION:Nur in Sachsen +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124841Z +LAST-MODIFIED:20101214T124900Z +DTSTAMP:20101214T124900Z +UID:f49a6a2d-f5a2-4bfe-bc1f-479b2dbd687a +SUMMARY:Volkstrauertag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20151115 +DTEND;VALUE=DATE:20151116 +DESCRIPTION:Kein gesetzlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124911Z +LAST-MODIFIED:20101214T124936Z +DTSTAMP:20101214T124936Z +UID:d0da5e2a-dbc3-4bee-8465-aa0935989a85 +SUMMARY:Totensonntag +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20151122 +DTEND;VALUE=DATE:20151123 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124941Z +LAST-MODIFIED:20101214T124953Z +DTSTAMP:20101214T124953Z +UID:82dc91b7-b1a6-47fa-aceb-1c3183502603 +SUMMARY:Erster Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20151129 +DTEND;VALUE=DATE:20151130 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T124957Z +LAST-MODIFIED:20101214T125009Z +DTSTAMP:20101214T125009Z +UID:c535e762-b8a1-4414-a623-6e833e1dacd0 +SUMMARY:Zweiter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20151206 +DTEND;VALUE=DATE:20151207 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101214T125014Z +LAST-MODIFIED:20101214T125027Z +DTSTAMP:20101214T125027Z +UID:50af7ba7-e511-4430-a290-a3c283969bcf +SUMMARY:Dritter Advent +CATEGORIES:Feiertag +DTSTART;VALUE=DATE:20151213 +DTEND;VALUE=DATE:20151214 +DESCRIPTION:Christlicher Feiertag +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/GreeceHolidays.ics b/media/caldata/GreeceHolidays.ics new file mode 100644 index 00000000000..aa8f5c78823 --- /dev/null +++ b/media/caldata/GreeceHolidays.ics @@ -0,0 +1,7533 @@ +BEGIN:VCALENDAR +METHOD:PUBLISH +X-WR-TIMEZONE:Europe/Athens +CALSCALE:GREGORIAN +X-WR-CALNAME:Greek Holidays +VERSION:2.0.1 + + +BEGIN:VEVENT +SUMMARY:Βασιλείου +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:20110102 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοφάνια +DTSTART;VALUE=DATE:20110106 +DTEND;VALUE=DATE:20110107 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Ιωάννου Προδρόμου +DTSTART;VALUE=DATE:20110107 +DTEND;VALUE=DATE:20110108 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αντωνίου +DTSTART;VALUE=DATE:20110117 +DTEND;VALUE=DATE:20110118 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αθανασίου +DTSTART;VALUE=DATE:20110118 +DTEND;VALUE=DATE:20110119 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Διονυσίου του εν Ολύμπω +DTSTART;VALUE=DATE:20110123 +DTEND;VALUE=DATE:20110124 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τριών Ιεραρχών +DTSTART;VALUE=DATE:20110130 +DTEND;VALUE=DATE:20110131 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Χαραλάμπους +DTSTART;VALUE=DATE:20110210 +DTEND;VALUE=DATE:20110211 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Ευδοκίας +DTSTART;VALUE=DATE:20110301 +DTEND;VALUE=DATE:20110302 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Εθνική εορτή +DTSTART;VALUE=DATE:20110325 +DTEND;VALUE=DATE:20110326 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πρωτομαγιά +DTSTART;VALUE=DATE:20110501 +DTEND;VALUE=DATE:20110502 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κωνσταντίνου και Ελένης +DTSTART;VALUE=DATE:20110521 +DTEND;VALUE=DATE:20110522 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πέτρου και Παύλου +DTSTART;VALUE=DATE:20110629 +DTEND;VALUE=DATE:20110630 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Των 12 Αποστόλων +DTSTART;VALUE=DATE:20110630 +DTEND;VALUE=DATE:20110701 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κοσμά και Δαμιανού\, Αναργύρων +DTSTART;VALUE=DATE:20110701 +DTEND;VALUE=DATE:20110702 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακής +DTSTART;VALUE=DATE:20110707 +DTEND;VALUE=DATE:20110708 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Ευφημίας, Όλγας +DTSTART;VALUE=DATE:20110711 +DTEND;VALUE=DATE:20110712 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Ηλία +DTSTART;VALUE=DATE:20110720 +DTEND;VALUE=DATE:20110721 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Παρασκευής +DTSTART;VALUE=DATE:20110726 +DTEND;VALUE=DATE:20110727 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αλεξάνδρου +DTSTART;VALUE=DATE:20110730 +DTEND;VALUE=DATE:20110731 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Mεταμόρφωση Σωτήρος +DTSTART;VALUE=DATE:20110806 +DTEND;VALUE=DATE:20110807 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κοίμηση Θεοτόκου +DTSTART;VALUE=DATE:20110815 +DTEND;VALUE=DATE:20110816 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Ύψωσις Τίμιου Σταυρού +DTSTART;VALUE=DATE:20110914 +DTEND;VALUE=DATE:20110915 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Σοφίας\, Πίστης\, Ελπίδος +DTSTART;VALUE=DATE:20110917 +DTEND;VALUE=DATE:20110918 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Ευσταθίου +DTSTART;VALUE=DATE:20110920 +DTEND;VALUE=DATE:20110921 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Διονυσίου +DTSTART;VALUE=DATE:20111003 +DTEND;VALUE=DATE:20111004 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Λουκά +DTSTART;VALUE=DATE:20111018 +DTEND;VALUE=DATE:20111019 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αρτεμίου +DTSTART;VALUE=DATE:20111020 +DTEND;VALUE=DATE:20111021 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δημητρίου +DTSTART;VALUE=DATE:20111026 +DTEND;VALUE=DATE:20111027 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Εθνική εορτή +DTSTART;VALUE=DATE:20111028 +DTEND;VALUE=DATE:20111029 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κοσμά και Δαμιανού\, Αναργύρων +DTSTART;VALUE=DATE:20111101 +DTEND;VALUE=DATE:20111102 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μιχαήλ και Γαβριήλ\, Αρχαγγέλων +DTSTART;VALUE=DATE:20111108 +DTEND;VALUE=DATE:20111109 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Ηρώων Πολυτεχνείου +DTSTART;VALUE=DATE:20111117 +DTEND;VALUE=DATE:20111118 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αικατερίνης +DTSTART;VALUE=DATE:20111125 +DTEND;VALUE=DATE:20111126 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Στυλιανού +DTSTART;VALUE=DATE:20111126 +DTEND;VALUE=DATE:20111127 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Ανδρέου +DTSTART;VALUE=DATE:20111130 +DTEND;VALUE=DATE:20111201 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Βαρβάρας +DTSTART;VALUE=DATE:20111204 +DTEND;VALUE=DATE:20111205 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Σάββα +DTSTART;VALUE=DATE:20111205 +DTEND;VALUE=DATE:20111206 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Νικολάου +DTSTART;VALUE=DATE:20111206 +DTEND;VALUE=DATE:20111207 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Άννης +DTSTART;VALUE=DATE:20111209 +DTEND;VALUE=DATE:20111210 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μηνά +DTSTART;VALUE=DATE:20111210 +DTEND;VALUE=DATE:20111211 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Σπυρίδωνος +DTSTART;VALUE=DATE:20111212 +DTEND;VALUE=DATE:20111213 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Ελευθερίου +DTSTART;VALUE=DATE:20111215 +DTEND;VALUE=DATE:20111216 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Διονυσίου Ζακύνθου +DTSTART;VALUE=DATE:20111217 +DTEND;VALUE=DATE:20111218 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναστασίας +DTSTART;VALUE=DATE:20111222 +DTEND;VALUE=DATE:20111223 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Χριστούγεννα +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111226 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Ευγενίας +DTSTART;VALUE=DATE:20111226 +DTEND;VALUE=DATE:20111227 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Στεφάνου +DTSTART;VALUE=DATE:20111227 +DTEND;VALUE=DATE:20111228 +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19780302 +DTEND;VALUE=DATE:19780303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19780313 +DTEND;VALUE=DATE:19780314 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19780317 +DTEND;VALUE=DATE:19780318 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19780318 +DTEND;VALUE=DATE:19780319 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19780319 +DTEND;VALUE=DATE:19780320 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19780423 +DTEND;VALUE=DATE:19780424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19780428 +DTEND;VALUE=DATE:19780429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19780430 +DTEND;VALUE=DATE:19780501 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19780501 +DTEND;VALUE=DATE:19780502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19780507 +DTEND;VALUE=DATE:19780508 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19780608 +DTEND;VALUE=DATE:19780609 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19780618 +DTEND;VALUE=DATE:19780619 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19780619 +DTEND;VALUE=DATE:19780620 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19780625 +DTEND;VALUE=DATE:19780626 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19780501 +DTEND;VALUE=DATE:19780502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19790222 +DTEND;VALUE=DATE:19790223 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19790305 +DTEND;VALUE=DATE:19790306 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19790309 +DTEND;VALUE=DATE:19790310 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19790310 +DTEND;VALUE=DATE:19790311 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19790311 +DTEND;VALUE=DATE:19790312 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19790415 +DTEND;VALUE=DATE:19790416 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19790420 +DTEND;VALUE=DATE:19790421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19790422 +DTEND;VALUE=DATE:19790423 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19790423 +DTEND;VALUE=DATE:19790424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19790429 +DTEND;VALUE=DATE:19790430 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19790531 +DTEND;VALUE=DATE:19790601 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19790610 +DTEND;VALUE=DATE:19790611 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19790611 +DTEND;VALUE=DATE:19790612 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19790617 +DTEND;VALUE=DATE:19790618 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19790423 +DTEND;VALUE=DATE:19790424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19800207 +DTEND;VALUE=DATE:19800208 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19800218 +DTEND;VALUE=DATE:19800219 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19800222 +DTEND;VALUE=DATE:19800223 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19800223 +DTEND;VALUE=DATE:19800224 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19800224 +DTEND;VALUE=DATE:19800225 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19800330 +DTEND;VALUE=DATE:19800331 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19800404 +DTEND;VALUE=DATE:19800405 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19800406 +DTEND;VALUE=DATE:19800407 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19800407 +DTEND;VALUE=DATE:19800408 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19800413 +DTEND;VALUE=DATE:19800414 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19800515 +DTEND;VALUE=DATE:19800516 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19800525 +DTEND;VALUE=DATE:19800526 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19800526 +DTEND;VALUE=DATE:19800527 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19800601 +DTEND;VALUE=DATE:19800602 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19800423 +DTEND;VALUE=DATE:19800424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19810226 +DTEND;VALUE=DATE:19810227 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19810309 +DTEND;VALUE=DATE:19810310 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19810313 +DTEND;VALUE=DATE:19810314 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19810314 +DTEND;VALUE=DATE:19810315 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19810315 +DTEND;VALUE=DATE:19810316 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19810419 +DTEND;VALUE=DATE:19810420 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19810424 +DTEND;VALUE=DATE:19810425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19810426 +DTEND;VALUE=DATE:19810427 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19810427 +DTEND;VALUE=DATE:19810428 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19810503 +DTEND;VALUE=DATE:19810504 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19810604 +DTEND;VALUE=DATE:19810605 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19810614 +DTEND;VALUE=DATE:19810615 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19810615 +DTEND;VALUE=DATE:19810616 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19810621 +DTEND;VALUE=DATE:19810622 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19810427 +DTEND;VALUE=DATE:19810428 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19820218 +DTEND;VALUE=DATE:19820219 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19820301 +DTEND;VALUE=DATE:19820302 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19820305 +DTEND;VALUE=DATE:19820306 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19820306 +DTEND;VALUE=DATE:19820307 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19820307 +DTEND;VALUE=DATE:19820308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19820411 +DTEND;VALUE=DATE:19820412 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19820416 +DTEND;VALUE=DATE:19820417 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19820418 +DTEND;VALUE=DATE:19820419 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19820419 +DTEND;VALUE=DATE:19820420 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19820425 +DTEND;VALUE=DATE:19820426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19820527 +DTEND;VALUE=DATE:19820528 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19820606 +DTEND;VALUE=DATE:19820607 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19820607 +DTEND;VALUE=DATE:19820608 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19820613 +DTEND;VALUE=DATE:19820614 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19820423 +DTEND;VALUE=DATE:19820424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19830310 +DTEND;VALUE=DATE:19830311 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19830321 +DTEND;VALUE=DATE:19830322 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19830325 +DTEND;VALUE=DATE:19830326 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19830326 +DTEND;VALUE=DATE:19830327 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19830327 +DTEND;VALUE=DATE:19830328 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19830501 +DTEND;VALUE=DATE:19830502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19830506 +DTEND;VALUE=DATE:19830507 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19830508 +DTEND;VALUE=DATE:19830509 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19830509 +DTEND;VALUE=DATE:19830510 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19830515 +DTEND;VALUE=DATE:19830516 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19830616 +DTEND;VALUE=DATE:19830617 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19830626 +DTEND;VALUE=DATE:19830627 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19830627 +DTEND;VALUE=DATE:19830628 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19830703 +DTEND;VALUE=DATE:19830704 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19830509 +DTEND;VALUE=DATE:19830510 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19840223 +DTEND;VALUE=DATE:19840224 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19840305 +DTEND;VALUE=DATE:19840306 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19840309 +DTEND;VALUE=DATE:19840310 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19840310 +DTEND;VALUE=DATE:19840311 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19840311 +DTEND;VALUE=DATE:19840312 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19840415 +DTEND;VALUE=DATE:19840416 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19840420 +DTEND;VALUE=DATE:19840421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19840422 +DTEND;VALUE=DATE:19840423 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19840423 +DTEND;VALUE=DATE:19840424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19840429 +DTEND;VALUE=DATE:19840430 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19840531 +DTEND;VALUE=DATE:19840601 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19840610 +DTEND;VALUE=DATE:19840611 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19840611 +DTEND;VALUE=DATE:19840612 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19840617 +DTEND;VALUE=DATE:19840618 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19840423 +DTEND;VALUE=DATE:19840424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19850214 +DTEND;VALUE=DATE:19850215 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19850225 +DTEND;VALUE=DATE:19850226 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19850301 +DTEND;VALUE=DATE:19850302 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19850302 +DTEND;VALUE=DATE:19850303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19850303 +DTEND;VALUE=DATE:19850304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19850407 +DTEND;VALUE=DATE:19850408 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19850412 +DTEND;VALUE=DATE:19850413 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19850414 +DTEND;VALUE=DATE:19850415 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19850415 +DTEND;VALUE=DATE:19850416 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19850421 +DTEND;VALUE=DATE:19850422 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19850523 +DTEND;VALUE=DATE:19850524 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19850602 +DTEND;VALUE=DATE:19850603 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19850603 +DTEND;VALUE=DATE:19850604 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19850609 +DTEND;VALUE=DATE:19850610 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19850423 +DTEND;VALUE=DATE:19850424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19860306 +DTEND;VALUE=DATE:19860307 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19860317 +DTEND;VALUE=DATE:19860318 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19860321 +DTEND;VALUE=DATE:19860322 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19860322 +DTEND;VALUE=DATE:19860323 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19860323 +DTEND;VALUE=DATE:19860324 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19860427 +DTEND;VALUE=DATE:19860428 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19860502 +DTEND;VALUE=DATE:19860503 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19860504 +DTEND;VALUE=DATE:19860505 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19860505 +DTEND;VALUE=DATE:19860506 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19860511 +DTEND;VALUE=DATE:19860512 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19860612 +DTEND;VALUE=DATE:19860613 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19860622 +DTEND;VALUE=DATE:19860623 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19860623 +DTEND;VALUE=DATE:19860624 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19860629 +DTEND;VALUE=DATE:19860630 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19860505 +DTEND;VALUE=DATE:19860506 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19870219 +DTEND;VALUE=DATE:19870220 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19870302 +DTEND;VALUE=DATE:19870303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19870306 +DTEND;VALUE=DATE:19870307 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19870307 +DTEND;VALUE=DATE:19870308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19870308 +DTEND;VALUE=DATE:19870309 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19870412 +DTEND;VALUE=DATE:19870413 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19870417 +DTEND;VALUE=DATE:19870418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19870419 +DTEND;VALUE=DATE:19870420 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19870420 +DTEND;VALUE=DATE:19870421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19870426 +DTEND;VALUE=DATE:19870427 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19870528 +DTEND;VALUE=DATE:19870529 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19870607 +DTEND;VALUE=DATE:19870608 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19870608 +DTEND;VALUE=DATE:19870609 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19870614 +DTEND;VALUE=DATE:19870615 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19870423 +DTEND;VALUE=DATE:19870424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19880211 +DTEND;VALUE=DATE:19880212 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19880222 +DTEND;VALUE=DATE:19880223 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19880226 +DTEND;VALUE=DATE:19880227 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19880227 +DTEND;VALUE=DATE:19880228 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19880228 +DTEND;VALUE=DATE:19880229 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19880403 +DTEND;VALUE=DATE:19880404 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19880408 +DTEND;VALUE=DATE:19880409 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19880410 +DTEND;VALUE=DATE:19880411 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19880411 +DTEND;VALUE=DATE:19880412 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19880417 +DTEND;VALUE=DATE:19880418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19880519 +DTEND;VALUE=DATE:19880520 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19880529 +DTEND;VALUE=DATE:19880530 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19880530 +DTEND;VALUE=DATE:19880531 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19880605 +DTEND;VALUE=DATE:19880606 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19880423 +DTEND;VALUE=DATE:19880424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19890302 +DTEND;VALUE=DATE:19890303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19890313 +DTEND;VALUE=DATE:19890314 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19890317 +DTEND;VALUE=DATE:19890318 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19890318 +DTEND;VALUE=DATE:19890319 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19890319 +DTEND;VALUE=DATE:19890320 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19890423 +DTEND;VALUE=DATE:19890424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19890428 +DTEND;VALUE=DATE:19890429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19890430 +DTEND;VALUE=DATE:19890501 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19890501 +DTEND;VALUE=DATE:19890502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19890507 +DTEND;VALUE=DATE:19890508 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19890608 +DTEND;VALUE=DATE:19890609 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19890618 +DTEND;VALUE=DATE:19890619 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19890619 +DTEND;VALUE=DATE:19890620 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19890625 +DTEND;VALUE=DATE:19890626 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19890501 +DTEND;VALUE=DATE:19890502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19900215 +DTEND;VALUE=DATE:19900216 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19900226 +DTEND;VALUE=DATE:19900227 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19900302 +DTEND;VALUE=DATE:19900303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19900303 +DTEND;VALUE=DATE:19900304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19900304 +DTEND;VALUE=DATE:19900305 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19900408 +DTEND;VALUE=DATE:19900409 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19900413 +DTEND;VALUE=DATE:19900414 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19900415 +DTEND;VALUE=DATE:19900416 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19900416 +DTEND;VALUE=DATE:19900417 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19900422 +DTEND;VALUE=DATE:19900423 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19900524 +DTEND;VALUE=DATE:19900525 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19900603 +DTEND;VALUE=DATE:19900604 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19900604 +DTEND;VALUE=DATE:19900605 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19900610 +DTEND;VALUE=DATE:19900611 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19900423 +DTEND;VALUE=DATE:19900424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19910207 +DTEND;VALUE=DATE:19910208 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19910218 +DTEND;VALUE=DATE:19910219 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19910222 +DTEND;VALUE=DATE:19910223 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19910223 +DTEND;VALUE=DATE:19910224 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19910224 +DTEND;VALUE=DATE:19910225 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19910331 +DTEND;VALUE=DATE:19910401 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19910405 +DTEND;VALUE=DATE:19910406 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19910407 +DTEND;VALUE=DATE:19910408 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19910408 +DTEND;VALUE=DATE:19910409 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19910414 +DTEND;VALUE=DATE:19910415 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19910516 +DTEND;VALUE=DATE:19910517 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19910526 +DTEND;VALUE=DATE:19910527 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19910527 +DTEND;VALUE=DATE:19910528 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19910602 +DTEND;VALUE=DATE:19910603 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19910423 +DTEND;VALUE=DATE:19910424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19920227 +DTEND;VALUE=DATE:19920228 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19920309 +DTEND;VALUE=DATE:19920310 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19920313 +DTEND;VALUE=DATE:19920314 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19920314 +DTEND;VALUE=DATE:19920315 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19920315 +DTEND;VALUE=DATE:19920316 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19920419 +DTEND;VALUE=DATE:19920420 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19920424 +DTEND;VALUE=DATE:19920425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19920426 +DTEND;VALUE=DATE:19920427 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19920427 +DTEND;VALUE=DATE:19920428 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19920503 +DTEND;VALUE=DATE:19920504 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19920604 +DTEND;VALUE=DATE:19920605 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19920614 +DTEND;VALUE=DATE:19920615 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19920615 +DTEND;VALUE=DATE:19920616 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19920621 +DTEND;VALUE=DATE:19920622 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19920427 +DTEND;VALUE=DATE:19920428 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19930218 +DTEND;VALUE=DATE:19930219 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19930301 +DTEND;VALUE=DATE:19930302 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19930305 +DTEND;VALUE=DATE:19930306 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19930306 +DTEND;VALUE=DATE:19930307 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19930307 +DTEND;VALUE=DATE:19930308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19930411 +DTEND;VALUE=DATE:19930412 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19930416 +DTEND;VALUE=DATE:19930417 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19930418 +DTEND;VALUE=DATE:19930419 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19930419 +DTEND;VALUE=DATE:19930420 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19930425 +DTEND;VALUE=DATE:19930426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19930527 +DTEND;VALUE=DATE:19930528 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19930606 +DTEND;VALUE=DATE:19930607 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19930607 +DTEND;VALUE=DATE:19930608 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19930613 +DTEND;VALUE=DATE:19930614 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19930423 +DTEND;VALUE=DATE:19930424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19940303 +DTEND;VALUE=DATE:19940304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19940314 +DTEND;VALUE=DATE:19940315 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19940318 +DTEND;VALUE=DATE:19940319 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19940319 +DTEND;VALUE=DATE:19940320 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19940320 +DTEND;VALUE=DATE:19940321 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19940424 +DTEND;VALUE=DATE:19940425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19940429 +DTEND;VALUE=DATE:19940430 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19940501 +DTEND;VALUE=DATE:19940502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19940502 +DTEND;VALUE=DATE:19940503 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19940508 +DTEND;VALUE=DATE:19940509 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19940609 +DTEND;VALUE=DATE:19940610 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19940619 +DTEND;VALUE=DATE:19940620 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19940620 +DTEND;VALUE=DATE:19940621 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19940626 +DTEND;VALUE=DATE:19940627 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19940502 +DTEND;VALUE=DATE:19940503 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19950223 +DTEND;VALUE=DATE:19950224 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19950306 +DTEND;VALUE=DATE:19950307 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19950310 +DTEND;VALUE=DATE:19950311 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19950311 +DTEND;VALUE=DATE:19950312 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19950312 +DTEND;VALUE=DATE:19950313 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19950416 +DTEND;VALUE=DATE:19950417 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19950421 +DTEND;VALUE=DATE:19950422 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19950423 +DTEND;VALUE=DATE:19950424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19950424 +DTEND;VALUE=DATE:19950425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19950430 +DTEND;VALUE=DATE:19950501 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19950601 +DTEND;VALUE=DATE:19950602 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19950611 +DTEND;VALUE=DATE:19950612 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19950612 +DTEND;VALUE=DATE:19950613 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19950618 +DTEND;VALUE=DATE:19950619 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19950423 +DTEND;VALUE=DATE:19950424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19960215 +DTEND;VALUE=DATE:19960216 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19960226 +DTEND;VALUE=DATE:19960227 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19960301 +DTEND;VALUE=DATE:19960302 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19960302 +DTEND;VALUE=DATE:19960303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19960303 +DTEND;VALUE=DATE:19960304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19960407 +DTEND;VALUE=DATE:19960408 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19960412 +DTEND;VALUE=DATE:19960413 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19960414 +DTEND;VALUE=DATE:19960415 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19960415 +DTEND;VALUE=DATE:19960416 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19960421 +DTEND;VALUE=DATE:19960422 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19960523 +DTEND;VALUE=DATE:19960524 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19960602 +DTEND;VALUE=DATE:19960603 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19960603 +DTEND;VALUE=DATE:19960604 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19960609 +DTEND;VALUE=DATE:19960610 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19960423 +DTEND;VALUE=DATE:19960424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19970227 +DTEND;VALUE=DATE:19970228 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19970310 +DTEND;VALUE=DATE:19970311 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19970314 +DTEND;VALUE=DATE:19970315 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19970315 +DTEND;VALUE=DATE:19970316 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19970316 +DTEND;VALUE=DATE:19970317 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19970420 +DTEND;VALUE=DATE:19970421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19970425 +DTEND;VALUE=DATE:19970426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19970427 +DTEND;VALUE=DATE:19970428 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19970428 +DTEND;VALUE=DATE:19970429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19970504 +DTEND;VALUE=DATE:19970505 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19970605 +DTEND;VALUE=DATE:19970606 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19970615 +DTEND;VALUE=DATE:19970616 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19970616 +DTEND;VALUE=DATE:19970617 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19970622 +DTEND;VALUE=DATE:19970623 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19970428 +DTEND;VALUE=DATE:19970429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19980219 +DTEND;VALUE=DATE:19980220 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19980302 +DTEND;VALUE=DATE:19980303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19980306 +DTEND;VALUE=DATE:19980307 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19980307 +DTEND;VALUE=DATE:19980308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19980308 +DTEND;VALUE=DATE:19980309 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19980412 +DTEND;VALUE=DATE:19980413 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19980417 +DTEND;VALUE=DATE:19980418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19980419 +DTEND;VALUE=DATE:19980420 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19980420 +DTEND;VALUE=DATE:19980421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19980426 +DTEND;VALUE=DATE:19980427 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19980528 +DTEND;VALUE=DATE:19980529 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19980607 +DTEND;VALUE=DATE:19980608 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19980608 +DTEND;VALUE=DATE:19980609 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19980614 +DTEND;VALUE=DATE:19980615 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19980423 +DTEND;VALUE=DATE:19980424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:19990211 +DTEND;VALUE=DATE:19990212 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:19990222 +DTEND;VALUE=DATE:19990223 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:19990226 +DTEND;VALUE=DATE:19990227 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:19990227 +DTEND;VALUE=DATE:19990228 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:19990228 +DTEND;VALUE=DATE:19990301 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:19990404 +DTEND;VALUE=DATE:19990405 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:19990409 +DTEND;VALUE=DATE:19990410 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:19990411 +DTEND;VALUE=DATE:19990412 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:19990412 +DTEND;VALUE=DATE:19990413 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:19990418 +DTEND;VALUE=DATE:19990419 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:19990520 +DTEND;VALUE=DATE:19990521 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:19990530 +DTEND;VALUE=DATE:19990531 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:19990531 +DTEND;VALUE=DATE:19990601 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:19990606 +DTEND;VALUE=DATE:19990607 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:19990423 +DTEND;VALUE=DATE:19990424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20000302 +DTEND;VALUE=DATE:20000303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20000313 +DTEND;VALUE=DATE:20000314 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20000317 +DTEND;VALUE=DATE:20000318 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20000318 +DTEND;VALUE=DATE:20000319 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20000319 +DTEND;VALUE=DATE:20000320 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20000423 +DTEND;VALUE=DATE:20000424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20000428 +DTEND;VALUE=DATE:20000429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20000430 +DTEND;VALUE=DATE:20000501 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20000501 +DTEND;VALUE=DATE:20000502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20000507 +DTEND;VALUE=DATE:20000508 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20000608 +DTEND;VALUE=DATE:20000609 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20000618 +DTEND;VALUE=DATE:20000619 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20000619 +DTEND;VALUE=DATE:20000620 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20000625 +DTEND;VALUE=DATE:20000626 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20000501 +DTEND;VALUE=DATE:20000502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20010215 +DTEND;VALUE=DATE:20010216 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20010226 +DTEND;VALUE=DATE:20010227 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20010302 +DTEND;VALUE=DATE:20010303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20010303 +DTEND;VALUE=DATE:20010304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20010304 +DTEND;VALUE=DATE:20010305 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20010408 +DTEND;VALUE=DATE:20010409 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20010413 +DTEND;VALUE=DATE:20010414 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20010415 +DTEND;VALUE=DATE:20010416 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20010416 +DTEND;VALUE=DATE:20010417 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20010422 +DTEND;VALUE=DATE:20010423 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20010524 +DTEND;VALUE=DATE:20010525 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20010603 +DTEND;VALUE=DATE:20010604 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20010604 +DTEND;VALUE=DATE:20010605 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20010610 +DTEND;VALUE=DATE:20010611 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20010423 +DTEND;VALUE=DATE:20010424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20020307 +DTEND;VALUE=DATE:20020308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20020318 +DTEND;VALUE=DATE:20020319 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20020322 +DTEND;VALUE=DATE:20020323 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20020323 +DTEND;VALUE=DATE:20020324 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20020324 +DTEND;VALUE=DATE:20020325 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20020428 +DTEND;VALUE=DATE:20020429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20020503 +DTEND;VALUE=DATE:20020504 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20020505 +DTEND;VALUE=DATE:20020506 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20020506 +DTEND;VALUE=DATE:20020507 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20020512 +DTEND;VALUE=DATE:20020513 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20020613 +DTEND;VALUE=DATE:20020614 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20020623 +DTEND;VALUE=DATE:20020624 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20020624 +DTEND;VALUE=DATE:20020625 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20020630 +DTEND;VALUE=DATE:20020701 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20020506 +DTEND;VALUE=DATE:20020507 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20030227 +DTEND;VALUE=DATE:20030228 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20030310 +DTEND;VALUE=DATE:20030311 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20030314 +DTEND;VALUE=DATE:20030315 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20030315 +DTEND;VALUE=DATE:20030316 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20030316 +DTEND;VALUE=DATE:20030317 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20030420 +DTEND;VALUE=DATE:20030421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20030425 +DTEND;VALUE=DATE:20030426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20030427 +DTEND;VALUE=DATE:20030428 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20030428 +DTEND;VALUE=DATE:20030429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20030504 +DTEND;VALUE=DATE:20030505 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20030605 +DTEND;VALUE=DATE:20030606 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20030615 +DTEND;VALUE=DATE:20030616 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20030616 +DTEND;VALUE=DATE:20030617 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20030622 +DTEND;VALUE=DATE:20030623 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20030428 +DTEND;VALUE=DATE:20030429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20040212 +DTEND;VALUE=DATE:20040213 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20040223 +DTEND;VALUE=DATE:20040224 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20040227 +DTEND;VALUE=DATE:20040228 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20040228 +DTEND;VALUE=DATE:20040229 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20040229 +DTEND;VALUE=DATE:20040301 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20040404 +DTEND;VALUE=DATE:20040405 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20040409 +DTEND;VALUE=DATE:20040410 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20040411 +DTEND;VALUE=DATE:20040412 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20040412 +DTEND;VALUE=DATE:20040413 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20040418 +DTEND;VALUE=DATE:20040419 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20040520 +DTEND;VALUE=DATE:20040521 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20040530 +DTEND;VALUE=DATE:20040531 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20040531 +DTEND;VALUE=DATE:20040601 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20040606 +DTEND;VALUE=DATE:20040607 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20040423 +DTEND;VALUE=DATE:20040424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20050303 +DTEND;VALUE=DATE:20050304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20050314 +DTEND;VALUE=DATE:20050315 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20050318 +DTEND;VALUE=DATE:20050319 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20050319 +DTEND;VALUE=DATE:20050320 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20050320 +DTEND;VALUE=DATE:20050321 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20050424 +DTEND;VALUE=DATE:20050425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20050429 +DTEND;VALUE=DATE:20050430 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20050501 +DTEND;VALUE=DATE:20050502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20050502 +DTEND;VALUE=DATE:20050503 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20050508 +DTEND;VALUE=DATE:20050509 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20050609 +DTEND;VALUE=DATE:20050610 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20050619 +DTEND;VALUE=DATE:20050620 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20050620 +DTEND;VALUE=DATE:20050621 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20050626 +DTEND;VALUE=DATE:20050627 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20050502 +DTEND;VALUE=DATE:20050503 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20060223 +DTEND;VALUE=DATE:20060224 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20060306 +DTEND;VALUE=DATE:20060307 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20060310 +DTEND;VALUE=DATE:20060311 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20060311 +DTEND;VALUE=DATE:20060312 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20060312 +DTEND;VALUE=DATE:20060313 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20060416 +DTEND;VALUE=DATE:20060417 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20060421 +DTEND;VALUE=DATE:20060422 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20060423 +DTEND;VALUE=DATE:20060424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20060424 +DTEND;VALUE=DATE:20060425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20060430 +DTEND;VALUE=DATE:20060501 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20060601 +DTEND;VALUE=DATE:20060602 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20060611 +DTEND;VALUE=DATE:20060612 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20060612 +DTEND;VALUE=DATE:20060613 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20060618 +DTEND;VALUE=DATE:20060619 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20060424 +DTEND;VALUE=DATE:20060425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20070208 +DTEND;VALUE=DATE:20070209 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20070219 +DTEND;VALUE=DATE:20070220 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20070223 +DTEND;VALUE=DATE:20070224 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20070224 +DTEND;VALUE=DATE:20070225 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20070225 +DTEND;VALUE=DATE:20070226 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20070401 +DTEND;VALUE=DATE:20070402 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20070406 +DTEND;VALUE=DATE:20070407 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20070408 +DTEND;VALUE=DATE:20070409 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20070409 +DTEND;VALUE=DATE:20070410 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20070415 +DTEND;VALUE=DATE:20070416 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20070517 +DTEND;VALUE=DATE:20070518 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20070527 +DTEND;VALUE=DATE:20070528 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20070528 +DTEND;VALUE=DATE:20070529 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20070603 +DTEND;VALUE=DATE:20070604 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20070423 +DTEND;VALUE=DATE:20070424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20080228 +DTEND;VALUE=DATE:20080229 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20080310 +DTEND;VALUE=DATE:20080311 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20080314 +DTEND;VALUE=DATE:20080315 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20080315 +DTEND;VALUE=DATE:20080316 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20080316 +DTEND;VALUE=DATE:20080317 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20080420 +DTEND;VALUE=DATE:20080421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20080425 +DTEND;VALUE=DATE:20080426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20080427 +DTEND;VALUE=DATE:20080428 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20080428 +DTEND;VALUE=DATE:20080429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20080504 +DTEND;VALUE=DATE:20080505 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20080605 +DTEND;VALUE=DATE:20080606 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20080615 +DTEND;VALUE=DATE:20080616 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20080616 +DTEND;VALUE=DATE:20080617 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20080622 +DTEND;VALUE=DATE:20080623 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20080428 +DTEND;VALUE=DATE:20080429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20090219 +DTEND;VALUE=DATE:20090220 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20090302 +DTEND;VALUE=DATE:20090303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20090306 +DTEND;VALUE=DATE:20090307 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20090307 +DTEND;VALUE=DATE:20090308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20090308 +DTEND;VALUE=DATE:20090309 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20090417 +DTEND;VALUE=DATE:20090418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20090419 +DTEND;VALUE=DATE:20090420 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20090420 +DTEND;VALUE=DATE:20090421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20090426 +DTEND;VALUE=DATE:20090427 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20090528 +DTEND;VALUE=DATE:20090529 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20090607 +DTEND;VALUE=DATE:20090608 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20090608 +DTEND;VALUE=DATE:20090609 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20090614 +DTEND;VALUE=DATE:20090615 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20090423 +DTEND;VALUE=DATE:20090424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20100204 +DTEND;VALUE=DATE:20100205 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20100215 +DTEND;VALUE=DATE:20100216 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20100219 +DTEND;VALUE=DATE:20100220 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20100220 +DTEND;VALUE=DATE:20100221 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20100221 +DTEND;VALUE=DATE:20100222 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20100328 +DTEND;VALUE=DATE:20100329 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20100411 +DTEND;VALUE=DATE:20100412 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20100524 +DTEND;VALUE=DATE:20100525 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20100530 +DTEND;VALUE=DATE:20100531 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20100423 +DTEND;VALUE=DATE:20100424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20110224 +DTEND;VALUE=DATE:20110225 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20110307 +DTEND;VALUE=DATE:20110308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20110311 +DTEND;VALUE=DATE:20110312 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20110312 +DTEND;VALUE=DATE:20110313 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20110313 +DTEND;VALUE=DATE:20110314 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20110417 +DTEND;VALUE=DATE:20110418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20110501 +DTEND;VALUE=DATE:20110502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20110619 +DTEND;VALUE=DATE:20110620 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20120216 +DTEND;VALUE=DATE:20120217 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20120227 +DTEND;VALUE=DATE:20120228 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20120302 +DTEND;VALUE=DATE:20120303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20120303 +DTEND;VALUE=DATE:20120304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20120304 +DTEND;VALUE=DATE:20120305 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20120413 +DTEND;VALUE=DATE:20120414 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20120415 +DTEND;VALUE=DATE:20120416 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20120416 +DTEND;VALUE=DATE:20120417 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20120422 +DTEND;VALUE=DATE:20120423 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20120524 +DTEND;VALUE=DATE:20120525 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20120603 +DTEND;VALUE=DATE:20120604 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20120604 +DTEND;VALUE=DATE:20120605 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20120610 +DTEND;VALUE=DATE:20120611 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20120423 +DTEND;VALUE=DATE:20120424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20130307 +DTEND;VALUE=DATE:20130308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20130318 +DTEND;VALUE=DATE:20130319 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20130322 +DTEND;VALUE=DATE:20130323 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20130323 +DTEND;VALUE=DATE:20130324 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20130324 +DTEND;VALUE=DATE:20130325 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20130428 +DTEND;VALUE=DATE:20130429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20130503 +DTEND;VALUE=DATE:20130504 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20130505 +DTEND;VALUE=DATE:20130506 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20130506 +DTEND;VALUE=DATE:20130507 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20130512 +DTEND;VALUE=DATE:20130513 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20130613 +DTEND;VALUE=DATE:20130614 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20130623 +DTEND;VALUE=DATE:20130624 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20130624 +DTEND;VALUE=DATE:20130625 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20130630 +DTEND;VALUE=DATE:20130701 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20130506 +DTEND;VALUE=DATE:20130507 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20140220 +DTEND;VALUE=DATE:20140221 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20140303 +DTEND;VALUE=DATE:20140304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20140307 +DTEND;VALUE=DATE:20140308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20140308 +DTEND;VALUE=DATE:20140309 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20140309 +DTEND;VALUE=DATE:20140310 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20140413 +DTEND;VALUE=DATE:20140414 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20140427 +DTEND;VALUE=DATE:20140428 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20140529 +DTEND;VALUE=DATE:20140530 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20140608 +DTEND;VALUE=DATE:20140609 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20140609 +DTEND;VALUE=DATE:20140610 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20140615 +DTEND;VALUE=DATE:20140616 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20140423 +DTEND;VALUE=DATE:20140424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20150212 +DTEND;VALUE=DATE:20150213 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20150223 +DTEND;VALUE=DATE:20150224 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20150227 +DTEND;VALUE=DATE:20150228 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20150228 +DTEND;VALUE=DATE:20150301 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20150301 +DTEND;VALUE=DATE:20150302 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20150410 +DTEND;VALUE=DATE:20150411 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20150412 +DTEND;VALUE=DATE:20150413 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20150413 +DTEND;VALUE=DATE:20150414 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20150419 +DTEND;VALUE=DATE:20150420 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20150521 +DTEND;VALUE=DATE:20150522 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20150531 +DTEND;VALUE=DATE:20150601 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20150601 +DTEND;VALUE=DATE:20150602 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20150607 +DTEND;VALUE=DATE:20150608 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20150423 +DTEND;VALUE=DATE:20150424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20160303 +DTEND;VALUE=DATE:20160304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20160314 +DTEND;VALUE=DATE:20160315 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20160318 +DTEND;VALUE=DATE:20160319 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20160319 +DTEND;VALUE=DATE:20160320 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20160320 +DTEND;VALUE=DATE:20160321 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20160424 +DTEND;VALUE=DATE:20160425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20160429 +DTEND;VALUE=DATE:20160430 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20160501 +DTEND;VALUE=DATE:20160502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20160502 +DTEND;VALUE=DATE:20160503 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20160508 +DTEND;VALUE=DATE:20160509 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20160609 +DTEND;VALUE=DATE:20160610 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20160619 +DTEND;VALUE=DATE:20160620 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20160620 +DTEND;VALUE=DATE:20160621 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20160626 +DTEND;VALUE=DATE:20160627 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20160502 +DTEND;VALUE=DATE:20160503 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20170216 +DTEND;VALUE=DATE:20170217 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20170227 +DTEND;VALUE=DATE:20170228 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20170303 +DTEND;VALUE=DATE:20170304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20170304 +DTEND;VALUE=DATE:20170305 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20170305 +DTEND;VALUE=DATE:20170306 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20170409 +DTEND;VALUE=DATE:20170410 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20170414 +DTEND;VALUE=DATE:20170415 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20170417 +DTEND;VALUE=DATE:20170418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20170423 +DTEND;VALUE=DATE:20170424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20170525 +DTEND;VALUE=DATE:20170526 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20170604 +DTEND;VALUE=DATE:20170605 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20170605 +DTEND;VALUE=DATE:20170606 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20170611 +DTEND;VALUE=DATE:20170612 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20170423 +DTEND;VALUE=DATE:20170424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20180208 +DTEND;VALUE=DATE:20180209 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20180219 +DTEND;VALUE=DATE:20180220 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20180223 +DTEND;VALUE=DATE:20180224 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20180224 +DTEND;VALUE=DATE:20180225 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20180225 +DTEND;VALUE=DATE:20180226 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20180401 +DTEND;VALUE=DATE:20180402 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20180406 +DTEND;VALUE=DATE:20180407 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20180408 +DTEND;VALUE=DATE:20180409 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20180409 +DTEND;VALUE=DATE:20180410 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20180415 +DTEND;VALUE=DATE:20180416 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20180517 +DTEND;VALUE=DATE:20180518 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20180527 +DTEND;VALUE=DATE:20180528 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20180528 +DTEND;VALUE=DATE:20180529 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20180603 +DTEND;VALUE=DATE:20180604 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20180423 +DTEND;VALUE=DATE:20180424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20190228 +DTEND;VALUE=DATE:20190301 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20190311 +DTEND;VALUE=DATE:20190312 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20190315 +DTEND;VALUE=DATE:20190316 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20190316 +DTEND;VALUE=DATE:20190317 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20190317 +DTEND;VALUE=DATE:20190318 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20190421 +DTEND;VALUE=DATE:20190422 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20190426 +DTEND;VALUE=DATE:20190427 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20190428 +DTEND;VALUE=DATE:20190429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20190429 +DTEND;VALUE=DATE:20190430 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20190505 +DTEND;VALUE=DATE:20190506 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20190606 +DTEND;VALUE=DATE:20190607 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20190616 +DTEND;VALUE=DATE:20190617 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20190617 +DTEND;VALUE=DATE:20190618 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20190623 +DTEND;VALUE=DATE:20190624 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20190429 +DTEND;VALUE=DATE:20190430 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20200220 +DTEND;VALUE=DATE:20200221 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20200302 +DTEND;VALUE=DATE:20200303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20200306 +DTEND;VALUE=DATE:20200307 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20200307 +DTEND;VALUE=DATE:20200308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20200308 +DTEND;VALUE=DATE:20200309 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20200412 +DTEND;VALUE=DATE:20200413 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20200417 +DTEND;VALUE=DATE:20200418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20200419 +DTEND;VALUE=DATE:20200420 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20200420 +DTEND;VALUE=DATE:20200421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20200426 +DTEND;VALUE=DATE:20200427 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20200528 +DTEND;VALUE=DATE:20200529 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20200607 +DTEND;VALUE=DATE:20200608 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20200608 +DTEND;VALUE=DATE:20200609 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20200614 +DTEND;VALUE=DATE:20200615 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20200423 +DTEND;VALUE=DATE:20200424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20210304 +DTEND;VALUE=DATE:20210305 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20210315 +DTEND;VALUE=DATE:20210316 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20210319 +DTEND;VALUE=DATE:20210320 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20210320 +DTEND;VALUE=DATE:20210321 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20210321 +DTEND;VALUE=DATE:20210322 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20210425 +DTEND;VALUE=DATE:20210426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20210430 +DTEND;VALUE=DATE:20210501 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20210502 +DTEND;VALUE=DATE:20210503 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20210503 +DTEND;VALUE=DATE:20210504 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20210509 +DTEND;VALUE=DATE:20210510 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20210610 +DTEND;VALUE=DATE:20210611 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20210620 +DTEND;VALUE=DATE:20210621 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20210621 +DTEND;VALUE=DATE:20210622 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20210627 +DTEND;VALUE=DATE:20210628 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20210503 +DTEND;VALUE=DATE:20210504 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20220224 +DTEND;VALUE=DATE:20220225 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20220307 +DTEND;VALUE=DATE:20220308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20220311 +DTEND;VALUE=DATE:20220312 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20220312 +DTEND;VALUE=DATE:20220313 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20220313 +DTEND;VALUE=DATE:20220314 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20220417 +DTEND;VALUE=DATE:20220418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20220422 +DTEND;VALUE=DATE:20220423 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20220424 +DTEND;VALUE=DATE:20220425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20220425 +DTEND;VALUE=DATE:20220426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20220501 +DTEND;VALUE=DATE:20220502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20220602 +DTEND;VALUE=DATE:20220603 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20220612 +DTEND;VALUE=DATE:20220613 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20220613 +DTEND;VALUE=DATE:20220614 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20220619 +DTEND;VALUE=DATE:20220620 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20220425 +DTEND;VALUE=DATE:20220426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20230216 +DTEND;VALUE=DATE:20230217 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20230227 +DTEND;VALUE=DATE:20230228 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20230303 +DTEND;VALUE=DATE:20230304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20230304 +DTEND;VALUE=DATE:20230305 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20230305 +DTEND;VALUE=DATE:20230306 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20230409 +DTEND;VALUE=DATE:20230410 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20230414 +DTEND;VALUE=DATE:20230415 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20230416 +DTEND;VALUE=DATE:20230417 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20230417 +DTEND;VALUE=DATE:20230418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20230423 +DTEND;VALUE=DATE:20230424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20230525 +DTEND;VALUE=DATE:20230526 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20230604 +DTEND;VALUE=DATE:20230605 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20230605 +DTEND;VALUE=DATE:20230606 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20230611 +DTEND;VALUE=DATE:20230612 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20230423 +DTEND;VALUE=DATE:20230424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20240307 +DTEND;VALUE=DATE:20240308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20240318 +DTEND;VALUE=DATE:20240319 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20240322 +DTEND;VALUE=DATE:20240323 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20240323 +DTEND;VALUE=DATE:20240324 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20240324 +DTEND;VALUE=DATE:20240325 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20240428 +DTEND;VALUE=DATE:20240429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20240503 +DTEND;VALUE=DATE:20240504 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20240505 +DTEND;VALUE=DATE:20240506 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20240506 +DTEND;VALUE=DATE:20240507 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20240512 +DTEND;VALUE=DATE:20240513 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20240613 +DTEND;VALUE=DATE:20240614 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20240623 +DTEND;VALUE=DATE:20240624 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20240624 +DTEND;VALUE=DATE:20240625 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20240630 +DTEND;VALUE=DATE:20240701 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20240506 +DTEND;VALUE=DATE:20240507 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20250220 +DTEND;VALUE=DATE:20250221 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20250303 +DTEND;VALUE=DATE:20250304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20250307 +DTEND;VALUE=DATE:20250308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20250308 +DTEND;VALUE=DATE:20250309 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20250309 +DTEND;VALUE=DATE:20250310 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20250413 +DTEND;VALUE=DATE:20250414 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20250418 +DTEND;VALUE=DATE:20250419 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20250420 +DTEND;VALUE=DATE:20250421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20250421 +DTEND;VALUE=DATE:20250422 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20250427 +DTEND;VALUE=DATE:20250428 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20250529 +DTEND;VALUE=DATE:20250530 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20250608 +DTEND;VALUE=DATE:20250609 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20250609 +DTEND;VALUE=DATE:20250610 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20250615 +DTEND;VALUE=DATE:20250616 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20250423 +DTEND;VALUE=DATE:20250424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20260212 +DTEND;VALUE=DATE:20260213 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20260223 +DTEND;VALUE=DATE:20260224 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20260227 +DTEND;VALUE=DATE:20260228 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20260228 +DTEND;VALUE=DATE:20260301 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20260301 +DTEND;VALUE=DATE:20260302 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20260405 +DTEND;VALUE=DATE:20260406 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20260410 +DTEND;VALUE=DATE:20260411 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20260412 +DTEND;VALUE=DATE:20260413 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20260413 +DTEND;VALUE=DATE:20260414 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20260419 +DTEND;VALUE=DATE:20260420 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20260521 +DTEND;VALUE=DATE:20260522 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20260531 +DTEND;VALUE=DATE:20260601 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20260601 +DTEND;VALUE=DATE:20260602 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20260607 +DTEND;VALUE=DATE:20260608 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20260423 +DTEND;VALUE=DATE:20260424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20270304 +DTEND;VALUE=DATE:20270305 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20270315 +DTEND;VALUE=DATE:20270316 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20270319 +DTEND;VALUE=DATE:20270320 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20270320 +DTEND;VALUE=DATE:20270321 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20270321 +DTEND;VALUE=DATE:20270322 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20270425 +DTEND;VALUE=DATE:20270426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20270430 +DTEND;VALUE=DATE:20270501 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20270502 +DTEND;VALUE=DATE:20270503 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20270503 +DTEND;VALUE=DATE:20270504 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20270509 +DTEND;VALUE=DATE:20270510 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20270610 +DTEND;VALUE=DATE:20270611 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20270620 +DTEND;VALUE=DATE:20270621 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20270621 +DTEND;VALUE=DATE:20270622 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20270627 +DTEND;VALUE=DATE:20270628 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20270503 +DTEND;VALUE=DATE:20270504 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20280217 +DTEND;VALUE=DATE:20280218 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20280228 +DTEND;VALUE=DATE:20280229 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20280303 +DTEND;VALUE=DATE:20280304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20280304 +DTEND;VALUE=DATE:20280305 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20280305 +DTEND;VALUE=DATE:20280306 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20280409 +DTEND;VALUE=DATE:20280410 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20280414 +DTEND;VALUE=DATE:20280415 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20280416 +DTEND;VALUE=DATE:20280417 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20280417 +DTEND;VALUE=DATE:20280418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20280423 +DTEND;VALUE=DATE:20280424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20280525 +DTEND;VALUE=DATE:20280526 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20280604 +DTEND;VALUE=DATE:20280605 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20280605 +DTEND;VALUE=DATE:20280606 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20280611 +DTEND;VALUE=DATE:20280612 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20280423 +DTEND;VALUE=DATE:20280424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20290208 +DTEND;VALUE=DATE:20290209 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20290219 +DTEND;VALUE=DATE:20290220 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20290223 +DTEND;VALUE=DATE:20290224 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20290224 +DTEND;VALUE=DATE:20290225 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20290225 +DTEND;VALUE=DATE:20290226 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20290401 +DTEND;VALUE=DATE:20290402 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20290406 +DTEND;VALUE=DATE:20290407 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20290408 +DTEND;VALUE=DATE:20290409 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20290409 +DTEND;VALUE=DATE:20290410 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20290415 +DTEND;VALUE=DATE:20290416 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20290517 +DTEND;VALUE=DATE:20290518 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20290527 +DTEND;VALUE=DATE:20290528 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20290528 +DTEND;VALUE=DATE:20290529 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20290603 +DTEND;VALUE=DATE:20290604 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20290423 +DTEND;VALUE=DATE:20290424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20300228 +DTEND;VALUE=DATE:20300301 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20300311 +DTEND;VALUE=DATE:20300312 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20300315 +DTEND;VALUE=DATE:20300316 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20300316 +DTEND;VALUE=DATE:20300317 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20300317 +DTEND;VALUE=DATE:20300318 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20300421 +DTEND;VALUE=DATE:20300422 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20300426 +DTEND;VALUE=DATE:20300427 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20300428 +DTEND;VALUE=DATE:20300429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20300429 +DTEND;VALUE=DATE:20300430 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20300505 +DTEND;VALUE=DATE:20300506 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20300606 +DTEND;VALUE=DATE:20300607 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20300616 +DTEND;VALUE=DATE:20300617 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20300617 +DTEND;VALUE=DATE:20300618 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20300623 +DTEND;VALUE=DATE:20300624 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20300429 +DTEND;VALUE=DATE:20300430 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20310213 +DTEND;VALUE=DATE:20310214 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20310224 +DTEND;VALUE=DATE:20310225 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20310228 +DTEND;VALUE=DATE:20310301 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20310301 +DTEND;VALUE=DATE:20310302 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20310302 +DTEND;VALUE=DATE:20310303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20310406 +DTEND;VALUE=DATE:20310407 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20310411 +DTEND;VALUE=DATE:20310412 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20310413 +DTEND;VALUE=DATE:20310414 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20310414 +DTEND;VALUE=DATE:20310415 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20310420 +DTEND;VALUE=DATE:20310421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20310522 +DTEND;VALUE=DATE:20310523 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20310601 +DTEND;VALUE=DATE:20310602 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20310602 +DTEND;VALUE=DATE:20310603 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20310608 +DTEND;VALUE=DATE:20310609 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20310423 +DTEND;VALUE=DATE:20310424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20320304 +DTEND;VALUE=DATE:20320305 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20320315 +DTEND;VALUE=DATE:20320316 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20320319 +DTEND;VALUE=DATE:20320320 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20320320 +DTEND;VALUE=DATE:20320321 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20320321 +DTEND;VALUE=DATE:20320322 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20320425 +DTEND;VALUE=DATE:20320426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20320430 +DTEND;VALUE=DATE:20320501 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20320502 +DTEND;VALUE=DATE:20320503 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20320503 +DTEND;VALUE=DATE:20320504 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20320509 +DTEND;VALUE=DATE:20320510 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20320610 +DTEND;VALUE=DATE:20320611 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20320620 +DTEND;VALUE=DATE:20320621 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20320621 +DTEND;VALUE=DATE:20320622 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20320627 +DTEND;VALUE=DATE:20320628 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20320503 +DTEND;VALUE=DATE:20320504 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20330224 +DTEND;VALUE=DATE:20330225 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20330307 +DTEND;VALUE=DATE:20330308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20330311 +DTEND;VALUE=DATE:20330312 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20330312 +DTEND;VALUE=DATE:20330313 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20330313 +DTEND;VALUE=DATE:20330314 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20330417 +DTEND;VALUE=DATE:20330418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20330422 +DTEND;VALUE=DATE:20330423 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20330424 +DTEND;VALUE=DATE:20330425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20330425 +DTEND;VALUE=DATE:20330426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20330501 +DTEND;VALUE=DATE:20330502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20330602 +DTEND;VALUE=DATE:20330603 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20330612 +DTEND;VALUE=DATE:20330613 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20330613 +DTEND;VALUE=DATE:20330614 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20330619 +DTEND;VALUE=DATE:20330620 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20330425 +DTEND;VALUE=DATE:20330426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20340209 +DTEND;VALUE=DATE:20340210 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20340220 +DTEND;VALUE=DATE:20340221 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20340224 +DTEND;VALUE=DATE:20340225 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20340225 +DTEND;VALUE=DATE:20340226 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20340226 +DTEND;VALUE=DATE:20340227 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20340402 +DTEND;VALUE=DATE:20340403 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20340407 +DTEND;VALUE=DATE:20340408 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20340409 +DTEND;VALUE=DATE:20340410 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20340410 +DTEND;VALUE=DATE:20340411 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20340416 +DTEND;VALUE=DATE:20340417 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20340518 +DTEND;VALUE=DATE:20340519 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20340528 +DTEND;VALUE=DATE:20340529 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20340529 +DTEND;VALUE=DATE:20340530 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20340604 +DTEND;VALUE=DATE:20340605 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20340423 +DTEND;VALUE=DATE:20340424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20350301 +DTEND;VALUE=DATE:20350302 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20350312 +DTEND;VALUE=DATE:20350313 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20350316 +DTEND;VALUE=DATE:20350317 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20350317 +DTEND;VALUE=DATE:20350318 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20350318 +DTEND;VALUE=DATE:20350319 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20350422 +DTEND;VALUE=DATE:20350423 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20350427 +DTEND;VALUE=DATE:20350428 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20350429 +DTEND;VALUE=DATE:20350430 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20350430 +DTEND;VALUE=DATE:20350501 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20350506 +DTEND;VALUE=DATE:20350507 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20350607 +DTEND;VALUE=DATE:20350608 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20350617 +DTEND;VALUE=DATE:20350618 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20350618 +DTEND;VALUE=DATE:20350619 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20350624 +DTEND;VALUE=DATE:20350625 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20350430 +DTEND;VALUE=DATE:20350501 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20360221 +DTEND;VALUE=DATE:20360222 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20360303 +DTEND;VALUE=DATE:20360304 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20360307 +DTEND;VALUE=DATE:20360308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20360308 +DTEND;VALUE=DATE:20360309 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20360309 +DTEND;VALUE=DATE:20360310 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20360413 +DTEND;VALUE=DATE:20360414 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20360418 +DTEND;VALUE=DATE:20360419 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20360420 +DTEND;VALUE=DATE:20360421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20360421 +DTEND;VALUE=DATE:20360422 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20360427 +DTEND;VALUE=DATE:20360428 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20360529 +DTEND;VALUE=DATE:20360530 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20360608 +DTEND;VALUE=DATE:20360609 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20360609 +DTEND;VALUE=DATE:20360610 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20360615 +DTEND;VALUE=DATE:20360616 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20360423 +DTEND;VALUE=DATE:20360424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20370205 +DTEND;VALUE=DATE:20370206 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20370216 +DTEND;VALUE=DATE:20370217 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20370220 +DTEND;VALUE=DATE:20370221 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20370221 +DTEND;VALUE=DATE:20370222 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20370222 +DTEND;VALUE=DATE:20370223 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20370329 +DTEND;VALUE=DATE:20370330 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20370403 +DTEND;VALUE=DATE:20370404 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20370405 +DTEND;VALUE=DATE:20370406 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20370406 +DTEND;VALUE=DATE:20370407 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20370412 +DTEND;VALUE=DATE:20370413 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20370514 +DTEND;VALUE=DATE:20370515 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20370524 +DTEND;VALUE=DATE:20370525 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20370525 +DTEND;VALUE=DATE:20370526 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20370531 +DTEND;VALUE=DATE:20370601 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20370423 +DTEND;VALUE=DATE:20370424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20380225 +DTEND;VALUE=DATE:20380226 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20380308 +DTEND;VALUE=DATE:20380309 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20380312 +DTEND;VALUE=DATE:20380313 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20380313 +DTEND;VALUE=DATE:20380314 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20380314 +DTEND;VALUE=DATE:20380315 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20380418 +DTEND;VALUE=DATE:20380419 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20380423 +DTEND;VALUE=DATE:20380424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20380425 +DTEND;VALUE=DATE:20380426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20380426 +DTEND;VALUE=DATE:20380427 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20380502 +DTEND;VALUE=DATE:20380503 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20380603 +DTEND;VALUE=DATE:20380604 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20380613 +DTEND;VALUE=DATE:20380614 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20380614 +DTEND;VALUE=DATE:20380615 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20380620 +DTEND;VALUE=DATE:20380621 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20380426 +DTEND;VALUE=DATE:20380427 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20390217 +DTEND;VALUE=DATE:20390218 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20390228 +DTEND;VALUE=DATE:20390301 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20390304 +DTEND;VALUE=DATE:20390305 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20390305 +DTEND;VALUE=DATE:20390306 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20390306 +DTEND;VALUE=DATE:20390307 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20390410 +DTEND;VALUE=DATE:20390411 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20390415 +DTEND;VALUE=DATE:20390416 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20390417 +DTEND;VALUE=DATE:20390418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20390418 +DTEND;VALUE=DATE:20390419 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20390424 +DTEND;VALUE=DATE:20390425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20390526 +DTEND;VALUE=DATE:20390527 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20390605 +DTEND;VALUE=DATE:20390606 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20390606 +DTEND;VALUE=DATE:20390607 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20390612 +DTEND;VALUE=DATE:20390613 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20390423 +DTEND;VALUE=DATE:20390424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20400308 +DTEND;VALUE=DATE:20400309 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20400319 +DTEND;VALUE=DATE:20400320 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20400323 +DTEND;VALUE=DATE:20400324 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20400324 +DTEND;VALUE=DATE:20400325 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20400325 +DTEND;VALUE=DATE:20400326 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20400429 +DTEND;VALUE=DATE:20400430 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20400504 +DTEND;VALUE=DATE:20400505 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20400506 +DTEND;VALUE=DATE:20400507 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20400507 +DTEND;VALUE=DATE:20400508 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20400513 +DTEND;VALUE=DATE:20400514 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20400614 +DTEND;VALUE=DATE:20400615 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20400624 +DTEND;VALUE=DATE:20400625 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20400625 +DTEND;VALUE=DATE:20400626 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20400701 +DTEND;VALUE=DATE:20400702 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20400507 +DTEND;VALUE=DATE:20400508 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20410221 +DTEND;VALUE=DATE:20410222 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20410304 +DTEND;VALUE=DATE:20410305 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20410308 +DTEND;VALUE=DATE:20410309 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20410309 +DTEND;VALUE=DATE:20410310 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20410310 +DTEND;VALUE=DATE:20410311 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20410414 +DTEND;VALUE=DATE:20410415 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20410419 +DTEND;VALUE=DATE:20410420 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20410421 +DTEND;VALUE=DATE:20410422 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20410422 +DTEND;VALUE=DATE:20410423 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20410428 +DTEND;VALUE=DATE:20410429 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20410530 +DTEND;VALUE=DATE:20410531 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20410609 +DTEND;VALUE=DATE:20410610 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20410610 +DTEND;VALUE=DATE:20410611 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20410616 +DTEND;VALUE=DATE:20410617 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20410423 +DTEND;VALUE=DATE:20410424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20420213 +DTEND;VALUE=DATE:20420214 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20420224 +DTEND;VALUE=DATE:20420225 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20420228 +DTEND;VALUE=DATE:20420301 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20420301 +DTEND;VALUE=DATE:20420302 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20420302 +DTEND;VALUE=DATE:20420303 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20420406 +DTEND;VALUE=DATE:20420407 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20420411 +DTEND;VALUE=DATE:20420412 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20420413 +DTEND;VALUE=DATE:20420414 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20420414 +DTEND;VALUE=DATE:20420415 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20420420 +DTEND;VALUE=DATE:20420421 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20420522 +DTEND;VALUE=DATE:20420523 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20420601 +DTEND;VALUE=DATE:20420602 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20420602 +DTEND;VALUE=DATE:20420603 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20420608 +DTEND;VALUE=DATE:20420609 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20420423 +DTEND;VALUE=DATE:20420424 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20430305 +DTEND;VALUE=DATE:20430306 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20430316 +DTEND;VALUE=DATE:20430317 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20430320 +DTEND;VALUE=DATE:20430321 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20430321 +DTEND;VALUE=DATE:20430322 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20430322 +DTEND;VALUE=DATE:20430323 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20430426 +DTEND;VALUE=DATE:20430427 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20430501 +DTEND;VALUE=DATE:20430502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20430503 +DTEND;VALUE=DATE:20430504 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20430504 +DTEND;VALUE=DATE:20430505 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20430510 +DTEND;VALUE=DATE:20430511 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20430611 +DTEND;VALUE=DATE:20430612 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20430621 +DTEND;VALUE=DATE:20430622 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20430622 +DTEND;VALUE=DATE:20430623 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20430628 +DTEND;VALUE=DATE:20430629 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20430504 +DTEND;VALUE=DATE:20430505 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20440225 +DTEND;VALUE=DATE:20440226 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20440307 +DTEND;VALUE=DATE:20440308 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20440311 +DTEND;VALUE=DATE:20440312 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20440312 +DTEND;VALUE=DATE:20440313 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20440313 +DTEND;VALUE=DATE:20440314 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20440417 +DTEND;VALUE=DATE:20440418 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20440422 +DTEND;VALUE=DATE:20440423 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20440424 +DTEND;VALUE=DATE:20440425 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20440425 +DTEND;VALUE=DATE:20440426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20440501 +DTEND;VALUE=DATE:20440502 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20440602 +DTEND;VALUE=DATE:20440603 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20440612 +DTEND;VALUE=DATE:20440613 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20440613 +DTEND;VALUE=DATE:20440614 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20440619 +DTEND;VALUE=DATE:20440620 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20440425 +DTEND;VALUE=DATE:20440426 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Τσικνοπέμπτη +DTSTART;VALUE=DATE:20450209 +DTEND;VALUE=DATE:20450210 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Καθαρά Δευτέρα +DTSTART;VALUE=DATE:20450220 +DTEND;VALUE=DATE:20450221 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Α' Χαιρετισμοί +DTSTART;VALUE=DATE:20450224 +DTEND;VALUE=DATE:20450225 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θεοδώρου +DTSTART;VALUE=DATE:20450225 +DTEND;VALUE=DATE:20450226 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή της Ορθοδοξίας +DTSTART;VALUE=DATE:20450226 +DTEND;VALUE=DATE:20450227 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή των Βαΐων +DTSTART;VALUE=DATE:20450402 +DTEND;VALUE=DATE:20450403 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Μεγάλη Παρασκευή +DTSTART;VALUE=DATE:20450407 +DTEND;VALUE=DATE:20450408 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Κυριακή του Πάσχα +DTSTART;VALUE=DATE:20450409 +DTEND;VALUE=DATE:20450410 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Δευτέρα Διακαινησίμου +DTSTART;VALUE=DATE:20450410 +DTEND;VALUE=DATE:20450411 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Θωμά +DTSTART;VALUE=DATE:20450416 +DTEND;VALUE=DATE:20450417 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αναλήψεως +DTSTART;VALUE=DATE:20450518 +DTEND;VALUE=DATE:20450519 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Πεντηκοστή +DTSTART;VALUE=DATE:20450528 +DTEND;VALUE=DATE:20450529 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίου Πνεύματος +DTSTART;VALUE=DATE:20450529 +DTEND;VALUE=DATE:20450530 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Αγίων Πάντων +DTSTART;VALUE=DATE:20450604 +DTEND;VALUE=DATE:20450605 +END:VEVENT + + +BEGIN:VEVENT +SUMMARY:Γεωργίου +DTSTART;VALUE=DATE:20450423 +DTEND;VALUE=DATE:20450424 +END:VEVENT + + +END:VCALENDAR diff --git a/media/caldata/GuyanaHolidays.ics b/media/caldata/GuyanaHolidays.ics new file mode 100644 index 00000000000..554408245f7 --- /dev/null +++ b/media/caldata/GuyanaHolidays.ics @@ -0,0 +1,411 @@ +BEGIN:VCALENDAR +PRODID:-//Google Inc//Google Calendar 70.9054//EN +VERSION:2.0 +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:Guyana Holidays +X-WR-TIMEZONE:America/New_York +X-WR-CALDESC:Public Holidays in Guyana\, South America.\nIf a holiday falls + on a Sunday the public holiday is observed on Monday. Note that some holid + ays follow a Lunar calendar. +BEGIN:VTIMEZONE +TZID:America/Guyana +X-LIC-LOCATION:America/Guyana +BEGIN:STANDARD +TZOFFSETFROM:-0400 +TZOFFSETTO:-0400 +TZNAME:GYT +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTART;VALUE=DATE:20131103 +DTEND;VALUE=DATE:20131104 +DTSTAMP:20130214T042015Z +UID:c1rjscqhjm1klnqbee14ckk9a4@google.com +CREATED:20090501T192921Z +DESCRIPTION:Diwali/ Deepavali is the Hindu Festival of Lights. +LAST-MODIFIED:20130214T041533Z +LOCATION:Guyana +SEQUENCE:2 +STATUS:CONFIRMED +SUMMARY:Diwali +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20131015 +DTEND;VALUE=DATE:20131016 +DTSTAMP:20130214T042015Z +UID:f56v2r2nik9c8aaq8foqmb0470@google.com +CREATED:20090501T193147Z +DESCRIPTION:Eid-ul-Adha is the Muslim Festival of Sacrifice\, commemorating + the willingness of Abraham to follow God's command to sacrifice his son Is + hmael +LAST-MODIFIED:20130214T041419Z +LOCATION:Guyana +SEQUENCE:2 +STATUS:CONFIRMED +SUMMARY:Eid-ul-Adha +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130807 +DTEND;VALUE=DATE:20130808 +DTSTAMP:20130214T042015Z +UID:gbis1otbvmb40gqkp0f9h4eem4@google.com +CREATED:20090501T192743Z +DESCRIPTION:Eid-ul-Fitr is not an official national holiday\, but it is wid + ely celebrated by the Muslim community. It celebrates the end of the Muslim + holy month of Ramadan\, on the first day of the tenth month of the Muslim + lunar calendar. The actual day of observance can vary by a day as the moon + must be seen the night before the end of Ramadan is officially declared. +LAST-MODIFIED:20130214T041110Z +LOCATION:Guyana +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Eid-ul-Fitr (non-official) +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090801 +DTEND;VALUE=DATE:20090802 +RRULE:FREQ=YEARLY;WKST=SU +DTSTAMP:20130214T042015Z +UID:6skdrq8umua3v16g8f9090bsvs@google.com +CREATED:20090501T190729Z +DESCRIPTION:Emancipation Day commemorates the abolition of slavery. +LAST-MODIFIED:20130214T040910Z +LOCATION:Guyana +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Emancipation Day +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +DTSTAMP:20130214T042015Z +UID:hndg12oft8io7i4of2mfc1l12k@google.com +CREATED:20130214T035259Z +DESCRIPTION:Easter Monday is the last day of the Easter holiday and it is c + ustomary for children (and adults) to celebrate by flying kites. +LAST-MODIFIED:20130214T040758Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Easter Monday +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +DTSTAMP:20130214T042015Z +UID:gc7ob3dt8s1gllon8hs9fadmnk@google.com +CREATED:20130214T035241Z +DESCRIPTION:Good Friday remembers the crucifixion of Jesus Christ\, the fou + nder of Christianity. +LAST-MODIFIED:20130214T040440Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Good Friday +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130327 +DTEND;VALUE=DATE:20130328 +DTSTAMP:20130214T042015Z +UID:4c1jv486jqvo33tkvgd8ahh90k@google.com +CREATED:20130214T035125Z +DESCRIPTION:Phagwah is a colourful Hindu festival celebrating the renewal o + f spring/ the triumph of good over evil. +LAST-MODIFIED:20130214T040319Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Phagwah +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130124 +DTEND;VALUE=DATE:20130125 +DTSTAMP:20130214T042015Z +UID:g5g67g03cqvc21qrkkpf632954@google.com +CREATED:20130214T035100Z +DESCRIPTION:Youman Nabi is the celebration of the birth anniversary of the + Prophet Mohamed\, the founder of Islam +LAST-MODIFIED:20130214T040038Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Youman Nabi +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090223 +DTEND;VALUE=DATE:20090224 +RRULE:FREQ=YEARLY;WKST=SU +DTSTAMP:20130214T042015Z +UID:0fftbjk0o905mqac5pger7f8ts@google.com +CREATED:20090501T193656Z +DESCRIPTION:Guyana's Republic Day is called Mashramani and celebrated with + a street carnival of the same name. Guyana became a republic on 23 Feb\, 19 + 70. +LAST-MODIFIED:20130214T035740Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Mashramani +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20091128 +DTEND;VALUE=DATE:20091129 +RRULE:FREQ=YEARLY;WKST=SU;UNTIL=20091106 +DTSTAMP:20130214T042015Z +UID:os1k9652n94sd0h2n1t2h3nsj0@google.com +CREATED:20090501T193147Z +DESCRIPTION:Eid-ul-Adha is the Muslim Festival of Sacrifice. +LAST-MODIFIED:20110625T142643Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Eid-ul-Adha +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20091017 +DTEND;VALUE=DATE:20091018 +RRULE:FREQ=YEARLY;WKST=SU;UNTIL=20091025 +DTSTAMP:20130214T042015Z +UID:puqn2vbl6gep412779bagkbh60@google.com +CREATED:20090501T192921Z +DESCRIPTION:Diwali/ Deepavli is the Hindu Festival of Light. +LAST-MODIFIED:20110625T142607Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Diwali +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090801 +DTEND;VALUE=DATE:20090802 +DTSTAMP:20130214T042015Z +UID:4029cvb8kgcu475hd372ojqm48@google.com +RECURRENCE-ID;VALUE=DATE:20090803 +CREATED:20090501T190729Z +DESCRIPTION:Emancipation Day. In commemoration of the abolition of slavery. +LAST-MODIFIED:20110625T141437Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Emancipation Day +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090803 +DTEND;VALUE=DATE:20090804 +RRULE:FREQ=YEARLY;WKST=SU;UNTIL=20090731 +DTSTAMP:20130214T042015Z +UID:4029cvb8kgcu475hd372ojqm48@google.com +CREATED:20090501T190729Z +DESCRIPTION:Emancipation Day. In commemoration of the abolition of slavery. +LAST-MODIFIED:20110625T141437Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Emancipation Day +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090505 +DTEND;VALUE=DATE:20090506 +RRULE:FREQ=YEARLY;WKST=SU +DTSTAMP:20130214T042015Z +UID:egb5d94qnj0oenenjukmqo7ir4@google.com +CREATED:20090501T185356Z +DESCRIPTION:Arrival Day celebrates the arrival of Portuguese\, Chinese\, Ea + st Indian and other immigrant populations who came to Guyana as indentured + labourers in the colonial period. +LAST-MODIFIED:20110625T141252Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Arrival Day +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090526 +DTEND;VALUE=DATE:20090527 +RRULE:FREQ=YEARLY;WKST=SU +DTSTAMP:20130214T042015Z +UID:oh2jb36ek1jubli784qvha7i9k@google.com +ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;CN=Guyana + Holidays;X-NUM-GUESTS=0:mailto:redspider.biz_69ph8ucqribk30so3qantoljhs@gr + oup.calendar.google.com +CREATED:20090501T185859Z +DESCRIPTION:Independence Day. Guyana became independent from the United Kin + gdom on May 26\, 1966. +LAST-MODIFIED:20110625T140943Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Independence Day +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090706 +DTEND;VALUE=DATE:20090707 +RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=1MO;WKST=SU +DTSTAMP:20130214T042015Z +UID:buerq2kmpvi52k2csb7aegcbo8@google.com +CREATED:20090501T190150Z +DESCRIPTION:CARICOM Day commemorates the establishment of the Caribbean Com + munity (CARICOM)\, with the signing of the Treaty of Chaguaramas on July 4\ + , 1973. The signatory nations then were Barbados\, Guyana\, Jamaica\, and T + rinidad & Tobago. It is celebrated on the first Monday in July in Antigua & + Barbuda\, Bahamas\, Barbados\, Belize\, Dominica\, Grenada\, Guyana\, Jama + ica\, Montserrat\, St. Kitts & Nevis\, St. Lucia\, St. Vincent & the Grenad + ines\, Suriname and Trinidad & Tobago. +LAST-MODIFIED:20110625T140759Z +LOCATION:Guyana +SEQUENCE:2 +STATUS:CONFIRMED +SUMMARY:CARICOM Day +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110320 +DTEND;VALUE=DATE:20110321 +DTSTAMP:20130214T042015Z +UID:1q5tkikfrh9262uf6kn2qkbhng@google.com +CREATED:20110625T140536Z +DESCRIPTION:Phagwah\, Holi\, Holika +LAST-MODIFIED:20110625T140536Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Phagwah +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110216 +DTEND;VALUE=DATE:20110217 +DTSTAMP:20130214T042015Z +UID:a3dpcb8d3d788l98s8b1deg5cg@google.com +CREATED:20110625T135242Z +DESCRIPTION:Youman Nabi - the birthday of the Prophet Mohammed PBUH +LAST-MODIFIED:20110625T135525Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Youman Nabi +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +RRULE:FREQ=YEARLY;WKST=SU +DTSTAMP:20130214T042015Z +UID:ogcvvm4b6npkndkkauud0lqk08@google.com +CREATED:20090501T193331Z +DESCRIPTION:New Years Day +LAST-MODIFIED:20110518T022354Z +LOCATION:Guyana +SEQUENCE:2 +STATUS:CONFIRMED +SUMMARY:New Years Day +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +DTSTAMP:20130214T042015Z +UID:5anr9lud76h3kuf89qa7de50lo@google.com +RECURRENCE-ID;VALUE=DATE:20081228 +CREATED:20090501T193331Z +DESCRIPTION:New Years Day +LAST-MODIFIED:20110518T022354Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:New Years Day +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20081228 +DTEND;VALUE=DATE:20081229 +RRULE:FREQ=YEARLY;WKST=SU;UNTIL=20081231T000000Z +DTSTAMP:20130214T042015Z +UID:5anr9lud76h3kuf89qa7de50lo@google.com +CREATED:20090501T193331Z +DESCRIPTION:New Years Day +LAST-MODIFIED:20110518T022353Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:New Years Day +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +RRULE:FREQ=YEARLY;WKST=SU +DTSTAMP:20130214T042015Z +UID:khh0tmcjm3jhh4iqem191fcv2s@google.com +CREATED:20090501T185324Z +DESCRIPTION:May/ Labour Day +LAST-MODIFIED:20100423T085721Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:May/ Labour Day +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +RRULE:FREQ=YEARLY;WKST=SU +DTSTAMP:20130214T042015Z +UID:kqaogntfge2lf32ivi3bovpo54@google.com +CREATED:20090501T193257Z +DESCRIPTION:Boxing Day +LAST-MODIFIED:20100306T073805Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Boxing Day +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +RRULE:FREQ=YEARLY;WKST=SU +DTSTAMP:20130214T042015Z +UID:ocgd4jsjlvhusorbmbqd9ht01g@google.com +CREATED:20090501T193219Z +DESCRIPTION:Christmas Day +LAST-MODIFIED:20100306T073805Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Christmas Day +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090311 +DTEND;VALUE=DATE:20090312 +DTSTAMP:20130214T042015Z +UID:fuafk77gnvd34ue5jq9i21rfl4@google.com +CREATED:20090501T194105Z +DESCRIPTION:Phagwah/ Holi is the Hindu Festival of Colours. It occurs on th + e last full moon day of the lunar month Phalguna. +LAST-MODIFIED:20090501T194105Z +LOCATION:Guyana +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Phagwah +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/HongKongHolidays.ics b/media/caldata/HongKongHolidays.ics new file mode 100644 index 00000000000..6cb0b7563b4 --- /dev/null +++ b/media/caldata/HongKongHolidays.ics @@ -0,0 +1,1306 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:America/New_York +X-LIC-LOCATION:America/New_York +BEGIN:DAYLIGHT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +TZNAME:EDT +DTSTART:19700308T020000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0400 +TZOFFSETTO:-0500 +TZNAME:EST +DTSTART:19701101T020000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20071016T170030Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:ce42d18e-10ec-4fa1-a147-a4b5fb903dfb +SUMMARY:The first day of January +CLASS:PUBLIC +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070101 +DTEND;VALUE=DATE;TZID=America/New_York:20070102 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170130Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:04d0b495-4775-4eec-b7a3-5f5ce5bccaa3 +SUMMARY:The day preceding Lunar New Year's Day +CLASS:PUBLIC +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070217 +DTEND;VALUE=DATE;TZID=America/New_York:20070218 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170220Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:2e0342d9-a849-40fa-a73c-698ec92028b9 +SUMMARY:The second day of the Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070219 +DTEND;VALUE=DATE;TZID=America/New_York:20070220 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170234Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:163ca4a5-17af-446b-aab4-3b7571761e6d +SUMMARY:The third day of the Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070220 +DTEND;VALUE=DATE;TZID=America/New_York:20070221 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170320Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:1084a30b-18a8-4517-b97d-b61a48404bb4 +SUMMARY:Ching Ming Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070405 +DTEND;VALUE=DATE;TZID=America/New_York:20070406 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170341Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:6d8dab53-3058-4fe4-bec5-b85f4a725a4f +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070406 +DTEND;VALUE=DATE;TZID=America/New_York:20070407 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170359Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:09c7bbfe-801a-4ff1-ba81-e49672fe97ee +SUMMARY:The day following Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070407 +DTEND;VALUE=DATE;TZID=America/New_York:20070408 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170417Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:c0d8d933-895f-4c87-83f6-4a47b990ee94 +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070409 +DTEND;VALUE=DATE;TZID=America/New_York:20070410 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170505Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:4e8e7581-600c-466f-a2ad-0e5955666c71 +SUMMARY:Labour Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070501 +DTEND;VALUE=DATE;TZID=America/New_York:20070502 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170526Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:939c4f40-565d-4405-a4a6-f7edca1db6fb +SUMMARY:The Buddha's Birthday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070524 +DTEND;VALUE=DATE;TZID=America/New_York:20070525 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170548Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:bec022f1-425d-4fc6-a2d3-fcbcbe7532d9 +SUMMARY:Tuen Ng Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070619 +DTEND;VALUE=DATE;TZID=America/New_York:20070620 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170608Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:08c6c933-7008-4db6-b377-69bdfb03a131 +SUMMARY:The day following Hong Kong Special Administrative Region + Establishment Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070702 +DTEND;VALUE=DATE;TZID=America/New_York:20070703 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170632Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:aa62414c-3e63-41aa-9e91-05ed22d6c2bf +SUMMARY:The day following Chinese Mid-Autumn Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20070926 +DTEND;VALUE=DATE;TZID=America/New_York:20070927 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170653Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:9a3068b1-7806-4289-836f-ef749ce13b3d +SUMMARY:National Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20071001 +DTEND;VALUE=DATE;TZID=America/New_York:20071002 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170712Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:f78c5c1d-7cd4-4e25-9d02-068b053eb1c5 +SUMMARY:Chung Yeung Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20071019 +DTEND;VALUE=DATE;TZID=America/New_York:20071020 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170731Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:f0e3f797-cfac-4fc2-a0f0-5f3396823205 +SUMMARY:Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20071225 +DTEND;VALUE=DATE;TZID=America/New_York:20071226 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T170758Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:9851a1aa-fc9b-48f0-9d90-a4d04bbff12f +SUMMARY:The first weekday after Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20071226 +DTEND;VALUE=DATE;TZID=America/New_York:20071227 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171400Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:8869fedc-8e53-4301-82e7-45c2b2688ff6 +SUMMARY:The first day of January +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080101 +DTEND;VALUE=DATE;TZID=America/New_York:20080102 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171419Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:521c8ff5-653f-4893-94b4-643103c84649 +SUMMARY:Lunar New Year’s Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080207 +DTEND;VALUE=DATE;TZID=America/New_York:20080208 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171438Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:53ae9160-5b70-47f6-800b-b1e33ad58403 +SUMMARY:The second day of the Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080208 +DTEND;VALUE=DATE;TZID=America/New_York:20080209 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171454Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:62a07855-3ae3-4322-a07a-c02dae7d093f +SUMMARY:The third day of the Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080209 +DTEND;VALUE=DATE;TZID=America/New_York:20080210 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171514Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:374f0446-9b80-439b-8e0a-8ab9775f0445 +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080321 +DTEND;VALUE=DATE;TZID=America/New_York:20080322 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171529Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132009Z +UID:8ba4baa8-488e-4224-9779-f0d91d6a8484 +SUMMARY:The day following Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080322 +DTEND;VALUE=DATE;TZID=America/New_York:20080323 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171550Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:d0a7a67d-8791-4059-8415-c2e13c5e910c +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080324 +DTEND;VALUE=DATE;TZID=America/New_York:20080325 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171614Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:099a9227-bac7-4ea5-91b7-45a251c238de +SUMMARY:Ching Ming Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080404 +DTEND;VALUE=DATE;TZID=America/New_York:20080405 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171646Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:93aedf15-39b3-4c68-99ce-21b8e21442fc +SUMMARY:Labour Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080501 +DTEND;VALUE=DATE;TZID=America/New_York:20080502 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171702Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:461069bc-ed35-4a98-9a29-59d9cbea5c4c +SUMMARY:The Buddha’s Birthday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080512 +DTEND;VALUE=DATE;TZID=America/New_York:20080513 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171723Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:3ffbf890-f87b-4374-857e-cc4fb1898a9c +SUMMARY:The day following Tuen Ng Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080609 +DTEND;VALUE=DATE;TZID=America/New_York:20080610 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171749Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:8a2f2518-2f26-44a9-a1ac-b1b8ac896a96 +SUMMARY:Hong Kong Special Administrative Region Establishment Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080701 +DTEND;VALUE=DATE;TZID=America/New_York:20080702 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171811Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:76352dbb-39ac-426f-8a68-ee6a35ffc287 +SUMMARY:The day following Chinese Mid-Autumn Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20080915 +DTEND;VALUE=DATE;TZID=America/New_York:20080916 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171829Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:eb15c5a3-986c-40e4-a0fc-a4969331c668 +SUMMARY:National Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20081001 +DTEND;VALUE=DATE;TZID=America/New_York:20081002 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171843Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:4cbfe489-5528-4eed-9e18-3887c68b7323 +SUMMARY:Chung Yeung Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20081007 +DTEND;VALUE=DATE;TZID=America/New_York:20081008 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171903Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:8a56c66c-f406-4d0e-9f05-bf29d843c88e +SUMMARY:Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20081225 +DTEND;VALUE=DATE;TZID=America/New_York:20081226 +END:VEVENT +BEGIN:VEVENT +CREATED:20071016T171915Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:e00baad6-1b98-478a-ab36-936fd2ba5e75 +SUMMARY:The first weekday after Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE;TZID=America/New_York:20081226 +DTEND;VALUE=DATE;TZID=America/New_York:20081227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004241Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:ae6024b2-eb99-4ed5-8843-c5d20f5c0acb +SUMMARY:The first day of January +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004411Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:1eff50fb-92af-4e7a-88a5-a70541063227 +SUMMARY:Lunar New Year's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090126 +DTEND;VALUE=DATE:20090127 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004429Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:5820e637-c8f8-4b0c-80d6-fe03c39dfe34 +SUMMARY:The second day of the Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090127 +DTEND;VALUE=DATE:20090128 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004448Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:d8b0a13d-f0dd-486f-85bb-9f35d48128cf +SUMMARY:The third day of the Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090128 +DTEND;VALUE=DATE:20090129 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004542Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:75e8d194-799a-49f5-82f6-a94994936c8f +SUMMARY:Ching Ming Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090404 +DTEND;VALUE=DATE:20090405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004601Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:818050c6-7985-42fd-9bc4-8dc4f4b79c30 +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004616Z +LAST-MODIFIED:20100801T132307Z +DTSTAMP:20121206T132010Z +UID:5018a2b4-26a6-47b5-8b23-31ba3f464442 +SUMMARY:The day following Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090411 +DTEND;VALUE=DATE:20090412 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004641Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:0108137b-c29c-48a7-babf-a5c3b3712a39 +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004706Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:f3032872-7e2e-487f-bb44-dd07507d5437 +SUMMARY:Labour Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004720Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:6cc65bff-0ce5-45f0-b1d8-a5478d5e5fb0 +SUMMARY:The Buddha's Birthday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090502 +DTEND;VALUE=DATE:20090503 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004743Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:97c2620e-d39f-4203-9b58-bb5c1a9dedff +SUMMARY:Tuen Ng Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090528 +DTEND;VALUE=DATE:20090529 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004800Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:3249f674-ecb3-4765-ae6d-873119f83f0d +SUMMARY:Hong Kong Special Administrative Region Establishment Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090701 +DTEND;VALUE=DATE:20090702 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004833Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:487727da-c4fd-4aeb-894e-9bf3925035e0 +SUMMARY:National Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20091001 +DTEND;VALUE=DATE:20091002 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004853Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:fccdfd16-b72a-475d-b913-0056e3a25e10 +SUMMARY:Chinese Mid-Autumn Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20091003 +DTEND;VALUE=DATE:20091004 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004913Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:df25d9ec-09a1-4812-8813-68fdc9ef818d +SUMMARY:Chung Yeung Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20091026 +DTEND;VALUE=DATE:20091027 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004936Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:ae58d963-d8f8-45d7-952e-a7020722128d +SUMMARY:Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175016Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:cc126810-e59f-41c1-9dd9-a587c184b15d +SUMMARY:The first day of January +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175122Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:234bc0af-28f6-49d3-a750-224a65d3dcca +SUMMARY:The day preceding Lunar New Year's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100213 +DTEND;VALUE=DATE:20100214 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175153Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:2736cc45-09f5-4376-8861-b1188c6674e1 +SUMMARY:The second day of the Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100215 +DTEND;VALUE=DATE:20100216 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175213Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:582f8d51-92f0-4297-a35c-0bb93ac5176d +SUMMARY:The third day of the Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100216 +DTEND;VALUE=DATE:20100217 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175231Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:8d84395a-72f6-424a-8d26-0e444d9e61ca +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175254Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:a2b3d826-d87a-4156-8910-3b0696d8b907 +SUMMARY:The day following Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100403 +DTEND;VALUE=DATE:20100404 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175311Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:34e5436d-17d1-417d-98bc-d78af21ec16d +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175326Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:f006e067-ba91-4c3c-ac97-0adaa1af7534 +SUMMARY:The day following Ching Ming Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100406 +DTEND;VALUE=DATE:20100407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175344Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:ba7c104b-5a6e-4328-af9c-b47c9c6234fd +SUMMARY:Labour Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:20100502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175401Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:c705ebfa-05b5-4c20-9fdd-48bfd9e4cfa4 +SUMMARY:The Buddha’s Birthday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100521 +DTEND;VALUE=DATE:20100522 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175420Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:05627774-787d-4760-b9b4-14812e11dec3 +SUMMARY:Tuen Ng Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100616 +DTEND;VALUE=DATE:20100617 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175438Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:a72b363a-da14-418f-bdb7-cff6e57f266b +SUMMARY:Hong Kong Special Administrative Region Establishment Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100701 +DTEND;VALUE=DATE:20100702 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175458Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:4e14fcdb-23ab-414e-bf91-41c54cd197da +SUMMARY:The day following Chinese Mid-Autumn Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100923 +DTEND;VALUE=DATE:20100924 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175517Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:cd74ac16-a9d9-4643-ae66-bb7040f8f824 +SUMMARY:National Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101001 +DTEND;VALUE=DATE:20101002 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175542Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:5d521809-5fbf-4449-a24c-bae69fb9f61b +SUMMARY:Chung Yeung Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101016 +DTEND;VALUE=DATE:20101017 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175625Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:0cc958fe-1e71-4351-807a-54a0a75d0f84 +SUMMARY:Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090730T175652Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:72ef85a7-455d-49ed-b1f1-1003def913e6 +SUMMARY:The first weekday after Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101227 +DTEND;VALUE=DATE:20101228 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080924T004948Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:1ce1d66d-5a2a-4792-a830-adb97f66fe03 +SUMMARY:The first weekday after Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T011740Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:0ae50dcf-554c-4a17-adb8-96affeca34a6 +SUMMARY:The first day of January +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:20110102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T011813Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:f1e545c1-c16c-488a-b981-7c1d2e77eb7c +SUMMARY:Lunar New Year's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110203 +DTEND;VALUE=DATE:20110204 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T011836Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:b02e42e8-ebf9-42d1-a5d0-b3d106ac5467 +SUMMARY:The second day of the Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110204 +DTEND;VALUE=DATE:20110205 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T011858Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:6c94a3e6-4519-4778-ab73-95096713cc82 +SUMMARY:The third day of the Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110205 +DTEND;VALUE=DATE:20110206 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T011922Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:e8f8857d-f3d2-4cea-98ac-98d28b338202 +SUMMARY:Ching Ming Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110405 +DTEND;VALUE=DATE:20110406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T011937Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:a26d45a9-76ef-40a0-b1c5-d48910f6e7ef +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T011950Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:12c7bd01-163b-4a1a-a373-91a8b8b6b0da +SUMMARY:The day following Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110423 +DTEND;VALUE=DATE:20110424 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T012010Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:eb343413-a3db-4bb3-a869-26945ec606b6 +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T012030Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:d065eaa7-3e89-49df-93de-cbff2ac86a58 +SUMMARY:The day following Labour Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110502 +DTEND;VALUE=DATE:20110503 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T012051Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:10025847-bb40-4533-b47f-d2b58e4a96f6 +SUMMARY:The Buddha's Birthday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110510 +DTEND;VALUE=DATE:20110511 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T012113Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:cdbde614-6c80-4825-8237-b84425a72dbf +SUMMARY:Tuen Ng Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110606 +DTEND;VALUE=DATE:20110607 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T012138Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:1307d036-3357-4557-a633-a93f9d1241ac +SUMMARY:Hong Kong Special Administrative Region Establishment Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110701 +DTEND;VALUE=DATE:20110702 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T012216Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:1913842d-cdb6-42c6-9f70-477a472db03e +SUMMARY:The day following Chinese Mid-Autumn Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110913 +DTEND;VALUE=DATE:20110914 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T012243Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:907d260b-a331-44bf-8177-085050a5820a +SUMMARY:National Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20111001 +DTEND;VALUE=DATE:20111002 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T012258Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:133861f5-2c27-4ae2-a696-6ea24a2539be +SUMMARY:Chung Yeung Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20111005 +DTEND;VALUE=DATE:20111006 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T012319Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:2d23491d-642b-4d5f-b860-2e566ae13c69 +SUMMARY:The first weekday after Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20111226 +DTEND;VALUE=DATE:20111227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100722T012339Z +LAST-MODIFIED:20100801T132308Z +DTSTAMP:20121206T132010Z +UID:2f63915d-7d52-413d-b78e-e9c13ccf8f33 +SUMMARY:The second weekday after Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20111227 +DTEND;VALUE=DATE:20111228 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T114629Z +LAST-MODIFIED:20111108T114653Z +DTSTAMP:20121206T132010Z +UID:b857ff3f-5ea0-4c40-9af3-d19f24c9daa9 +SUMMARY:The day following the first day of January +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120102 +DTEND;VALUE=DATE:20120103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T114717Z +LAST-MODIFIED:20111108T114732Z +DTSTAMP:20121206T132010Z +UID:f997cda3-f7e8-4cbd-9559-c7db17a376db +SUMMARY:Lunar New Year's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120123 +DTEND;VALUE=DATE:20120124 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T114737Z +LAST-MODIFIED:20111108T114800Z +DTSTAMP:20121206T132010Z +UID:eae5a3cc-2e8e-45d1-be6d-21c66d3d96d8 +SUMMARY:The second day of the Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120124 +DTEND;VALUE=DATE:20120125 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T114803Z +LAST-MODIFIED:20111108T114821Z +DTSTAMP:20121206T132010Z +UID:a92cb84a-fb90-47b3-a540-649958260eba +SUMMARY:The third day of the Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120125 +DTEND;VALUE=DATE:20120126 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T114830Z +LAST-MODIFIED:20111108T114842Z +DTSTAMP:20121206T132010Z +UID:6981135b-b08a-46f8-b124-73aed6bc8907 +SUMMARY:Ching Ming Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120404 +DTEND;VALUE=DATE:20120405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T114847Z +LAST-MODIFIED:20111108T114857Z +DTSTAMP:20121206T132010Z +UID:b08a0f6b-a749-491b-bc1d-1e35b1328664 +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T114901Z +LAST-MODIFIED:20111108T114915Z +DTSTAMP:20121206T132010Z +UID:4128ddbc-f921-4592-8d64-0a5bcfdf798b +SUMMARY:The day following Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120407 +DTEND;VALUE=DATE:20120408 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T114919Z +LAST-MODIFIED:20111108T114929Z +DTSTAMP:20121206T132010Z +UID:96d4ac05-ff14-4686-bb37-7a56627ce80e +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T114935Z +LAST-MODIFIED:20111108T114956Z +DTSTAMP:20121206T132010Z +UID:896391c8-863b-4f2a-a34d-46c13c988a66 +SUMMARY:The Birthday of the Buddha +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120428 +DTEND;VALUE=DATE:20120429 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T115003Z +LAST-MODIFIED:20111108T115012Z +DTSTAMP:20121206T132010Z +UID:e5b8f12b-b3fd-46fa-9704-27df6fad2ed9 +SUMMARY:Labour Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120501 +DTEND;VALUE=DATE:20120502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T115020Z +LAST-MODIFIED:20111108T115033Z +DTSTAMP:20121206T132010Z +UID:6e25ec51-aef3-4091-b499-1a34b12286ee +SUMMARY:Tuen Ng Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120623 +DTEND;VALUE=DATE:20120624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T115122Z +LAST-MODIFIED:20111108T115145Z +DTSTAMP:20121206T132010Z +UID:3807c01a-5488-4d64-b59d-4dcac4c825de +SUMMARY:The day following the Chinese Mid-Autumn Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20121001 +DTEND;VALUE=DATE:20121002 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T115152Z +LAST-MODIFIED:20111108T115208Z +DTSTAMP:20121206T132010Z +UID:5d0fba35-afd3-4f21-9213-1dde5642c3d7 +SUMMARY:The day following National Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20121002 +DTEND;VALUE=DATE:20121003 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T115213Z +LAST-MODIFIED:20111108T115228Z +DTSTAMP:20121206T132010Z +UID:fafad9e1-a0be-418c-b381-d5cb0ef20ea8 +SUMMARY:Chung Yeung Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20121023 +DTEND;VALUE=DATE:20121024 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T115236Z +LAST-MODIFIED:20111108T115247Z +DTSTAMP:20121206T132009Z +UID:eff161db-9585-49e9-98f6-cf84f8ea1401 +SUMMARY:Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T115255Z +LAST-MODIFIED:20111108T115315Z +DTSTAMP:20121206T132009Z +UID:dfe9ddc8-aaa0-4a79-ad6a-eea5f662a80b +SUMMARY:The first weekday after Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20121226 +DTEND;VALUE=DATE:20121227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111108T115040Z +LAST-MODIFIED:20111108T115407Z +DTSTAMP:20121206T132010Z +UID:1ab0da71-1500-4418-9d8a-0d809e1e9d7a +SUMMARY:The day following Hong Kong Special Administrative Region + Establishment Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120702 +DTEND;VALUE=DATE:20120703 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132139Z +LAST-MODIFIED:20121206T132206Z +DTSTAMP:20121206T132139Z +UID:c805f652-5aeb-4215-af49-accd530b8975 +SUMMARY:The first day of January +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130101 +DTEND;VALUE=DATE:20130102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132255Z +LAST-MODIFIED:20121206T132303Z +DTSTAMP:20121206T132255Z +UID:ec93cd11-ee22-497b-a5c9-e4c71909ed0d +SUMMARY:The third day of Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130212 +DTEND;VALUE=DATE:20130213 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132318Z +LAST-MODIFIED:20121206T132327Z +DTSTAMP:20121206T132318Z +UID:ec468988-c3e6-4b04-9d14-e432fee6cfc2 +SUMMARY:The fourth day of Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130213 +DTEND;VALUE=DATE:20130214 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132338Z +LAST-MODIFIED:20121206T132345Z +DTSTAMP:20121206T132338Z +UID:21449564-a89b-48de-89d3-a64ee20797e2 +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132354Z +LAST-MODIFIED:20121206T132402Z +DTSTAMP:20121206T132354Z +UID:65db68fe-8d57-4f1a-be62-6dd2d28203cd +SUMMARY:The day following Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130330 +DTEND;VALUE=DATE:20130331 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132414Z +LAST-MODIFIED:20121206T132421Z +DTSTAMP:20121206T132414Z +UID:1eeeb3ac-c994-4011-b708-c2d1cf9d273b +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132428Z +LAST-MODIFIED:20121206T132434Z +DTSTAMP:20121206T132428Z +UID:e5aae93b-c36e-4145-a8bc-548a71a8523c +SUMMARY:Ching Ming Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130404 +DTEND;VALUE=DATE:20130405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132442Z +LAST-MODIFIED:20121206T132448Z +DTSTAMP:20121206T132442Z +UID:778ac5d1-7c8f-4e6c-a808-60b73a3675d5 +SUMMARY:Labour Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130501 +DTEND;VALUE=DATE:20130502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132456Z +LAST-MODIFIED:20121206T132502Z +DTSTAMP:20121206T132456Z +UID:9f363ff2-16a4-4ef6-b9e3-695cd5931177 +SUMMARY:The Birthday of the Buddha +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130517 +DTEND;VALUE=DATE:20130518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132512Z +LAST-MODIFIED:20121206T132518Z +DTSTAMP:20121206T132512Z +UID:cc0f2d50-9e79-49b8-8db0-d74732b8ac94 +SUMMARY:Tuen Ng Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130612 +DTEND;VALUE=DATE:20130613 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132527Z +LAST-MODIFIED:20121206T132533Z +DTSTAMP:20121206T132527Z +UID:d504be5a-97d4-4c9a-8c86-34d56b09c9f7 +SUMMARY:Hong Kong Special Administrative Region Establishment Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130701 +DTEND;VALUE=DATE:20130702 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132545Z +LAST-MODIFIED:20121206T132551Z +DTSTAMP:20121206T132545Z +UID:662d2741-73ae-4ce8-82ed-bb9a6bc8fb39 +SUMMARY:The day following the Chinese Mid-Autumn Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130920 +DTEND;VALUE=DATE:20130921 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132601Z +LAST-MODIFIED:20121206T132607Z +DTSTAMP:20121206T132601Z +UID:57d616ea-323f-4dad-ae76-27cb379c3cd3 +SUMMARY:National Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131001 +DTEND;VALUE=DATE:20131002 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132614Z +LAST-MODIFIED:20121206T132621Z +DTSTAMP:20121206T132614Z +UID:11aab136-d20f-46e2-8a61-39450b66c450 +SUMMARY:The day following Chung Yeung Festival +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131014 +DTEND;VALUE=DATE:20131015 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132630Z +LAST-MODIFIED:20121206T132640Z +DTSTAMP:20121206T132630Z +UID:d5f2a7b4-ff26-41e8-9bb6-14c652c52121 +SUMMARY:Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131225 +DTEND;VALUE=DATE:20131226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132647Z +LAST-MODIFIED:20121206T132653Z +DTSTAMP:20121206T132647Z +UID:ed08ada0-6c59-455f-8faf-d308d0e174c1 +SUMMARY:The first weekday after Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131226 +DTEND;VALUE=DATE:20131227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121206T132236Z +LAST-MODIFIED:20121206T132735Z +DTSTAMP:20121206T132236Z +UID:a3c4beca-3185-4207-b708-aae324a881e5 +SUMMARY:The second day of Lunar New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130211 +DTEND;VALUE=DATE:20130212 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/HungarianHolidays.ics b/media/caldata/HungarianHolidays.ics new file mode 100644 index 00000000000..24406423415 --- /dev/null +++ b/media/caldata/HungarianHolidays.ics @@ -0,0 +1,270 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20101230T130622Z +LAST-MODIFIED:20110102T122156Z +DTSTAMP:20110102T122156Z +UID:79577971-d7d5-4c23-8457-2ad1d046f67e +SUMMARY:Újév +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:20110102 +DESCRIPTION:Munkaszüneti nap +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T131216Z +LAST-MODIFIED:20110102T122225Z +DTSTAMP:20110102T122225Z +UID:511b80b5-2eb8-4853-b8d0-703244a4422d +SUMMARY:Az 1848-as forradalom ünnepe +DTSTART;VALUE=DATE:20110315 +DTEND;VALUE=DATE:20110316 +DESCRIPTION:Nemzeti ünnep\, munkaszüneti nap\n\nA modern parlamentáris + Magyarország megszületésének a napja. Az 1848. március 15-ei forradal + om célja a Habsburg-uralom megszüntetése\, a függetlenség és az alko + tmányos berendezkedés kivívása volt. 1989-ben először volt munkaszü + neti nap. 1990-től hivatalos nemzeti ünnep. Ezen a napon osztják ki a K + ossuth- és Széchenyi-díjakat.\n\nhttp://hu.wikipedia.org/wiki/1848-as_f + orradalom +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T131526Z +LAST-MODIFIED:20101230T133616Z +DTSTAMP:20101230T133616Z +UID:491c8ec7-fc0c-466d-a42d-e482226d9a27 +SUMMARY:Húsvét hétfő +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110427 +DESCRIPTION:Munkaszüneti nap\n\nKeresztény ünnep\; időpontja a tavaszi + napéjegyenlőséget követő első holdtölte utáni első vasárnap és + azt követő hétfő.\n\nhttp://hu.wikipedia.org/wiki/H%C3%BAsv%C3%A9t +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T131801Z +LAST-MODIFIED:20110102T122240Z +DTSTAMP:20110102T122240Z +UID:8f78816d-b921-4649-b1aa-bd90db45ffee +SUMMARY:Munka ünnepe +DTSTART;VALUE=DATE:20110501 +DTEND;VALUE=DATE:20110502 +DESCRIPTION:Munkaszüneti nap\n\nhttp://hu.wikipedia.org/wiki/A_munka_%C3% + BCnnepe +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T131912Z +LAST-MODIFIED:20101230T133705Z +DTSTAMP:20101230T133705Z +UID:559380a2-6e4f-4cdc-8aab-9128b57b4bbd +SUMMARY:Pünkösd hétfő +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +DESCRIPTION:Munkaszüneti nap\n\nKeresztény ünnep\; 50 nappal húsvét u + tán\, vasárnap és hétfő.\n\nhttp://hu.wikipedia.org/wiki/P%C3%BCnk%C3 + %B6sd +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T132045Z +LAST-MODIFIED:20101230T132813Z +DTSTAMP:20101230T132813Z +UID:224a2605-e66d-4827-b1d3-09ebe5eb0686 +SUMMARY:Államalapítás ünnepe +DTSTART;VALUE=DATE:20110820 +DTEND;VALUE=DATE:20110821 +DESCRIPTION:Nemzeti és állami ünnep\n\nhttp://hu.wikipedia.org/wiki/%C3 + %81llamalap%C3%ADt%C3%A1s\n\nSzent István szentté avatásának (1083) é + vfordulója. Egyházi ünnep is.\nhttp://hu.wikipedia.org/wiki/Szent_Istv% + C3%A1n\n\nAz új kenyér ünnepe\n +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T132214Z +LAST-MODIFIED:20101230T132335Z +DTSTAMP:20101230T132335Z +UID:b2c09365-df7c-428c-a62b-82cdc1bdf59e +SUMMARY:Az 1956-os forradalom ünnepe +DTSTART;VALUE=DATE:20111023 +DTEND;VALUE=DATE:20111024 +DESCRIPTION:Nemzeti ünnep\n\naz 1956-os forradalom ünnepe\nhttp://hu.wik + ipedia.org/wiki/Az_1956-os_forradalom\n\na 3. magyar köztársaság kikiá + ltásának napja\nhttp://hu.wikipedia.org/wiki/3._magyar_k%C3%B6zt%C3%A1rs + as%C3%A1g +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T132349Z +LAST-MODIFIED:20101230T132546Z +DTSTAMP:20101230T132546Z +UID:b72070c4-013a-4508-a8b3-da6352371a09 +SUMMARY:Mindenszentek +DTSTART;VALUE=DATE:20111101 +DTEND;VALUE=DATE:20111102 +DESCRIPTION:Munkaszüneti nap\n\nKeresztény ünnep\, amelyet a katolikus + egyházban november 1-én tartanak\n\nhttp://hu.wikipedia.org/wiki/Mindens + zentek +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T132551Z +LAST-MODIFIED:20101230T132635Z +DTSTAMP:20101230T132635Z +UID:aeea890f-70cc-448e-8306-52227c3f4df4 +SUMMARY:Karácsony +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111227 +DESCRIPTION:Munkaszüneti nap\n\nhttp://hu.wikipedia.org/wiki/Kar%C3%A1cso + ny +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T130622Z +LAST-MODIFIED:20101230T132858Z +DTSTAMP:20101230T132858Z +UID:7ec7e047-ba9b-46ad-bcd7-375780a63f00 +SUMMARY:Újév +DTSTART;VALUE=DATE:20120101 +DTEND;VALUE=DATE:20120102 +DESCRIPTION:Munkaszüneti nap +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T131216Z +LAST-MODIFIED:20101230T132945Z +DTSTAMP:20101230T132945Z +UID:ae7e5558-7a12-46d6-b9a4-deea96cfcf71 +SUMMARY:Az 1848-as forradalom ünnepe +DTSTART;VALUE=DATE:20120315 +DTEND;VALUE=DATE:20120316 +DESCRIPTION:Nemzeti ünnep\, munkaszüneti nap\n\nA modern parlamentáris + Magyarország megszületésének a napja. Az 1848. március 15-ei forradal + om célja a Habsburg-uralom megszüntetése\, a függetlenség és az alko + tmányos berendezkedés kivívása volt. 1989-ben először volt munkaszü + neti nap. 1990-től hivatalos nemzeti ünnep. Ezen a napon osztják ki a K + ossuth- és Széchenyi-díjakat.\n\nhttp://hu.wikipedia.org/wiki/1848-as_f + orradalom +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T131526Z +LAST-MODIFIED:20101230T133650Z +DTSTAMP:20101230T133650Z +UID:942a7b22-7ed3-4e6f-a31f-84a287aec9d6 +SUMMARY:Húsvét hétfő +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +DESCRIPTION:Munkaszüneti nap\n\nKeresztény ünnep\; időpontja a tavaszi + napéjegyenlőséget követő első holdtölte utáni első vasárnap és + azt követő hétfő.\n\nhttp://hu.wikipedia.org/wiki/H%C3%BAsv%C3%A9t +TRANSP:TRANSPARENT +SEQUENCE:4 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T131801Z +LAST-MODIFIED:20110102T122253Z +DTSTAMP:20110102T122253Z +UID:28f9ab2d-fded-4e50-9ed1-f3fdee1d09d4 +SUMMARY:Munka ünnepe +DTSTART;VALUE=DATE:20120501 +DTEND;VALUE=DATE:20120502 +DESCRIPTION:Munkaszüneti nap\n\nhttp://hu.wikipedia.org/wiki/A_munka_%C3% + BCnnepe +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T131912Z +LAST-MODIFIED:20101230T133731Z +DTSTAMP:20101230T133731Z +UID:1c2f2500-b11c-430d-9fe9-2b00ae4dc64b +SUMMARY:Pünkösd hétfő +DTSTART;VALUE=DATE:20120528 +DTEND;VALUE=DATE:20120529 +DESCRIPTION:Munkaszüneti nap\n\nKeresztény ünnep\; 50 nappal húsvét u + tán\, vasárnap és hétfő.\n\nhttp://hu.wikipedia.org/wiki/P%C3%BCnk%C3 + %B6sd +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T132045Z +LAST-MODIFIED:20101230T133406Z +DTSTAMP:20101230T133406Z +UID:3f0f897b-725d-4924-9014-6d93cd3fc45a +SUMMARY:Államalapítás ünnepe +DTSTART;VALUE=DATE:20120820 +DTEND;VALUE=DATE:20120821 +DESCRIPTION:Nemzeti és állami ünnep\n\nhttp://hu.wikipedia.org/wiki/%C3 + %81llamalap%C3%ADt%C3%A1s\n\nSzent István szentté avatásának (1083) é + vfordulója. Egyházi ünnep is.\nhttp://hu.wikipedia.org/wiki/Szent_Istv% + C3%A1n\n\nAz új kenyér ünnepe\n +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T132214Z +LAST-MODIFIED:20101230T133440Z +DTSTAMP:20101230T133440Z +UID:555c03aa-56e9-494d-9a88-f4343bdb454b +SUMMARY:Az 1956-os forradalom ünnepe +DTSTART;VALUE=DATE:20121023 +DTEND;VALUE=DATE:20121024 +DESCRIPTION:Nemzeti ünnep\n\naz 1956-os forradalom ünnepe\nhttp://hu.wik + ipedia.org/wiki/Az_1956-os_forradalom\n\na 3. magyar köztársaság kikiá + ltásának napja\nhttp://hu.wikipedia.org/wiki/3._magyar_k%C3%B6zt%C3%A1rs + as%C3%A1g +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T132349Z +LAST-MODIFIED:20101230T133502Z +DTSTAMP:20101230T133502Z +UID:2d491b4e-5f89-4f12-b375-a7bd4bc9f31e +SUMMARY:Mindenszentek +DTSTART;VALUE=DATE:20121101 +DTEND;VALUE=DATE:20121102 +DESCRIPTION:Munkaszüneti nap\n\nKeresztény ünnep\, amelyet a katolikus + egyházban november 1-én tartanak\n\nhttp://hu.wikipedia.org/wiki/Mindens + zentek +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101230T132551Z +LAST-MODIFIED:20101230T133520Z +DTSTAMP:20101230T133520Z +UID:41ee5ec4-79bc-4ebd-a970-7fcbeb0e33d1 +SUMMARY:Karácsony +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121227 +DESCRIPTION:Munkaszüneti nap\n\nhttp://hu.wikipedia.org/wiki/Kar%C3%A1cso + ny +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/IcelandHolidays.ics b/media/caldata/IcelandHolidays.ics new file mode 100644 index 00000000000..4d82443cc64 --- /dev/null +++ b/media/caldata/IcelandHolidays.ics @@ -0,0 +1,2621 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:c6f8947d-31db-4f7e-afb0-80e077dacbf6 +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20080204 +DTEND;VALUE=DATE:20080205 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:0fb5c05b-f177-4339-8b30-ddda1b45d431 +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20080205 +DTEND;VALUE=DATE:20080206 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:3150133f-bee7-4d92-a868-198c74d0a720 +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20080206 +DTEND;VALUE=DATE:20080207 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:535164eb-2a86-4429-a3a3-4a5d6ea3d05d +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20080316 +DTEND;VALUE=DATE:20080317 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:ea012aa4-67fe-4c45-b6e2-895b39f097db +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20080320 +DTEND;VALUE=DATE:20080321 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:13954433-a29a-45f0-91af-d59e00940d79 +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20080321 +DTEND;VALUE=DATE:20080322 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:302d29d5-6ac7-42b7-9de5-b868611fa98b +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20080323 +DTEND;VALUE=DATE:20080324 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:f33982c7-3b83-4916-8d95-1cc93523f331 +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20080324 +DTEND;VALUE=DATE:20080325 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:3c55e99d-b845-46f7-8e20-95b784f03df9 +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20080501 +DTEND;VALUE=DATE:20080502 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:891ae468-23e0-4a89-845f-8ab6b6e82e09 +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20080511 +DTEND;VALUE=DATE:20080512 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:7798f95e-5f81-42cd-851f-9e8f1ad40ef2 +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20080512 +DTEND;VALUE=DATE:20080513 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:ab730f67-9a1e-43e9-b71b-b678d17a7a5f +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20081025 +DTEND;VALUE=DATE:20081026 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:e47aa2fa-8ca3-4c7e-a3ea-f1fe3de1ff88 +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20080424 +DTEND;VALUE=DATE:20080425 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:c9d2714a-90e2-4040-99de-26fa3a8ffe48 +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20080823 +DTEND;VALUE=DATE:20080824 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:01b1b626-4817-46a8-beec-c00788362557 +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20080118 +DTEND;VALUE=DATE:20080119 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:7e94c412-85b5-42e4-8a1f-edfb1d629945 +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20080224 +DTEND;VALUE=DATE:20080225 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:c85affd2-bbc8-4bc0-992f-833f3f1f2fbe +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20081130 +DTEND;VALUE=DATE:20081201 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:8f075997-5ac9-4314-b40a-b727614b61b8 +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20081207 +DTEND;VALUE=DATE:20081208 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:39f50c22-c43d-4c22-9af9-6681a5f4407d +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20081214 +DTEND;VALUE=DATE:20081215 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:dd2d409e-b33f-4028-b5fe-558cf46e71ad +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20081221 +DTEND;VALUE=DATE:20081222 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:1cde5158-3ae2-44d3-9451-6118afe29279 +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20080601 +DTEND;VALUE=DATE:20080602 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:69e7a3e0-da95-422f-9b0f-4409ad0afbc4 +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20090223 +DTEND;VALUE=DATE:20090224 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:0c1616ee-d75f-4de8-b415-1a719114eddf +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20090224 +DTEND;VALUE=DATE:20090225 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:a7cc1955-c807-427e-967c-43aac47e015b +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20090225 +DTEND;VALUE=DATE:20090226 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:8477f5b2-b76a-4c4c-97e3-6003a8e8a01c +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20090405 +DTEND;VALUE=DATE:20090406 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:d3131ce1-fa63-4c1e-8d8e-54debc531fcb +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20090409 +DTEND;VALUE=DATE:20090410 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:842de3d8-b8b1-4ac3-881a-90617b900271 +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:19862725-5e62-4247-9ff4-5f91a6385165 +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:7f085b9d-cbbf-4a96-b8c8-e28331c5b9ea +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:81473921-68e0-409a-b19f-0c2f5ec9dab7 +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20090521 +DTEND;VALUE=DATE:20090522 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:0d890d05-5444-461f-aae0-ecfa8a2b2397 +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20090531 +DTEND;VALUE=DATE:20090601 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:e7b5377b-2f2e-4789-baf6-321b96e5954e +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20090601 +DTEND;VALUE=DATE:20090602 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:fd29a14e-1abe-47eb-a20f-9bce562125a6 +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20091024 +DTEND;VALUE=DATE:20091025 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:16615b2f-fc64-4ece-a283-e69e8275a546 +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20090423 +DTEND;VALUE=DATE:20090424 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:e1e1863b-32c2-4897-a763-7b748493a704 +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20090822 +DTEND;VALUE=DATE:20090823 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:f8e676c5-f8da-498d-b512-f2e62d0eff07 +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20090123 +DTEND;VALUE=DATE:20090124 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:8a28d999-2579-4462-bf8f-2c03af2aca52 +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20090222 +DTEND;VALUE=DATE:20090223 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:dba6be39-76ca-498a-9ec5-4775658a748c +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20091129 +DTEND;VALUE=DATE:20091130 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:9c33b857-64b7-4bca-930d-39a0769c3092 +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20091206 +DTEND;VALUE=DATE:20091207 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:840978b1-6d7c-468a-8005-10f1e03126ef +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20091213 +DTEND;VALUE=DATE:20091214 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:94994580-501b-4df5-bf84-bc3a7c684ac6 +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20091220 +DTEND;VALUE=DATE:20091221 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:1e4fe43c-90f6-4840-a96c-a6b86b542fcf +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20090607 +DTEND;VALUE=DATE:20090608 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:26a55ca4-6e72-40aa-b308-2fac1d13ea7c +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20100215 +DTEND;VALUE=DATE:20100216 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:18f3bc8d-e06a-4cea-8ba2-1d24cc14557b +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20100216 +DTEND;VALUE=DATE:20100217 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:1d0981c6-bf6c-404d-bcf0-8d8f07412e0a +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20100217 +DTEND;VALUE=DATE:20100218 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:bfdff49e-4e40-47df-a0cb-ee22f993d85c +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20100328 +DTEND;VALUE=DATE:20100329 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:4cb58a72-ee42-4ba4-a001-7c1da526538c +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20100401 +DTEND;VALUE=DATE:20100402 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:ee7b4c71-faca-4f29-b4d8-fe18367182a7 +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:6eaf82a3-f57a-4af6-ac43-949e0497c112 +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:a99ae4a5-ea78-43f4-bc07-ddafb21d6c80 +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:d0b886d0-de0b-4010-a9ce-da5362b307d8 +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:68b3e42c-e243-4a12-b95f-48e8769e0158 +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:28e6527e-c488-4aad-9259-d2947ccc4b6a +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20100524 +DTEND;VALUE=DATE:20100525 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:15fb4726-a1d6-4f41-b80a-df6c659b9b74 +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20101023 +DTEND;VALUE=DATE:20101024 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:964c05f6-c839-4653-996e-75918b9fe629 +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20100422 +DTEND;VALUE=DATE:20100423 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:ebfd2520-6eac-4a9e-8bb6-261b6d2f5611 +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20100821 +DTEND;VALUE=DATE:20100822 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:903b07f0-6e1a-4ede-8b03-add66d0356d2 +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20100122 +DTEND;VALUE=DATE:20100123 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:accacc7a-2d7f-491b-96fc-a159246463e0 +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20100221 +DTEND;VALUE=DATE:20100222 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:9387b5a2-087a-4830-ac8a-3bd80614c665 +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20101128 +DTEND;VALUE=DATE:20101129 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:fb4c073e-e50e-474c-b352-fa1bbb47529c +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20101205 +DTEND;VALUE=DATE:20101206 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:c5f49dc4-e647-4107-b889-857dbca5d483 +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20101212 +DTEND;VALUE=DATE:20101213 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:c4f9a77b-33b8-4f0b-997d-c60e7d63abc1 +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20101219 +DTEND;VALUE=DATE:20101220 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:eb5012e8-6a96-4e30-bd1e-a9e03f3443d9 +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20100606 +DTEND;VALUE=DATE:20100607 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:4e11ebcc-fdff-4d1f-a27c-8e321fb8940d +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20110307 +DTEND;VALUE=DATE:20110308 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:6769d928-3718-489b-b97f-421597770088 +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20110308 +DTEND;VALUE=DATE:20110309 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:31591beb-307d-4d70-a570-a03bd1de39e3 +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20110309 +DTEND;VALUE=DATE:20110310 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:949450b4-aa55-4c24-b04c-3be08e180fd0 +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20110417 +DTEND;VALUE=DATE:20110418 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:3a49dd92-90c9-4907-b195-b7fe12611493 +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20110421 +DTEND;VALUE=DATE:20110422 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:2a2ea282-603d-4f98-ae4a-298b5a6dcfe3 +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:13be9400-d26c-43ea-913d-0f20c531455c +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:36399758-0fca-4c26-98b0-9e3f51a90d4c +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:4cca6fce-98cb-4fa4-8e3f-ab053f77836b +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:fe8b96a5-6e12-42d1-bde2-79e6deb1603e +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:aab9ae04-2500-4aba-939a-2d7a24528a81 +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:01746c4d-a16b-49f3-bb36-c1e75e217fbd +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20111022 +DTEND;VALUE=DATE:20111023 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:f150868d-2df6-41fd-8a45-a635ba0217bd +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20110421 +DTEND;VALUE=DATE:20110422 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:21205e84-f150-401f-bae2-b8fbbc9e401a +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20110820 +DTEND;VALUE=DATE:20110821 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:339d2c82-f2bb-4f72-824c-aeba900968f4 +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20110121 +DTEND;VALUE=DATE:20110122 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:3fcddab7-b9c9-4bed-b61e-98c46102e084 +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20110220 +DTEND;VALUE=DATE:20110221 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:7cd1c15e-34af-4cab-900e-b7e0d6e0cdf8 +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20111204 +DTEND;VALUE=DATE:20111205 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:51550a98-0caa-444a-99b5-6fc674b8fe53 +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20111211 +DTEND;VALUE=DATE:20111212 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:18fbf7cb-5e14-47ce-a5c4-4ce3803b417d +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20111218 +DTEND;VALUE=DATE:20111219 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:e68458cc-59d4-4215-85a3-3b12a65ba002 +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111226 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:0165cf9e-b5d6-44cf-922c-01ea2da9a040 +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20110605 +DTEND;VALUE=DATE:20110606 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:6f3a160a-9b99-415f-b250-14d58d1f7da6 +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20120220 +DTEND;VALUE=DATE:20120221 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:0cd13d1d-bf06-4f36-9b42-f8dbf907dedf +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20120221 +DTEND;VALUE=DATE:20120222 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:1a892d3e-d2ed-4f07-85f0-11e426b673ff +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20120222 +DTEND;VALUE=DATE:20120223 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:59d9f3ca-ed78-4863-8915-63f4cb79f700 +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20120401 +DTEND;VALUE=DATE:20120402 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:a7d22e74-ccb7-4b21-8cac-fb05b2b74d04 +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20120405 +DTEND;VALUE=DATE:20120406 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:001ac9bc-508b-435e-9266-b88f55855403 +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:bc742a7e-9543-421c-9011-5c3abfd3a12b +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:9460ae0a-a6a8-445a-a6ea-6ad024b2240a +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:d643c96c-588f-414d-80a4-6e13fb525a85 +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:f646ddfb-e99a-4dd4-8f52-f06fd0fde284 +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20120527 +DTEND;VALUE=DATE:20120528 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:1db91531-3ee4-44f9-ac35-2a86b938542b +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20120528 +DTEND;VALUE=DATE:20120529 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:9bbe069e-e3e8-4ecb-96f7-bb8c3544225f +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20121027 +DTEND;VALUE=DATE:20121028 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:28f3cea4-121f-4ebb-b7e5-0dda87799fe9 +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20120419 +DTEND;VALUE=DATE:20120420 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:3b5ae6e4-17c6-465c-8c6b-ab5b6a738b55 +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20120818 +DTEND;VALUE=DATE:20120819 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:aec1ada7-afef-43a5-a412-302f638a4a8c +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20120120 +DTEND;VALUE=DATE:20120121 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:db9c05f5-3a11-4303-be12-1737df8c87ce +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20120219 +DTEND;VALUE=DATE:20120220 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:f37d7174-2158-498f-973e-1856090b6d1e +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20121202 +DTEND;VALUE=DATE:20121203 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:a43b0e85-ab34-4fac-97aa-a2a8258af3e2 +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20121209 +DTEND;VALUE=DATE:20121210 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:378fc9b1-9501-424a-874b-02eb1d1af7ba +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20121216 +DTEND;VALUE=DATE:20121217 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:ee445434-86ee-4ca5-b975-f7e454cf4d64 +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20121223 +DTEND;VALUE=DATE:20121224 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:e98696fe-54a3-4e72-84c4-89403b0739d9 +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20120603 +DTEND;VALUE=DATE:20120604 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:9eca6e03-0baa-4aa2-a540-7fa960a08db2 +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20130211 +DTEND;VALUE=DATE:20130212 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:1d574e8a-8b2e-4906-9678-6f9e3fce3bb7 +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20130212 +DTEND;VALUE=DATE:20130213 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:0c2a6bbc-f4d9-4f28-a22d-a141b5d107e5 +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20130213 +DTEND;VALUE=DATE:20130214 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:b0f9c078-9c99-44fb-b6a7-63b531fc35e2 +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20130324 +DTEND;VALUE=DATE:20130325 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:b48d6229-b4d3-42a7-aaa9-ee216fd802f0 +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20130328 +DTEND;VALUE=DATE:20130329 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:65d68146-0799-46e4-86ec-f1ede7666b8d +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:25a65eee-6d39-4621-8aec-bf3c59ebf51d +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:5d5ef538-6690-4ccf-8a4a-c9e2ab13576d +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:ad59db5e-b22d-4762-8907-8f2ed5fbb4d0 +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:b097f40d-8d9f-47f6-adac-e3b300d2e386 +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:4b93bc2a-13b1-42ac-abe9-8da3d226def0 +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20130520 +DTEND;VALUE=DATE:20130521 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:cb11477a-a399-42f5-a8b9-2a50afa93fad +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20131026 +DTEND;VALUE=DATE:20131027 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:61520fa4-bab4-47b4-bcca-09decc778ed9 +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20130425 +DTEND;VALUE=DATE:20130426 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:b72513ea-5b2b-4138-ba76-a109a544ee50 +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20130824 +DTEND;VALUE=DATE:20130825 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:11529370-f666-46a1-8702-c53b25223e93 +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20130118 +DTEND;VALUE=DATE:20130119 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:ba422f76-9e9e-47e3-9972-cf69d71cf692 +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20130224 +DTEND;VALUE=DATE:20130225 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:937ab002-ea68-47ee-bc68-cde2e4054103 +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20131201 +DTEND;VALUE=DATE:20131202 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:ff4654e9-241f-4374-bfb9-caa75ca7ac0f +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20131208 +DTEND;VALUE=DATE:20131209 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:cc041a6f-9841-4378-bbf3-0dcad84c428f +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20131215 +DTEND;VALUE=DATE:20131216 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:b008da9c-8780-41a7-9ba0-f864c468d2c8 +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20131222 +DTEND;VALUE=DATE:20131223 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:764cd2b0-ca22-4c86-afb1-92682126d42f +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20130602 +DTEND;VALUE=DATE:20130603 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:55ddf5d5-a704-4634-b549-14fa5c407961 +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20140303 +DTEND;VALUE=DATE:20140304 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:ba40a206-1460-4e4a-b189-0fb954899330 +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20140304 +DTEND;VALUE=DATE:20140305 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:01e43a41-6349-4a72-8d21-a44a231ecaed +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20140305 +DTEND;VALUE=DATE:20140306 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:1761df51-07f2-40a7-b084-d039c384dab6 +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20140413 +DTEND;VALUE=DATE:20140414 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:e48d26c2-f45e-4e06-be3a-e5b0bb1fc819 +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20140417 +DTEND;VALUE=DATE:20140418 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:0482d12a-5785-48d1-8541-8b4ab1cf2f9d +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:3065f87f-b447-41d9-b213-8cb4a3f70c3c +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:377fe57d-55fe-47d6-94b6-ffb5f479058e +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:47e95f80-0f8f-40c1-8fe6-75dd391ef641 +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20140529 +DTEND;VALUE=DATE:20140530 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:92a75137-8a0c-48a9-9cbd-e1c74486e2c9 +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20140608 +DTEND;VALUE=DATE:20140609 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:1118d81a-4a89-430f-a5e5-cd878de0951b +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20140609 +DTEND;VALUE=DATE:20140610 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:2016e9af-664e-4947-9dcc-7923860f557c +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20141025 +DTEND;VALUE=DATE:20141026 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:ba575f4b-8a13-4084-bec6-3b3f2fd306a0 +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20140424 +DTEND;VALUE=DATE:20140425 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:527616ba-a48f-4201-b2ae-66f8cbf207e1 +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20140823 +DTEND;VALUE=DATE:20140824 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:bd5ab2f9-6566-4301-a36f-0d03a4279f1b +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20140124 +DTEND;VALUE=DATE:20140125 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:4cdd69f3-852f-4968-92f7-b3e83548bab3 +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20140223 +DTEND;VALUE=DATE:20140224 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:49ded4b5-5c1b-43ba-923d-614fba0d553e +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20141130 +DTEND;VALUE=DATE:20141201 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:d87e190c-3b85-4dfb-9b72-121d3cab7285 +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20141207 +DTEND;VALUE=DATE:20141208 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:ed30e9d0-439a-4cbf-8e00-53f1f776ff1b +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20141214 +DTEND;VALUE=DATE:20141215 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:c1e54efb-d9fc-445a-b3c9-fb7d2c153504 +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20141221 +DTEND;VALUE=DATE:20141222 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:200028ee-ddb0-471b-a67b-26c3e86bd73c +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20140601 +DTEND;VALUE=DATE:20140602 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:86ca200c-b017-4cf1-a258-80a5d282eb22 +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20150216 +DTEND;VALUE=DATE:20150217 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:3c6ca02a-e18e-40f6-999b-a2cf798070e8 +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20150217 +DTEND;VALUE=DATE:20150218 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:4a585d5d-1034-4c72-9395-ce404a54fa41 +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20150218 +DTEND;VALUE=DATE:20150219 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:89784ad9-318c-41f4-9822-f6f24bd9b1ce +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20150329 +DTEND;VALUE=DATE:20150330 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:76df42ae-03a2-4aeb-9abd-970b4f2f562e +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20150402 +DTEND;VALUE=DATE:20150403 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:f6a72a3f-5dda-4bb7-bee9-458d73c5ae0c +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:69637b56-088e-4da7-a49f-12489fd77f02 +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:5081e585-e177-4ed3-9e91-392e94f13b79 +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:3843a9bb-eaa5-4cb3-89a2-107529b2f512 +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20150514 +DTEND;VALUE=DATE:20150515 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:0461578d-b95e-4a0d-9dcf-a076fff936be +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20150524 +DTEND;VALUE=DATE:20150525 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:1ce8cdf8-d861-4754-95f6-eb544372e2b1 +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20150525 +DTEND;VALUE=DATE:20150526 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:70289535-3d29-4c56-9630-bc068c8bd78b +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20151024 +DTEND;VALUE=DATE:20151025 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:6519caaf-bc5c-420a-b922-ef4aa613745a +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20150423 +DTEND;VALUE=DATE:20150424 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:388ee082-b23b-4e9e-89ab-24843eb7ad70 +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20150822 +DTEND;VALUE=DATE:20150823 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:b66c43a8-7e94-4d29-84a4-6c3f00483d46 +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20150123 +DTEND;VALUE=DATE:20150124 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:22cec1d3-ede5-4614-ba91-198ac8d371b7 +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20150222 +DTEND;VALUE=DATE:20150223 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:0d7fd119-e947-4db4-a318-cbc0f1c0587d +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20151129 +DTEND;VALUE=DATE:20151130 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:5eaaa289-857d-4c0c-99cd-b8dbadb675a8 +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20151206 +DTEND;VALUE=DATE:20151207 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:15250dd2-f878-48fd-9530-20d103bd7dad +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20151213 +DTEND;VALUE=DATE:20151214 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:6f4ecfeb-6c5c-4e2f-9773-829fff4fe269 +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20151220 +DTEND;VALUE=DATE:20151221 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:c61a6ec3-583e-43d7-8dc4-2a4765386413 +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20150607 +DTEND;VALUE=DATE:20150608 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:26f15924-f391-4e69-be73-85cfa14424d1 +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20160208 +DTEND;VALUE=DATE:20160209 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:7ae07cfc-1612-410b-b468-d43fe6a137b4 +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20160209 +DTEND;VALUE=DATE:20160210 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095929Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095929Z +UID:aa654224-698a-4172-b947-438e77d15b30 +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20160210 +DTEND;VALUE=DATE:20160211 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:0565600f-f5d1-479f-9f03-e644423d51f0 +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20160320 +DTEND;VALUE=DATE:20160321 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:9c21da01-e2a5-433a-821a-1bb721387413 +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20160324 +DTEND;VALUE=DATE:20160325 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:b3403d75-e5df-4941-8d38-6f0c7726d8c2 +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20160325 +DTEND;VALUE=DATE:20160326 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:17ea33aa-29c5-4b28-b1ee-f79bc3fd8ad7 +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:6e2fd61c-9739-4cce-9051-426cbd03b10d +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20160328 +DTEND;VALUE=DATE:20160329 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:6cbc8cbe-eaf1-46b0-bbf9-792680fbbf69 +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20160505 +DTEND;VALUE=DATE:20160506 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:627b7a1d-7003-4812-8eb1-37366db95182 +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20160515 +DTEND;VALUE=DATE:20160516 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:9833e4d5-0ae6-442a-9683-9b5b34f5a56f +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20160516 +DTEND;VALUE=DATE:20160517 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:126d2807-161e-478e-a9f3-76ab2633bad7 +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20161022 +DTEND;VALUE=DATE:20161023 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:231ca6c1-cdc9-4712-b153-9e8101d6fb61 +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20160421 +DTEND;VALUE=DATE:20160422 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:cb8105de-7e04-477c-8125-6f86a540e368 +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20160820 +DTEND;VALUE=DATE:20160821 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:145c1697-f3e0-46ba-b91b-2b0236065d1f +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20160122 +DTEND;VALUE=DATE:20160123 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:0261020f-68bf-45c1-9d05-277f2a6d146d +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20160221 +DTEND;VALUE=DATE:20160222 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:eb0154af-4ce1-4b8d-8d8d-aae5624a76de +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20161204 +DTEND;VALUE=DATE:20161205 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:ae290d7f-94eb-4438-9f6a-90a07626e340 +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20161211 +DTEND;VALUE=DATE:20161212 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:12efacab-5688-4d70-8dec-0872eff80e9e +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20161218 +DTEND;VALUE=DATE:20161219 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:74a5a474-d936-45f4-a01f-d2644207aa61 +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20161225 +DTEND;VALUE=DATE:20161226 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:4ce96739-885b-4df7-9e50-c071f734fe68 +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20160605 +DTEND;VALUE=DATE:20160606 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:4392dd17-170e-4cea-93bd-9bc98f64ee59 +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20170227 +DTEND;VALUE=DATE:20170228 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:9733d1c2-0085-4d2d-9677-00e0a014304e +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20170228 +DTEND;VALUE=DATE:20170301 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:a8506e11-07fd-4673-9245-e2e5c67d7a71 +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20170301 +DTEND;VALUE=DATE:20170302 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:1598478d-c18c-4e98-9d9d-e50416b766bd +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20170409 +DTEND;VALUE=DATE:20170410 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:35a9f0ac-3b14-42a2-8416-e5169bcca494 +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20170413 +DTEND;VALUE=DATE:20170414 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:729d3083-249c-4dff-9d92-d009ac7ea24a +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20170414 +DTEND;VALUE=DATE:20170415 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:296d8d0f-6821-4964-91ca-d16f755de711 +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:8d516886-aabe-474a-ae47-20ee7d2b18c7 +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20170417 +DTEND;VALUE=DATE:20170418 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:c5027457-7b3e-4caa-bc74-635964c2a1c0 +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20170525 +DTEND;VALUE=DATE:20170526 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:c85e16c6-231e-4b23-84d0-c123867c803c +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20170604 +DTEND;VALUE=DATE:20170605 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:b5b70bbb-b74a-40a2-a45e-6336d4841f8d +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20170605 +DTEND;VALUE=DATE:20170606 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:c5c3518e-0e66-46f6-a714-22926212b6ce +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20171021 +DTEND;VALUE=DATE:20171022 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:0b18d210-aac6-49bf-a85b-917d1e513d7c +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20170420 +DTEND;VALUE=DATE:20170421 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:ab0c6e3a-19cf-4880-b206-0d4717a8b087 +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20170819 +DTEND;VALUE=DATE:20170820 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:1ddc7b4e-a649-4654-a46b-cd629a8301a1 +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20170120 +DTEND;VALUE=DATE:20170121 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:ea19e66d-e7bd-433f-9b8d-0b1fc6f59fb9 +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20170219 +DTEND;VALUE=DATE:20170220 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:27454acb-f233-4fed-9961-aadf598a27f4 +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20171203 +DTEND;VALUE=DATE:20171204 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:601d1c56-7862-4303-b4c9-40472bfa8d1a +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20171210 +DTEND;VALUE=DATE:20171211 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:d6a97e06-6e42-4fbd-94e5-dec48c8c0e19 +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20171217 +DTEND;VALUE=DATE:20171218 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:5b2a23d2-4d42-4ed2-88a7-1f73cce9e591 +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20171224 +DTEND;VALUE=DATE:20171225 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:9f044e24-9a8a-445a-8c41-16f6dfc877b7 +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20170611 +DTEND;VALUE=DATE:20170612 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:f6b908b0-1c65-468d-9428-004d000373ff +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20180212 +DTEND;VALUE=DATE:20180213 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:c7e82feb-5168-4661-8260-a52022f7d5af +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20180213 +DTEND;VALUE=DATE:20180214 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:75444211-93cf-4b00-8a9a-c6ece024c0a9 +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20180214 +DTEND;VALUE=DATE:20180215 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:15c787c3-97ed-4475-9220-8d416e6a24dc +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20180325 +DTEND;VALUE=DATE:20180326 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:84deaae9-14f4-4ed2-8a16-3007269e1a79 +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20180329 +DTEND;VALUE=DATE:20180330 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:15adbd7d-ae95-44c1-8af5-39622b9d5523 +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20180330 +DTEND;VALUE=DATE:20180331 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:02052b20-f7ef-487f-90fc-0ceb9448018f +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20180401 +DTEND;VALUE=DATE:20180402 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:82fad218-1411-4e17-8e9a-4f7d8b3c648c +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20180402 +DTEND;VALUE=DATE:20180403 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:b197dcfb-9dd9-46a9-a222-d981312aeafe +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20180510 +DTEND;VALUE=DATE:20180511 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:97a308db-a652-44c3-8788-277c3ae7683e +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20180520 +DTEND;VALUE=DATE:20180521 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:276cb53b-57fe-4cc9-b0bc-9448c28fabd2 +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20180521 +DTEND;VALUE=DATE:20180522 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:58f69b89-0e51-4d99-9e1f-291c42e22aae +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20181027 +DTEND;VALUE=DATE:20181028 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:26bab17c-f935-4eb7-af22-044961951e16 +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20180419 +DTEND;VALUE=DATE:20180420 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:7bda4558-3d0d-4f7c-ba72-29174a4b03bd +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20180818 +DTEND;VALUE=DATE:20180819 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:16191875-9e90-4ec5-900a-3aa307efcc1a +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20180119 +DTEND;VALUE=DATE:20180120 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:074d505e-1b43-474d-98ff-c80d56d09c31 +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20180218 +DTEND;VALUE=DATE:20180219 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:dbb488cd-e659-4e7a-b5b3-e19a0e1e006f +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20181202 +DTEND;VALUE=DATE:20181203 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:67f1838a-4ef2-4497-9c9d-370a1e4edff5 +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20181209 +DTEND;VALUE=DATE:20181210 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:2d1af323-444b-4d66-a9ee-ce7182cba0e7 +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20181216 +DTEND;VALUE=DATE:20181217 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:d9714752-bbd0-4343-bcc0-efe1d5bc48c9 +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20181223 +DTEND;VALUE=DATE:20181224 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:e03fb6b3-cf1b-49a9-ad3a-d2cdd2e10f21 +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20180603 +DTEND;VALUE=DATE:20180604 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:e9e0d609-efc0-4680-abfb-d7d3abd3f39b +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20190304 +DTEND;VALUE=DATE:20190305 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:9e728175-33f4-4cc3-8d12-3b35084d9f26 +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20190305 +DTEND;VALUE=DATE:20190306 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:2db18149-2e2a-4815-b062-55d71bcb32a4 +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20190306 +DTEND;VALUE=DATE:20190307 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:6b31d7dd-4796-409d-9344-c64852f69922 +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20190414 +DTEND;VALUE=DATE:20190415 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:0359043f-afa7-4fdd-b998-8ffd4bcd79d9 +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20190418 +DTEND;VALUE=DATE:20190419 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:58f68821-06b2-4046-bd3e-d4d1c849e922 +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20190419 +DTEND;VALUE=DATE:20190420 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:417d8869-408a-4352-8d33-a8bacd640a80 +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20190421 +DTEND;VALUE=DATE:20190422 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:eceaee5d-d21f-4c01-9fef-322f480a688f +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20190422 +DTEND;VALUE=DATE:20190423 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:df2fdfb3-96b0-4b2e-91db-3da456e952aa +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20190530 +DTEND;VALUE=DATE:20190531 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:2101103e-31bd-4e8c-8b23-41de85859245 +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20190609 +DTEND;VALUE=DATE:20190610 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:c0d14cc3-45f0-414a-a753-190a59d13045 +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20190610 +DTEND;VALUE=DATE:20190611 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:5d98c5cf-a892-4951-ba82-ba5dccb86e24 +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20191026 +DTEND;VALUE=DATE:20191027 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:c8c12f62-73cc-4da6-a341-4cba85299639 +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20190425 +DTEND;VALUE=DATE:20190426 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:d7442b5a-4d1f-44aa-a303-0edbd4ec8204 +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20190824 +DTEND;VALUE=DATE:20190825 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:786d61fe-1252-41d0-a3fc-51dedf159cd6 +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20190118 +DTEND;VALUE=DATE:20190119 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:ab168677-e452-4c30-ad4e-dab992307c87 +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20190224 +DTEND;VALUE=DATE:20190225 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:3d9fc523-f73e-4d58-aacc-94b8e17f3e32 +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20191201 +DTEND;VALUE=DATE:20191202 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:da933667-ab75-4658-9c4c-e76a9cc56886 +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20191208 +DTEND;VALUE=DATE:20191209 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:2d44af44-54e8-4a64-9621-2f3a9f8c574a +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20191215 +DTEND;VALUE=DATE:20191216 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:750854fe-e0dc-48bc-84c6-9b4824fd4318 +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20191222 +DTEND;VALUE=DATE:20191223 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:db90aafa-73e9-44c0-ac60-000f6f27e67a +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20190602 +DTEND;VALUE=DATE:20190603 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:bc39ee76-782d-48f6-b41f-408d7e6ea68e +SUMMARY:Bolludagur +DTSTART;VALUE=DATE:20200224 +DTEND;VALUE=DATE:20200225 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:d6bf13e8-3708-4e64-937e-e8abaf053b6e +SUMMARY:Sprengidagur +DTSTART;VALUE=DATE:20200225 +DTEND;VALUE=DATE:20200226 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:42535133-a356-438d-a1bb-0d0232de4de6 +SUMMARY:Öskudagur +DTSTART;VALUE=DATE:20200226 +DTEND;VALUE=DATE:20200227 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:b44bcb6b-f8a7-4754-b17f-85dc2ebac1c9 +SUMMARY:Pálmasunnudagur +DTSTART;VALUE=DATE:20200405 +DTEND;VALUE=DATE:20200406 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:abb80d0e-6623-4e07-b091-5d9b82926515 +SUMMARY:Skírdagur +DTSTART;VALUE=DATE:20200409 +DTEND;VALUE=DATE:20200410 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:7a92551a-9acf-425c-af13-2805683534b8 +SUMMARY:Föstudagurinn langi +DTSTART;VALUE=DATE:20200410 +DTEND;VALUE=DATE:20200411 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:9a6134ee-810f-405f-b93b-01afefee2128 +SUMMARY:Páskadagur +DTSTART;VALUE=DATE:20200412 +DTEND;VALUE=DATE:20200413 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:482e006d-3dbc-42b5-b582-9837bbc1cda0 +SUMMARY:Annar í páskum +DTSTART;VALUE=DATE:20200413 +DTEND;VALUE=DATE:20200414 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:4f610ecb-d58f-467b-9c30-4bf1fc22f85e +SUMMARY:Uppstigningardagur +DTSTART;VALUE=DATE:20200521 +DTEND;VALUE=DATE:20200522 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:c41c0cd7-6e27-467b-b99d-0bdd45842a97 +SUMMARY:Hvítasunnudagur +DTSTART;VALUE=DATE:20200531 +DTEND;VALUE=DATE:20200601 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:d6c72e7b-fcfd-4481-9cf4-fc2074a8f9f0 +SUMMARY:Annar í hvítasunnu +DTSTART;VALUE=DATE:20200601 +DTEND;VALUE=DATE:20200602 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:caf309e6-7565-4ca2-84f1-8914b577b58f +SUMMARY:Fyrsti vetrardagur +DTSTART;VALUE=DATE:20201024 +DTEND;VALUE=DATE:20201025 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:6ec52ac0-de08-4f95-9a39-50f264279343 +SUMMARY:Sumardagurinn fyrsti +DTSTART;VALUE=DATE:20200423 +DTEND;VALUE=DATE:20200424 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:265baaf3-d998-4259-bb2f-1f8f89f98e85 +SUMMARY:Menningarnótt +DTSTART;VALUE=DATE:20200822 +DTEND;VALUE=DATE:20200823 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:e6000cdf-9e51-4337-9351-47202661d099 +SUMMARY:Bóndadagur +DTSTART;VALUE=DATE:20200124 +DTEND;VALUE=DATE:20200125 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:d6e73e1b-0c18-4040-8d02-49d885768166 +SUMMARY:Konudagur +DTSTART;VALUE=DATE:20200223 +DTEND;VALUE=DATE:20200224 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:c5480948-11db-43ae-a77e-3b02037ab338 +SUMMARY:Fyrsti í aðventu +DTSTART;VALUE=DATE:20201129 +DTEND;VALUE=DATE:20201130 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:728da255-2984-417b-be76-aa2eee5c0189 +SUMMARY:Annar í aðventu +DTSTART;VALUE=DATE:20201206 +DTEND;VALUE=DATE:20201207 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:50bc115f-bd88-4f0c-840b-b4ea155f3685 +SUMMARY:Þriðji í aðventu +DTSTART;VALUE=DATE:20201213 +DTEND;VALUE=DATE:20201214 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:893600d6-f4ef-4bef-b539-4d79859ceb64 +SUMMARY:Fjórði í aðventu +DTSTART;VALUE=DATE:20201220 +DTEND;VALUE=DATE:20201221 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:5dd4d7f0-6f5f-4d16-91c4-d897fe474be1 +SUMMARY:Sjómannadagurinn +DTSTART;VALUE=DATE:20200607 +DTEND;VALUE=DATE:20200608 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:7310dfe1-2a6b-41ac-8042-31ca22dbed92 +SUMMARY:Þrettándinn +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080106 +DTEND;VALUE=DATE:20080107 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:7394164c-2ad0-4011-86aa-227b6c31997b +SUMMARY:Alþjóðadagur verkalýðsins +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080501 +DTEND;VALUE=DATE:20080502 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:0a9d386e-47ac-4b00-9955-93ed732fec3e +SUMMARY:Lýðveldisdagurinn +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080617 +DTEND;VALUE=DATE:20080618 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:a758c951-750f-4348-8a19-c6cf9407cec0 +SUMMARY:Fullveldisdagurinn +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20081201 +DTEND;VALUE=DATE:20081202 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:9d19dafa-a3fb-47f3-9f61-29dd738509f7 +SUMMARY:Þorláksmessa +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20081223 +DTEND;VALUE=DATE:20081224 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:436cc1f3-2ef8-4613-8cf7-4f48ef4f8294 +SUMMARY:Aðfangadagur +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20081224 +DTEND;VALUE=DATE:20081225 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:b53b43c6-5553-465d-a8e0-f374300a5692 +SUMMARY:Jóladagur +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20081225 +DTEND;VALUE=DATE:20081226 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:375e5456-df44-4e1a-86a3-38205161a08f +SUMMARY:Annar í jólum +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20081226 +DTEND;VALUE=DATE:20081227 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:8befbdd5-6b7c-4d8b-9dc0-bb203c75d4a2 +SUMMARY:Gamlársdagur +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20081231 +DTEND;VALUE=DATE:20090101 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:5c6e2c7b-bb06-48ea-a472-af4ed1594598 +SUMMARY:Nýársdagur +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080101 +DTEND;VALUE=DATE:20080102 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:f173fc37-b027-4b81-8c90-180849624576 +SUMMARY:Frídagur verslunarmanna +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1MO;BYMONTH=8 +DTSTART;VALUE=DATE:20080804 +DTEND;VALUE=DATE:20080805 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:4b67ff2b-c612-4feb-bedb-fe69d74bb3c9 +SUMMARY:Mæðradagurinn +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=5 +DTSTART;VALUE=DATE:20080511 +DTEND;VALUE=DATE:20080512 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:4ffa79a7-5949-44b8-a322-3063e131d9b6 +SUMMARY:Jónsmessa +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080624 +DTEND;VALUE=DATE:20080625 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:d9ac70a4-c6cd-4b9c-91a4-5eb99b815458 +SUMMARY:Dagur íslenskrar tungu +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20081116 +DTEND;VALUE=DATE:20081117 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:d96ad287-ea70-4c09-9136-c75d8728d21c +SUMMARY:Feðradagurinn +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=11 +DTSTART;VALUE=DATE:20081112 +DTEND;VALUE=DATE:20081113 +END:VEVENT +BEGIN:VEVENT +CREATED:20090514T095930Z +LAST-MODIFIED:20090514T095930Z +DTSTAMP:20090514T095930Z +UID:9bb19668-dd5b-4f3d-a330-79463f60ef46 +SUMMARY:Valentínusdagur +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20080214 +DTEND;VALUE=DATE:20080215 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/IndiaHolidays.ics b/media/caldata/IndiaHolidays.ics new file mode 100644 index 00000000000..f60160cebcf --- /dev/null +++ b/media/caldata/IndiaHolidays.ics @@ -0,0 +1,1309 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:America/Los_Angeles +X-LIC-LOCATION:America/Los_Angeles +BEGIN:DAYLIGHT +TZOFFSETFROM:-0800 +TZOFFSETTO:-0700 +TZNAME:PDT +DTSTART:19700308T020000 +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0700 +TZOFFSETTO:-0800 +TZNAME:PST +DTSTART:19701101T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11 +END:STANDARD +END:VTIMEZONE +BEGIN:VTIMEZONE +TZID:America/Dawson +X-LIC-LOCATION:America/Dawson +BEGIN:DAYLIGHT +TZOFFSETFROM:-0800 +TZOFFSETTO:-0700 +TZNAME:PDT +DTSTART:19700308T020000 +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0700 +TZOFFSETTO:-0800 +TZNAME:PST +DTSTART:19701101T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T045027Z +DTSTAMP:20101224T045027Z +UID:2002-01-01-1 +SUMMARY:New Year's Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Restricted Holiday +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:20110102 +CLASS:PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:4 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T055143Z +DTSTAMP:20101224T055143Z +UID:2002-01-21-1 +SUMMARY:Guru Gobind Singh Jayanti +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110105 +DTEND;VALUE=DATE:20110106 +CLASS:PUBLIC +DESCRIPTION:The 10th and the final guru of the Sikh faith was born on thi + s day in the year 1666. His birthday generally falls in December or Januar + y or sometimes twice within a year as it is calculated according to Hindu + Bikrami calendar based on moon-year. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:5 +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T045330Z +DTSTAMP:20101224T045330Z +UID:2002-01-13-1 +SUMMARY:Bhogi +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +EXDATE;VALUE=DATE:20130113 +CATEGORIES:Festival +DTSTART;VALUE=DATE:20110114 +DTEND;VALUE=DATE:20110115 +CLASS:PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:4 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T045318Z +DTSTAMP:20101224T045318Z +UID:2002-01-14-1 +SUMMARY:Sankranti +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +EXDATE;VALUE=DATE:20130114 +CATEGORIES:Restricted Holiday +DTSTART;VALUE=DATE:20110115 +DTEND;VALUE=DATE:20110116 +CLASS:PUBLIC +DESCRIPTION:This holy day marks the commencement of the Sun's northern cou + rse in the Heavens\, known as the Uttaraayana patha. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:5 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T045304Z +DTSTAMP:20101224T045304Z +UID:2002-01-15-1 +SUMMARY:Pongal +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Restricted Holiday +DTSTART;VALUE=DATE:20110116 +DTEND;VALUE=DATE:20110117 +CLASS:PUBLIC +DESCRIPTION:Usually comes a day after Sankranti. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T142234Z +LAST-MODIFIED:20101224T045304Z +DTSTAMP:20101224T045304Z +UID:2002-01-15-1 +SUMMARY:Pongal +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20130115 +DTSTART;VALUE=DATE:20100116 +DTEND;VALUE=DATE:20100117 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T045406Z +DTSTAMP:20101224T045406Z +UID:2002-01-26-1 +SUMMARY:Republic Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20110126 +DTEND;VALUE=DATE:20110127 +CLASS:PUBLIC +DESCRIPTION:On this day in 1950 India became a Sovereign Democratic Republ + ic with a constitution to guide her destiny. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T045352Z +DTSTAMP:20101224T045352Z +UID:902705443 +SUMMARY:Netaji's birthday +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Miscellaneous +DTSTART;VALUE=DATE:20110123 +DTEND;VALUE=DATE:20110124 +CLASS:PUBLIC +DESCRIPTION:Netaji Subhash Chandra Bose was born on this day in the year 1 + 897 in Cuttack\, Orissa\, India. Netaji was a fierce and popular leader i + n the political scene in pre-independence India. He founded the Indian Na + tional Arm. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T045432Z +DTSTAMP:20101224T045432Z +UID:2002-01-30-1 +SUMMARY:Mahatma's martyrdom day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20110130 +DTEND;VALUE=DATE:20110131 +CLASS:PUBLIC +DESCRIPTION:On this day in 1948 a Hindu fanatic\, Nathuram Godse who oppos + ed the mahatma's program of tolerance for all creeds and religion assassin + ated the mahatma. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T142014Z +LAST-MODIFIED:20101224T045431Z +DTSTAMP:20101224T045431Z +UID:2002-01-30-1 +SUMMARY:Mahatma's martyrdom day +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20170129 +DTSTART;VALUE=DATE:20100129 +DTEND;VALUE=DATE:20100130 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T054802Z +DTSTAMP:20101224T054802Z +UID:41e41b70-7235-11da-8b29-b8edd2384ed6 +SUMMARY:Vaisakhi +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Festival +DTSTART;VALUE=DATE:20110413 +DTEND;VALUE=DATE:20110414 +CLASS:PUBLIC +DESCRIPTION:The Sikh New Year Festival\, which also commemmorates the foun + ding of the Khalsa by the tenth Guru (Guru Gobind Singh) in 1699. Also spe + lled Baisakhi. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T045958Z +DTSTAMP:20101224T045958Z +UID:2002-05-25-1 +SUMMARY:ID-I-Milad-un-Nabi (Barah-Wafat) +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20110220 +DTEND;VALUE=DATE:20110221 +CLASS:PUBLIC +DESCRIPTION:The Prophet was born on the twelfth day of Rabi-ul-Awwal\, the + third month of the Muslim year. His death anniversary also falls on the s + ame day\, the word 'barah' standing for the twelve days of the Prophet's s + ickness. This event is subject to the appearance of the Moon. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:4 +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T170605Z +LAST-MODIFIED:20101224T045958Z +DTSTAMP:20101224T045958Z +UID:2002-05-25-1 +SUMMARY:ID-I-Milad-un-Nabi (Barah-Wafat) +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20120220 +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20120209 +DTEND;VALUE=DATE:20120210 +CLASS:PUBLIC +DESCRIPTION:The Prophet was born on the twelfth day of Rabi-ul-Awwal\, the + third month of the Muslim year. His death anniversary also falls on the s + ame day\, the word 'barah' standing for the twelve days of the Prophet's s + ickness. This event is subject to the appearance of the Moon. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T053459Z +DTSTAMP:20101224T053459Z +UID:2002-04-14-1 +SUMMARY:Puthandu +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Tamil Nadu State Holiday +DTSTART;VALUE=DATE:20110414 +DTEND;VALUE=DATE:20110415 +CLASS:PUBLIC +DESCRIPTION:This marks the beginning of the Tamil new year. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T051130Z +DTSTAMP:20101224T051130Z +UID:31970fe0-7236-11da-86c4-893c642964fe +SUMMARY:Gudi Padwa +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Event +DTSTART;VALUE=DATE:20110404 +DTEND;VALUE=DATE:20110405 +CLASS:PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH:1 +DESCRIPTION:This marks the beginning of the Marathi new year. +X-MOZILLA-ALARM-DEFAULT-UNITS:days +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T025934Z +DTSTAMP:20101224T025934Z +UID:ae54cc40-7236-11da-aaaa-92d722977743 +SUMMARY:Dr. Bhimrao Ramji Ambedkar's birthday +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110414 +DTEND;VALUE=DATE:20110415 +CLASS:PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH:1 +DESCRIPTION:Dr. B.R. Ambedkar has been called the most prominent Indian Un + touchable leader of the 20th century. He helped spark a revival of Buddhis + m in India\, a movement which is now known as neo-Buddhism. +X-MOZILLA-ALARM-DEFAULT-UNITS:days +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T171554Z +LAST-MODIFIED:20101224T025934Z +DTSTAMP:20101224T025934Z +UID:ae54cc40-7236-11da-aaaa-92d722977743 +SUMMARY:Dr. Bhimrao Ramji Ambedkar's birthday +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:19930308 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:19930307 +DTEND;VALUE=DATE:19930308 +CLASS:PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH:1 +DESCRIPTION:Dr. B.R. Ambedkar has been called the most prominent Indian Un + touchable leader of the 20th century. He helped spark a revival of Buddhis + m in India\, a movement which is now known as neo-Buddhism. +X-MOZILLA-ALARM-DEFAULT-UNITS:days +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T030214Z +DTSTAMP:20101224T030214Z +UID:2002-08-15-1 +SUMMARY:Independence Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20110815 +DTEND;VALUE=DATE:20110816 +CLASS:PUBLIC +TRANSP:TRANSPARENT +DESCRIPTION:On this day in 1947\, India got her independence. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T052814Z +DTSTAMP:20101224T052814Z +UID:362908a0-2f52-11d8-ae5b-92fe3e55f869 +SUMMARY:Parsi New Year +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +EXDATE;VALUE=DATE:20130819 +CATEGORIES:Festival +DTSTART;VALUE=DATE:20110819 +DTEND;VALUE=DATE:20110820 +CLASS:PUBLIC +DESCRIPTION:Parsis are descendants from Persian immigrants of the A.D. 600 + -900 who fled from Persia\, now Iran. They are the followers of the ancien + t Persian religion known as Zoroastrianism\, living in India\, Iran\, and + Pakistan. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T030019Z +DTSTAMP:20101224T030019Z +UID:2002-10-02-1 +SUMMARY:Gandhi Jayanti +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20111002 +DTEND;VALUE=DATE:20111003 +CLASS:PUBLIC +DESCRIPTION:Mohandas Karamchand Gandhi\, the great Mahatma was born on thi + s day in the year 1869. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T052611Z +DTSTAMP:20101224T052611Z +UID:2002-03-25-1 +SUMMARY:Muharram +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20111206 +DTEND;VALUE=DATE:20111207 +CLASS:PUBLIC +DESCRIPTION:Islamic new year. Depending on the visibility of the Moon\, th + is event may occur one day later or earlier. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:4 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T142021Z +LAST-MODIFIED:20101224T052611Z +DTSTAMP:20101224T052611Z +UID:2002-03-25-1 +SUMMARY:Muharram +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20131205 +DTSTART;VALUE=DATE:20131124 +DTEND;VALUE=DATE:20131125 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T224235Z +LAST-MODIFIED:20101224T052611Z +DTSTAMP:20101224T052611Z +UID:2002-03-25-1 +SUMMARY:Muharram +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20141206 +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20141113 +DTEND;VALUE=DATE:20141114 +CLASS:PUBLIC +DESCRIPTION:Islamic new year. Depending on the visibility of the Moon\, th + is event may occur one day later or earlier. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T045850Z +DTSTAMP:20101224T045850Z +UID:2002-03-12-1 +SUMMARY:Maha Shivaratri +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +EXDATE;VALUE=DATE:20120302 +CATEGORIES:Restricted Holiday +DTSTART;VALUE=DATE:20110303 +DTEND;VALUE=DATE:20110304 +CLASS:PUBLIC +DESCRIPTION:This festival is observed to commemorate the night when Lord S + hiva\, the God of destruction\, danced his celestial dance\, the Tandav an + d his wedding anniversary. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T060532Z +DTSTAMP:20101224T060532Z +UID:2002-03-29-1 +SUMMARY:Ugadi +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +EXDATE;VALUE=DATE:20120404 +CATEGORIES:Restricted Holiday +DTSTART;VALUE=DATE:20110404 +DTEND;VALUE=DATE:20110405 +CLASS:PUBLIC +DESCRIPTION:Telugu new year's day. It is believed that the creator of the + Hindu pantheon Lord Brahma started creation on this day. Also known as Cha + itra Suddha Padhyami. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:4 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T030158Z +DTSTAMP:20101224T030158Z +UID:2002-04-25-1 +SUMMARY:Mahavir Jayanti +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +EXDATE;VALUE=DATE:20130416 +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20110416 +DTEND;VALUE=DATE:20110417 +CLASS:PUBLIC +DESCRIPTION:Birthday of Mahavir\, the 24th Tirtankhara \, founder of Jaini + sm. The Digambaras believe that he was born in the year 615 BC +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T171554Z +LAST-MODIFIED:20101224T030158Z +DTSTAMP:20101224T030158Z +UID:2002-04-25-1 +SUMMARY:Mahavir Jayanti +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20120415 +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20120404 +DTEND;VALUE=DATE:20120405 +CLASS:PUBLIC +DESCRIPTION:Birthday of Mahavir\, the 24th Tirtankhara \, founder of Jaini + sm. The Digambaras believe that he was born in the year 615 BC +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T051038Z +DTSTAMP:20101224T051038Z +UID:cf7417b0-7236-11da-936b-8c894bc3e4c3 +SUMMARY:Good Friday +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +CLASS:PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH:1 +X-MOZILLA-ALARM-DEFAULT-UNITS:days +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T050850Z +DTSTAMP:20101224T050850Z +UID:2002-05-26-1 +SUMMARY:Buddha Purnima +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +EXDATE;VALUE=DATE:20120517 +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20110517 +DTEND;VALUE=DATE:20110518 +CLASS:PUBLIC +DESCRIPTION:Buddha was born on a full moon night in the month of Vaisakh i + n 563 B.C. This day comes in the month of April or May. He achieved enligh + tenment as well as nirvana on the same date. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T172109Z +LAST-MODIFIED:20101224T050850Z +DTSTAMP:20101224T050850Z +UID:2002-05-26-1 +SUMMARY:Buddha Purnima +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20120516 +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20120505 +DTEND;VALUE=DATE:20120506 +CLASS:PUBLIC +DESCRIPTION:Buddha was born on a full moon night in the month of Vaisakh i + n 563 B.C. This day comes in the month of April or May. He achieved enligh + tenment as well as nirvana on the same date. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T052537Z +DTSTAMP:20101224T052537Z +UID:2002-12-06-1 +SUMMARY:Idu'l Fitr +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20110830 +DTEND;VALUE=DATE:20110831 +CLASS:PUBLIC +DESCRIPTION:Also known as Ramzan. Coming with the new moon\, this festival + marks the end of Ramzan\, the ninth month of the Muslim year. The holy Ko + ran was also revealed this month. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:4 +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T050918Z +DTSTAMP:20101224T050918Z +UID:2002-11-04-1 +SUMMARY:Deepawali +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Festival +DTSTART;VALUE=DATE:20111026 +DTEND;VALUE=DATE:20111027 +CLASS:PUBLIC +DESCRIPTION:Also called as Diwali commemorates Lord Rama's return to his k + ingdom Ayodhya after completing his 14-year exile. Also marks the beginnin + g of the Marwari new year. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:4 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T173244Z +LAST-MODIFIED:20101224T050918Z +DTSTAMP:20101224T050918Z +UID:2002-11-04-1 +SUMMARY:Deepawali +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20121025 +CATEGORIES:Festival +DTSTART;VALUE=DATE:20121014 +DTEND;VALUE=DATE:20121015 +CLASS:PUBLIC +DESCRIPTION:Also called as Diwali commemorates Lord Rama's return to his k + ingdom Ayodhya after completing his 14-year exile. Also marks the beginnin + g of the Marwari new year. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T055010Z +DTSTAMP:20101224T055010Z +UID:2002-11-19-1 +SUMMARY:Guru Nanak's Jayanti +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20110414 +DTEND;VALUE=DATE:20110415 +CLASS:PUBLIC +DESCRIPTION:Guru Nanak Dev\, the founder of the Sikh faith\, was born in t + he month of Kartik(October/November)\, in 1469 A.D. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:4 +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T173911Z +LAST-MODIFIED:20101224T055010Z +DTSTAMP:20101224T055010Z +UID:2002-11-19-1 +SUMMARY:Guru Nanak's Jayanti +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20120413 +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20120402 +DTEND;VALUE=DATE:20120403 +CLASS:PUBLIC +DESCRIPTION:Guru Nanak Dev\, the founder of the Sikh faith\, was born in t + he month of Kartik(October/November)\, in 1469 A.D. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T050033Z +DTSTAMP:20101224T050033Z +UID:b9e79b50-7235-11da-8266-8565e4d16d93 +SUMMARY:Holi +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Restricted Holiday +DTSTART;VALUE=DATE:20110320 +DTEND;VALUE=DATE:20110321 +CLASS:PUBLIC +DESCRIPTION:This exuberant spring festival celebrating the destruction of + the \n demon-King Hiranyakashipu and of the evil Holika by Narasimha\, the + \n half-man half-Lion incarnation of Lord Visnu. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T142520Z +LAST-MODIFIED:20101224T050033Z +DTSTAMP:20101224T050033Z +UID:b9e79b50-7235-11da-8266-8565e4d16d93 +SUMMARY:Holi +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20120320 +DTSTART;VALUE=DATE:20120320 +DTEND;VALUE=DATE:20120321 +CLASS:PUBLIC +DESCRIPTION:This exuberant spring festival celebrating the destruction of + the \n demon-King Hiranyakashipu and of the evil Holika by Narasimha\, the + \n half-man half-Lion incarnation of Lord Vishnu. +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T170644Z +LAST-MODIFIED:20101224T050033Z +DTSTAMP:20101224T050033Z +UID:b9e79b50-7235-11da-8266-8565e4d16d93 +SUMMARY:Holi +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20130320 +CATEGORIES:Restricted Holiday +DTSTART;VALUE=DATE:20130309 +DTEND;VALUE=DATE:20130310 +CLASS:PUBLIC +DESCRIPTION:This exuberant spring festival celebrating the destruction of + the \n demon-King Hiranyakashipu and of the evil Holika by Narasimha\, the + \n half-man half-Lion incarnation of Lord Visnu. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T052957Z +DTSTAMP:20101224T052957Z +UID:2002-04-21-1 +SUMMARY:Sri Ram navami +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Festival +DTSTART;VALUE=DATE:20110412 +DTEND;VALUE=DATE:20110413 +CLASS:PUBLIC +DESCRIPTION:The birthday of Sri Rama\, the 7th avatar of Vishnu. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T171554Z +LAST-MODIFIED:20101224T052957Z +DTSTAMP:20101224T052957Z +UID:2002-04-21-1 +SUMMARY:Sri Ram navami +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20140412 +CATEGORIES:Festival +DTSTART;VALUE=DATE:20140401 +DTEND;VALUE=DATE:20140402 +CLASS:PUBLIC +DESCRIPTION:The birthday of Sri Rama\, the 7th avatar of Vishnu. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T052906Z +DTSTAMP:20101224T052906Z +UID:2002-08-22-1 +SUMMARY:Raksha Bandhan +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +EXDATE;VALUE=DATE:20120813 +CATEGORIES:Festival +DTSTART;VALUE=DATE:20110813 +DTEND;VALUE=DATE:20110814 +CLASS:PUBLIC +DESCRIPTION:Raksha Bandhan is celebrated in India to honour the sea God Va + runa. However\, at most places\, it celebrates the love of a brother for h + is sister. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T172157Z +LAST-MODIFIED:20101224T052906Z +DTSTAMP:20101224T052906Z +UID:2002-08-22-1 +SUMMARY:Raksha Bandhan +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20120812 +CATEGORIES:Festival +DTSTART;VALUE=DATE:20120801 +DTEND;VALUE=DATE:20120802 +CLASS:PUBLIC +DESCRIPTION:Raksha Bandhan is celebrated in India to honour the sea God Va + runa. However\, at most places\, it celebrates the love of a brother for h + is sister. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T052341Z +DTSTAMP:20101224T052341Z +UID:2002-08-30-1 +SUMMARY:Janmashtami +STATUS:TENTATIVE +RRULE:FREQ=YEARLY +EXDATE;VALUE=DATE:20120822 +CATEGORIES:Festival +DTSTART;VALUE=DATE:20110822 +DTEND;VALUE=DATE:20110823 +CLASS:PUBLIC +DESCRIPTION:Lord Krishna's brithday. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T172157Z +LAST-MODIFIED:20101224T052341Z +DTSTAMP:20101224T052341Z +UID:2002-08-30-1 +SUMMARY:Janmashtami +STATUS:TENTATIVE +RECURRENCE-ID;VALUE=DATE:20120821 +CATEGORIES:Festival +DTSTART;VALUE=DATE:20120807 +DTEND;VALUE=DATE:20120808 +CLASS:PUBLIC +DESCRIPTION:Lord Krishna's brithday. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T051014Z +DTSTAMP:20101224T051014Z +UID:2002-09-10-1 +SUMMARY:Ganesh Chaturthi +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Festival +DTSTART;VALUE=DATE:20110911 +DTEND;VALUE=DATE:20110912 +CLASS:PUBLIC +DESCRIPTION:This festival marked the birthday of Lord Ganesh. Ganpati is o + ne of the most popular deities. He is worshipped by both Shivaites and Vai + shnavites. Even Buddhists and Jains have respect for Ganpati. He is consid + ered to be an avatar of both Shiva and Vishnu. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T172157Z +LAST-MODIFIED:20101224T051014Z +DTSTAMP:20101224T051014Z +UID:2002-09-10-1 +SUMMARY:Ganesh Chaturthi +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20120910 +CATEGORIES:Festival +DTSTART;VALUE=DATE:20120830 +DTEND;VALUE=DATE:20120831 +CLASS:PUBLIC +DESCRIPTION:This festival marked the birthday of Lord Ganesh. Ganpati is o + ne of the most popular deities. He is worshipped by both Shivaites and Vai + shnavites. Even Buddhists and Jains have respect for Ganpati. He is consid + ered to be an avatar of both Shiva and Vishnu. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T043956Z +DTSTAMP:20101224T043956Z +UID:179ec0c0-722d-11da-8c69-f4215b177f2b +SUMMARY:Maha Saptami [Dussehra] +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Festival +DTSTART;VALUE=DATE:20111003 +DTEND;VALUE=DATE:20111004 +CLASS:PUBLIC +DESCRIPTION:Prayers are offered to Kolabou\, Lord Ganesha’s wife. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:7 +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T043834Z +DTSTAMP:20101224T043834Z +UID:2002-10-07-1 +SUMMARY:Navaratri [Dussehra] +STATUS:TENTATIVE +RRULE:FREQ=YEARLY +CATEGORIES:Festival +DTSTART;VALUE=DATE:20110927 +DTEND;VALUE=DATE:20110928 +CLASS:PUBLIC +DESCRIPTION:A 10 day festival associated with vanquishing demons\, in par + ticular Rama's victory over Ravana in the Ramayana\, and Durga's victory o + ver the buffalo-headed Mahishasura. Ends with the Vijaya Dasami day. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:4 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T172959Z +LAST-MODIFIED:20101224T033034Z +DTSTAMP:20101224T033034Z +UID:2002-10-07-1 +SUMMARY:Navaratri [Dussehra] +STATUS:TENTATIVE +RECURRENCE-ID;VALUE=DATE:20120926 +CATEGORIES:Festival +DTSTART;VALUE=DATE:20120915 +DTEND;VALUE=DATE:20120916 +CLASS:PUBLIC +TRANSP:TRANSPARENT +DESCRIPTION:A 10 day festival associated with vanquishing demons\, in par + ticular Rama's victory over Ravana in the Ramayana\, and Durga's victory o + ver the buffalo-headed Mahishasura. Ends with the Vijaya Dasami day. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T033141Z +DTSTAMP:20101224T033141Z +UID:2002-10-13-1 +SUMMARY:Sri Durga Ashtami [Dussehra] +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Festival +DTSTART;VALUE=DATE:20111004 +DTEND;VALUE=DATE:20111005 +CLASS:PUBLIC +DESCRIPTION:Godess Durga is considered to be a divine mother who exists in + all beings in the form of intelligence\, mercy\, beauty and is a consort + of Lord Shiva. Prayers are offered to the goddess to bestow upon man all w + ealth\, auspiciousness\, prosperity\, knowledge (both sacred and secular)\ + , and all other potent powers. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:4 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T033155Z +DTSTAMP:20101224T033155Z +UID:2002-10-14-1 +SUMMARY:Sri Maha Navami [Dussehra] +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Festival +DTSTART;VALUE=DATE:20111005 +DTEND;VALUE=DATE:20111006 +CLASS:PUBLIC +DESCRIPTION:The culmination of the Navratri festival. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:4 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T061014Z +DTSTAMP:20101224T061014Z +UID:2002-10-15-1 +SUMMARY:Vijaya Dasami [Dussehra] +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +EXDATE;VALUE=DATE:20121006 +CATEGORIES:Festival +DTSTART;VALUE=DATE:20111006 +DTEND;VALUE=DATE:20111007 +CLASS:PUBLIC +DESCRIPTION:Also very well known as Dussehra. The occasion marks the trium + ph of Lord Rama over the demon king\, Ravana\, the victory of good over ev + il. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:5 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T045705Z +DTSTAMP:20101224T045705Z +UID:5efd3780-7233-11da-88ad-9f93f56d9df3 +SUMMARY:Maharishi Dayanand Saraswati Jayanti +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Restricted Holiday +DTSTART;VALUE=DATE:20100227 +DTEND;VALUE=DATE:20100228 +CLASS:PUBLIC +DESCRIPTION:The founder of the Arya Samaj. The sage who sought to restore + to Hinduism its natural radiance and wisdom. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081223T225242Z +LAST-MODIFIED:20101224T045705Z +DTSTAMP:20101224T045705Z +UID:5efd3780-7233-11da-88ad-9f93f56d9df3 +SUMMARY:Maharishi Dayanand Saraswati Jayanti +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20120228 +CATEGORIES:Restricted Holiday +DTSTART;VALUE=DATE:20120309 +DTEND;VALUE=DATE:20120310 +CLASS:PUBLIC +DESCRIPTION:The founder of the Arya Samaj. The sage who sought to restore + to Hinduism its natural radiance and wisdom. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T063438Z +DTSTAMP:20101224T063438Z +UID:cef395e0-83b1-11db-9a83-a573279bff77 +SUMMARY:Lunar Eclipse [Total] +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Event +DTSTART:20110615T033900 +DTEND:20110615T050900 +CLASS:PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH:1 +X-MOZILLA-ALARM-DEFAULT-UNITS:days +X-MOZ-GENERATION:7 +SEQUENCE:4 +DESCRIPTION:Eclipse visibility: S.America\, Europe\, Africa\, Asia\, Aus. + +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T052747Z +DTSTAMP:20101224T052747Z +UID:7ed9f200-2f52-11d8-b2cb-913852cf0eb2 +SUMMARY:Onam +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110909 +DTEND;VALUE=DATE:20110910 +CLASS:PUBLIC +DESCRIPTION:Onam is celebrated after the memory of King Mahabali. The King + ruled Kerala\, Southern India long time ago. Onam symbolizes the joyful r + ule of the King and the happiness that the people had under his rule. The + people also have the belief that during Onam\, the King returns to Kerala + to visit his people. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T172806Z +LAST-MODIFIED:20101224T052747Z +DTSTAMP:20101224T052747Z +UID:7ed9f200-2f52-11d8-b2cb-913852cf0eb2 +SUMMARY:Onam +STATUS:CONFIRMED +RECURRENCE-ID;VALUE=DATE:20120908 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120829 +DTEND;VALUE=DATE:20120830 +CLASS:PUBLIC +DESCRIPTION:Onam is celebrated after the memory of King Mahabali. The King + ruled Kerala\, Southern India long time ago. Onam symbolizes the joyful r + ule of the King and the happiness that the people had under his rule. The + people also have the belief that during Onam\, the King returns to Kerala + to visit his people. +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T060828Z +DTSTAMP:20101224T060828Z +UID:7818d420-7237-11da-be73-d94cdcdce3bf +SUMMARY:Maharishi Valmiki's birthday +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +EXDATE;VALUE=DATE:20121014 +CATEGORIES:Restricted Holiday +DTSTART;VALUE=DATE:20111014 +DTEND;VALUE=DATE:20111015 +CLASS:PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH:1 +DESCRIPTION:Valmiki began to compose the great eternal song and poem of th + e life of Sri Rama-The Ramayana. Valmiki's Ramayana is the very first poem + in Sanskrit. Therefore\, it is called the Adikavya or the \"The first poe + m\" and Valmiki is also known as the Adikavi\, which means \"The first poe + t\". +X-MOZILLA-ALARM-DEFAULT-UNITS:days +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:6 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T051957Z +DTSTAMP:20101224T051957Z +UID:9ada5cc0-8471-11db-b773-eb975c5415ab +SUMMARY:Id ul Zuha [Bakrid] +STATUS:CONFIRMED +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20111106 +DTEND;VALUE=DATE:20111107 +CLASS:PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH:1 +DESCRIPTION:A muslim festival also known as the feast of the sacrifice. Si + gnifies the commemoration of the ordeals of Prophet Ibrahim. Usually falls + on the last month of the islamic calendar. Depending on the visibility of + the Moon\, this event may occur one day later or earlier. +X-MOZILLA-ALARM-DEFAULT-UNITS:days +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T060338Z +DTSTAMP:20101224T060338Z +UID:ef00eb20-846f-11db-ad56-bf7312a0508a +SUMMARY:Solar Eclipse [Partial] +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Event +DTSTART:20110104T085100 +DTEND:20110104T085200 +CLASS:PUBLIC +X-MOZILLA-ALARM-DEFAULT-LENGTH:1 +X-MOZILLA-ALARM-DEFAULT-UNITS:days +X-MOZILLA-RECUR-DEFAULT-UNITS:years +X-MOZ-GENERATION:4 +SEQUENCE:2 +DESCRIPTION:Eclipse Visibility: Europe\, Africa\, c Asia +END:VEVENT +BEGIN:VEVENT +CREATED:20071219T141846Z +LAST-MODIFIED:20101224T030132Z +DTSTAMP:20101224T030132Z +UID:2002-12-25-1 +SUMMARY:Christmas +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:National Holiday +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111226 +CLASS:PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS:years +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071222T175806Z +LAST-MODIFIED:20101224T050819Z +DTSTAMP:20101224T050819Z +UID:0509197b-e862-4b73-837d-98d23d4d0587 +SUMMARY:Bohag Bihu [Assamese New Year] +RRULE:FREQ=YEARLY +CATEGORIES:Event +DTSTART;VALUE=DATE;TZID=America/Dawson:20110413 +DTEND;VALUE=DATE;TZID=America/Dawson:20110414 +TRANSP:TRANSPARENT +DESCRIPTION:This marks the beginning of the Assamese new year. +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071222T180739Z +LAST-MODIFIED:20101224T060510Z +DTSTAMP:20101224T060510Z +UID:13794675-3cb6-4e3b-9581-d72514278e90 +SUMMARY:Nutan Varsh +RRULE:FREQ=YEARLY +CATEGORIES:Restricted Holiday +DTSTART;VALUE=DATE;TZID=America/Dawson:20111027 +DTEND;VALUE=DATE;TZID=America/Dawson:20111028 +TRANSP:TRANSPARENT +DESCRIPTION:This marks the beginning of the Gujarati new year. Also known + as Hindu Vikram Samvatsar or bestu Varsh. +X-MOZ-GENERATION:5 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T173244Z +LAST-MODIFIED:20101224T051456Z +DTSTAMP:20101224T051456Z +UID:13794675-3cb6-4e3b-9581-d72514278e90 +SUMMARY:Gujarati New Year +RECURRENCE-ID;VALUE=DATE;TZID=America/Dawson:20121026 +DTSTART;VALUE=DATE;TZID=America/Dawson:20121015 +DTEND;VALUE=DATE;TZID=America/Dawson:20121016 +TRANSP:TRANSPARENT +DESCRIPTION:This marks the beginning of the Gujarati new year. +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20071222T182315Z +LAST-MODIFIED:20101224T054057Z +DTSTAMP:20101224T054057Z +UID:e4d23f27-a4e3-479e-a25b-d905e1d27f67 +SUMMARY:Losoong [Sikkimese New Year] +RRULE:FREQ=YEARLY +CATEGORIES:Event +DTSTART;VALUE=DATE;TZID=America/Dawson:20111229 +DTEND;VALUE=DATE;TZID=America/Dawson:20111230 +TRANSP:TRANSPARENT +DESCRIPTION:This marks the beginning of the Sikkimese new year.\n +X-MOZ-GENERATION:4 +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20081226T174015Z +LAST-MODIFIED:20101224T054057Z +DTSTAMP:20101224T054057Z +UID:e4d23f27-a4e3-479e-a25b-d905e1d27f67 +SUMMARY:Losoong [Sikkimese New Year] +RECURRENCE-ID;VALUE=DATE;TZID=America/Dawson:20121228 +CATEGORIES:Event +DTSTART;VALUE=DATE;TZID=America/Dawson:20130114 +DTEND;VALUE=DATE;TZID=America/Dawson:20130115 +TRANSP:TRANSPARENT +DESCRIPTION:This marks the beginning of the Sikkimese new year.\n +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T044812Z +LAST-MODIFIED:20101224T044939Z +DTSTAMP:20101224T044939Z +UID:6abc385a-1be8-4620-b8b5-3b4dc31f1bf1 +SUMMARY:Maha Sashti [Dussehra] +RRULE:FREQ=YEARLY +CATEGORIES:Festival +DTSTART;VALUE=DATE:20111002 +DTEND;VALUE=DATE:20111003 +DESCRIPTION:Start of prayers to Godess Durga or Shakti. +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T055530Z +LAST-MODIFIED:20101224T063446Z +DTSTAMP:20101224T063446Z +UID:8655066a-d265-4d29-ad48-0b292bce9931 +SUMMARY:Lunar Eclipse [Total] +RRULE:FREQ=YEARLY +CATEGORIES:Event +DTSTART;TZID=America/Los_Angeles:20111210T033200 +DTEND;TZID=America/Los_Angeles:20111210T042300 +DESCRIPTION:Eclipse visibility: Europe\, e Africa\, Asia\, Aus.\, Pacific\ + , N.A. +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T055856Z +LAST-MODIFIED:20101224T060035Z +DTSTAMP:20101224T060035Z +UID:b0e77f23-b090-4427-ba4b-11b9c3b23849 +SUMMARY:Solar Eclipse [Partial] +RRULE:FREQ=YEARLY +CATEGORIES:Event +DTSTART;TZID=America/Los_Angeles:20111125T062100 +DTEND;TZID=America/Los_Angeles:20111125T062200 +DESCRIPTION:Eclipse Visibility: s Africa\, Antarctica\, Tasmania\, N.Z. +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T060054Z +LAST-MODIFIED:20101224T060358Z +DTSTAMP:20101224T060358Z +UID:b1a43b9d-9020-4421-b284-4e4281ec1e3e +SUMMARY:Solar Eclipse [Partial] +RRULE:FREQ=YEARLY +CATEGORIES:Event +DTSTART;TZID=America/Los_Angeles:20110601T211700 +DTEND;TZID=America/Los_Angeles:20110601T211800 +DESCRIPTION:Eclipse Visibility: e Asia\, n N. America\, Iceland +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T060151Z +LAST-MODIFIED:20101224T060250Z +DTSTAMP:20101224T060250Z +UID:8dec8425-9bb9-4749-8078-701299a910f1 +SUMMARY:Solar Eclipse [Partial] +RRULE:FREQ=YEARLY +CATEGORIES:Event +DTSTART;TZID=America/Los_Angeles:20110701T083900 +DTEND;TZID=America/Los_Angeles:20110701T084000 +DESCRIPTION:Eclipse Visibility: s Indian Ocean +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T062835Z +LAST-MODIFIED:20101224T062941Z +DTSTAMP:20101224T062941Z +UID:398fe323-73f0-4487-a2eb-033a1cc6318a +SUMMARY:Sri Lalitha Panchami [Dussehra] +RRULE:FREQ=YEARLY +CATEGORIES:Festival +DTSTART;VALUE=DATE:20111001 +DTEND;VALUE=DATE:20111003 +TRANSP:TRANSPARENT +DESCRIPTION:Prayers are offered to the Godess of the five elements - Earth + \, Water\, Air\, Fire and Space. +X-MOZ-GENERATION:2 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/IndonesianHolidays.ics b/media/caldata/IndonesianHolidays.ics new file mode 100644 index 00000000000..c0e32fe9166 --- /dev/null +++ b/media/caldata/IndonesianHolidays.ics @@ -0,0 +1,213 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20130103T124707Z +LAST-MODIFIED:20130103T132316Z +DTSTAMP:20130103T132316Z +UID:8aac3edb-202d-48bd-8468-bed81bb8c5ce +SUMMARY:Tahun Baru 2013 +DTSTART;VALUE=DATE:20130101 +DTEND;VALUE=DATE:20130102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T124827Z +LAST-MODIFIED:20130103T132320Z +DTSTAMP:20130103T132320Z +UID:73fceaea-aa43-4fb4-bed4-0de656d4157e +SUMMARY:Maulid Nabi Muhammad +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130124 +DTEND;VALUE=DATE:20130125 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125014Z +LAST-MODIFIED:20130103T132326Z +DTSTAMP:20130103T132326Z +UID:f6bb403c-c338-47fb-be9a-827230c43dd7 +SUMMARY:Tahun Baru Imlek 2564 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130210 +DTEND;VALUE=DATE:20130211 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125057Z +LAST-MODIFIED:20130103T132333Z +DTSTAMP:20130103T132333Z +UID:31ecfb0c-225d-4d46-a370-d778ea73a81f +SUMMARY:Hari Raya Nyepi Tahun Baru Saka 1935 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130312 +DTEND;VALUE=DATE:20130313 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125125Z +LAST-MODIFIED:20130103T132338Z +DTSTAMP:20130103T132338Z +UID:c1e792eb-fa4c-4c65-a89c-0d8ecaec5343 +SUMMARY:Wafat Isa Almasih +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125148Z +LAST-MODIFIED:20130103T132346Z +DTSTAMP:20130103T132346Z +UID:0cd19205-ff73-420a-be77-f169489d92ac +SUMMARY:Kenaikan Isa Almasih +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125229Z +LAST-MODIFIED:20130103T132350Z +DTSTAMP:20130103T132350Z +UID:a1921475-49eb-476e-a998-53995766f1af +SUMMARY:Hari Raya Waisak 2557 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130525 +DTEND;VALUE=DATE:20130526 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125305Z +LAST-MODIFIED:20130103T132358Z +DTSTAMP:20130103T132358Z +UID:2671ab65-1e71-48e1-a3d0-8550c632f107 +SUMMARY:Isra' Mi'raj +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130606 +DTEND;VALUE=DATE:20130607 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125357Z +LAST-MODIFIED:20130103T132417Z +DTSTAMP:20130103T132417Z +UID:e45529b2-8b95-48e6-87a0-a2f5ea6b184e +SUMMARY:Hari Kemerdekaan RI +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130817 +DTEND;VALUE=DATE:20130818 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125904Z +LAST-MODIFIED:20130103T132424Z +DTSTAMP:20130103T132424Z +UID:b20eb2f7-071a-41bc-b92c-110ccab87f12 +SUMMARY:Cuti bersama Hari Raya Idul Adha +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131014 +DTEND;VALUE=DATE:20131015 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125728Z +LAST-MODIFIED:20130103T132428Z +DTSTAMP:20130103T132428Z +UID:16cec0fe-3351-4ae0-bd9a-f47f7c8390f3 +SUMMARY:Hari Raya Idul Adha +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131015 +DTEND;VALUE=DATE:20131016 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125750Z +LAST-MODIFIED:20130103T132432Z +DTSTAMP:20130103T132432Z +UID:bb98a821-3604-4b01-bb76-a6e90d173e6d +SUMMARY:Tahun Baru 1435 H +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131105 +DTEND;VALUE=DATE:20131106 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125814Z +LAST-MODIFIED:20130103T132437Z +DTSTAMP:20130103T132437Z +UID:5fc932a5-8017-423e-aedc-40ee33b8cd8a +SUMMARY:Hari Raya Natal +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131225 +DTEND;VALUE=DATE:20131226 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125838Z +LAST-MODIFIED:20130103T132441Z +DTSTAMP:20130103T132441Z +UID:05a38608-7cce-4153-b341-ced69c598f94 +SUMMARY:Cuti bersama Hari Raya Natal +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131226 +DTEND;VALUE=DATE:20131227 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125443Z +LAST-MODIFIED:20130103T132407Z +DTSTAMP:20130103T132407Z +UID:c6135803-7295-4083-908e-fcf049a5149b +SUMMARY:Cuti bersama Hari Raya Idul Fitri +RRULE:FREQ=DAILY;UNTIL=20130807T000000 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130805 +DTEND;VALUE=DATE:20130806 +SEQUENCE:2 +X-MOZ-GENERATION:2 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T125617Z +LAST-MODIFIED:20130103T132413Z +DTSTAMP:20130103T132413Z +UID:4af808f9-92c6-4152-b700-ce34b662670a +SUMMARY:Hari Raya Idul Fitri +RRULE:FREQ=DAILY;UNTIL=20130809T000000 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130808 +DTEND;VALUE=DATE:20130809 +SEQUENCE:2 +X-MOZ-GENERATION:2 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/IndonesianHolidaysEnglish.ics b/media/caldata/IndonesianHolidaysEnglish.ics new file mode 100644 index 00000000000..c72806c3036 --- /dev/null +++ b/media/caldata/IndonesianHolidaysEnglish.ics @@ -0,0 +1,186 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20130103T131156Z +LAST-MODIFIED:20130103T131503Z +DTSTAMP:20130103T131503Z +UID:e9a0997d-8fda-41c0-a84e-fc638e3c0ba5 +SUMMARY:The Prophet Muhammad's Birthday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130124 +DTEND;VALUE=DATE:20130125 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T131106Z +LAST-MODIFIED:20130103T131507Z +DTSTAMP:20130103T131507Z +UID:c2e6244f-beec-47b8-9fda-757e0913415d +SUMMARY:New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130101 +DTEND;VALUE=DATE:20130102 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T131442Z +LAST-MODIFIED:20130103T131517Z +DTSTAMP:20130103T131517Z +UID:441b8b1a-f080-4a0e-b4aa-e8dc4788527c +SUMMARY:Chinese New Year +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130210 +DTEND;VALUE=DATE:20130211 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T131656Z +LAST-MODIFIED:20130103T131709Z +DTSTAMP:20130103T131709Z +UID:ea3204fa-e6c0-402b-aec1-5aa7ee1f6624 +SUMMARY:Day of Silence (Nyepi) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130312 +DTEND;VALUE=DATE:20130313 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T131725Z +LAST-MODIFIED:20130103T131729Z +DTSTAMP:20130103T131729Z +UID:3982c378-eabe-447a-9c4e-24dba872f688 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T131749Z +LAST-MODIFIED:20130103T131756Z +DTSTAMP:20130103T131756Z +UID:49f80072-2fa2-4841-aa00-3e12c9bf94ad +SUMMARY:Ascension Day of Jesus Christ +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T131805Z +LAST-MODIFIED:20130103T131811Z +DTSTAMP:20130103T131811Z +UID:11821a76-d283-4e23-ae74-d11908674c70 +SUMMARY:Waisak Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130525 +DTEND;VALUE=DATE:20130526 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T131825Z +LAST-MODIFIED:20130103T131831Z +DTSTAMP:20130103T131831Z +UID:4a0f1f48-36f8-4cc6-946c-b1ddfa99bd9a +SUMMARY:Ascension of the Prophet +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130606 +DTEND;VALUE=DATE:20130607 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T131939Z +LAST-MODIFIED:20130103T131949Z +DTSTAMP:20130103T131949Z +UID:32d5f153-ffbc-46c9-8b71-b13211238d2b +SUMMARY:Independence Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130817 +DTEND;VALUE=DATE:20130818 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T132006Z +LAST-MODIFIED:20130103T132014Z +DTSTAMP:20130103T132014Z +UID:d8887ab9-db9c-49db-86aa-2c9ee37eb461 +SUMMARY:Joint Holiday * +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131014 +DTEND;VALUE=DATE:20131015 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T132021Z +LAST-MODIFIED:20130103T132027Z +DTSTAMP:20130103T132027Z +UID:8eaa9d1e-882a-41a3-b2fa-7cce84e2d94f +SUMMARY:Eid al-Adha +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131015 +DTEND;VALUE=DATE:20131016 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T132053Z +LAST-MODIFIED:20130103T132103Z +DTSTAMP:20130103T132103Z +UID:f17beb2f-491a-4d3d-8c57-1fc9a43b61ba +SUMMARY:Muharram +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131105 +DTEND;VALUE=DATE:20131106 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T132110Z +LAST-MODIFIED:20130103T132117Z +DTSTAMP:20130103T132117Z +UID:065d7652-5ce6-45bd-8fae-5a6b7e33d373 +SUMMARY:Christmas Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131225 +DTEND;VALUE=DATE:20131226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T132121Z +LAST-MODIFIED:20130103T132127Z +DTSTAMP:20130103T132127Z +UID:3c24025c-d159-48b5-8c38-477d73c5d7b4 +SUMMARY:Joint Holiday * +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131226 +DTEND;VALUE=DATE:20131227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T131849Z +LAST-MODIFIED:20130103T131909Z +DTSTAMP:20130103T131909Z +UID:c6e71722-cafd-4a1f-8025-1b7883fdbeac +SUMMARY:Joint Holiday * +RRULE:FREQ=DAILY;UNTIL=20130807 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130805 +DTEND;VALUE=DATE:20130806 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130103T131917Z +LAST-MODIFIED:20130103T131933Z +DTSTAMP:20130103T131933Z +UID:d9044e88-6c85-4c91-ae81-525e6139c532 +SUMMARY:Eid al-Fitr +RRULE:FREQ=DAILY;UNTIL=20130809 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130808 +DTEND;VALUE=DATE:20130809 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/IranHolidays_English.ics b/media/caldata/IranHolidays_English.ics new file mode 100644 index 00000000000..6b8b1a82844 --- /dev/null +++ b/media/caldata/IranHolidays_English.ics @@ -0,0 +1,1558 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +X-WR-CALNAME:IranHolidays_English +X-WR-TIMEZONE:floating +BEGIN:VTIMEZONE +TZID:Asia/Tehran +X-LIC-LOCATION:Asia/Tehran +BEGIN:STANDARD +TZOFFSETFROM:+0330 +TZOFFSETTO:+0330 +TZNAME:IRST +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T105957Z +DTSTAMP:20070704T195343Z +UID:12c2b1ae-d8be-4f77-b766-1b2b26d51e64 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070321 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070322 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T110011Z +DTSTAMP:20070704T195343Z +UID:21677692-6d92-46fb-94a0-a8366baf0f24 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070322 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070323 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T110014Z +DTSTAMP:20070704T195343Z +UID:ec22e919-9388-49ea-9ebd-f6275dc55125 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070323 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070324 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T110029Z +DTSTAMP:20070704T195343Z +UID:0f382508-1d66-4b7a-a12e-52542b2092b1 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070324 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070325 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T110354Z +DTSTAMP:20070704T195343Z +UID:e8c56352-9b1d-433f-900f-d15fc6ccd795 +SUMMARY:Iranian National Day/Islamic Republic Day +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070401 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070402 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T110521Z +DTSTAMP:20070704T195343Z +UID:1ea8bcbb-8161-46b2-b1ec-e49d0c247545 +SUMMARY:Nature Day +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070402 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070403 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T112108Z +DTSTAMP:20070704T195343Z +UID:e19fc8e2-85ae-46b6-9ae1-0ebc9889b016 +SUMMARY:Anniversary of Mumammad\, Anniversary of Imam Sadeq +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070406 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070407 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T112558Z +DTSTAMP:20070704T195343Z +UID:24bd1727-1512-4a70-8c74-59653ec82a16 +SUMMARY:Anniversary of the passing of Khomeini +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070604 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070605 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T112845Z +DTSTAMP:20070704T195343Z +UID:d62b02dd-fd1b-4d5d-9009-76f4de21ecb4 +SUMMARY:Anniversary of the uprising against the Shah +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070605 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070606 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T113004Z +DTSTAMP:20070704T195343Z +UID:acc433a8-f6dd-4fb3-8779-2883e6611efc +SUMMARY:Martyrdom of Fatima +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070618 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070619 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T113122Z +DTSTAMP:20070704T195343Z +UID:20419d8c-5843-4441-8522-5adb5d579593 +SUMMARY:Anniversary of Ali +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070728 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070729 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T113242Z +DTSTAMP:20070704T195343Z +UID:5f481c30-43d9-4fa7-ba24-77ec2ed84f2b +SUMMARY:Mission of Muhammad +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070811 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070812 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T113418Z +DTSTAMP:20070704T195343Z +UID:d2396a1c-718f-4305-8c66-39878ed17be1 +SUMMARY:Anniversary of Imam Mahdi +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20070829 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20070830 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T192009Z +DTSTAMP:20070704T195343Z +UID:4ecbb385-4986-4edf-be8c-3602052dbe05 +SUMMARY:Martyrdom of Ali +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20071003 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20071004 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T192253Z +DTSTAMP:20070704T195343Z +UID:df579e32-78f1-4904-9d64-bfe049952217 +SUMMARY:End of Ramadan +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20071013 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20071014 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T192423Z +DTSTAMP:20070704T195343Z +UID:be62eed6-a8fd-4ba8-90ac-6f061bd7d7e4 +SUMMARY:Martyrdom of Imam Sadeq +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20071106 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20071107 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T192642Z +DTSTAMP:20070704T195343Z +UID:66206ccf-47d0-4ed4-80eb-361a2784a73b +SUMMARY:Eid-e-Qorban +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20071221 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20071222 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T193405Z +DTSTAMP:20070704T195343Z +UID:a82e6ed1-6564-41b1-812f-c4bd9755892f +SUMMARY:Day of Ashura +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080119 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080120 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T194001Z +DTSTAMP:20070704T195343Z +UID:ff92787a-598f-43eb-a4a5-4efe1143c811 +SUMMARY:Eid-e-Ghadeer +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20071229 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20071230 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T194242Z +DTSTAMP:20070704T195343Z +UID:63cbf374-59b6-4dc0-8331-aa1ef9f0405e +SUMMARY:Revolution Day +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080211 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080212 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T194500Z +DTSTAMP:20070704T195343Z +UID:1369896f-ca5e-48e5-88f1-627e5a1e33a7 +SUMMARY:Day of Tasua'a +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080118 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080119 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T194534Z +DTSTAMP:20070704T195343Z +UID:3a196ed2-64a1-4760-b111-e20eee31e3ea +SUMMARY:Arba’in-e Hosseini +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080228 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080229 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20080324T113809Z +DTSTAMP:20080324T113809Z +UID:40b9c4b0-c261-4015-8925-2f1b8c213185 +SUMMARY:Demise of Muhammad\, Martyrdom of Imam Hassan +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080307 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080308 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T194918Z +DTSTAMP:20070704T195343Z +UID:44c865ab-268e-4d7f-8b85-d90d530776e0 +SUMMARY:Martyrdom of Imam Reza +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080308 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080309 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T105234Z +LAST-MODIFIED:20070704T195116Z +DTSTAMP:20070704T195343Z +UID:fb0db57a-87c1-4fd5-8391-fc54f75ab913 +SUMMARY:Nationalization of the Oil Industries +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080319 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080320 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T111725Z +LAST-MODIFIED:20080324T111729Z +DTSTAMP:20080324T111729Z +UID:ab08678d-5e05-4c7d-b8f8-a0633fb3784b +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080320 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080321 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T111733Z +LAST-MODIFIED:20080324T111737Z +DTSTAMP:20080324T111737Z +UID:22ec8039-8f04-42cf-8fb8-25cee5005987 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080321 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080322 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T111741Z +LAST-MODIFIED:20080324T111744Z +DTSTAMP:20080324T111744Z +UID:8e572c8c-630e-4545-936f-3e027b5562a7 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080322 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080323 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T111801Z +LAST-MODIFIED:20080324T111804Z +DTSTAMP:20080324T111804Z +UID:90c992b7-5d70-4d3b-b726-1fd7523f868f +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080323 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080324 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T111821Z +LAST-MODIFIED:20080324T111825Z +DTSTAMP:20080324T111825Z +UID:c2744702-1bef-4c8b-8337-2ac9b4876c9a +SUMMARY:Anniversary of Mumammad\, Anniversary of Imam Sadeq +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080325 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080326 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T111838Z +LAST-MODIFIED:20080324T111842Z +DTSTAMP:20080324T111842Z +UID:522ca4c0-1034-4e35-a4b9-304a5f4256dc +SUMMARY:Iranian National Day/Islamic Republic Day +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080331 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080401 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T111854Z +LAST-MODIFIED:20080324T111857Z +DTSTAMP:20080324T111857Z +UID:b65f02e8-75bd-4c49-9672-c0b939f31db3 +SUMMARY:Nature Day +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080401 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080402 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T111930Z +LAST-MODIFIED:20080324T111933Z +DTSTAMP:20080324T111933Z +UID:084bcf16-b51b-4e28-b576-19dde784a736 +SUMMARY:Anniversary of the passing of Khomeini +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080603 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080604 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T111943Z +LAST-MODIFIED:20080324T111947Z +DTSTAMP:20080324T111947Z +UID:af2c5ec7-ccf4-4177-84d2-3f484eddc463 +SUMMARY:Anniversary of the uprising against the Shah +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080604 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080605 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T111956Z +LAST-MODIFIED:20080324T112001Z +DTSTAMP:20080324T112001Z +UID:498241e0-cd21-45fc-ad0f-e7786338dea7 +SUMMARY:Martyrdom of Fatima +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080607 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080608 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112023Z +LAST-MODIFIED:20080324T112027Z +DTSTAMP:20080324T112027Z +UID:ec4a15fe-c0eb-4ba4-b06f-f1b07ec4aaf3 +SUMMARY:Anniversary of Ali +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080716 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080717 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112038Z +LAST-MODIFIED:20080324T112043Z +DTSTAMP:20080324T112043Z +UID:8094cd30-e200-47ba-b3d0-3d3d22b2c538 +SUMMARY:Mission of Muhammad +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080730 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080731 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112059Z +LAST-MODIFIED:20080324T112102Z +DTSTAMP:20080324T112102Z +UID:c886793f-d221-470e-a4e2-17cafc95798e +SUMMARY:Anniversary of Imam Mahdi +DTSTART;TZID=Asia/Tehran:20080817T000000 +DTEND;TZID=Asia/Tehran:20080817T010000 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112119Z +LAST-MODIFIED:20080324T112123Z +DTSTAMP:20080324T112123Z +UID:a512a679-9e11-453f-bb9b-67a05c57d477 +SUMMARY:Martyrdom of Ali +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20080922 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20080923 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112126Z +LAST-MODIFIED:20080324T112136Z +DTSTAMP:20080324T112136Z +UID:d6c6c9e8-e087-4686-aaad-84fb149e7a3b +SUMMARY:End of Ramadan +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20081001 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20081002 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112151Z +LAST-MODIFIED:20080324T112201Z +DTSTAMP:20080324T112201Z +UID:38cdea3c-27ea-40e9-a25a-9f85c9926219 +SUMMARY:Martyrdom of Imam Sadeq +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20081025 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20081026 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112222Z +LAST-MODIFIED:20080324T112226Z +DTSTAMP:20080324T112226Z +UID:c9e2945e-2be8-412e-83fd-f584262bf0b1 +SUMMARY:Eid-e-Qorban +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20081209 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20081210 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112227Z +LAST-MODIFIED:20080324T112239Z +DTSTAMP:20080324T112239Z +UID:51647283-c978-440e-aed3-45282a593812 +SUMMARY:Eid-e-Ghadeer +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20081217 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20081218 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112253Z +LAST-MODIFIED:20080324T112257Z +DTSTAMP:20080324T112257Z +UID:76cf99f6-684f-459a-8455-c826ee644f78 +SUMMARY:Day of Tasua'a +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20090106 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20090107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112313Z +LAST-MODIFIED:20080324T112316Z +DTSTAMP:20080324T112316Z +UID:2631e797-ad99-4b3a-9a2a-5e6735747987 +SUMMARY:Day of Ashura +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20090107 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20090108 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112330Z +LAST-MODIFIED:20080324T112334Z +DTSTAMP:20080324T112334Z +UID:6d0896d2-265b-4138-97bf-eca5dd0dd112 +SUMMARY:Revolution Day +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20090210 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20090211 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112350Z +LAST-MODIFIED:20080324T112353Z +DTSTAMP:20080324T112353Z +UID:df35855c-9d6e-4004-90fc-4a065eab9cfb +SUMMARY:Arba’in-e Hosseini +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20090216 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20090217 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112409Z +LAST-MODIFIED:20080324T112417Z +DTSTAMP:20080324T112417Z +UID:ed1a9659-d3cf-4cc6-bb59-a8b6946a91d9 +SUMMARY:Demise of Muhammad\, Martyrdom of Imam Hassan +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20090224 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20090225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112428Z +LAST-MODIFIED:20080324T112432Z +DTSTAMP:20080324T112432Z +UID:fcf70a0e-d1e2-422d-ad86-a7338cd77941 +SUMMARY:Martyrdom of Imam Reza +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20090226 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20090227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112446Z +LAST-MODIFIED:20080324T112450Z +DTSTAMP:20080324T112450Z +UID:d0762f20-b24f-49b9-8d0d-d32424f3b8d8 +SUMMARY:Nationalization of the Oil Industries +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20090319 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20090320 +END:VEVENT +BEGIN:VEVENT +CREATED:20080324T112501Z +LAST-MODIFIED:20080324T112505Z +DTSTAMP:20080324T112505Z +UID:934920a4-cf35-4171-b2b9-b5a46a76a4fe +SUMMARY:Anniversary of Mumammad\, Anniversary of Imam Sadeq +DTSTART;VALUE=DATE;TZID=Asia/Tehran:20090315 +DTEND;VALUE=DATE;TZID=Asia/Tehran:20090316 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T121208Z +LAST-MODIFIED:20090304T121214Z +DTSTAMP:20090304T121213Z +UID:e43585ad-118d-44fd-9127-29243e2768e5 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE:20090321 +DTEND;VALUE=DATE:20090322 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T121228Z +LAST-MODIFIED:20090304T121233Z +DTSTAMP:20090304T121233Z +UID:d86fd885-8133-4932-bcc7-d0cf1cf18966 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE:20090322 +DTEND;VALUE=DATE:20090323 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T121236Z +LAST-MODIFIED:20090304T121243Z +DTSTAMP:20090304T121243Z +UID:114d0ec5-5c25-4a5b-87d6-125289baec53 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE:20090323 +DTEND;VALUE=DATE:20090324 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T121334Z +LAST-MODIFIED:20090304T121339Z +DTSTAMP:20090304T121339Z +UID:52eed717-d9c7-4e65-85a9-a6b5dea53566 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE:20090324 +DTEND;VALUE=DATE:20090325 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T121426Z +LAST-MODIFIED:20100330T110954Z +DTSTAMP:20100330T110954Z +UID:1568325d-e814-446d-93c5-6c3b796c9670 +SUMMARY:Iranian National Day/Islamic Republic Day +DTSTART;VALUE=DATE:20090401 +DTEND;VALUE=DATE:20090402 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T121628Z +LAST-MODIFIED:20090304T121700Z +DTSTAMP:20090304T121700Z +UID:f03a395e-9f25-4b1f-93a9-b0f557e005dd +SUMMARY:Nature Day +DTSTART;VALUE=DATE:20090402 +DTEND;VALUE=DATE:20090403 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T121849Z +LAST-MODIFIED:20090304T121928Z +DTSTAMP:20090304T121928Z +UID:55fedde3-dd6f-4b3b-806a-835fcbfc620e +SUMMARY:Anniversary of the passing of Khomeini +DTSTART;VALUE=DATE:20090604 +DTEND;VALUE=DATE:20090605 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T121940Z +LAST-MODIFIED:20090304T122016Z +DTSTAMP:20090304T122016Z +UID:12d7df1f-19f2-493c-808f-57c9ca9b6dd0 +SUMMARY:Anniversary of the uprising against the Shah +DTSTART;VALUE=DATE:20090605 +DTEND;VALUE=DATE:20090606 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T122036Z +LAST-MODIFIED:20090304T122123Z +DTSTAMP:20090304T122123Z +UID:0b48474c-21da-4383-b294-da95fab27883 +SUMMARY:Martyrdom of Fatima +DTSTART;VALUE=DATE:20090528 +DTEND;VALUE=DATE:20090529 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T122244Z +LAST-MODIFIED:20090304T122304Z +DTSTAMP:20090304T122304Z +UID:81d9e073-9e23-45a2-a1b9-f94589558fe1 +SUMMARY:Anniversary of Ali +DTSTART;VALUE=DATE:20090706 +DTEND;VALUE=DATE:20090707 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T122320Z +LAST-MODIFIED:20090304T122402Z +DTSTAMP:20090304T122402Z +UID:6a823477-a177-4200-9bb3-f3248cb1be91 +SUMMARY:Mission of Muhammad +DTSTART;VALUE=DATE:20090720 +DTEND;VALUE=DATE:20090721 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T122420Z +LAST-MODIFIED:20090304T122501Z +DTSTAMP:20090304T122501Z +UID:ac1c7082-d3c7-4347-bca3-5186f2563d29 +SUMMARY:Anniversary of Imam Mahdi +DTSTART;VALUE=DATE:20090807 +DTEND;VALUE=DATE:20090808 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T122519Z +LAST-MODIFIED:20090304T122555Z +DTSTAMP:20090304T122555Z +UID:413c4113-25e2-4b95-934d-d410dfa8f186 +SUMMARY:Martyrdom of Ali +DTSTART;VALUE=DATE:20090911 +DTEND;VALUE=DATE:20090912 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T122607Z +LAST-MODIFIED:20090304T122649Z +DTSTAMP:20090304T122649Z +UID:6005b6d3-d03d-48f7-bbee-b26dadee16cc +SUMMARY:End of Ramadan +DTSTART;VALUE=DATE:20090920 +DTEND;VALUE=DATE:20090921 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T122707Z +LAST-MODIFIED:20090304T122832Z +DTSTAMP:20090304T122832Z +UID:1baf27e7-d7bc-4fce-9159-23a986797447 +SUMMARY:Martyrdom of Imam Sadeq +DTSTART;VALUE=DATE:20091014 +DTEND;VALUE=DATE:20091015 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T122848Z +LAST-MODIFIED:20090304T122958Z +DTSTAMP:20090304T122958Z +UID:c90c25dd-bcfc-495e-bbfb-bccde219e3b0 +SUMMARY:Eid-e-Qorban +DTSTART;VALUE=DATE:20091128 +DTEND;VALUE=DATE:20091129 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T123008Z +LAST-MODIFIED:20090304T123035Z +DTSTAMP:20090304T123035Z +UID:31b419e4-54ae-41c9-90cd-ed78438a4c2f +SUMMARY:Eid-e-Ghadeer +DTSTART;VALUE=DATE:20091206 +DTEND;VALUE=DATE:20091207 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T123052Z +LAST-MODIFIED:20090304T123119Z +DTSTAMP:20090304T123119Z +UID:bd5f0128-cb27-44c1-b367-5768260e2ccc +SUMMARY:Day of Tasua'a +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T123134Z +LAST-MODIFIED:20090304T123152Z +DTSTAMP:20090304T123152Z +UID:e45963b0-eb78-43e0-80fb-116e3e13ecde +SUMMARY:Day of Ashura +DTSTART;VALUE=DATE:20091227 +DTEND;VALUE=DATE:20091228 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T123307Z +LAST-MODIFIED:20090304T123342Z +DTSTAMP:20090304T123342Z +UID:93a23566-c936-4e70-9da5-5f60bba18251 +SUMMARY:Revolution Day +DTSTART;VALUE=DATE:20100211 +DTEND;VALUE=DATE:20100212 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T123353Z +LAST-MODIFIED:20090304T123433Z +DTSTAMP:20090304T123433Z +UID:ecaadb01-6d21-4f97-8ec4-a1888a55ea94 +SUMMARY:Arba’in-e Hosseini +DTSTART;VALUE=DATE:20100205 +DTEND;VALUE=DATE:20100206 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T123445Z +LAST-MODIFIED:20090304T123501Z +DTSTAMP:20090304T123501Z +UID:49a9b0d7-c1de-472a-928c-9d720e669a19 +SUMMARY:Demise of Muhammad\, Martyrdom of Imam Hassan +DTSTART;VALUE=DATE:20100213 +DTEND;VALUE=DATE:20100214 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T123512Z +LAST-MODIFIED:20090304T123526Z +DTSTAMP:20090304T123526Z +UID:bba770dd-d34c-49c5-bd0e-9d39abd87a4c +SUMMARY:Martyrdom of Imam Reza +DTSTART;VALUE=DATE:20100215 +DTEND;VALUE=DATE:20100216 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T123542Z +LAST-MODIFIED:20090304T123601Z +DTSTAMP:20090304T123601Z +UID:5a225565-8b84-45a3-a25b-e22a554aa01a +SUMMARY:Anniversary of Mumammad\, Anniversary of Imam Sadeq +DTSTART;VALUE=DATE:20100304 +DTEND;VALUE=DATE:20100305 +END:VEVENT +BEGIN:VEVENT +CREATED:20090304T123612Z +LAST-MODIFIED:20090304T123635Z +DTSTAMP:20090304T123635Z +UID:f7587aa3-0045-43a0-bee6-5a98c329b986 +SUMMARY:Nationalization of the Oil Industries +DTSTART;VALUE=DATE:20100320 +DTEND;VALUE=DATE:20100321 +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T110713Z +LAST-MODIFIED:20100330T110719Z +DTSTAMP:20100330T110719Z +UID:af410997-0a3d-4ec1-9f2d-02f8a52ab8b2 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE:20100324 +DTEND;VALUE=DATE:20100325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T110720Z +LAST-MODIFIED:20100330T110730Z +DTSTAMP:20100330T110730Z +UID:b20e9813-e633-4cfb-9bc3-341140ed3942 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE:20100322 +DTEND;VALUE=DATE:20100323 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T110731Z +LAST-MODIFIED:20100330T110735Z +DTSTAMP:20100330T110735Z +UID:4054948a-6e7e-4425-9aef-c31a263adfb1 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE:20100321 +DTEND;VALUE=DATE:20100322 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T111021Z +LAST-MODIFIED:20100330T111027Z +DTSTAMP:20100330T111027Z +UID:b5c179bc-582f-49b1-98ab-ca1b2b4c12f3 +SUMMARY:Iranian National Day/Islamic Republic Day +DTSTART;VALUE=DATE:20100401 +DTEND;VALUE=DATE:20100402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T111112Z +LAST-MODIFIED:20100330T114037Z +DTSTAMP:20100330T114037Z +UID:2b04a499-ffeb-47d2-b9ef-9f258c260ab2 +SUMMARY:Nature Day +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T114341Z +LAST-MODIFIED:20100330T114350Z +DTSTAMP:20100330T114350Z +UID:0de112cb-2329-4a5f-8a24-24b6bc010c59 +SUMMARY:Martyrdom of Fatima +DTSTART;VALUE=DATE:20100517 +DTEND;VALUE=DATE:20100518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T114453Z +LAST-MODIFIED:20100330T114520Z +DTSTAMP:20100330T114520Z +UID:5355b9f4-8e40-4ef6-a51f-95a262bc397d +SUMMARY:Anniversary of the passing of Khomeini +DTSTART;VALUE=DATE:20100604 +DTEND;VALUE=DATE:20100605 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T114549Z +LAST-MODIFIED:20100330T114553Z +DTSTAMP:20100330T114553Z +UID:139a29ef-240e-43f4-bf8e-4307e9a29e1c +SUMMARY:Anniversary of the uprising against the Shah +DTSTART;VALUE=DATE:20100605 +DTEND;VALUE=DATE:20100606 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T114741Z +LAST-MODIFIED:20100330T114746Z +DTSTAMP:20100330T114746Z +UID:5207c645-4cd6-433d-bc47-e7d232f87dbb +SUMMARY:Anniversary of Ali +DTSTART;VALUE=DATE:20100626 +DTEND;VALUE=DATE:20100627 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T114856Z +LAST-MODIFIED:20100330T114901Z +DTSTAMP:20100330T114901Z +UID:bf7c545d-156c-46ce-b582-940e30cb79b7 +SUMMARY:Mission of Muhammad +DTSTART;VALUE=DATE:20100710 +DTEND;VALUE=DATE:20100711 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T115312Z +LAST-MODIFIED:20100330T115325Z +DTSTAMP:20100330T115325Z +UID:a26b78b4-05c8-4176-94eb-ad7c30346be7 +SUMMARY:Anniversary of Imam Mahdi +DTSTART;VALUE=DATE:20100727 +DTEND;VALUE=DATE:20100728 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T115505Z +LAST-MODIFIED:20100330T115509Z +DTSTAMP:20100330T115509Z +UID:bff4588a-f956-4216-9194-d0868449e9c3 +SUMMARY:Martyrdom of Ali +DTSTART;VALUE=DATE:20100901 +DTEND;VALUE=DATE:20100902 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T115611Z +LAST-MODIFIED:20100330T115614Z +DTSTAMP:20100330T115614Z +UID:93235bb9-46a6-4993-a6d7-997d3be06284 +SUMMARY:End of Ramadan +DTSTART;VALUE=DATE:20100910 +DTEND;VALUE=DATE:20100911 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T115703Z +LAST-MODIFIED:20100330T115710Z +DTSTAMP:20100330T115710Z +UID:81897dec-d5bf-4a3f-9915-0b274718f4d1 +SUMMARY:Martyrdom of Imam Sadeq +DTSTART;VALUE=DATE:20101004 +DTEND;VALUE=DATE:20101005 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T115813Z +LAST-MODIFIED:20100330T115818Z +DTSTAMP:20100330T115818Z +UID:eaf76147-f252-4d78-928b-6042a678240c +SUMMARY:Eid-e-Qorban +DTSTART;VALUE=DATE:20101117 +DTEND;VALUE=DATE:20101118 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T115913Z +LAST-MODIFIED:20100330T115922Z +DTSTAMP:20100330T115922Z +UID:c248b735-0362-4a91-ab85-b5af1b84faf2 +SUMMARY:Eid-e-Ghadeer +DTSTART;VALUE=DATE:20101125 +DTEND;VALUE=DATE:20101126 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T120024Z +LAST-MODIFIED:20100330T120146Z +DTSTAMP:20100330T120146Z +UID:b19c7189-46da-4ee6-afd6-bc4a73dc609c +SUMMARY:Day of Tasua'a +DTSTART;VALUE=DATE:20101215 +DTEND;VALUE=DATE:20101216 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T120213Z +LAST-MODIFIED:20100330T120217Z +DTSTAMP:20100330T120217Z +UID:dcbab311-98fa-4097-8144-a2e80d37aba8 +SUMMARY:Day of Ashura +DTSTART;VALUE=DATE:20101216 +DTEND;VALUE=DATE:20101217 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T120426Z +LAST-MODIFIED:20100330T120430Z +DTSTAMP:20100330T120430Z +UID:449ac431-2be2-4a63-a63e-4ac0661d72f0 +SUMMARY:Arba’in-e Hosseini +DTSTART;VALUE=DATE:20110125 +DTEND;VALUE=DATE:20110126 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T120814Z +LAST-MODIFIED:20100330T120818Z +DTSTAMP:20100330T120818Z +UID:92cc1176-ef01-4921-b848-33cf528edfb7 +SUMMARY:Demise of Muhammad\, Martyrdom of Imam Hassan +DTSTART;VALUE=DATE:20110202 +DTEND;VALUE=DATE:20110203 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T120905Z +LAST-MODIFIED:20100330T120910Z +DTSTAMP:20100330T120910Z +UID:cdbc49d7-1b4b-4bea-86db-651676d89539 +SUMMARY:Martyrdom of Imam Reza +DTSTART;VALUE=DATE:20110204 +DTEND;VALUE=DATE:20110205 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T120953Z +LAST-MODIFIED:20100330T120958Z +DTSTAMP:20100330T120958Z +UID:4593ea57-db99-4148-8e76-4aa1869d13b8 +SUMMARY:Revolution Day +DTSTART;VALUE=DATE:20110211 +DTEND;VALUE=DATE:20110212 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T121051Z +LAST-MODIFIED:20100330T121056Z +DTSTAMP:20100330T121056Z +UID:8b1392e7-b0d0-465a-aaa3-5224c51c3fe3 +SUMMARY:Anniversary of Mumammad\, Anniversary of Imam Sadeq +DTSTART;VALUE=DATE:20110221 +DTEND;VALUE=DATE:20110222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100330T121200Z +LAST-MODIFIED:20100330T121204Z +DTSTAMP:20100330T121204Z +UID:0b93f77d-6475-4974-a799-c88f56e86f8f +SUMMARY:Nationalization of the Oil Industries +DTSTART;VALUE=DATE:20110320 +DTEND;VALUE=DATE:20110321 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T113834Z +LAST-MODIFIED:20101228T113844Z +DTSTAMP:20101228T113844Z +UID:33236ea7-4e52-4489-a1af-562edeef8b57 +SUMMARY:Persian New Year (Nowruz) +DTSTART;VALUE=DATE:20100323 +DTEND;VALUE=DATE:20100324 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T130232Z +LAST-MODIFIED:20101229T103105Z +DTSTAMP:20101229T103105Z +UID:0b190e6e-7892-486f-9f64-35819462c7c7 +SUMMARY:Persian New Year (Nowruz) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110321 +DTEND;VALUE=DATE:20110322 +LOCATION:Iran +DESCRIPTION:Nowrūz (Persian: نوروز\, IPA: [noʊˈɾuːz]\, \"New Day + \"\, originally \"New Light\") is the traditional celebration of the ancie + nt Iranian New Year. Nowruz is also widely referred to as the Persian New + Year.\nNowruz is celebrated and observed by Iranian peoples and the relate + d cultural continent and has spread in many other parts of the world\, inc + luding parts of Central Asia\, South Asia\, Northwestern China\, the Crime + a and some groups in the Balkans.\nThe term Nowruz in writing\, first appe + ared in Persian records in the second century AD\, but it was also an impo + rtant day during the time of the Achaemenids (c. 648-330 BC)\, where kings + from different nations under the Persian empire used to bring gifts to th + e Emperor\, also called King of Kings (Shahanshah)\, of Persia on Nowruz.\ + nThe UN's General Assembly in 2010 recognized the International Day of Now + ruz\, describing it a spring festival of Persian origin which has been cel + ebrated for over 3\,000 years. During the meeting of The Inter-governmenta + l Committee for the Safeguarding of the Intangible Heritage of the United + Nations\, held between 28 September – 2 October 2009 in Abu Dhabi\, Nowr + ūz was officially registered on the UNESCO List of the Intangible Cultura + l Heritage of Humanity.\n\nThe term Nowruz is a Persian compound-word and + consists of:\n\n now (Old Persian nava) means \"new\" and has the follo + wing cognates\, in English new\, in Latin novus\, German neu\, Sanskrit na + va\, etc. The Persian pronunciation differs in the many dialects of the la + nguage: while the eastern dialects have preserved the original diphthong ( + IPA: [næuˈɾoːz])\, the western dialects usually pronounce it with a di + fferent diphthong (IPA: [nouˈɾuːz])\, and some colloquial variants (suc + h as the Tehrani accent) pronounce it with a monophtong (IPA: [noˈɾuːz] + ).\n rōz (also with various pronuciations\, such as rūz\, rozh\, or r + oj) means \"day\" in Middle- and Modern Persian\, as well as related langu + ages\, such as Kurdish. The original meaning of the word\, however\, was \ + "light\". The term is derived from Avestan *rowch-\, itself derived from P + roto-Indo-European *leuk- (l <-> r and k <-> ch sound changes are common i + n Indo-European languages)\, and is related to Sanskrit ruci\, Latin lux a + nd\, in fact\, English light.\n\nhttp://en.wikipedia.org/wiki/Nowruz +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T134054Z +LAST-MODIFIED:20101229T103111Z +DTSTAMP:20101229T103111Z +UID:8e400bd8-a210-4392-881c-a9b42334f270 +SUMMARY:Persian New Year (Nowruz) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110322 +DTEND;VALUE=DATE:20110323 +TRANSP:TRANSPARENT +LOCATION:Iran +DESCRIPTION:Nowrūz (Persian: نوروز\, IPA: [noʊˈɾuːz]\, \"New Day + \"\, originally \"New Light\") is the traditional celebration of the ancie + nt Iranian New Year. Nowruz is also widely referred to as the Persian New + Year.\nNowruz is celebrated and observed by Iranian peoples and the relate + d cultural continent and has spread in many other parts of the world\, inc + luding parts of Central Asia\, South Asia\, Northwestern China\, the Crime + a and some groups in the Balkans.\nThe term Nowruz in writing\, first appe + ared in Persian records in the second century AD\, but it was also an impo + rtant day during the time of the Achaemenids (c. 648-330 BC)\, where kings + from different nations under the Persian empire used to bring gifts to th + e Emperor\, also called King of Kings (Shahanshah)\, of Persia on Nowruz.\ + nThe UN's General Assembly in 2010 recognized the International Day of Now + ruz\, describing it a spring festival of Persian origin which has been cel + ebrated for over 3\,000 years. During the meeting of The Inter-governmenta + l Committee for the Safeguarding of the Intangible Heritage of the United + Nations\, held between 28 September – 2 October 2009 in Abu Dhabi\, Nowr + ūz was officially registered on the UNESCO List of the Intangible Cultura + l Heritage of Humanity.\n\nThe term Nowruz is a Persian compound-word and + consists of:\n\n now (Old Persian nava) means \"new\" and has the follo + wing cognates\, in English new\, in Latin novus\, German neu\, Sanskrit na + va\, etc. The Persian pronunciation differs in the many dialects of the la + nguage: while the eastern dialects have preserved the original diphthong ( + IPA: [næuˈɾoːz])\, the western dialects usually pronounce it with a di + fferent diphthong (IPA: [nouˈɾuːz])\, and some colloquial variants (suc + h as the Tehrani accent) pronounce it with a monophtong (IPA: [noˈɾuːz] + ).\n rōz (also with various pronuciations\, such as rūz\, rozh\, or r + oj) means \"day\" in Middle- and Modern Persian\, as well as related langu + ages\, such as Kurdish. The original meaning of the word\, however\, was \ + "light\". The term is derived from Avestan *rowch-\, itself derived from P + roto-Indo-European *leuk- (l <-> r and k <-> ch sound changes are common i + n Indo-European languages)\, and is related to Sanskrit ruci\, Latin lux a + nd\, in fact\, English light.\n\nhttp://en.wikipedia.org/wiki/Nowruz +SEQUENCE:2 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T134422Z +LAST-MODIFIED:20101229T103118Z +DTSTAMP:20101229T103118Z +UID:20071498-85e4-4d06-9824-6cfd4e75ef7e +SUMMARY:Persian New Year (Nowruz) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110323 +DTEND;VALUE=DATE:20110324 +LOCATION:Iran +TRANSP:TRANSPARENT +DESCRIPTION:Nowrūz (Persian: نوروز\, IPA: [noʊˈɾuːz]\, \"New Day + \"\, originally \"New Light\") is the traditional celebration of the ancie + nt Iranian New Year. Nowruz is also widely referred to as the Persian New + Year.\nNowruz is celebrated and observed by Iranian peoples and the relate + d cultural continent and has spread in many other parts of the world\, inc + luding parts of Central Asia\, South Asia\, Northwestern China\, the Crime + a and some groups in the Balkans.\nThe term Nowruz in writing\, first appe + ared in Persian records in the second century AD\, but it was also an impo + rtant day during the time of the Achaemenids (c. 648-330 BC)\, where kings + from different nations under the Persian empire used to bring gifts to th + e Emperor\, also called King of Kings (Shahanshah)\, of Persia on Nowruz.\ + nThe UN's General Assembly in 2010 recognized the International Day of Now + ruz\, describing it a spring festival of Persian origin which has been cel + ebrated for over 3\,000 years. During the meeting of The Inter-governmenta + l Committee for the Safeguarding of the Intangible Heritage of the United + Nations\, held between 28 September – 2 October 2009 in Abu Dhabi\, Nowr + ūz was officially registered on the UNESCO List of the Intangible Cultura + l Heritage of Humanity.\n\nThe term Nowruz is a Persian compound-word and + consists of:\n\n now (Old Persian nava) means \"new\" and has the follo + wing cognates\, in English new\, in Latin novus\, German neu\, Sanskrit na + va\, etc. The Persian pronunciation differs in the many dialects of the la + nguage: while the eastern dialects have preserved the original diphthong ( + IPA: [næuˈɾoːz])\, the western dialects usually pronounce it with a di + fferent diphthong (IPA: [nouˈɾuːz])\, and some colloquial variants (suc + h as the Tehrani accent) pronounce it with a monophtong (IPA: [noˈɾuːz] + ).\n rōz (also with various pronuciations\, such as rūz\, rozh\, or r + oj) means \"day\" in Middle- and Modern Persian\, as well as related langu + ages\, such as Kurdish. The original meaning of the word\, however\, was \ + "light\". The term is derived from Avestan *rowch-\, itself derived from P + roto-Indo-European *leuk- (l <-> r and k <-> ch sound changes are common i + n Indo-European languages)\, and is related to Sanskrit ruci\, Latin lux a + nd\, in fact\, English light.\n\nhttp://en.wikipedia.org/wiki/Nowruz +X-MOZ-GENERATION:3 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T134516Z +LAST-MODIFIED:20101229T103127Z +DTSTAMP:20101229T103127Z +UID:968c822f-bdf9-449a-a912-7caf0a80903d +SUMMARY:Persian New Year (Nowruz) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110324 +DTEND;VALUE=DATE:20110325 +LOCATION:Iran +DESCRIPTION:Nowrūz (Persian: نوروز\, IPA: [noʊˈɾuːz]\, \"New Day + \"\, originally \"New Light\") is the traditional celebration of the ancie + nt Iranian New Year. Nowruz is also widely referred to as the Persian New + Year.\nNowruz is celebrated and observed by Iranian peoples and the relate + d cultural continent and has spread in many other parts of the world\, inc + luding parts of Central Asia\, South Asia\, Northwestern China\, the Crime + a and some groups in the Balkans.\nThe term Nowruz in writing\, first appe + ared in Persian records in the second century AD\, but it was also an impo + rtant day during the time of the Achaemenids (c. 648-330 BC)\, where kings + from different nations under the Persian empire used to bring gifts to th + e Emperor\, also called King of Kings (Shahanshah)\, of Persia on Nowruz.\ + nThe UN's General Assembly in 2010 recognized the International Day of Now + ruz\, describing it a spring festival of Persian origin which has been cel + ebrated for over 3\,000 years. During the meeting of The Inter-governmenta + l Committee for the Safeguarding of the Intangible Heritage of the United + Nations\, held between 28 September – 2 October 2009 in Abu Dhabi\, Nowr + ūz was officially registered on the UNESCO List of the Intangible Cultura + l Heritage of Humanity.\n\nThe term Nowruz is a Persian compound-word and + consists of:\n\n now (Old Persian nava) means \"new\" and has the follo + wing cognates\, in English new\, in Latin novus\, German neu\, Sanskrit na + va\, etc. The Persian pronunciation differs in the many dialects of the la + nguage: while the eastern dialects have preserved the original diphthong ( + IPA: [næuˈɾoːz])\, the western dialects usually pronounce it with a di + fferent diphthong (IPA: [nouˈɾuːz])\, and some colloquial variants (suc + h as the Tehrani accent) pronounce it with a monophtong (IPA: [noˈɾuːz] + ).\n rōz (also with various pronuciations\, such as rūz\, rozh\, or r + oj) means \"day\" in Middle- and Modern Persian\, as well as related langu + ages\, such as Kurdish. The original meaning of the word\, however\, was \ + "light\". The term is derived from Avestan *rowch-\, itself derived from P + roto-Indo-European *leuk- (l <-> r and k <-> ch sound changes are common i + n Indo-European languages)\, and is related to Sanskrit ruci\, Latin lux a + nd\, in fact\, English light.\n\nhttp://en.wikipedia.org/wiki/Nowruz +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T102555Z +LAST-MODIFIED:20101229T103159Z +DTSTAMP:20101229T103159Z +UID:a22d40f6-13f2-4300-91b3-b5e291e7d496 +SUMMARY:Iranian National Day/Islamic Republic Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110401 +DTEND;VALUE=DATE:20110402 +LOCATION:Iran +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T102930Z +LAST-MODIFIED:20101229T142815Z +DTSTAMP:20101229T142815Z +UID:54f2741c-cbb6-401d-94ca-a587c95c6dbf +SUMMARY:Nature Day/Sizdahbedar(13 bedar) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110402 +DTEND;VALUE=DATE:20110403 +LOCATION:Iran +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +DESCRIPTION:Sizdahbedar or Sizdah Be-dar (Persian Sizdah Bedar ) is the na + me of a ceremony in Persian Culture. Sizdah is the Persian term for thirte + en. Leaving the house on the Thirteenth Day of Farvardin (the first month + of Iranian calendar)\, and joyfully spending the day outdoors have been a + national tradition since ancient times in Iran. Sizdah Bedar (in English: + Getting rid of the Thirteenth) has been possibly considered as a tradition + because some people believe the thirteen is an unlucky number\, and every + body should get rid of the thirteen. That interpretation may be disputed s + ince it is documented that in Persian\, Bedar may also mean Raftan-e beh D + ar-o Dasht (in English: Going Outdoors and Country Sides). Most of the tim + es Sizdah Bedar coincides with the first day of April\, which is known as + April Fools' Day in the Western Culture.\nLike the Iranian New Year (in Pe + rsian: Nowruz\, aka Know Rooz)\, the tradition of Sizdah Bedar also traces + back to the era of legendary king Jamshid who celebrated this outdoor fes + tival together with his people\, the Iranians.\n Researcher Mohammad Ahmad + Panahi Semnaani noted that\, “The essence of the Sizdah Bedar ceremonie + s is the enthusiasm to set up a family\, lead a happy life and form friend + ship. By growing sprouts\, ancient Iranians expressed their spirit for gre + en environment and seek further divine blessings in the form of rain for t + heir farmlands. Iranians believed that the Demon of Drought was defeated a + t midday of Sizdah Bedar. They used to sacrifice sheep and cook kebab in t + he open areas to celebrate victory of the Angel of Rain against the Demon + of Drought”.\n +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T143920Z +LAST-MODIFIED:20101229T143935Z +DTSTAMP:20101229T143935Z +UID:bc542474-9181-4d86-9ffe-04bdc33a41bd +SUMMARY:Martyrdom of Fatima +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110507 +DTEND;VALUE=DATE:20110508 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T144050Z +LAST-MODIFIED:20101229T144109Z +DTSTAMP:20101229T144109Z +UID:8f9832f5-134b-4f51-8470-9006fe2fb97e +SUMMARY:Anniversary of the passing of Khomeini +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110604 +DTEND;VALUE=DATE:20110605 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T151220Z +LAST-MODIFIED:20101229T151230Z +DTSTAMP:20101229T151230Z +UID:07e2406b-f864-4078-80fe-fef156092fd7 +SUMMARY:Anniversary of the uprising against the Shah +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110605 +DTEND;VALUE=DATE:20110606 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T151359Z +LAST-MODIFIED:20101229T151413Z +DTSTAMP:20101229T151413Z +UID:1c777375-ad7c-4078-b732-d8ca505ef20d +SUMMARY:Anniversary of Ali +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110616 +DTEND;VALUE=DATE:20110617 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T151500Z +LAST-MODIFIED:20101229T151513Z +DTSTAMP:20101229T151513Z +UID:a49706a3-6997-4071-bde1-f30bd9ad769a +SUMMARY:Mission of Muhammad +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110630 +DTEND;VALUE=DATE:20110701 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T151611Z +LAST-MODIFIED:20101229T151619Z +DTSTAMP:20101229T151619Z +UID:7f255ebf-bd10-43f1-b87a-e814261deeba +SUMMARY:Anniversary of Imam Mahdi +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110717 +DTEND;VALUE=DATE:20110718 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T151658Z +LAST-MODIFIED:20101229T151718Z +DTSTAMP:20101229T151718Z +UID:2e251669-4572-4fe4-9568-eeba8048ba17 +SUMMARY:Martyrdom of Ali +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110821 +DTEND;VALUE=DATE:20110822 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T151746Z +LAST-MODIFIED:20101229T151756Z +DTSTAMP:20101229T151756Z +UID:e67d7c3d-c86e-4ab3-840c-0808e54fe410 +SUMMARY:End of Ramadan +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110831 +DTEND;VALUE=DATE:20110901 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T151846Z +LAST-MODIFIED:20101229T151933Z +DTSTAMP:20101229T151933Z +UID:1cc16254-c1b5-4418-9849-894dba0d3677 +SUMMARY:Martyrdom of Imam Sadeq +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110924 +DTEND;VALUE=DATE:20110925 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T152007Z +LAST-MODIFIED:20101229T152020Z +DTSTAMP:20101229T152020Z +UID:46948f7c-16e3-406d-b40b-ca240a86843f +SUMMARY:Eid-e-Qorban +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20111107 +DTEND;VALUE=DATE:20111108 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T152052Z +LAST-MODIFIED:20101229T152159Z +DTSTAMP:20101229T152159Z +UID:df19a663-a4b5-4a41-803a-7b6bb35cdee6 +SUMMARY:Eid-e-Ghadeer +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20111115 +DTEND;VALUE=DATE:20111116 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T152438Z +LAST-MODIFIED:20101229T152449Z +DTSTAMP:20101229T152449Z +UID:1ac39cf6-dda6-40d8-8f08-2f7b4ff314e7 +SUMMARY:Day of Tasua'a +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20111205 +DTEND;VALUE=DATE:20111206 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T152511Z +LAST-MODIFIED:20101229T152522Z +DTSTAMP:20101229T152522Z +UID:1e904b74-d1b1-4058-ab29-67f32bdab167 +SUMMARY:Day of Ashura +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20111206 +DTEND;VALUE=DATE:20111207 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T152632Z +LAST-MODIFIED:20101229T152659Z +DTSTAMP:20101229T152659Z +UID:c5a33e0c-e590-45ae-bbff-e63cf64c850f +SUMMARY:Arba’in-e Hosseini +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120114 +DTEND;VALUE=DATE:20120115 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T152820Z +LAST-MODIFIED:20101229T152930Z +DTSTAMP:20101229T152930Z +UID:e598386c-683f-4ae6-b53e-827640b04ea7 +SUMMARY:Demise of Muhammad\, Martyrdom of Imam Hassan +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120122 +DTEND;VALUE=DATE:20120123 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T153056Z +LAST-MODIFIED:20101229T153111Z +DTSTAMP:20101229T153111Z +UID:8f588b98-51e1-4510-bec4-9a9e14ec4522 +SUMMARY:Martyrdom of Imam Reza +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120124 +DTEND;VALUE=DATE:20120125 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T153314Z +LAST-MODIFIED:20101229T153326Z +DTSTAMP:20101229T153326Z +UID:c14cc105-c70e-4a58-8832-62dda8d78b47 +SUMMARY:Anniversary of Mumammad\, Anniversary of Imam Sadeq +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120210 +DTEND;VALUE=DATE:20120211 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T153538Z +LAST-MODIFIED:20101229T153550Z +DTSTAMP:20101229T153550Z +UID:e42f3d3f-3d36-4945-a789-0fd3777fdd9f +SUMMARY:Revolution Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120211 +DTEND;VALUE=DATE:20120212 +LOCATION:Iran +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T153919Z +LAST-MODIFIED:20101229T163317Z +DTSTAMP:20101229T163317Z +UID:c5038363-8315-4d82-aeeb-3d1a2f68802b +SUMMARY:Nationalization of the Oil Industries +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120319 +DTEND;VALUE=DATE:20120320 +LOCATION:Iran +TRANSP:TRANSPARENT +DESCRIPTION:Commemorates the day Iran took control of its own oil industry + \, an event that led to the first U.S.-backed post-war coup d’ etat.\nFo + r almost half of the 20th century\, the British-owned Anglo-Iranian Oil Co + mpany (now British Petroleum)\, enjoyed a monopoly of the oil industry in + Iran. By the 1940s\, against a backdrop of political turmoil characterized + by calls for a shift from a monarchical to a parliamentary government\, t + he Iranians started working for national ownership of their oil fields\, f + inding a champion in Muhammad Mossadaq\, a democratic-oriented\, wealthy l + awyer and nationalist. In 1951\, pressure from Iranians led by the Nationa + l Front\, a coalition of opposition groups\, forced the Shah of Iran—Rez + a Pahlavi\, a staunch British ally—to appoint Mossadaq as Prime Minister + \, who promptly nationalized all Iranian oil fields and refineries. The Br + itish launched efforts to retain their control of Iranian oil through lega + l maneuvers\, economic embargoes\, and strategies to overthrow Mossadaq\, + while soliciting U.N. and U.S. support in the process\, The United States\ + , originally opposed to “challenging Iranian sovereignty” under Presid + ent Truman\, eventually\, as a means to stem a Communist takeover of Iran\ + , backed a coup d’etat (a covert CIA operation) under President Eisenhow + er in 1953. Mossadaq was overthrown\, paving the way for the Shah of Iran + ’s return to power for a 25-year rule that ended in the 1978-1979 Islami + c Revolution.\nHow Celebrated: Distinguished Iranian scholars and politici + ans discuss their viewpoints on the present state of Iran’s political an + d economic affairs. In other parts of the world\, Iranians attend seminars + and meetings on the meaning of this event on world affairs. +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101229T163608Z +LAST-MODIFIED:20101229T163740Z +DTSTAMP:20101229T163740Z +UID:cbe743d4-5d32-4977-b495-40d6680ac891 +SUMMARY:Yalda Festival (Shabe Chelle) +DTSTART;VALUE=DATE:20111221 +DTEND;VALUE=DATE:20111222 +LOCATION:Iran +DESCRIPTION:An ancient Zoroastrian festival that marks the winter solstice + \, the longest night of the year\, in which day and night\, representing g + ood and evil\, battle for supremacy.\nBackground: Thousands of years ago\, + when Zoroastrianism was the prevailing religion in ancient Persia\, peopl + e believed in the perpetual struggle between Ahura Mazda (the deity repres + enting truth and light) and Ahriman (the evil being representing falsehood + and darkness). The struggle reached a climax at the end of the solar year + \, which was also the shortest day of the year. People feasted\, kept fire + s burning all night\, and prayed for Ahriman’s defeat. The coming of daw + n signaled the start of the new solar year as well as the triumph of light + (good) over darkness (evil).\nThe observance of Yalda survived the arriva + l and spread of Islam\, though today it is considered more of a social – + rather than a religious – affair when family and friends gather to feas + t on fresh and dried winter fruits\, seeds\, and nuts.\nHow Celebrated: Sh + ops start selling nuts\, dried fruits\, and melons days before the festiva + l. Zoroastrians believe that eating melons during Yalda can ward off vario + us diseases and that eating nuts will bring good fortune. In addition to t + he feasting\, Zoroastrians also offer prayers of thanks for the previous y + ears’ bounty and for prosperity throughout the New Year. People light bo + nfires outside their homes\, while families gather in front of the firepla + ce or around a korsi (a table with a brazier of hot coals underneath) for + a nightlong vigil\; they recite poems\, play music\, and share stories and + jokes until daybreak. The festival is celebrated by the small Zoroastrian + community in a predominantly Islamic region. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110313T180946Z +LAST-MODIFIED:20110313T181127Z +DTSTAMP:20110313T181127Z +UID:640cd06d-45cb-4d90-9745-1dec65dbb563 +SUMMARY:Chaharshanbe Suri +DTSTART;VALUE=DATE:20120313 +DTEND;VALUE=DATE:20120314 +LOCATION:Iran +DESCRIPTION:Chahārshanbe-Sūri (Persian: چهارشنبه ‌سوری\, p + ronounced Chārshambe-Sūri) meaning Wednesday Feast\, from the word sour[ + citation needed] which means feast in Persian is an ancient Iranian festiv + al dating back to at least 1700 BCE of the early Zoroastrian era. Also cal + led the Festival of Fire\, it is a prelude to Nowruz\, which marks the arr + ival of spring. Traditionally celebrated on the last Tuesday night of the + year\, Chahrshanbeh Soori has\, since the Iranian revolution\, been marked + on the evening before the last Wednesday. The words Chahar Shanbeh mean W + ednesday and Suri means red. Bonfires are lit to \"keep the sun alive\" un + til early morning.The celebration usually starts in the evening\, with peo + ple making bonfires in the streets and jumping over them singing zardi-ye + man az to\, sorkhi-ye to az man. The literal translation is\, my sickly ye + llow paleness is yours\, your fiery red color is mine. This is a purificat + ion rite. Loosely translated\, this means you want the fire to take your p + aleness\, sickness\, and problems and in turn give you redness\, warmth\, + and energy. There is no religious significance attached to Chaharshanbeh S + oori and it serves as a cultural festival for Persian people: Persian Jews + \, Muslims\, Armenians\, Kurds\, and Zoroastrians\, as well as for Azeri p + eoples. Indeed this celebration\, in particular the significant role of fi + re\, is likely to hail from Zoroastrianism.\n\nAnother tradition of this d + ay is to make special ajeel\, or mixed nuts and berries. People wear disgu + ises and chadors and go door to door knocking on doors. Receiving of the A + jeel is customary\, as is receiving of a bucket of water.\n\nAncient Irani + ans celebrated the last 5 days of the year in their annual obligation feas + t of all souls\, Hamaspathmaedaya (Farvardigan or popularly Forodigan). Th + ey believed Faravahar\, the guardian angels for humans and also the spirit + s of dead would come back for reunion. There are the seven Amesha Spenta\, + that are represented as Haftseen or literally the seven S. These spirits + were entertained as honored guests in their old homes\, and were bidden a + formal ritual farewell at the dawn of the New Year. The festival also coin + cided with festivals celebrating the creation of fire and humans. In Sassa + nid period the festival was divided into two distinct pentads\, known as t + he lesser and the greater Pentad\, or Panji as it is called today. Gradual + ly the belief developed that the 'Lesser Panji' belonged to the souls of c + hildren and those who died without sin\, whereas 'Greater Panji' was truly + for all souls.\n\nAstrology\nMuch of the symbolism of this act links to a + strological connotations associated with sign of Pisces or Esfand\, or the + 12th House related to the subconscious mind\, hidden resources\, hidden p + roblems\, social responsibility. The human has to face his ultimate fears + and does so by jumping over the fire. That cleansing act is necessary befo + re the advent of the Spring at the Vernal Equinox. Wednesday is chosen bec + ause of its ancient association with being the fourth day of Mercury or Kh + erad\, and Mercury being the messenger of Gods.\n\nFal-Gûsh\nIranians bel + ieve that certain days are especially good for divination. During the Chah + arshanbe Suri\, divination\, especially by listening to the conversations + of the passers by and interpreting that which is heard (fālgūš) as a si + gn is quite common . Fortunetellers\, (fālgīr)\, who are mostly gypsies\ + , are still active in some parts of Iran.\n +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/IranHolidays_Persian.ics b/media/caldata/IranHolidays_Persian.ics new file mode 100644 index 00000000000..c08d085ac54 --- /dev/null +++ b/media/caldata/IranHolidays_Persian.ics @@ -0,0 +1,8351 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//ddaysoftware.com//NONSGML DDay.iCal 1.0//EN +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120321 +DTSTAMP:20120614T172315 +DTSTART;VALUE=DATE:20120320 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱ فروردین +UID:FARSIDATE13910101 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم شمسی +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:نوروز، از جشن‌های باستانی ایرانیان است. در زمانهای کهن، جشن نور + وز در نخستین روز فروردین (معمولاً مطابق با ٢۱ مارس) آغاز می‏شد، ولی مشخص ن + یست که چند روز طول می‏کشیده‏است. در بعضی از دربارهای سلطنتی جشن‏ یک ماه اد + امه داشته‌است. مطابق برخی از اسناد، جشن عمومی نوروز تا پنجمین روز فروردین + برپا می‏شد، و جشن خاص نوروز تا آخر ماه ادامه داشت. شاید بتوان گفت، در طی پ + نج روز اول فروردین جشن نوروز جنبه ملی و عمومی داشت، در حالیکه طی باقیمانده + ماه، هنگامی‏که پادشاهان مردم عادی را به دربار شاهنشاهی می‏پذیرفتند جنبه خ + صوصی و سلطنتی داشت . +DTEND;VALUE=DATE:20120321 +DTSTAMP:20120614T172315 +DTSTART;VALUE=DATE:20120320 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:آغاز نوروز - تعطیل +UID:SHAMSI13910101-227 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120322 +DTSTAMP:20120614T172315 +DTSTART;VALUE=DATE:20120321 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢ فروردین +UID:FARSIDATE13910102 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم شمسی +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:نوروز، از جشن‌های باستانی ایرانیان است. در زمانهای کهن، جشن نور + وز در نخستین روز فروردین (معمولاً مطابق با ٢۱ مارس) آغاز می‏شد، ولی مشخص ن + یست که چند روز طول می‏کشیده‏است. در بعضی از دربارهای سلطنتی جشن‏ یک ماه اد + امه داشته‌است. مطابق برخی از اسناد، جشن عمومی نوروز تا پنجمین روز فروردین + برپا می‏شد، و جشن خاص نوروز تا آخر ماه ادامه داشت. شاید بتوان گفت، در طی پ + نج روز اول فروردین جشن نوروز جنبه ملی و عمومی داشت، در حالیکه طی باقیمانده + ماه، هنگامی‏که پادشاهان مردم عادی را به دربار شاهنشاهی می‏پذیرفتند جنبه خ + صوصی و سلطنتی داشت +DTEND;VALUE=DATE:20120322 +DTSTAMP:20120614T172315 +DTSTART;VALUE=DATE:20120321 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:عید نوروز(تعطیل) +UID:SHAMSI13910102-228 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120322 +DTSTAMP:20120614T172315 +DTSTART;VALUE=DATE:20120321 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:هجوم ماموران به مدرسه فیضیه قم(۱٣۴٢ ه.ش) +UID:SHAMSI13910102-229 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120322 +DTSTAMP:20120614T172315 +DTSTART;VALUE=DATE:20120321 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:آغاز عملیات فتح المبین (۱٣۶۱ ه.ش) +UID:SHAMSI13910102-230 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120323 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120322 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣ فروردین +UID:FARSIDATE13910103 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم شمسی +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:نوروز، از جشن‌های باستانی ایرانیان است. در زمانهای کهن، جشن نور + وز در نخستین روز فروردین (معمولاً مطابق با ٢۱ مارس) آغاز می‏شد، ولی مشخص ن + یست که چند روز طول می‏کشیده‏است. در بعضی از دربارهای سلطنتی جشن‏ یک ماه اد + امه داشته‌است. مطابق برخی از اسناد، جشن عمومی نوروز تا پنجمین روز فروردین + برپا می‏شد، و جشن خاص نوروز تا آخر ماه ادامه داشت. شاید بتوان گفت، در طی پ + نج روز اول فروردین جشن نوروز جنبه ملی و عمومی داشت، در حالیکه طی باقیمانده + ماه، هنگامی‏که پادشاهان مردم عادی را به دربار شاهنشاهی می‏پذیرفتند جنبه خ + صوصی و سلطنتی داشت. +DTEND;VALUE=DATE:20120323 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120322 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:عید نوروز - تعطیل +UID:SHAMSI13910103-231 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:هر سال ٢٢ مارس (دوم فروردین ماه) روز جهانی آب خوانده می شود و ب + زرگداشت چنین روزی ابتکاری است از سوی کنفرانس محیط زیست و توسعه سازمان ملل + متحد که در سال ۱٩٩٢ در اجلاس ریودوژانیرو به تصویب رسید. مجمع عمومی سازمان + ملل متحد نیز در پنجاه و هشتمین جلسه خود در دسامبر ٢٠٠٣ موافقت کرد که در ده + ه ٢٠٠۵ تا ٢٠۱۵ ، به عنوان دهه بین المللی برای یک اقدام عملی در نظر گرفته ش + ود و با موضوع "آب برای زندگی" نام گذاری شود. این دهه از ٢٢ مارس ٢٠٠۵، آغاز + می شود. دهه آب برای زندگی با هدف جهانی "تمرکز بیشتر روی موضوع های مربوط ب + ه آب" آغاز می شود و تلاش برای استفاده از مشارکت زنان در فعالیت های توسعه م + رتبط با آب، همکاری در کلیه سطح برای دستیابی به هدف های مربوط به آب در اعلا + میه هزاره و اجرای برنامه ژوهانسبورگ (نشست جهانی توسعه پایدار) دارد . +DTEND;VALUE=DATE:20120323 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120322 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی آب +UID:MILADI20120322-406 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120324 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120323 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۴ فروردین +UID:FARSIDATE13910104 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم شمسی +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:نوروز، از جشن‌های باستانی ایرانیان است. در زمانهای کهن، جشن نور + وز در نخستین روز فروردین (معمولاً مطابق با ٢۱ مارس) آغاز می‏شد، ولی مشخص ن + یست که چند روز طول می‏کشیده‏است. در بعضی از دربارهای سلطنتی جشن‏ یک ماه اد + امه داشته‌است. مطابق برخی از اسناد، جشن عمومی نوروز تا پنجمین روز فروردین + برپا می‏شد، و جشن خاص نوروز تا آخر ماه ادامه داشت. شاید بتوان گفت، در طی پ + نج روز اول فروردین جشن نوروز جنبه ملی و عمومی داشت، در حالیکه طی باقیمانده + ماه، هنگامی‏که پادشاهان مردم عادی را به دربار شاهنشاهی می‏پذیرفتند جنبه خ + صوصی و سلطنتی داشت . +DTEND;VALUE=DATE:20120324 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120323 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:عید نوروز - تعطیل +UID:SHAMSI13910104-232 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:روز جهانی هواشناسی سازمان جهانی هواشناسی ، همه ساله ٢٣ مارس مصا + دف با سوم فروردین را بعنوان روز جهانی روز هواشناسی تعیین کرده است. سازمان + هواشناسی جهانی، سازمانی است متشکل از ۱٨٧ عضو و وابسته به سازمان ملل متحد ک + ه وظیفه تحقیق و بررسی تغییرات هوا و اقلیم زمین و علم هواشناسی و علوم وابست + ه به آن را عهده دار است. امسال موضوع روز جهانی هواشناسی بر آب و هوای قطبی + و توجه خاص به تبعات آن بر آب و هوای کل کره زمین محوریت دارد. +DTEND;VALUE=DATE:20120324 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120323 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی هواشناسی +UID:MILADI20120323-407 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120325 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120324 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۵ فروردین +UID:FARSIDATE13910105 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120326 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120325 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۶ فروردین +UID:FARSIDATE13910106 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120327 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120326 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٧ فروردین +UID:FARSIDATE13910107 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120328 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120327 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٨ فروردین +UID:FARSIDATE13910108 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120329 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120328 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٩ فروردین +UID:FARSIDATE13910109 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120330 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120329 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٠ فروردین +UID:FARSIDATE13910110 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۵ جمادی الاول - حضرت زینب کبری(س) – سال ۶ هجری قمری حضرت زینب(س + ) در سال ششم قمری، در حیات جدش حضرت محمد(ص)، در مدینه منوره دیده به جهان گ + شود . پدرش امیرمؤمنان علی بن ابی طالب(ع) و مادرش فاطمه زهرا(س) می باشند. ا + ین کودک سعادتمند، در خردسالی مادرش را از دست داد و در خانه خویش، به جای ما + در مهربان مورد احترام همگان قرار گرفت. اوج ایثارگری، فداکاری و کمالات روحی + وی در واقعه کربلا به منصه ظهور رسید. وی با سرپرستی اسیران و بازماندگان شه + یدان کربلا و تحمل اسارت کوفه و شام و خواندن خطبه های غرّا در مجلس عبیدالله + بن زیاد در کوفه و در مجلس یزید بن معاویه در شام ، قیام برادرش امام حسین(ع + ) را به کمال رسانید . +DTEND;VALUE=DATE:20120330 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120329 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت زینب و روز پرستار و بهورز +UID:GHAMARI14330505-373 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120331 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120330 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۱ فروردین +UID:FARSIDATE13910111 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120401 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120331 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٢ فروردین +UID:FARSIDATE13910112 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CATEGORIES:تعطیل - تقویم شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120401 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120331 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جمهوری اسلامی ایران - تعطیل +UID:SHAMSI13910112-233 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120402 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120401 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٣ فروردین +UID:FARSIDATE13910113 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CATEGORIES:تعطیل - تقویم شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120402 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120401 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز طبیعت - تعطیل +UID:SHAMSI13910113-234 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120403 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120402 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۴ فروردین +UID:FARSIDATE13910114 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120404 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120403 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۵ فروردین +UID:FARSIDATE13910115 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120405 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120404 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۶ فروردین +UID:FARSIDATE13910116 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120406 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120405 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٧ فروردین +UID:FARSIDATE13910117 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120407 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120406 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٨ فروردین +UID:FARSIDATE13910118 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱٣ جمادی الاول - شهادت حضرت فاطمه زهرا (س) بنا به روایتی - سال + یازدهم هجری قمری درباره تاریخ شهادت حضرت زهرا (س) اکثر مورخان و سیره نویسا + ن شیعه متفقند که این حادثه جان سوز در ماه جمادی به وقوع پیوست، ولیکن در ای + ن که کدام یک از دو ماه جمادی الاولی و جمادی الآخره بوده است، اتفاق نظر ندا + رند. زیرا برخی از آنان معتقدند که آن حضرت، پس از رحلت پدرش پیامبر(ص) تنها + هفتاد و پنج روز و برخی دیگر می گویند نود و پنج روز زنده بود. آن هایی که هف + تاد و پنج روز را برگزیده اند، شهادتش را در روز سیزدهم جمادی الاولی می دانن + د . +DTEND;VALUE=DATE:20120407 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120406 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت حضرت فاطمه زهرابه روایتی +UID:GHAMARI14330513-374 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120408 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120407 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٩ فروردین +UID:FARSIDATE13910119 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120408 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120407 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت آیت الله سید محمد باقر صدر توسط رژیم بعث عراق +UID:SHAMSI13910119-235 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:سازمان جهانی بهداشت در سال ۱٩۴٨اولین مجمع بهداشت جهانی را برگزا + ر کرد. این مجمع تصمیم گرفت روز ٧آوریل ( ۱٨فروردین) هر سال را به عنوان روز + جهانی سلامت تعیین کند. این تصمیم از سال ۱٩۵٠به مرحله عمل درآمد. هدف از تعی + ین یک روز به عنوان روز جهانی سلامت ، آگاهی رسانی در مورد مضمون معین بهداشت + ی برای روشن شدن اولویت های مورد توجه سازمان جهانی بهداشت است. همه ساله در + روز جهانی سلامت شعاری تعیین می شود.امسال با شعار جهانی با آینده ای مطمئن ب + ا سرمایه گذاری در سلامت و با هدف حساس سازی مردم ، سیاستگذاران و مسوولان هف + ته سلامت ۱٨تا ٢۴فروردین ماه در کشور برگزار می شود . +DTEND;VALUE=DATE:20120408 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120407 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز سلامتی(روز جهانی بهداشت) +UID:MILADI20120407-408 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120409 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120408 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٠ فروردین +UID:FARSIDATE13910120 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120409 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120408 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز ملی فن آوری هسته ای +UID:SHAMSI13910120-236 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120410 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120409 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۱ فروردین +UID:FARSIDATE13910121 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120410 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120409 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت امیر سپهبد علی صیاد شیرازی +UID:SHAMSI13910121-237 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:شورای عالی انقلاب فرهنگی در جلسه ۶۶٨ مورخ ٢۶ مرداد ماه ٨٩ بنا ب + ه پیشنهاد شورای فرهنگ عمومی در ۱٣ مرداد ٨٩، تغییرات اعمال شده در تقویم رسم + ی كشور برای سال ۱٣٩٠ هجری شمسی را تصویب كرد که بر این اساس روز ٢۱ فروردین + به نام روز «هنر انقلاب اسلامی» نامگذاری شد. \n\n +DTEND;VALUE=DATE:20120410 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120409 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز هنر انقلاب اسلامی +UID:SHAMSI13910121-431 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120411 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120410 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٢ فروردین +UID:FARSIDATE13910122 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120412 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120411 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٣ فروردین +UID:FARSIDATE13910123 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120413 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120412 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۴ فروردین +UID:FARSIDATE13910124 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120414 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120413 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۵ فروردین +UID:FARSIDATE13910125 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120414 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120413 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت عطار نیشابوری +UID:SHAMSI13910125-238 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120415 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120414 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۶ فروردین +UID:FARSIDATE13910126 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120416 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120415 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٧ فروردین +UID:FARSIDATE13910127 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120417 +DTSTAMP:20120614T172316 +DTSTART;VALUE=DATE:20120416 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٨ فروردین +UID:FARSIDATE13910128 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120418 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120417 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٩ فروردین +UID:FARSIDATE13910129 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120418 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120417 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز ارتش جمهوری اسلامی و نیروی زمینی +UID:SHAMSI13910129-239 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120419 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120418 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣٠ فروردین +UID:FARSIDATE13910130 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120420 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120419 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣۱ فروردین +UID:FARSIDATE13910131 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120421 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120420 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱ اردیبهشت +UID:FARSIDATE13910201 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:سعدی تخلص و شهرت «مشرف الدین» ، مشهور به «شیخ سعدی» یا «شیخ شیر + از» است.سعدی‌ از بزرگ‌ترین‌ ستارگان‌ و برجستگان‌ درجه‌ اول‌ آسمان‌ ادب‌ ای + ران‌ زمین‌ است‌ که‌ با تسلط وصف‌ ناپذیر خود بزرگترین‌ شاهکارهای‌ ادبی‌ ایر + ان‌ را در سرتاسر تاریخ‌ ادبی‌ این‌ کشور خلق‌ نموده‌ است‌ سال تولد او را از + ۵٧۱ تا ۶٠۶ هجری قمری احتمال داده اند و تاریخ درگذشتش را هم سالهای ۶٩٠ تا + ۶٩۵ نوشته اند. سعدی در شیراز پای به هستی نهاد و هنوز کودکی بیش نبود که پدر + ش در گذشت. آثار او عبارت است از: ۱- بوستان یا سعدی نامه، که در واقع اولین + اثر اوست و در سال ۶۵۵ تمام شده است. ٢- گلستان. ٣- قصاید عربی. ۴- قصاید فار + سی. ۵- مراثی. ۶- غزلیات. ٧- ملمعات و مثلثات و ترجیعات. ٨- مجالس پنجگانه. ٩ + - نصیحة الملوک . ۱٠- صاحبیه. ۱۱- خبیثات. مجموعه ی این آثار "کلیات سعدی" نا + میده می شود. که تحت همین عنوان بارها بارها چاپ شده است. آرامگاه سعدی در شی + راز می باشد. +DTEND;VALUE=DATE:20120421 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120420 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت سعدی +UID:SHAMSI13910201-240 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120422 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120421 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢ اردیبهشت +UID:FARSIDATE13910202 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:انقلاب اسلامی ایران بیش از هر چیز مرهون فرهنگ اسلامی و تعالیم ح + یات بخش اسلام و تداوم و گسترش چنین انقلابی در گرو بقا و رشد فرهنگ اسلامی د + ر نسلهای موجود و آینده است. این وظیفه بیش از همه بر عهده نهادهای آموزشی و + پرورشی، بخصوص دانشگاههاست؛ اما بافت دانشگاهی ایران در سالهای پیش از انقلاب + اسلامی و همچنین نظام آموزشی و محتوای دروس و کتابها بویژه در علوم انسانی آ + ن دوره، متناسب با این وظیفه نبود و چه بسا دانشگاههای ما به وسیله خارجیان ه + دایت می شد و شکل و محتوای آنها تابع اراده بیگانگان و خط مشی آنها در جهت حف + ظ و تقویت سلطه سیاسی اقتصادی امریکا و سایر دول استعمارگر بوده است؛ به همین + علت پس از پیروزی انقلاب، دانشجویان و استادان متعهد دانشگاهها تصمیم گرفتند + انقلابی فرهنگی به وجود بیاورند تا در سایه آن بتوانند ضمانتی برای بقا و تد + اوم انقلاب اسلامی و همچنین عامل نیرومندی برای صدور و گسترش فرهنگ انقلاب ای + جاد کنند. +DTEND;VALUE=DATE:20120422 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120421 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:سالروز اعلام انقلاب فرهنگی +UID:SHAMSI13910202-241 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در نخستین روزهای پیروزی انقلاب اسلامی در سال ۱٣۵٧ بنا به فرمان + بنیانگذار جمهوری اسلامی ایران حضرت امام خمینی (ره) به جوانان غیور و انقلاب + ی ایران اسلامی، عده ای از دلسوختگان راستین و پیروان صدیق ولایت فقیه گردهم + جمع شدند و نهاد مقدس سپاه پاسداران انقلاب اسلامی را پی ریزی کردند. شاید در + آن روزهای نخست که هدف سپاه را پاسداری از انقلاب اسلامی و دستاوردهای آن مط + رح می کردند، تصور نمی رفت که چه مسئولیت سنگین و رسالت خطیری به عهده این تش + کیلات تازه تأسیس خواهد بود. حضرت امام خمینی (ره) در دوم اردیبهشت سال ۱٣۵٨ + طی فرمانی به شورای انقلاب اسلامی رسماً تأسیس این نهاد مقدس را اعلام کردند + و شورای انقلاب با تأسیس شورای فرماندهی سپاه پاسداران انقلاب اسلامی گام اسا + سی را در جهت سازماندهی این نهاد برداشت. سپاه نهادی نظامی در جهت اهداف و آر + مانهای والای انقلاب اسلامی است و نامگذاری سالروز ولادت سالار شهیدان به نام + روز پاسدار از این جهت است که سپاه آرمانی بزرگ و مقدس دارد که حفاظت و نگهب + انی از نظام و حکومتی است که براساس اسلام ناب محمدی (ص) برپا شده. +DTEND;VALUE=DATE:20120422 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120421 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:تاسیس سپاه پاسداران انقلاب اسلامی +UID:SHAMSI13910202-242 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120422 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120421 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز زمین پاک +UID:SHAMSI13910202-243 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120423 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120422 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣ اردیبهشت +UID:FARSIDATE13910203 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:شیخ ‌بهایى، حکیم و فقیه و عارف و مـنجم و ریاضیدان و شاعر و ادیب + و مورخ بزرگ، درسال ٩۵٣ قمری، در بعلبک از توابع جبل عامل دیده به جهان گشود + . ناحیه "جبل عامل" همواره یکی از مراکز شیعه در مغرب آسیا بوده است و پیشوای + ان و دانشمندان شیعه که از این ناحیه برخاسته اند، بسیارند. شیخ بهائی در کود + کی به همراه پدرش به ایران آمد و پس از اتمام تحصیلات، شیخ الاسلام اصفهان شد + . او پس از فراگیری مقدمات علوم نزد پدر بزرگوار خود وارد حوزه های مختلف علو + م زمان خویش شد و در بسیاری از علوم روزگارش متبحر گشت به طوری که گفته اند ا + و از هر علمی به میزان کفایت و مهارت گلی چیده بود. فقه، فلسفه، ریاضیات، اصو + ل، هندسه، نجوم، طب، ادبیات و...همگی از علومی بودند که شیخ بزرگوار شم دانش + پژوهی خود را در آنها آزموده بود . آن عالم ربانی از خود آثار گرانبهایی را ن + یز به جای نهاده است که برخی از مورخین شمار آن را بیش از دویست کتاب دانسته + اند . +DTEND;VALUE=DATE:20120423 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120422 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت شیخ بهایی +UID:SHAMSI13910203-244 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120424 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120423 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۴ اردیبهشت +UID:FARSIDATE13910204 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120425 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120424 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۵ اردیبهشت +UID:FARSIDATE13910205 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120425 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120424 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شکست حمله نظامی آمریکا به ایران در طبس +UID:SHAMSI13910205-245 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120426 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120425 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۶ اردیبهشت +UID:FARSIDATE13910206 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120427 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120426 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٧ اردیبهشت +UID:FARSIDATE13910207 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم قمری +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٣ جمادی الثانی - شهادت حضرت فاطمه زهرا(س) - سال یازدهم هجری قمر + ی حضرت فاطمه زهرا (س) یکی از بانوان قدسی عالم بشریت و مهتر زنان عالم است. + وی در هنگام رحلت پدرش پیامبر خدا(ص)، فرزندی حامله بود که رسول خدا(ص) او را + "محسن" نام نهاده بود. ولیکن پس از رحلت پیامبر(ص) ناملایمات فراوانی از غاص + بان خلافت اسلامی متحمل شد و بر اثر آن، جنین او سِقط و پیش از تولد، در رحم + مادرش شهید گردید. حضرت فاطمه(س) از آن پس بیمار شد و روز به روز حالش سخت تر + گردید، تا این که در جمادی الاولی سال یازدهم قمری دیده از جهان فروبست و رو + ح ملکوتی اش به روح پاک و قدسی پدرش پیوست . +DTEND;VALUE=DATE:20120427 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120426 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت حضرت فاطمه زهرا تعطیل +UID:GHAMARI14330603-375 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120428 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120427 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٨ اردیبهشت +UID:FARSIDATE13910208 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120429 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120428 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٩ اردیبهشت +UID:FARSIDATE13910209 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در تقویم رسمى کشور ما، روز نهم اردیبهشت به نام «روز شوراها» نام + گذاری شده است. شورا اصلی عقلى است که آموزه هاى دین اسلام در کتاب و سنت نیز + بر آن صحه گذاشته است. انقلاب اسلامى ایران نیز که بر مبناى آموزه هاى اسلام + ى در چارچوب هدف سلبى خود با استبداد و خودرأیى فرمانروایان به مبارزه برخاست + و تحقق مشارکت عمومى مردم را در تعیین سرنوشتشان به عنوان هدفی ایجابى برگزی + د؛. روز نهم اردیبهشت ۱٣٧٨ شوراهاى شهر و روستا به طور رسمى دوره چهارساله مس + ئولیت خویش را براى تحقق حاکمیت مردم که عملى شدن آن در گرو فعالیت این نهاد + است آغاز کرد. اگر بهترین قوانین براى فعالیت شوراها تصویب شود و بهترین افرا + د واجد شرایط و دارای ویژگی شورایى به عضویت این نهادها درآیند و ارتباط شورا + ها با سایر نهادها در بهترین سطح ممکن برقرار گردد، اما مردم از اعضاى شوراها + که به عنوان نمایندگان آنها قصد تحقق اراده و حاکمیت آنها را دارند در این م + سیر جدى گرفته نشوند، بدون تردید شوراها در رسیدن به اهداف خود ناتوان خواهند + بود. +DTEND;VALUE=DATE:20120429 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120428 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز شوراها +UID:SHAMSI13910209-246 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120430 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120429 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٠ اردیبهشت +UID:FARSIDATE13910210 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:خلیج فارس و نام پرتوافکن آن میراث گرانسنگ ایرانیان باستان است. + میراثی که ایرانیان آزاد اندیش روزگار کهن برای فرزندان خود به یادگار گذارده + ‌اند تا مایه فخر و مباهات نسلهای بعدی باشد.از آن هنگام که تاریخ بشر مکتوب + شد و جغرافی بگونه‌ای علمی درمقیاس با سطح و حد تحقیق و مطالعه در دوران باست + ان مورد بررسی قرار گرفت، نام خلیج فارس جزء چهار دریای شناخته شده بوده که ب + ه اعتقاد یونانیان کهن همگی از یک اقیانوس عظیم به وسعتی معادل همه آبهای جها + ن سرچشمه می‌گرفتند و بسیار پیش از آنکه داریوش هخامنشی امپراتور ایران در کت + یبه‌های خود از دریای پارس سخن براند، حتی غیرایرانیان هم این پهنه آبی را با + نام پارس می‌شناختند.از دوره جمال عبدالناصر رئیس جمهور پیشین مصر نیز، به ت + شویق او و اوج گیری تعصب عربی، رسماً کشورهای عربی نام تاریخی خلیج فارس را د + ر رسانه ها و کتب رسمی عربی تغییر دادند.کشورهای حوزه خلیج فارس و جهان باید + نیک دریابند که پاک نمودن حقیقت از تاریخ امری ناممکن است که جهان سالها شاهد + اینگونه تلاش های ناممکن صهیونیسم جهانی در محو فلسطین بوده و هست. و اکنون + و این بار نیز بدانند که رویای تازه و پریشان آنان هیچگاه تعبیر نخواهد شد چر + ا که هر مرد و زن ایرانی مقتدرانه از آبهای نیلگون و نام خلیج همیشه فارس حرا + ست خواهد نمود. +DTEND;VALUE=DATE:20120430 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120429 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز ملی خلیج فارس +UID:SHAMSI13910210-247 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در حالی که اشغال خرمشهر توسط عراق به عنوان آخرین و مهم ترین برگ + برنده این کشور برای وادار ساختن ایران به شرکت در هر گونه مذاکرات صلح تلقی + می شد، آزاد سازی این شهر می توانست سمبل تحمیل اراده سیاسی جمهوری اسلامی ب + ر متجاوز و اثبات برتری نظامی اش باشد. سرانجام عملیات بیت المقدس در ٣٠ دقیق + ه بامداد روز ۱٠ اردیبهشت ۱٣۶۱ با قرائت رمز عملیات بسم الله الرحمن الرحیم . + بسم الله القاسم الجبارین، یا علی ابن ابی طالب از سوی فرماندهی آغاز شد. طی + عملیات بیت المقدس ۵٠٣٨ کیلومتر مربع از اراضی اشغال شده از جمله شهرهای خرم + شهر و هویزه و نیز پادگان حمید و جاده اهواز – خرمشهر آزاد شدند. علاوه بر ای + ن شهرهای اهواز، حمیدیه و سوسنگرد از تیررس توپخانه دشمن خارج گردیدند. هم چن + ین ۱٨٠ کیلومتر از خط مرزی تامین شد. فتح خرمشهر موجب انفعال ارتش عراق شد؛ ب + ه گونه ای که نظامیان عراقی تا مدت زیادی نتوانستند از لاک دفاعی خارج شوند. +DTEND;VALUE=DATE:20120430 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120429 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:آغاز عملیات بیت المقدس +UID:SHAMSI13910210-248 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120501 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120430 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۱ اردیبهشت +UID:FARSIDATE13910211 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120502 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120501 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٢ اردیبهشت +UID:FARSIDATE13910212 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:استاد شهید آیت الله مطهری در ۱٣ بهمن ۱٢٩٨ هجری شمسی در فریمان و + اقع در ٧۵ کیلومتری شهر مقدس مشهد در یک خانواده اصیل روحانی چشم به جهان می + گشاید. پس از طی دوران طفولیت به مکتب خانه رفته و به فراگیری دروس ابتدایی م + ی پردازد. در سن دوازده سالگی به حوزه علمیه مشهد عزیمت نموده و به تحصیل مقد + مات علوم اسلامی اشتغال می ورزد. در سال ۱٣۱۶ علیرغم مبارزه شدید رضاخان با ر + وحانیت و علیرغم مخالفت دوستان و نزدیکان، برای تکمیل تحصیلات خود عازم حوزه + علمیه قم می شود. در دوره اقامت پانزده ساله خود در قم از محضر مرحوم آیت الل + ه العظمی بروجردی (در فقه و اصول) و حضرت امام خمینی ( به مدت ۱٢ سال در فلسف + ه ملاصدرا و عرفان و اخلاق و اصول) و مرحوم علامه سید محمد حسین طباطبائی (در + فلسفه : الهیات شفای بوعلی و دروس دیگر) بهره می گیرد. مهمترین خدمات استاد + مطهری در طول حیات پر برکتش ارائه ایدئولوژی اصیل اسلامی از طریق درس و سخنرا + نی و تألیف کتاب است. استاد مطهری در ساعت بیست و دو و بیست دقیقه سه شنبه یا + زدهم اردیبهشت ماه سال ۱٣۵٨ در تاریکی شب در حالی که از یکی از جلسات فکری سی + اسی بیرون آمده بود یا گلوله گروه نادان و جنایتکار فرقان که به مغزش اصابت ن + مود به شهادت می رسد. +DTEND;VALUE=DATE:20120502 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120501 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت استاد مرتضی مطهری +UID:SHAMSI13910212-249 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120502 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120501 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز معلم +UID:SHAMSI13910212-250 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:در اول ماه مه ۱٨٨۶ میلادی،پلیس شیکاگو با حمله به تظاهرات گسترده + کارگران، که برای هشت ساعت کار در روز، وحق تشکیل اتحادیه های کارگری برپا ش + ده بود، آنان را به خاک و خون کشیدند. بعد از این واقعه دادگاه چندتن از رهبر + ان کارگران را محاکمه و به مرگ محکوم کرد. یکی از رهبران کارگران اعتصابی، پس + از اعلام رأی، در برابردادگاه چنین گفت: " کارگران اینک دریافته اند که می ت + وانند با اتحاد، و مبارزه جمعی بر مشکلات خود فائق آیند. آنان می دانند که چه + قدرت عظیمی در اتحادشان نهفته است، به همین علت است که کارفرمایان با تمام ت + وان می کوشند تا اتحاد کارگران را بشکنند، و میتینگ کارگران را به خاک و خونب + کشانند. ما کارگران گردهم آمدیم تا اندکی از حقوق خود را باز پس بگیریم؛ اما + اکنون از دادگاه و زندان سر در آورده ایم. امروز اگر صدای حق طلبانه ما را با + گلوله خفه می کنید، مطمئن باشید که این صداها از این پس خاموش شدنی نیست، بل + که هر روز طنین آن رساتر خواهد شد." رهبران کارگران شیکاگو به دست مستکبران ج + ان باختند؛ در سال ۱٨٨٩ میلادی، کنگره بین المللی کارگران در پاریس، به پیشنه + اد نماینده کارگران امریکا، روز اول ماه مه را به عنوان روز جهانی کارگر برگز + ید . +DTEND;VALUE=DATE:20120502 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120501 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی کار و کارگر +UID:MILADI20120501-409 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120503 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120502 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٣ اردیبهشت +UID:FARSIDATE13910213 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120504 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120503 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۴ اردیبهشت +UID:FARSIDATE13910214 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120505 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120504 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۵ اردیبهشت +UID:FARSIDATE13910215 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:محمد بن علی بن بابویه قمی معروف به " ابن بابویه" ، " محمد بن با + بویه" و " شیخ صدوق" نامی ترین دانشمند گرانمایه و بزرگوار و فقیه و محدث عال + یقدر شیعه درنیمه دوم سده چهارم هجری است. وی در سال ٣٠۶ هجری قمری در شهر مق + دس قم به دنیا آمد. پدرش، ابو الحسن علی بن حسین بن موسی قمی، نیز از فقهای ش + یعه بود که با حسن بن روح، نائب سوم امام زمان، نیز ملاقات داشت. او صاحب سه + فرزند شد که محمد (شیخ صدوق) بزرگ ترین آنها بود. شیخ صدوق (ابن بابویه) نزد + اساتید زیادی از جمله پدرش شاگردی کرد و ادب و فقه را فرا گرفت. شیخ صدوق برا + ی ملاقات با ابو عبدالله نعمت رقیب به بلخ رفت و کتاب " من لا یحضره الفقیه " + را به نام او نوشت. شیخ در اواخر عمر در شهر ری زندگی می کرد که تحت سیطره آ + ل بویه بود و رکن الدوله و وزیر او، صاحب ابن عباد، او را بسیار گرامی می‌داش + تند. ابن بابویه به سال ٣٨۱ هجری قمری در سن هفتاد و شش سالگى در ری در گذشت + و در همان جا در نزدیکى حضرت عبدالعظیم مدفون گشت. +DTEND;VALUE=DATE:20120505 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120504 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت شیخ صدوق +UID:SHAMSI13910215-251 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120506 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120505 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۶ اردیبهشت +UID:FARSIDATE13910216 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:پنجم ماه می مصادف با ۱۵ اردیبهشت، روز جهانی ماما نامگذاری شده ا + ست. برای اولین بار در سال ۱٩٨٠ این روز به عنوان روز جهانی ماما پیشنهاد و س + پس از سال ۱٩٩٢ به صورت رسمی اعلام شد. هدف از بزرگداشت روزجهانی ماما افزایش + آگاهی و تبادل اطلاعات مابین ایشان در راستای سلامتی مادر و نوزاد است. +DTEND;VALUE=DATE:20120506 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120505 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی ماما +UID:MILADI20120505-410 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120507 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120506 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٧ اردیبهشت +UID:FARSIDATE13910217 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120508 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120507 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٨ اردیبهشت +UID:FARSIDATE13910218 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120509 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120508 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٩ اردیبهشت +UID:FARSIDATE13910219 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:مشهورترین دانشمند فقیه و محدث نامی شیعه در نیمه اول سده چهارم ه + جری ، ثقة الاسلام محمد بن یعقوب بن اسحاق کلینی رازی معروف به ((کلینی )) یا + ((شیخ کلینی)) است. کلینی اصلا ایرانی و از روستای (( کلین )) بر وزن حسین و + اقع در ٣٨ کیلومتری شهر ری و ناحیه جنوب غربی جاده قم به تهران نزدیک حسن آبا + د کنونی است. به همین جهت او را به لقب (( رازی )) منسوب به (( ری )) هم میخو + انند. \n\nیاقوت حموی جغرافی دان نامی در گذشته سال ۶٢۶ ( هجری ) می نویسد : + (( استخری ( زنده در سال ٣۴٠ هجری )) گفته است که ری از اصفهان بزرگتر است ، + و در مشرق بعد از بغداد شهری آبادتر از آن نیست ، هرچند نیشابور از حیث وسعت + بزرگتر از آنست . ری در طول و عرض یک فرسخ و نیم است ، و دارای روستاهایی اس + ت که هرکدام از شهری بزرگتر میباشد. \n\nباری ، ری و به خصوص روستاهای آن از + روزگاران نخستین جزو مراکز شیعه نشین بوده است ، هرچند بیشتر مردم ری را سنی + ان حنفی و شافعی تشکیل می داده اند. \n\nآرامگاه پدر کلینی یعنی یعقوب بن اسح + اق که از بزرگان شیعیان آن روز بوده هم اکنون در قریه (( کلین )) است ، و زیا + رتگاه مردم آن سامان میباشد. \n\nعلان رازی دائی کلینی و جمعی دیگر از فقها و + محدثین شیعه همچون محمد بن محمد بن عصام شاگرد کلینی هم از آن قریه بوده اند + . +DTEND;VALUE=DATE:20120509 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120508 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت شیخ كلينی +UID:SHAMSI13910219-432 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:عنوان سازمان بین المللی با هدف تخفیف آلام انسانی و حفظ و پیشرفت + بهداشت عمومی، بر طبق موافقتنامه ژنو در سال ۱٨۶۴ میلادی و خاصه درنتیجه مسا + عی شخصی به نام ژن هنری دونان (Jean Henry Dunant ، ۱٩۱٠ ـ ۱٨٢٨) سوئیسی، پس + از تشکیل صلیب سرخ نامیده شد. در سال ۱٨۶٢ دونان کتاب "خاطره ای از سولفرینو + Solferino " را شرح داد و خواستار تشکیل جمعیتهای امدادی داوطلب برای تسکین آ + لام این گونه آسیب دیدگان از جنگ شد. +DTEND;VALUE=DATE:20120509 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120508 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی صلیب سرخ و هلال احمر +UID:MILADI20120508-411 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120510 +DTSTAMP:20120614T172317 +DTSTART;VALUE=DATE:20120509 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٠ اردیبهشت +UID:FARSIDATE13910220 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120511 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120510 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۱ اردیبهشت +UID:FARSIDATE13910221 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120512 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120511 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٢ اردیبهشت +UID:FARSIDATE13910222 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120513 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120512 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٣ اردیبهشت +UID:FARSIDATE13910223 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120514 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120513 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۴ اردیبهشت +UID:FARSIDATE13910224 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:حضرت آیت الله حاج میرزا محمد حسن حسینی شیرازی از مراجع عالیقدر + شیعه می باشد. وی به سال ۱٢۴٨ هجری قمری از شهر خویش شیراز به اصفهان رفت و ن + زد علمای آن شهر به تحصیل علوم عقلیه و نقلیه پرداخت و در سال ۱٢۵٩ هجری قمری + به عتبات عالیات رفت و نزد شیخ مرتضی انصاری به یادگیری پرداخت. در سال ۱٢٩۱ + هجری قمری در سامرا اقامت گزید و در آن شهر به تدریس و تعلیم مشغول شد و در + سال ۱٣۱٢ هجری قمری به رحمت پرودگار نایل و در نجف اشرف به خاک سپرده شد. فتو + ای تاریخی وی در تحریم تنباکو، فاجعه ای را که به سال ۱٣٠٩ هجری قمری به دست + ناصرالدین شاه قاجار با واگذاری امتیاز دخانیات ایران به مدت پنجاه سال به ان + گلیسی ها در حال شکل گرفتن بود، در نطفه نابود کرد. ناصرالدین شاه سه سفر به + اروپا کرد در سومین سفرش – در تاریخ ۱٢ شعبان ۱٣٠۶ هجری قمری مطابق با ۱٨٨٩ م + یلادی از راه روسیه به انگلستان رفت. در این سفر که به ترغیب صدراعظم امین ال + سطان بود، شاه در اثر ولخرجی های زیاد، پول هایش تمام شد. قرار می شود برای ر + فع این مشکل امتیازی را در زمینه ی کشت، توزیع و فروش توتون و تنباکو به یک ن + فر انگلیسی به نام «ماژور تالبوت» واگذار، و در مقابل ٢ هزار لیره دریافت کند + . که این عمل با مخالفت شدید علما و میرزای شیرازی صورت گرفت و مردم نیز از آ + ن حمایت کردند. +DTEND;VALUE=DATE:20120514 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120513 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:لغو امتیاز تنباکو به فتوای آیت الله میرزا حسن شیرازی +UID:SHAMSI13910224-252 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٢٠ جمادی الثانی - میلاد فرخنده حضرت فاطمه زهرا(س) - سال پنجم بع + ثت حضرت فاطمه زهرا (س) در بیستم جمادی الآخر، سال پنجم بعثت، هشت سال پیش از + هجرت پیامبر(ص)، دیده به جهان گشود و با انوار وجودی اش جهان را روشن و منور + گردانید. ایشان ، آخرین فرزند پیامبر اکرم (ص) از همسرش حضرت خدیجه (س) ، و + همسر امیرمؤمنان بود ، که یکی از بانوان قدسی عالم بشریت و مهتر زنان عالم اس + ت . +DTEND;VALUE=DATE:20120514 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120513 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت فاطمه زهرا و روز زن +UID:GHAMARI14330620-376 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120515 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120514 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۵ اردیبهشت +UID:FARSIDATE13910225 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:٢۵ اردیبهشت ماه روز بزرگداشت حکیم ابوالقاسم فردوسی، بزرگترین حم + اسه سرای ایران و یکی از حماسه سرایان بزرگ جهان است. وی در سال ٣۱٩ یا ٣٢٠ ش + مسی برابر با سال ٣٢٩ قمری در طوس متولد شد. شهرت جهانی فردوسی، به خاطر کتاب + شاهنامه است که وی سرودن آن را از دوران جوانی آغاز کرد، تا پایان عمر، باره + ا آن را بررسی و ویرایش کرد و بر غنای آن افزود. شاهنامه، گنجینه میراث هزار + ساله ملت و کشور ایران و دایره المعارف فرهنگ و تاریخ ایرانیان است. آن گونه + که فردوسی می گوید، سرودن شاهنامه، سی سال طول کشید. این اثر جاویدان فردوسی + که در شمار بهترین آثار حماسی عالم است، در حدود شصت هزار بیت دارد و تاکنون + به زبان های مختلف دنیا ترجمه شده است. فردوسی در حفظ امانت هنگام نقل مطالب، + به کار بردن نهایت مهارت در وصف مناظر طبیعی و میدان های جنگ و قهرمانان منظ + ومه خود و نیز ذکر حکم و مواعظ دلپذیر، کمال توانایی را نشان داده است. فردوس + ی در بیان افکار و نقل معانی و رعایت سادگی زبان، صراحت و روشنی سخن، انسجام، + استحکام و متانت کلام در درجه ای از قدرت است که کلامش همواره در میان استاد + ان، نمونه اعلای فصاحت و بلاغت شمرده شده و به منزله سخن سهل و ممتنع تلقی گر + دیده است. +DTEND;VALUE=DATE:20120515 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120514 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت فردوسی +UID:SHAMSI13910225-253 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120516 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120515 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۶ اردیبهشت +UID:FARSIDATE13910226 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:مجمع جهانی سازمان ملل بر اساس قطعنامه شماره ۴٧/٢٣٧ که در تاریخ + ٢٠ سپتامبر ۱٩٩٣ به تصویب رسیده است، پانزدهم ماه می را که مصادف با ٢۵ اردیب + هشت میباشد بنام روز جهانی خانواده اعلام کرده است. همه ساله چنین روزی به عن + وان روز جهانی خانواده در کشورهای مختلف گرامی داشته می شود. هدف از گرامیداش + ت این روز اهمیت جوامع جهانی به خانواده بعنوان اصلی ترین رکن جامعه و برطرف + نمودن مواردی است که در دنیای امروز این کانون گرم زندگی تهدید می کند. علاوه + بر آن روز جهانی خانواده فرصت مناسبی است برای ارتقا سطح آگاهی عمومی در مور + د مسائل مربوط به خانواده و بسط آن در جوامع مختلف. در ایران اسلامی نیز همچو + ن دیگر کشورهای جهان،دولت و مردم با گرامیداشت این روز حمایت خاص خود را از ک + انون گرم خانواده اعلام می دارند. اهمیت خاص دین مبین اسلام به خانه و خانواد + ه و نگاه جدید دولتمردان به مشکلات و مسائل مربوط به خانواده راهکارهای مفیدی + را در این زمینه بدنبال داشته است. دانش‌افزایی خانواده‌ها در حوزه‌های فرهن + گی و اجتماعی از جمله اقداماتی است که در سال های اخیر در این زمینه صورت گرف + ته است. +DTEND;VALUE=DATE:20120516 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120515 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی خانواده +UID:MILADI20120515-412 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120517 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120516 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٧ اردیبهشت +UID:FARSIDATE13910227 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:امروز ارتباطات‌ به‌ ویژه‌ از جنس‌ الکترونیکی‌ آن‌ به‌ بخش‌ لاین + فکی‌ از زندگی‌ روزمره‌ ما در حوزه‌های‌ مختلف‌ تبدیل‌ شده‌ است‌ که‌ بخش‌ قا + بل‌ توجهی‌ از مردم‌ جامعه‌ و خصوصا نخبگان‌ کشور بدون‌ استفاده‌ از آن‌ سپری + ‌ کردن‌ روزشان‌ سخت‌ و غیرممکن‌ شده‌ است‌. این‌ که‌ مردم‌ بتوانند هر روز ص + بح‌ از اهم‌ اخبار دنیا که‌ با نگاه‌های‌ متفاوت‌ از سراسر جهان‌ منتشر می‌گر + دد با کمترین‌ هزینه‌ و صرف‌ وقت‌ آگاه‌ شوند و نقد هر کدام‌ را نیز مشاهده‌ + کنند و خود نیز بتوانند نقدی‌ بر آن‌ چه‌ فکر می‌کنند وجود دارد داشته‌ باشند + و آن‌ را به‌ راحتی‌ و با کمترین‌ هزینه‌ به‌ گوش‌ جهانیان‌ برسانند مدیون‌ + وجود ارتباطات‌ خصوصا از نوع‌ الکترونیکی‌ آن‌ است‌. ارتباطات‌ قادر است‌ مشا + رکت‌ بیشتر آحاد جامعه‌ را در ساختن‌ کشور و کمک‌ به‌ دولت‌ها در برطرف‌ کردن + ‌ عیوب‌ و یا اتخاذ بهترین‌ تصمیم‌ها ایجاد کند و می‌تواند خرد جمعی‌ و مشارک + ت‌ گروهی‌ را به‌ ارمغان‌ بیاورد. کما این‌ که‌ در بسیاری‌ از حکومت‌های‌ مبت + نی‌ بر مردم‌ چنین‌ چیزی‌ محقق‌ شده‌ است‌ و از مواهب‌ آن‌ همه‌ برخوردار گرد + یده‌اند. به خاطر نقش عمده و مهمی که ارتباطات خصوصا از نوع الکترونیکی آن در + عصر حاضر در زندگی مردم ایفا میکند روز ٢٧ اردیبهشت را به این امر اختصاص دا + ده اند. +DTEND;VALUE=DATE:20120517 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120516 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز ارتباطات و روابط عمومی +UID:SHAMSI13910227-254 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120518 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120517 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٨ اردیبهشت +UID:FARSIDATE13910228 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:ابوالفتح عمر ابن ابراهیم خیام یا خیامی نیشابوری مشهور به حکیم ع + مر خیام، فیلسوف، ریاضی دان، ستاره شناس و شاعر قرن پنجم هجری قمری/ قرن دواز + دهم میلادی است که در شهر نیشابور به دنیا آمد. شهرت او گرچه بیشتر به شاعری + است اما در واقع خیام فیلسوف و ریاضی دانی بود که به آثار ابوعلی سینا پرداخت + و یکی از خطبه های معروف او را در باب یکتایی خداوند به فارسی ترجمه کرد. او + لین اشاره ای که به شعر خیام شده، صدسال پس از مرگ اوست. خیام منجم بود و تقو + یم امروز ایرانی، حاصل محاسباتی است که او و عده ای از دانشمندانی دیگر، در ز + مان جلال الدین ملک شاه سلجوقی انجام دادند و به نام وی تقویم جلالی خوانده م + ی شود شعر خیام، در قالب رباعی، شعری کوتاه، ساده و بدون هنرنمایی های فضل فر + وشانه و در عین حال حاوی معانی عمیق فلسفی و حاصل اندیشه آگاهانه متفکری بزرگ + در مقابل اسرار عظیم آفرینش است. در دنیای ادب و هنر بیرون از مرزها، خاصه د + ر جهان انگلیسی زبان، خیام معروف ترین شاعر ایرانی است که شهرتش از محافل علم + ی و ادبی بسیار فراتر رفته است. این شهرت مرهون ترجمه رباعیات او به وسیله اد + وارد فیتز جرالد شاعر انگلیسی است. +DTEND;VALUE=DATE:20120518 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120517 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت حکیم عمر خیام +UID:SHAMSI13910228-255 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:در۱٧ مه ۱٨۶۵ میلادی "اتحادیه تلگرافی بین المللی" در پاریس تشکیل + شد. ازآن تاریخ به بعد نام این اتحادیه دستخوش تحول شد و سرانجام در ٣٠ اکتب + ر ۱٩٠۶ میلادی در کنفرانس "اتحادیه تلگرافی بین الملل" تصمیم گرفته شد که "ات + حادیه رادیو و تلگرافی بین الملل" نیز تشکیل شود. در ٩دسامبر سال ۱٩٣٢ میلادی + به موجب "عهدنامه مادرید" با وحدت دو اتحادیه یاد شده فوق، "اتحادیه بین الم + للی ارتباطات دور" شروع به کار کرد. در واقع روز جهانی ارتباطات یادآور تأسیس + این اتحادیه ها برای پیشرفت ارتباطات است. سابقه عضویت ایران در "اتحادیه تل + گرافی بین المللی" بیش از یکصد سال است. نهاد مذکور پس از جنگ جهانی دوم و تش + کیل سازمان ملل، به موجب تصمیم کنفرانس عمومی نمایندگان دولتهای عضو، این اتح + ادیه به صورت نهاد تخصصی سازمان ملل درآمد واز آن زمان تاکنون، جزو مؤسسات وی + ژه سازمان ملل متحد بوده است. +DTEND;VALUE=DATE:20120518 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120517 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی ارتباطات +UID:MILADI20120517-413 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120519 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120518 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٩ اردیبهشت +UID:FARSIDATE13910229 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:پژوهشگران و متخصصان موزه داری، به دنبال ریشه یابی واژه موزه به + مبدأ "هلنی" بسنده کرده و تاریخ موزه و تاریخگذاری این پدیده را این گونه تعر + یف کرده اند: "معبد خدایان هنر شعر و موسیقی که بر فراز تپه ای در آتن قرار د + اشت، نخستین موزه ای است که در تاریخ موزه ها نام برده می شود و موزه "آشمولی + ن" در شهر آکسفورد نخستین موزه ای است که آثار مشرق زمین را در خود محفوظ داش + ته است. نخستین موزه در قاره آسیا موزه "هارمیتاژ" یا "هرمیتاژ" در لنینگراد + روسیه است و اولین موزه ایران در سال ۱٢٩۵ هـ .ش به نام "موزه ملی ایران" پای + ه گذاری و گشایش یافته است. سال ۱٧۴۶ میلادی را در تاریخ تحول و تکامل موزه ه + ا باید نقطه عطفی به شمار آورد. زیرا در این سال نویسنده فرانسوی، "لاخون دوس + ن ین" عقاید و اندیشه های نوینی را درباره موزه مطرح کرد که موجب تحرک و تسری + ع در بنیادگیری موزه ها شد. چهار سال پس از آن به سال ۱٧۵٠ میلادی اولین موزه + واقعی جهان در قصر لوکزامبورگ برپا شد." +DTEND;VALUE=DATE:20120519 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120518 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی موزه و میراث فرهنگی +UID:MILADI20120518-414 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120520 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120519 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣٠ اردیبهشت +UID:FARSIDATE13910230 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120521 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120520 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣۱ اردیبهشت +UID:FARSIDATE13910231 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120522 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120521 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱ خرداد +UID:FARSIDATE13910301 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:بهره وری یک دیدگاه فکری است. یک طرز تفکر برای تداوم پیشرفت و به + بود هر آنچه که وجود دارد .بهره وری اطمینان به قابلیت انجام کارهای امروز به + تر از دیروز بطور مداوم است.بهره وری تلاشی پیوسته برای بکار گیری تکنیکهای ج + دید و روشهای جدید است.بهره وری مهارت در توسعه انسان است. امروزه در اقتصاد + کلیه کشورها چه کشورهای توسعه یافته و چه در حال توسعه بهره‌ وری به اولویتی + ملی تبدیل شده است. بهره‌وری بطوری که موجبات رشد اقتصادی و کنترل تورم را فر + اهم و امکان دستیابی در سطح بالای استاندارد زندگی را میسر می‌کند. برای بهره + ‌ور بودن، باید باور و اعتقاد داشته باشیم که امروز، بهتر از دیروز و فردا ب + هتر از امروز می‌توان عمل کرد و این مطلب همان فرمایش حضرت علی (ع) است که می + ‌فرماید: هر کسی دو روزش مثل هم باشد زیان دیده است، بر این اساس باید سعی و + تلاش نمود که هر روزمان بهتر از دیروزمان باشد و این هم یک پیام بهره‌وری است + . +DTEND;VALUE=DATE:20120522 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120521 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بهره وری و بهینه سازی مصرف +UID:SHAMSI13910301-256 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:محمد بن ابراهیم قوامی شیرازی ملقب به صدرالمتالهین یا ملاصدرا، ا + ز بزرگان فلسفه اسلامی و از بزرگترین دانشمندان جهان، درنهم جمادی الاولی سال + ٩٨٠ قمری در شیراز دیده به جهان گشود. پدر او خواجه ابراهیم قوامی مردی پرهی + زگار دیندار و دوستدار و حامی دانش و معرفت بود. در زمان حیات ملاصدرا ، شیرا + ز دارای حکومت مستقلی بود و حکمرانی آن به برادر شاه واگذار گردید، در آن زما + ن پدر ملاصدرا به عنوان معاون او و دومین شخصیت مهم آن منطقه به شمار می رفت. + صدرالدین محمد در علوم متعارف زمان ، به ویژه در فلسفه اشراق ، مکتب مشاء‌ ، + کلام ، عرفان و تفسیر قرآن مهارت یافت. او آثار فلسفی متفکرانی چون سقراط و + فلاسفه ی هم عصر او، افلاطون، ‌ارسطو و شاگردانش و دانشمندانی چون ابن سینا و + خواجه نصرالدین طوسی را دقیقاً بررسی نمود ، موارد ضعف آنها را باز شناخت و + مسایل مبهم مکاتب را به خوبی دانست . "حکمت متعالیه" مهمترین کتاب ملاصدرا به + شمار می آید که حاوی ژرف ترین پاسخ ها به مسائل فلسفی است. از وی آثاردرخشان + ی باقی مانده است که برخی از آنها عبارتند از : اسفار اربعه، مبدأ و معاد، دی + وان اشعار، حدوث العالم، مفاتیح الغیب، متشابهات القرآن. حکیم وارسته در طول + عمر ٧۱ ساله اش هفت بار با پای پیاده به حج مشرف شد. و به هنگام آغاز سفر هفت + م یا در بازگشت از آن سفر به سال ۱٠۵٠ ه .ق در شهر بصره تن رنجور را وداع نمو + د و در جوار حق قرار گرفت ، و در همانجا به خاک سپرده شد. +DTEND;VALUE=DATE:20120522 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120521 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت ملاصدرا +UID:SHAMSI13910301-257 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120523 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120522 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢ خرداد +UID:FARSIDATE13910302 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120524 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120523 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣ خرداد +UID:FARSIDATE13910303 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در سوم خرداد سال ۱٣۶۱ هجری شمسی‌ خرمشهر شهرشهیدان و عاشقان آزا + ده به دست رزمندگان دلیر اسلا‌م از اشغال متجاوزان بعثی عراق آزاد شد . این ش + هر ٢٠ ماه در اشغال ٣٠ هزار تن از نیروهای بعثی بود که در سوم خرداد با اجرای + عملیات غرور آفرین آزادسازی خرمشهر از چنگال صدامیان‌ این حادثه بزرگ در صفح + ات تاریخ ایران به ثبت رسید و باعث سرافرازی مردم این مرز و بوم در جهان شد. + در حماسه آزادسازی خرمشهر وحدت سپاه‌ ارتش و دیگر نیروها همراه با نفس مسیحای + ی امام راحل‌ پرچم اسلا‌م را در آن شهر و بر فراز گلدسته‌ها و گنبد مسجد جامع + خرمشهر به اهتزاز درآورد. رسانه‌های غربی از این عملیات به عنوان بزرگترین پ + یروزی ایران تا آن زمان ازجنگ‌ یاد کردند. عملیات غرورآفرین بیت‌المقدس با رم + ز یاعلی ابن ابی طالب در بامداد جمعه دهم اردیبهشت ماه ۱٣۶۱ آغاز شد و اکثر ش + هدا و جانبازان این عملیات از ناحیه سر زخمی یا شهید شدند. پیروزی ایران در ا + ین عملیات بازتاب های بین‌المللی زیادی داشت و این روز در حقیقت روز اعتراف د + شمنان به سربلندی ملت ایران بود. آزادی خرمشهر به علت اجرا تاکتیک های نظامی + در دنیا بی نظیر است و با این عملیات توانایی یک ملت با تکیه بر قدرت ایمان د + ر معرض دید جهانیان قرار گرفت. +DTEND;VALUE=DATE:20120524 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120523 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:فتح خرمشهر +UID:SHAMSI13910303-258 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱ رجب - میلاد مسعود امام محمد باقر(ع) - سال ۵٧ هجری قمری امام م + حمدباقر (ع) در نخستین روز ماه رجب سال ۵٧ قمری در مدینه منوره دیده به جهان + گشود. امام محمدباقر (ع) پنجمین امام شیعیان است و در محرم سال ٩۵ قمری، پس ا + ز شهادت پدر بزرگوارش امام زین العابدین(ع) به مقام منیع امامت نایل آمد. اما + م محمدباقر(ع) دارای لقب های متعددی است و مشهورترین لقب آن حضرت، "باقر" میب + اشد. زیرا وی علم را شکافت و در عصر خویش در گسترش آن، تلاش بدیعی به عمل آور + د . +DTEND;VALUE=DATE:20120524 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120523 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:میلاد مسعود امام محمد باقر +UID:GHAMARI14330701-377 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120525 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120524 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۴ خرداد +UID:FARSIDATE13910304 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:به پاس مقاومت و فداکاری های مردم دزفول، روز چهارم خرداد، مصادف + با روز انتخاب شهرستان دزفول به عنوان شهر نمونه مقاومت، در تقویم سال ۱۳۹۰ ب + ه عنوان «روز مقاومت و پایداری» نامکذاری خواهد شد.\n +DTEND;VALUE=DATE:20120525 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120524 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز مقاومت و پايداری +UID:SHAMSI13910304-433 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120526 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120525 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۵ خرداد +UID:FARSIDATE13910305 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٣ رجب - شهادت امام علی النقی(ع) – سال ٢۵۴ هجری قمری امام علی ال + نقی (ع) در سوم رجب و یا به روایتی در ٢۵ جمادی الآخر سال ٢۵۴ قمری، در ایام + خلافت معتز عباسی، به وسیله معتمد عباسی، برادر خلیفه وقت، مسموم و در آن غری + به سرا، به شهادت رسید. هم اکنون قبر شریفش، به همراه قبر مطهر فرزندش امام ح + سن عسکری(ع) و قبر خواهرش حکیمه خاتون دختر امام جواد(ع) و قبر نرگس خاتون ما + در امام زمان(ع) در یک ضریح مقدس قرار دارد و در شهر سامرا، مزار شیعیان و دو + ستداران اهل بیت(ع) می باشد . +DTEND;VALUE=DATE:20120526 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120525 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت حضرت امام علی النقی الهادی +UID:GHAMARI14330703-378 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120527 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120526 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۶ خرداد +UID:FARSIDATE13910306 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120528 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120527 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٧ خرداد +UID:FARSIDATE13910307 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120529 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120528 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٨ خرداد +UID:FARSIDATE13910308 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120530 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120529 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٩ خرداد +UID:FARSIDATE13910309 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120531 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120530 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٠ خرداد +UID:FARSIDATE13910310 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120601 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120531 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۱ خرداد +UID:FARSIDATE13910311 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:در کشور عزیزمان ایران نیز همگام با دیگر کشورهای جهان روز جهانی + بدون دخانیات برگزار می گردد. در این روز موضوعاتی مانند حمایت های سیاسی و ا + جتماعی و قانون جامع کنترل دخانیات، محیط های آموزشی عاری از دخانیات، خانه و + خانواده عاری از دخانیات، اماکن عمومی عاری از دخانیات، سازمانهای مردم نهاد + ، روز جهانی محیط های عاری از دخانیات و محیط های ورزشی عاری از دخانیات با ا + جرای قانون جامع کنترل و مبارزه با دخانیات بررسی خواهد شد. روز جهانی بدون د + خانیات هر سال در ٣۱ می مصادف با ۱٠ خرداد برگزار می شود. در سال ۱٩٨٧ کشورها + ی عضو سازمان بهداشت جهانی با تعیین یک روز با عنوان روز جهانی بدون دخانیات؛ + توجه همگان را به مضرات و خطرات استفاده از دخانیات جلب نموده و بررسی راهکا + رهای جلوگیری از مرگ و میر ناشی از آن می پردازند. +DTEND;VALUE=DATE:20120601 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120531 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی بدون دخانیات +UID:MILADI20120531-415 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120602 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120601 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٢ خرداد +UID:FARSIDATE13910312 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱٠ رجب - میلاد مسعود امام محمد تقی(ع)- سال ۱٩۵ هجری قمری امام م + حمد بن علی(ع) معروف به "تقی" و "جوادالائمه" ، امام نهم شیعیان است.نام پدرش + امام علی بن موسی الرضا(ع) و مادرش سبیکه می باشد. محل تولد امام جواد(ع) در + مدینه منوره و در خانه امام رضا(ع) بود . امام محمد تقی(ع)، پس از شهادت پدر + گرامی اش امام رضا(ع) در سال ٢٠٣ قمری در طوس خراسان به دست مأمون عباسی، ام + امت شیعیان را بر عهده گرفت. با این که وی، در آن أیام خردسال بود و بیش از ه + شت سال از عمر شریفش نگذشته بود، سکان کشتی امت را بر عهده گرفت و آن را به ن + یکی، امامت و هدایت نمود . +DTEND;VALUE=DATE:20120602 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120601 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت امام محمد تقی +UID:GHAMARI14330710-379 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120603 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120602 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٣ خرداد +UID:FARSIDATE13910313 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120604 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120603 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۴ خرداد +UID:FARSIDATE13910314 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم شمسی +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:امام خمینی ره در بیستم جمادی الثانی سال ۱٣٢٠ ه ق در شهرستان خمی + ن از توابع استان مرکزی در خانواده ای اهل علم و دین دیده به جهان گشودند. حض + رت امام خمینی ره نیز از سنین کودکی و نوجوانی با بهره گیری از هوشی سرشار، ق + سمتی از معارف متداول روز و علوم مقدماتی و سطح حوزه های علمیه از جمله ادبیا + ت عرب، منطق، فلسفه را فرا گرفت و در سال ۱٢٩٨ ه ش عازم حوزه علمیه اراک شد. + آن حضرت همزمان با فراگیری فقه و اصول نزد فقها و مجتهدین وقت به فراگیری ریا + ضیات، هیات و فلسفه پرداخت. فعالیت جدی امام خمینی در اعتراض به رژیم و ماهیت + شاهنشاهی پهلوی از زمان ارایه لایحه انجمن هایی ولایتی و ایالتی که شرط مسلم + ان بودن و سوگند به قرآن کریم انتخاب شوندگان مجلس شورای ملی را حذف می کرد، + آغاز شد .رژیم شاه سیزدهم آبان سال ۱٣۴٣ امام خمینی ره را بازداشت کرد و در س + یزدهم دی ماه همان سال ایشان را به ترکیه تبعید کرد. رژیم چندی بعد امام ره ر + ا در تاریخ ۱٣ مهر ماه ۱٣۴۴ از ترکیه به عراق تبعید کرد. +DTEND;VALUE=DATE:20120604 +DTSTAMP:20120614T172318 +DTSTART;VALUE=DATE:20120603 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:رحلت حضرت امام خمینی-تعطیل و انتخاب حضرت آیت الله خامنه ای +UID:SHAMSI13910314-259 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120605 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120604 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۵ خرداد +UID:FARSIDATE13910315 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم شمسی +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در سحرگاه پانزدهم خرداد سال ۱٣۴٢، رژیم ستم شاهی به خانه امام خم + ینی رحمة الله یورش بردند. آنها امام را که سه روز پیش از آن، به مناسبت عاشو + رای حسینی در مدرسه فیضیه، در سخنان کوبنده ای، از جنایات شاه و اربابان آمری + کایی و اسرائیلی او پرده برداشته بود، دستگیر و دور از چشم مردم، به زندانی د + ر تهران منتقل کردند. هنوز چند ساعتی از این حادثه نگذشته بود که خیابان های + شهر قم، زیرپای مردان و زنان انقلابی – که در اعتراض به رژیم شاه و حمایت از + رهبرشان فریاد برآورده بودند – به لرزه درآمد. این صحنه، درآن روز در تهران و + چند شهر دیگر نیز به وجود آمد و بدین ترتیب، مردم ایران با این قیام گسترده، + نشان دادند که خواستار برقراری حکومت اسلامی و پایان دادن به رژیم ستمشاهی ه + ستند. در پانزدهم خرداد ۱٣۴٢، مردم تهران هم چون سایر شهرها، در اعتراض به دس + تگیری امام خمینی (ره) به خیابان ها ریختند و قیام خونین خویش را آغاز کردند. + سیل خروشان کشاورزان غیور و کفن پوش ورامین، دهقانان کن و نیز مردم جماران ب + ه سوی تهران سرازیر شد.امام خمینی (ره)درباره روز پانزده خرداد ۱٣۴٢ چنین فرم + ودند: روز پانزده خرداد، در عین حال که چون عاشورا، روز عزای عمومی ملٌت مظلو + م است، روز حماسه آفرین ۱۵ خرداد، بزرگداشت ارزش های انسانی در طول تاریخ است + . +DTEND;VALUE=DATE:20120605 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120604 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:قیام ۱۵ خرداد - تعطیل +UID:SHAMSI13910315-260 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم قمری +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱٣ رجب - میلاد مسعود امام علی بن ابی طالب(ع) در کعبه معظمه امام + علی بن ابیطالب در سیزده رجب سال سی ام عام الفیل، یعنی ٢٣ سال پیش از هجرت + نبوی در درون کعبه معظمه دیده به جهان گشود. القاب آن حضرت عبارتند از: امیرا + لمؤمنین، خلیفه رسول الله، حیدر و … تولد در خانه کعبه، فضیلتی ویژه حضرت علی + (ع) است و خدای متعال، تنها وی را به چنین امتیازی کرامت نمود. آری، حضرت علی + (ع) در چنین روز مبارک و در چنین محل مبارک و با میزبانی خدای سبحان دیده به + جهان گشود و جهان هستی را از انوار الهی اش روشن گردانید. او نخستین کسی بود + که به خدا و پیامبرش ایمان آورد و تا آخر عمر شریف خود در اعتلای کلمه لا اله + الا الله و عدالت اسلامی، لحظه ای از پای ننشست . +DTEND;VALUE=DATE:20120605 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120604 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت امام علی تعطیل- آغاز ایام البیض اعتکاف +UID:GHAMARI14330713-380 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120606 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120605 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۶ خرداد +UID:FARSIDATE13910316 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:در سال ۱٩٧٢ مجمع عمومی سازمان ملل با تصویب ماده ای پنچم ژوئن هر + سال مقارن با پانزدهم خرداد را روز جهانی محیط زیست اعلام نمود که هدف از آن + افزایش آگاهی مردم برای حفظ محیط زیست و ترغیب مسئولان به اتخاذ تدابیری برا + ی مقابله با تخریب محیط زیست است . +DTEND;VALUE=DATE:20120606 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120605 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی محیط زیست +UID:MILADI20120605-444 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120607 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120606 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٧ خرداد +UID:FARSIDATE13910317 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱۵ رجب - وفات حضرت زینب کبری(س) – سال ۶٢ هجری قمری بعد از واقعه + بزرگ کربلا حضرت زینب (س) با افشاگری حکومت جائرانه یزید چنان صحنه را بر وی + تنگ کرد که یزید با تمام تکبرها و غرورهای شیطانیش، از کشتن امام حسین(ع) و + یارانش اظهار ندامت کرد و بدین لحاظ در صدد دلجویی از اسیران و بازماندگان وا + قعه کربلا برآمد و آنان را محترمانه به مدینه منوره برگردانید. حضرت زینب(س) + پس از بازگشت به مدینه، بر اثر اندوه بی پایان واقعه کربلا، از نظر جسمی روز + به روز ضعیفتر می شد و توان خویش را از دست می داد و سرانجام پس از هیجده ماه + و پنج روز از واقعه کربلا و در ۵۶ سالگی، در ۱۵ رجب سال ۶٢ قمری وفات یافت . +DTEND;VALUE=DATE:20120607 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120606 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:وفات حضرت زینب +UID:GHAMARI14330715-381 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120608 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120607 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٨ خرداد +UID:FARSIDATE13910318 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120609 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120608 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٩ خرداد +UID:FARSIDATE13910319 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120610 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120609 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٠ خرداد +UID:FARSIDATE13910320 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:مجاهد شهید آیت الله سید محمدرضا سعیدی در دوم اردیبهشت ۱٣٠٨، چشم + به جهان گشود. پدر بزرگوارش حجت الاسلام سید احمد سعیدی، است. ادبیات عرب را + در مشهد آموخت و دروس فقه و اصول و معارف را نزد استادان بزرگی فرا گرفت. سر + انجام با زحمات طاقت فرسا و تلاشهای پیگیر به مرحله ی استنباط و اجتهاد رسید. + آیت الله سعیدی به مسافرتهای تبلیغی نیز می رفت و در آبادان بخاطر سخنرانی اف + شاگرانه و ضد رژیم به زندان افتاد. ایشان به علت سخنرانی هایی علیه رژیم پهلو + ی چندین بار توسط ساواک دستگیر و ممنوع المنبر شده بود اما آیت الله سعیدی دس + ت از فعالیت نکشید در اردیبهشت ۱٣۴٩، رژیم از سرمایه گذاران امریکایی دعوت به + عمل آورد تا به اصطلاح در ایران سرمایه گذاری کنند و در واقع در یک حرکت است + عماری اقتصاد ایران را کاملاً در اختیار امریکایی ها قرار دهد. به دنبال این + اقدام، علمای حوزه علمیه قم، در ۱۱ اردیبهشت همان سال، با انتشار اطلاعیه ای، + مردم را از این خطر بزرگ آگاه ساختند. در این میان آیت الله سعیدی دست به فع + الیت های شدید زد و با انتشار اعلامیه ای به زبان عربی، خطاب به علمای کشورها + ی اسلامی، آنها را دعوت به اعتراض و مخالفت نمود. +DTEND;VALUE=DATE:20120610 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120609 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت آیت الله سعیدی +UID:SHAMSI13910320-261 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120611 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120610 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۱ خرداد +UID:FARSIDATE13910321 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:در دنیای خشن امروز که نشانه استیلای تکنیک بر روح انسان است، صنا + یع دستی یعنی دمیدن روح لطافت به این زندگی خشن و انسان تا هست لطافت را می خ + واهد و صنایع دستی این نیاز مبرم انسان را برآورده می کند. ٢٠ خرداد روز جهان + ی صنایع دستی را گرامی میداریم. یکی از خصوصیات صنایع دستی این است که این صن + عت حاصل روح ملت ها و آئین فرهنگ ملی کشورهاست که به سادگی با رجوع به آمار ص + نایع دستی کشورها به روحیه مردم آن کشورها می توان پی برد، بنابراین صنایع دس + تی تنها یک کالا برای مبادله نیست بلکه خصوصیات فرهنگی و ویژگی های اقوام از + طریق این کالا مبادله میشود و نوعی ارتباط را ایجاد میکند.صنایع دستی پس از ج + نگ جهانی دوم با محتوای هنری و فرهنگی مورد توجه کشورهای پیشرفته قرار گرفت و + ۱٠ ژوئن (٢٠ خرداد) سال ۱٩۶۴ میلادی، نخستین کنگره‌ی جهانی با شرکت مسوولان + اجرایی استادان دانشگاه، هنرمندان و صنعت‌گران بیش از ۴٠ کشور جهان در نیویور + ک برگزار شد که در قطعنامه‌ی پایانی این کنگره، تاسیس شورای جهانی صنایع دستی + به عنوان نهاد وابسته به یونسکو تصویب شد. +DTEND;VALUE=DATE:20120611 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120610 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی صنایع دستی +UID:MILADI20120610-445 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120612 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120611 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٢ خرداد +UID:FARSIDATE13910322 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120613 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120612 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٣ خرداد +UID:FARSIDATE13910323 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120614 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120613 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۴ خرداد +UID:FARSIDATE13910324 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120615 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120614 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۵ خرداد +UID:FARSIDATE13910325 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120616 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120615 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۶ خرداد +UID:FARSIDATE13910326 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120617 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120616 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٧ خرداد +UID:FARSIDATE13910327 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٢۵ رجب - شهادت امام موسی کاظم(ع) – سال ۱٨٣ هجری قمری هارون الرش + ید که از جنایت کارترین حاکمان عباسی بود، وجود شریف امام موسی کاظم(ع) و مقا + م و معنویت وی و احترام مردم نسبت به او را، تحمل نمی کرد و از این بابت، بسی + ار نارحت و عصبانی بود. سرانجام در رمضان سال ۱٧٩ قمری، با دستور او امام موس + ی کاظم(ع) را دستگیر کردند. در زندان ، سندی بن شاهک با قساوت قلب و سنگ دلی + تمام، با آن حضرت رفتار می کرد و پس از چندی شکنجه و آزار طاقت فرسا به دستور + هارون الرشید به آن حضرت، خرمای مسموم خورانید و وی را غریبانه و مظلومانه د + ر ٢۵ رجب سال ۱٨٣ قمری به شهادت رسانید. امام موسی کاظم(ع) در مقابر قریش، در + بغداد به خاک سپرده شده است . +DTEND;VALUE=DATE:20120617 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120616 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت حضرت امام موسی کاظم +UID:GHAMARI14330725-382 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120618 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120617 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٨ خرداد +UID:FARSIDATE13910328 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:۱٧ ژوئن روز جهانی بیابان زدایی هر ساله روز ۱٧ ژوئن مصادف با ٢٧ + هرداد روز جهانی بیابان زدایی در نظر گرفته شده است. صندوق بین المللی توسعه + کشاورزی (IFAD) سازمان ملل متحد پیشتاز امر بیابان زدایی می باشد. این صندوق + فعالیت بیابان زدایی را از قاره آفریقا شروع نمود. توسعه بیابان ها در کره زم + ین زندگی بیش از ٢/۱ میلیارد انسان را در بیش از ۱۱٠ کشور دنیا تهدید می کند. + شعار روز جهانی بیابان زدایی امسال ٢٠٠٧ ازسوی برنامه عمران سازمان ملل به" + بیابان.زایی و تغییر اقلیم، یک معضل جهانی " نامگذاری شده است. رابطه مستقیم + گسترش بیابان ها با تغییرات آبو هوایی زمین غیرقابل انکار است. در این بین لز + وم برنامه ای جامع و یکپارچه در مدیریت و بهره‌‏برداری پایدار منابع محیطی اک + وسیستم‌‏های شکننده مناطق خشک و با پذیرش نقش اساسی جوامع بومی و ملی، روستای + ی و عشایری و دانش بومی و تجربه دیرینه آنان در مقابله با بیابان‌‏زایی و حفظ + طبیعت و منابع طبیعی کاملا مشهود است . +DTEND;VALUE=DATE:20120618 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120617 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی بیابان زدایی +UID:MILADI20120617-446 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120619 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120618 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٩ خرداد +UID:FARSIDATE13910329 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:دکتر علی شریعتی در سال ۱٣۱٢ در روستای مزینان از حوالی شهرستان س + بزوار متولد شد. علی به سال ۱٣۱٩ در سن هفت سالگی در دبستان ابن یمین، ثبت نا + م می کند.پس از اتمام تحصیلات مقدماتی در ۱۶ سالگی سیکل اول دبیرستان (کلاس ن + هم نظام قدیم) را به پایان رساند و وارد دانشسرای مقدماتی شد. در سال ٣۱، اول + ین بازداشت علی که در واقع نخستین رویارویی مستقیم وی با حکومت و طرفداری همه + جانبه او از حکومت ملی بود، واقع شد.در اواسط سال ۱٣٣۱ تحصیلات علی در دانشس + را تمام شد و پس از مدتی شروع به تدریس در مدرسه کاتب پور احمدآباد کرد. و هم + زمان به فعالیتهای سیاسیش ادامه داد. در سال ۱٣٣۴ پس از تاسیس دانشکده علوم و + ادبیات انسانی مشهد وارد آن دانشکده شد. در دانشکده مسئول انجمن ادبی دانشجو + یان بود به علت موافقت با بورسیه تحصیلی او در اوایل خرداد ماه ۱٣٣٨ برای ادا + مه تحصیل راهی فرانسه می شود. وی در سال ۱٩۶٣ با درجه دکتری یونیورسیته فارغ + التحصیل شد و پس از مدتی او به همراه خانواده و سه فرزندش به ایران بازگشت و + در مرز بازرگان توسط مأموران ساواک دستگیر شد. دکترشریعتی در ٢۵ اردیبهشت ماه + ۱٣۵۶ تهران را به سوی اروپا ترک گفت سرانجام در ٢٩ خرداد ۱٣۵۶ دکتر شریعتی ب + ه طرز مرموزی دیده از جهان فرو بست و در جوار حرم مطهر حضرت زینب (س) در سوری + ه به خاک سپرده شد. +DTEND;VALUE=DATE:20120619 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120618 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:در گذشت دکتر علی شریعتی +UID:SHAMSI13910329-262 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم قمری +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٢٧ رجب - مبعث حضرت محمد(ص) حضرت محمد (ص) در ٢٧ رجب سال چهلم عام + الفیل (مطابق با سال ۶۱٠ میلادی)، در چهل سالگی به رسالت مبعوث شد. آن حضرت + در حالی که در غار حرا، در حوالی مکه معظمه، به عبادت و نیایش می پرداخت، جبر + ئیل امین بر وی نازل شد و بر وی آیاتی از قرآن مجید را به عنوان طلیعه و آغاز + کتاب هدایت و سعادت، بخواند و وی را به کسوت نبوت مفتخر ساخت . +DTEND;VALUE=DATE:20120619 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120618 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:مبعث حضرت رسول اکرم تعطیل +UID:GHAMARI14330727-383 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120620 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120619 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣٠ خرداد +UID:FARSIDATE13910330 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:ساعت ٢۶/۱۴ روز دوشنبه ٣٠ خرداد سال ۱٣٧٢ خورشیدی برابر با عاشوار + ی ۱۴۱۵ هجری قمری و در حالی که رواقها، صحنها، بستها و اطراف مرقد مطهر هشتمی + ن امام معصوم از جمعیت موج می زند و مردم بر افروخته از عشق و ارادت به سالار + شهیدان ابا عبدالله الحسین (ع)، غرق عزاداری و نوحه سرایی اند، صدای مهیب ان + فجار بمب، فضای روضة منوره رضوی را پر می کند و انفجار سهمگین همه جا را به ل + رزه در می آورد بر اثر شدت انفجار که طبق نظر کارشناسان مربوطه مقدار آن معاد + ل ۱٠ پوند ماده منفجره تی. ان. تی بوده است، اعضای بدن تعدادی از زائران همچو + ن سر و دست و پا و انگشت جدا شده و به اطراف محل حتی پشت بام حرم و سقف ضریح + مطهر پراکنده می شود. و آنچه از کینة منافقان باقی ماند، سیصد تن مجروحان حاد + ثه بودند که عده ای از آنان اعضایی از بدن خود بخصوص دست و پایشان را از دست + داده بودند و ٢٧ نفر شهید که الی الابد مظلومیتشان گریبانگیر دشمنان ولایت اس + ت. در میان مجروحان و شهدا از هر سن و از هر قشر و طبقه ای دیده می شدند. +DTEND;VALUE=DATE:20120620 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120619 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:انفجار در حرم حضرت امام رضا +UID:SHAMSI13910330-263 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120621 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120620 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣۱ خرداد +UID:FARSIDATE13910331 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:دکتر مصطفی چمران در سال ۱٣۱۱ در تهران متولد شد. وی تحصیلات خود + را در مدرسه انتصاربه آغاز کرد و در دارالفنون و البرز دوران متوسطه را گذران + د؛ در دانشکده فنی دانشگاه تهران ادامه تحصیل داد و در سال ۱٣٣۶ در رشته الکت + رو مکانیک فارغ التحصیل شد و یک سال به تدریس در دانشکده فنی پرداخت. وی در ه + مه دوران تحصیل شاگرد اول بود.در سال ۱٣٣٧ با استفاده از بورس تحصیلی شاگردان + ممتاز به امریکا اعزام شد و پس از تحقیقات علمی در جمع معروفترین دانشمندان + جهان در دانشگاه کالیفرنیا و معتبرترین دانشگاه امریکا_ برکلی_ با ممتازترین + درجه علمی موفق به اخذ دکترای الکترونیک و فیزیک پلاسما گردید. در امریکا، با + همکاری بعضی از دوستانش، برای اولین بار انجمن اسلامی دانشجویان امریکا را پ + ایه ریزی کرد و از موسسین انجمن دانشجویان ایرانی در کالیفرنیا و از فعالین ا + نجمن دانشجویان ایرانی در امریکا به شمار میرفت که بدلیل این فعالیتها، بورس + تحصیلی شاگرد ممتازی وی از سوی رژیم شاه قطع می شود. دکتر چمران با پیروزی ان + قلاب اسلامی، بعد از ٢٣ سال هجرت، به وطن باز می گردد. همه تجربیات انقلابی و + علمی خود را در خدمت انقلاب میگذارد. +DTEND;VALUE=DATE:20120621 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120620 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت دکتر مصطفی چمران +UID:SHAMSI13910331-264 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120622 +DTSTAMP:20120614T172319 +DTSTART;VALUE=DATE:20120621 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱ تیر +UID:FARSIDATE13910401 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در سال ۱٣۶٠ ه.ش سازمان تبلیغات اسلامی به فرمان امام خمینی (ره) + تاسیس شد. این نهاد با هدف اعتلای فرهنگ نغز و پر بار اسلامی و تبلور حیات مع + نوی و تبیین و ترویج شاخصهای اعتقادی فعال گردید. تبلیغات، به معنای مجموعه ا + عمال گفتاری، نوشتاری، رفتاری و تصویری است که به منظور نفوذ و تاثیر گذاری د + ر شخصیت، افکار، عقاید و احساسات مخاطبان سازماندهی می شود و برای جهت بخشیدن + به آنان در راستای هدف و مقصدی مشخص، هویت پیدا می کند. تبلیغات در بینش و ف + رهنگ اسلامی از جایگاه رفیع و ویژه ای برخوردار است. بعد از پیروزی انقلاب اس + لامی، نهاد شورای عالی تبلیغات اسلامی در اول تیرماه ۱٣۶٠ به صورت نهادی منسج + م، مستقل و وابسته به ولایت فقیه با اراده امام (ره) و به منظور پرداختن به ا + مر تبلیغات به وجود آمد. این نهاد انقلابی در سیر تکاملی خود، در ۱۴/۱/۱٣۶٨ ب + ا دست خط مبارک امام خمینی (ره) به سازمان تبلیغات اسلامی تغییر نام یافت.همچ + نین این روز به عنوان روز تبلیغ و اطلاع رسانی دینی نامگذاری شده است. +DTEND;VALUE=DATE:20120622 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120621 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز تبلیغ و اطلاع رسانی دینی +UID:SHAMSI13910401-265 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:همه ساله چنین روزی در کشور، تحت عنوان روز اصناف گرامی داشته می + شود. حمایت از تولید کنندگان در کنار حمایت کارکر، و پی گیری راههای جذب سرما + یه و سرمایه گذار از راههایی است که باعث مستحکم تر شدن جایگاه اصناف در کشور + می شود. اصناف کشور در صورتی که جایگاه لازم را در سازماندهی کشور پیدا کنند + ، می توانند به عنوان یک تشکل سراسری، به طور مستقیم در بحث تعیین ضرایب مالی + اتی و ... دخالت مفید داشته باشند. +DTEND;VALUE=DATE:20120622 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120621 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز اصناف +UID:SHAMSI13910401-266 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120623 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120622 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢ تیر +UID:FARSIDATE13910402 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120624 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120623 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣ تیر +UID:FARSIDATE13910403 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120625 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120624 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۴ تیر +UID:FARSIDATE13910404 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٣ شعبان - میلاد مسعود امام حسین(ع) امام حسین(ع) فرزند امیرمؤمنا + ن (ع) و فاطمه زهرا(س)، دومین فرزند آن دو بزرگوار و محبوب پیامبراکرم(ص) بود + . از امام صادق(ع) روایت شد: هنگامی که امام حسین(ع) دیده به جهان گشود، جبرئ + یل امین از سوی پروردگار متعال مأمور گردید تا همراه هزار فرشته، جهت تهنیت و + شادباش گویی به نوزاد فاطمه زهرا(س)، به زمین فرود آیند . +DTEND;VALUE=DATE:20120625 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120624 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت امام حسین و روز پاسدار +UID:GHAMARI14330803-384 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120626 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120625 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۵ تیر +UID:FARSIDATE13910405 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۴ شعبان - ولادت با سعادت ابی الفضل العباس(ع) – سال ٢۶ هجری قمری + حضرت عباس بن امیر المومنین (ع)، مکنّی به "ابوالفضل" در چهارم شعبان سال ٢۶ + قمری ، در مدینه منوّره دیده به جهان گشود. مادر گرامی اش حضرت فاطمه بنت حز + ام، معروف به "اُمّ البنین"، همسر مکرّمه امام علی (ع) است. پس از تولد مبارک + آثار حضرت عباس(ع)، وی در مکتب پدر مهربان و مادر فهیمش پرورش یافت و به رشد + و تکامل رسید. وی در آغاز خلافت پدرش امام علی(ع)، ده ساله بود و در همین سن + ین در تمام نبردهای آن حضرت، حضور فعال داشت و هم چون مردان کارآزموده و رزم + آور، با دشمنان پدرش به نبرد می پرداخت. اوج دلیری، فداکاری و وفاداری عباس ب + ن علی(ع) در واقعه کربلا آشکار گردید . +DTEND;VALUE=DATE:20120626 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120625 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت ابوالفضل العباس و روز جانباز +UID:GHAMARI14330804-385 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120627 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120626 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۶ تیر +UID:FARSIDATE13910406 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۵ شعبان - میلاد فرخنده امام زین العابدین(ع) – سال ٣٨ هجری قمری + تولد با سعادت امام علی بن الحسین(ع)، معروف به امام زین العابدین(ع) روز پنج + م شعبان سال ٣٨ قمری، می باشد. پدرش امام حسین بن علی(ع) و مادرش شهربانو دخت + ر یزدگرد سوم است. گفتنی است که نسل ابی عبدالله الحسین(ع)، منحصراً از امام + زین العابدین(ع) تکثیر و توسعه یافت و تمامی سادات حسینی، به این امام همام، + منتهی می گردند . +DTEND;VALUE=DATE:20120627 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120626 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت امام زین العابدین +UID:GHAMARI14330805-386 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:اعتیاد یــك بیمارى اجتماعی است كه عوارض جسمى و روانى دارد و تا + زمانى كه بـه علل گرایش بیمار توجه نشود، درمان جسمى و روانى فقط براى مدتى ن + تیجه‏ بخش خواهد بود و فـــرد مـــعتاد دوباره گرفتار مواد اعتیاد آور می‏ گ + ردد.\nاعتیاد به موادمخدر یكى از مهمترین مشكلات اجتماعی، اقتصادى و بهداشتى + است كه عوارض ناشى از آن تهدیدى جدى براى جامعه بشرى محسوب شده و موجب ركود ا + جتماعى در زمینه ‏هاى مختلف مى‌گـــــردد همچنین ویــرانگری‏ هاى حاصل از آن + زمینه ساز سقوط بسیارى از ارزش‌ها و هنجارهاى فرهنگى و اخلاقى شده و بدین ترت + یب سلامت جامعه را بطور جدى به مخاطره مى‌اندازد.\n +DTEND;VALUE=DATE:20120627 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120626 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی مبارزه با مواد مخدر +UID:MILADI20120626-447 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120628 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120627 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٧ تیر +UID:FARSIDATE13910407 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در ساعت بیست و یک و سی دقیقه روز یکشنبه هفتم تیر ماه ۱٣۶٠ آیت ا + لله بهشتی و هفتاد و دو تن از شخصیت های بر جسته کشور از جمله نمایندگان مجلس + ، اعضای هیات دولت و...به طور کلی برخی از اعضای حزب جمهوری اسلامی طی انفجار + ی در دفتر این حزب به درجه رفیع شهادت نایل آمدند . شهید آیت‌الله سیدمحمد حس + ینی بهشتی فرزند سید فضل الله در روز دوم آبان ماه سال ۱٣٠٧ در محله لومیان ش + هر اصفهان متولد شد. پدرش سید فضل الله مردی روحانی و متقی بود. محمد در سن ۴ + سالگی آموختن را آغاز نمود. سال ششم ابتدایی به عنوان نفر دوم شهر معرفی گشت + .سپس به دبیرستان سعدی راه یافت. هنوز دو سال نگذشته بود که به مطالعه علوم د + ینی علاقمند شد. بعد از آموختن فقه و پایان دوره‌ سطح در سال ۱٣٢۵ به قم مهاج + رت نمود.دکتر بهشتی به زبانهای فرانسوی و انگلیسی آشنایی داشت. آیت الله بهشت + ی با پیروزی انقلاب به عنوان دبیر شورای انقلاب معرفی گشت و بعد از تعیین اعض + ای مجلس خبرگان به انتخاب مردم تدوین قانون اساسی را بر عهده گرفت و با آوردن + دلایل و براهین مستند اصل ولایت فقیه را در مجلس خبرگان به تصویب رساند. +DTEND;VALUE=DATE:20120628 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120627 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت آیت الله دکتر بهشتی و ٧٢ تن از یاران امام(۱٣۶٠ ه.ش) +UID:SHAMSI13910407-267 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120628 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120627 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز قوه قضاییه +UID:SHAMSI13910407-268 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120629 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120628 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٨ تیر +UID:FARSIDATE13910408 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120629 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120628 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز مبارزه با سلاح های شیمیایی و میکروبی +UID:SHAMSI13910408-269 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120630 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120629 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٩ تیر +UID:FARSIDATE13910409 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120701 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120630 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٠ تیر +UID:FARSIDATE13910410 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:دهم تیر ماه بر اساس مصوبه شورای عالی انقلاب فرهنگی روز صنعت و م + عدن نامیده شده است. اختصاص این روز فرصت مناسبی است که به مهمترین موتور محر + که اقتصاد یعنی بخش صنعت و معدن نگاهی اندیشمندانه شود چرا که این بخش به عنو + ان عامل مولد اشتغال پایدار در افزایش تولید ناخالص ملی و درآمد سرانه نقش بس + زایی دارد. ایران با در اختیار داشتن منابع و ذخایر سوختی و همچنین سایر مواد + معدنی مورد نظر صنایع مختلف، در صورت برنامه ریزی صحیح و دراز مدت؛ قدرت و ا + مکان کافی جهت حصول پیشرفت های عمده صنعتی و نیل به خود کفایی را دارد. استخر + اج معادن و معدنکاری و توسعه صنعت در زمینه های گوناگون صنعتی از دیرباز در گ + شور ما متداول بوده و بعضی از مورخین نوشته اند که مردم ایران از اولین کسانی + بوده اند که مس را استخراج و ذوب نموده اند. افزایش درآمدها و رشد بهره وری + در بخشهای مختلف و همچنین رشد تقاضا و فعالتر شدن بانکها، بیمه، بورس و آموزش + و همچنین گسترش بازارها، ارتقا نظام مدیریتی و حتی احترام به قانون، همه و ه + مه از پیامدهای توسعه صنعتی و بهره برداری بهینه از معادن است. +DTEND;VALUE=DATE:20120701 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120630 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز صنعت و معدن +UID:SHAMSI13910410-270 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120702 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120701 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۱ تیر +UID:FARSIDATE13910411 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:به سال ۱٣٢٧ هجری قمری در یزد و در خانواده‏ای روحانی، کودکی زاده + شد که او را محمد نام نهادند. پدرش، مرحوم آقامیرزا ابوطالب، از عالمان وارس + ته آن زمان بود که در مسجد روضه محمدیه، معروف به حظیره، اقامه جماعت می‏کرد. + شهید صدوقی در سایه سرپرستی مرحوم میرزا محمد کرمانشاهی، پسرعموی خود به تحص + یل دانش پرداخت. او در بیست سالگی با دختر عمویش ازدواج کرد. شجاعت و شهامت ش + هید صدوقی در مبارزه با طاغوت، زبانزد همگان است. شیوه برخورد او با رژیم و ج + اسوسان آن به گونه‏ای بود که دشمن نمی‏توانست از شیوه عمل مبارزاتی او و طرفد + ارانش آگاه شود. آیت اللّه‏ صدوقی تا سال ۱٣٣٠ در حوزه علمیه قم به تدریس و ت + حصیل و خدمت به طلاب مشغول بود.سرانجام در پی اصرار مردم و علمای یزد، و با و + جود داشتن موقعیت ممتاز در شهر قم، به یزد بازگشت و مورد استقبال بی‏نظیر مرد + م آن دیار قرار گرفت با پیروزی انقلاب در ٢٢ بهمن ماه سال ۱٣۵٧، آیت اللّه‏ ص + دوقی برای تدوین قانون‏اساسی جمهوری اسلامی، از یزد راهی مجلس خبرگان شد و در + این مجلس، بُعد دیگری از شخصیت انقلابی خود را در تدوین اصل ولایت فقیه نشان + داد. +DTEND;VALUE=DATE:20120702 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120701 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت آیت‌الله صدوقی چهارمین شهید محراب +UID:SHAMSI13910411-271 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120703 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120702 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٢ تیر +UID:FARSIDATE13910412 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:هواپیمای ایرباس جمهوری اسلامی ایران در دوازدهم تیر ۱٣۶٧ به همرا + ه ٢٧٠ مسافر و ۱۶ خدمه فرودگاه بندر عباس را به مقصد دوبی ترک کرد . اما دیری + از پرواز این هواپیما نگذشته بود که ناوگان وینسنس دزدان دریایی مدرن آمریکا + یی ، دراقدامی تروریستی ، این هواپیمای مسافربری را در ساعت ده و بیست و چهار + دقیقه، در سطح دوازده هزار پایی بر فراز آبهای سرزمینی جمهوری اسلامی ایران + مورد حمله موشکی خود قرار داد. دراین واقعه دردناک و پس از شلیک ناجوانمردانه + دو فروند موشک، تمامی مسافران ،که تعدادی از آنان کودک بودند،وخدمه هواپیمای + ایرباس جان به جان آفرین تسلیم کردند . +DTEND;VALUE=DATE:20120703 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120702 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:سقوط هواپیمای مسافربری ایران توسط ناو آمریکایی +UID:SHAMSI13910412-272 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DTEND;VALUE=DATE:20120703 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120702 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت علی اکبر و روز جوان +UID:GHAMARI14330811-387 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120704 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120703 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٣ تیر +UID:FARSIDATE13910413 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120705 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120704 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۴ تیر +UID:FARSIDATE13910414 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:روز قلم در تقویم ایران، به عنوان نمادی برای تجلیل از صاحب‏قلمان + و آثار ایشان انتخاب شده است. صفحات تقویم، چهاردهم تیرماه با عنوان «روز قل + م» به خود جلوه‏ای دیگر بخشیده است. نام‏گذاری این روز به نام قلم، بی ارتباط + با تاریخ کهن متمدن و فرهنگ‏ساز این سرزمین نیست. ابوریحان بیرونی در کتاب آ + ثار الباقیه خود آورده است که چهاردهمین روز از تیرماه را ایرانیان باستان، ر + وز تیر (عطارد) می‏نامیدند. از طرفی سیاره تیر یا همان عطارد، در فرهنگ ادب پ + ارسی، کاتب و نویسنده ستارگان است. به همین مناسبت این روز را روز نویسندگان + می‏دانستند و گرامی می‏داشتند. ارزش و کرامت قلم بسیار بالاتر از آن است که ب + رای بزرگداشت آن و صاحبانش به اختصاص دادن روزی در تقویم به آن بسنده کنیم. د + ر این روز با گرامی‏داشت یاد و خاطره اهالی قلم و تجلیل از آثار ایشان، شاید + بتوانیم گوشه‏ای از زحمات طاقت‏فرسای آنان را قدردان باشیم. قلم، زبان عقل و + معرفت و احساس انسان‏ها و بیان‏کننده اندیشه و شخصیت صاحب آن است. قلم، زبان + دوم انسان‏هاست. در نخستین ارتباط وحیانی رسول خدا صلی‏الله‏علیه‏و‏آله با مب + دأ هستی در غار حرا، سخن از قلم به میان می‏آید، تا جایی که خداوند خود را ای + ن‏گونه معرفی می‏کند:«الَّذی عَلَّمَ بِالْقَلَمِ؛ آن‏که با قلم آموخت.» +DTEND;VALUE=DATE:20120705 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120704 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز قلم +UID:SHAMSI13910414-273 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:امام خمینی ره در بیستم جمادی الثانی سال ۱٣٢٠ ه ق در شهرستان خمی + ن از توابع استان مرکزی در خانواده ای اهل علم و دین دیده به جهان گشودند. حض + رت امام خمینی ره نیز از سنین کودکی و نوجوانی با بهره گیری از هوشی سرشار، ق + سمتی از معارف متداول روز و علوم مقدماتی و سطح حوزه های علمیه از جمله ادبیا + ت عرب، منطق، فلسفه را فرا گرفت و در سال ۱٢٩٨ ه ش عازم حوزه علمیه اراک شد. + آن حضرت همزمان با فراگیری فقه و اصول نزد فقها و مجتهدین وقت به فراگیری ریا + ضیات، هیات و فلسفه پرداخت. فعالیت جدی امام خمینی در اعتراض به رژیم و ماهیت + شاهنشاهی پهلوی از زمان ارایه لایحه انجمن هایی ولایتی و ایالتی که شرط مسلم + ان بودن و سوگند به قرآن کریم انتخاب شوندگان مجلس شورای ملی را حذف می کرد، + آغاز شد .رژیم شاه سیزدهم آبان سال ۱٣۴٣ امام خمینی ره را بازداشت کرد و در س + یزدهم دی ماه همان سال ایشان را به ترکیه تبعید کرد. رژیم چندی بعد امام ره ر + ا در تاریخ ۱٣ مهر ماه ۱٣۴۴ از ترکیه به عراق تبعید کرد. +DTEND;VALUE=DATE:20120705 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120704 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:تولد حضرت امام خمینی +UID:SHAMSI13910414-274 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120706 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120705 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۵ تیر +UID:FARSIDATE13910415 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120707 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120706 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۶ تیر +UID:FARSIDATE13910416 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:مالیات از جمله منابع مهم مالی هر کشور ی به شمار می آید و در اسل + ام نیز براین امر تاکید بسیار شده است . بیان ویژگی ها وکارکردهای مختلف مالی + ات در جامعه، رفع موانع موجود در جهت جذب مالیات ها از سوی مردم ، تبیین وجوب + پرداخت مالیات در جامعه و...از جمله علل نام گذاری چنین روزی به عنوان روز م + الیات بوده است. +DTEND;VALUE=DATE:20120707 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120706 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز مالیات +UID:SHAMSI13910416-275 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم قمری +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱۵ شعبان - میلاد فرخنده امام زمان(ع) – سال ٢۵۵ هجری قمری امام ز + مان(ع) ، در پانزدهم شعبان سال ٢۵۵ قمری دیده به جهان گشود و عالم هستی را با + انوار تابناک خویش جلوه گر ساخت. پدرش امام حسن عسکری(ع)، امام یازدهم شیعیا + ن و مادرش نرجس می باشد. محل تولد امام زمان(ع) در شهر سامرّا و در خانه امام + حسن عسکری(ع) به صورت نهان واقع گردید. امام زمان(ع)، دوازدهمین و آخرین پیش + وا و امام معصوم(ع) است . بدین جهت شیعیان، روز پانزدهم شعبان را روز عید رسم + ی اعلان نموده و در آن روز به شکرانه نعمت بزرگ الهی به جشن و شادمانی می پرد + ازند . +DTEND;VALUE=DATE:20120707 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120706 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت قائم تعطیل +UID:GHAMARI14330815-388 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120708 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120707 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٧ تیر +UID:FARSIDATE13910417 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120709 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120708 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٨ تیر +UID:FARSIDATE13910418 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120710 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120709 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٩ تیر +UID:FARSIDATE13910419 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120711 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120710 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٠ تیر +UID:FARSIDATE13910420 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120712 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120711 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۱ تیر +UID:FARSIDATE13910421 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:شوراي فرهنگ عمومي كشور سالروز قيام مردم مشهد عليه كشف حجاب را ب + ه عنوان روز عفاف و حجاب نام گذاري كرد.\nعضو شوراي فرهنگ عمومي كشور گفت: در + جلسه اخير شوراي فرهنگ عمومي، ٢٢ تير ماه روز قيام مردم مشهد عليه كشف حجاب + و كشتار مردم در مسجد گوهرشاد به عنوان روز عفاف وحجاب به تصويب رسيد.\n +DTEND;VALUE=DATE:20120712 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120711 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز عفاف و حجاب +UID:SHAMSI13910421-434 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120713 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120712 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٢ تیر +UID:FARSIDATE13910422 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120714 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120713 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٣ تیر +UID:FARSIDATE13910423 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120715 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120714 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۴ تیر +UID:FARSIDATE13910424 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120716 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120715 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۵ تیر +UID:FARSIDATE13910425 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:روز بهزیستی بیست و پنجم تیر هر سال، روز بهزیستی و تأمین اجتماعی + نام‏گذاری شده است. سازمانی که مبنای به وجود آمدنش کمک به تأمین حداقل هزین + ه زندگی خانواده‏های نیازمند و بی‏سرپرست و ایجاد زمینه‏های مناسب برای خودکف + ایی آنان بوده است. تأمین اجتماعی انسان به کمک فطرت و خردی که خداوند به او + بخشیده، در طول تاریخ به بسیاری از حقیقت‏ها پی برده و در کنار پیشرفت علمی، + به پیشرفت‏های اجتماعی رسیده است. تأمین اجتماعی، یکی از دستاوردهای تجربی بش + ر است. تأمین اجتماعی صرف‏نظر از نظام اقتصادی حاکم بر جامعه، همواره مورد تو + جه ویژه دولت‏ها و ملت‏ها در سراسر جهان بوده است . +DTEND;VALUE=DATE:20120716 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120715 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بهزیستی و تامین اجتماعی +UID:SHAMSI13910425-276 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120717 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120716 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۶ تیر +UID:FARSIDATE13910426 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120718 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120717 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٧ تیر +UID:FARSIDATE13910427 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:"قطعنامه ۵٩٨" هشتمین قطعنامه ‌ای بود که شورای امنیت سازمان ملل + از ابتدای تجاوز رژیم بعث عراق به جمهوری اسلامی ایران، صادر کرد. تمامی قطعن + امه‌های قبلی که در همین چارچوب و از جانب شورای امنیت صادر می شد، به دلیل ج + هت گیری ناعادلانه آنها از سوی کشورمان رد شده بود اما در ابتدای صدور قطعنام + ه ۵٩٨ به علت نکات مثبتی که در این قطعنامه گنجانده شده بود از سوی جمهوری اس + لامی اعلام شد که ایران جای بحث و مذاکراتی را درباره این قطعنامه می‌بیند و + لذا تهران در نخستین واکنش به قطعنامه ۵٩٨ نه آن را رد کرد و نه پذیرفت. البت + ه سرانجام در تاریخ ٢٧ تیر ۱٣۶٧ این قطعنامه مورد قبول جمهوری اسلامی ایران ق + رار گرفت. +DTEND;VALUE=DATE:20120718 +DTSTAMP:20120614T172320 +DTSTART;VALUE=DATE:20120717 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:اعلام پذیرش قطعنامه۵٩٨شورای امنیت از سوی ایران +UID:SHAMSI13910427-277 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120719 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120718 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٨ تیر +UID:FARSIDATE13910428 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120720 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120719 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٩ تیر +UID:FARSIDATE13910429 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120721 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120720 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣٠ تیر +UID:FARSIDATE13910430 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120722 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120721 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣۱ تیر +UID:FARSIDATE13910431 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120723 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120722 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱ مرداد +UID:FARSIDATE13910501 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120724 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120723 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢ مرداد +UID:FARSIDATE13910502 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120725 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120724 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣ مرداد +UID:FARSIDATE13910503 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120726 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120725 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۴ مرداد +UID:FARSIDATE13910504 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120727 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120726 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۵ مرداد +UID:FARSIDATE13910505 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:سالروز عملیات افتخار آفرین مرصاد(۱٣۶٧ ه.ش) نیروهای اسلام در روز + ۵ مرداد عملیات مرصاد را به رمز یا علی بن ابی طالب (ع) آغاز نمودند و طی چن + دین ساعت، صدها تن از منافقین را به هلاکت رسانده، و مابقی را به فرار وا داش + تند. در این عملیات بیش از ٢۵٠٠ تن از منافقین به هلاکت رسیدند و بیش از چهار + صد دستگاه خودرو، نفربر و تانک آنان منهدم شد. نتایج عملیات - عقب راندن دشمن + از خاک ایران اسلامی - به هلاکت رساندن حدود ٢٠٠٠ نفر و به اسارت درآوردن ٢۵ + ٠ تن از نیروهای دشمن. +DTEND;VALUE=DATE:20120727 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120726 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:سالروز عملیات غرورآفرین مرصاد +UID:SHAMSI13910505-278 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120728 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120727 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۶ مرداد +UID:FARSIDATE13910506 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:امروزه تربیت نیروی انسانی ماهر و متخصص و کارآمد از عوامل کلیدی + و انکارناپذیر در توسعه اقتصادی و اجتماعی هر کشور محسوب می گردد و هر نوع سر + مایه گذاری کلان در بخشهای مختلف اقتصادی نیازمند به برنامه ریزی و سرمایه گذ + اری در بخش نیروی انسانی و توسعه منابع این نیرو می باشد. نظام جمهوری اسلامی + ایران برپایه ایمان به کرامت و ارزش والای انسان یکی از راههای تامین قسط و + عدل، استقلال سیاسی، اقتصادی، اجتماعی و فرهنگی و نیز همبستگی ملی را استفاده + از علوم و فنون و تجارب پیشرفته بشری و تلاش در پیشبرد آنها می داند. \nسازم + ان آموزش فنی و حرفه ای کشور وابسته به وزارت کار و امور اجتماعی براساس قانو + ن برنامه سوم توسعه اقتصادی، اجتماعی و فرهنگی بعنوان متولی و مجری آموزشهای + فنی و حرفه ای کوتاه مدت در بخشهای کشاورزی، صنعت و خدمات می باشد. این سازما + ن که فراگیرترین دستگاه آموزشی کشور در این زمینه می باشد می کوشد در حیطه وظ + ایف خود دستیابی به هدفهای تعیین شده در قانون اساسی را ممکن سازدئ و تا رفع + نیاز بازار کار، فعالیتهای خود را توسعه دهد و در عین حال بر جنبه کیفی آن نی + ز تاکید داشته، سعی می نماید مهارت شاغلین را با تکنولوژی روز همگام سازد.\n +DTEND;VALUE=DATE:20120728 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120727 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز كارآفرینی و آموزشهای فنی و حرفه ای +UID:SHAMSI13910506-435 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120729 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120728 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٧ مرداد +UID:FARSIDATE13910507 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120730 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120729 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٨ مرداد +UID:FARSIDATE13910508 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120730 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120729 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت شیخ شهاب‌الدین سهروردی اشراق +UID:SHAMSI13910508-279 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120731 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120730 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٩ مرداد +UID:FARSIDATE13910509 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:سازمان انتقال خون ایران با توجه به اهداف خود و تکیه بر اساسنامة + سازمان، به منظور آموزش و ارتقاء سطح آگاهی جامعه، ترویج فرهنگ اهدای خون، ج + مع‌آوری خون از داوطلبان اهدا، آماده سازی و تهیه فراورده‌های خونی و توزیع آ + ن در مراکز درمانی و بیمارستان‌ها، گام‌های مطمئنی برداشته است. از این رو از + سال ۱٣۵٣ش. به بعد سالروز تاسیس سازمان انتقال خون ایران(نهم مرداد) به عنوا + ن روز اهدای خون نام‌گذاری گردیده است. +DTEND;VALUE=DATE:20120731 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120730 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز اهدای خون +UID:SHAMSI13910509-280 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱٠ رمضان - وفات حضرت خدیجه کبری(س) – سال دهم بعثت اُمّ المؤمنین + ، حضرت خدیجه کبری(س) نخستین همسر رسول خدا(ص)، از زنان شریف، اصیل و نامدار + عرب و اسلام می باشد. سرانجام این بانوی فداکار، پس از یک عمر تلاش و کوشش و + ٢۵ سال خدمت به رسول گرامی(ص) و دین مبین اسلام ، در دهم رمضان سال دهم بعثت + ، جان به جان آفرینان تسلیم و روح مطهرش به اعلی علیین عروج نمود. پس از غسل + و کفن بدن مطهر خدیجه کبری(س)، پیامبر(ص) وی را در حجون مکه به خاک سپرد . +DTEND;VALUE=DATE:20120731 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120730 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:وفات حضرت خدیجه +UID:GHAMARI14330910-389 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120801 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120731 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٠ مرداد +UID:FARSIDATE13910510 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120802 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120801 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۱ مرداد +UID:FARSIDATE13910511 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:همه ساله اول آگوست که بنام روز جهانی شیر مادر نامگذاری شده، در + کشورهای مختلف جهان گرامی داشته میشود. هدف از نامگذاری این روز تشویق مادران + به تغذیه فرزندان خود از این موهبت الهی است. "آن ونمن" مدیر اجرایی یونیسف: + «هفته جهانی تغذیه با شیر مادر همچنین به ما فرصتی می دهد تا خانواده ها و م + ردم را از مزایای تغذیه زود هنگام و انحصاری با شیر مادر آگاه کنیم و یونیسف + به حمایت، ترویج و پشتیبانی از تغذیه با شیر مادر متعهد است.» +DTEND;VALUE=DATE:20120802 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120801 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی شیر مادر +UID:MILADI20120801-416 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120803 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120802 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٢ مرداد +UID:FARSIDATE13910512 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120804 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120803 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٣ مرداد +UID:FARSIDATE13910513 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120805 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120804 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۴ مرداد +UID:FARSIDATE13910514 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:صدور فرمان مشروطیت(۱٢٨۵ ه.ش) پس از استقرار سلطنت قاجار، کشور ای + ران به تدریج با بحران‌هایی چون: فقر، عدم امکانات لازم برای ادارة امور، ندا + شتن نیروهای کار آمد و کافی، مواجه گردید . روحانیون شروع به سخنرانی در مساج + د علیه استبداد و هوا‌داری از مشروطه کردند. مظفرالدین شاه که از اعتراضات مر + دم به وحشت افتاده بود و احساس خطر می‌کرد، بالاخره در ۱۴ جمادی‌الاخر سال ۱۴ + مرداد ۱٢٨۵ش. تن به صدور فرمان مشروطیت و تاسیس مجلس شورای ملی مرکب از برگزی + دگان ملت داد. +DTEND;VALUE=DATE:20120805 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120804 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:صدور فرمان مشروطیت +UID:SHAMSI13910514-281 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:۱۴مرداد را به نام روز حقوق بشر اسلامي و كرامت انساني نام نهاده‌ + اند. موضوع حقوق بشر امروزه به عنوان يكي از مهمترين و شاخص‌ترين مباحث مطرح + در عرصه‌ي تئوري‌، تفكر و عمل بشر امروزي، خودنمايي مي‌كند. حقوق بشر چيست؟ ح + دود و ثغور آن كدامند؟ مصاديق عيني و عملي آن چه مي‌باشد؟ چه جوامعي به آن بي + شتر اهتمام مي‌ورزند؟ اين‌ها و ده‌ها سؤال ديگر همواره در حوزه‌ي انديشه و عم + ل مورد توجه و عنايت ويژه‌ي صاحب‌نظران و متفكران جوامع شرقي و غربي بوده است + .\n\n +DTEND;VALUE=DATE:20120805 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120804 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز حقوق بشر اسلامی و کرامت انسانی +UID:SHAMSI13910514-436 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱۵ رمضان - میلاد مسعود امام حسن مجتبی(ع) - سال سوم هجری قمری ام + ام حسن (ع)، معروف به مجتبی(ع)، دومین امام شیعیان است. وی در پانزدهم ماه مب + ارک رمضان سال سوم هجری قمری در حیات جدش پیامبراکرم(ص) در مدینه منوره دیده + به جهان گشود. پدرش امام علی ابن ابی طالب(ع) و مادرش حضرت فاطمه زهرا(س) می + باشد. امام حسن مجتبی(ع) نخستین فرزند این دو بزرگوار بود ، بدین جهت تولد وی + ، موجب شادمانی آن دو و پیامبر اسلام(ص) و تمامی محبان اهل بیت(ع) گردید +DTEND;VALUE=DATE:20120805 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120804 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت امام حسن مجتبی +UID:GHAMARI14330915-390 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120806 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120805 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۵ مرداد +UID:FARSIDATE13910515 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120807 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120806 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۶ مرداد +UID:FARSIDATE13910516 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:انقلاب فرهنگی به نوبه خود جهاد دانشگاهی را در راستای تکامل خویش + ، و حفظ و صیانت اصول ، اهداف و دستاوردهایش بنیان گذاشت. این نهاد انقلابی + علی رغم نغمه های شوم گروهک های معاند و ضد انقلاب ، مراحل پر فراز و افتخار + آفرینی را از جهات مختلف گذراند: از شکل گرفتن اولین هسته های " جذب نیرو" در + دانشگاه ها تا تشکیل آن توسط ستاد انقلاب فرهنگی که سرانجام در سال ۱٣۶٣، به + عنوان ِ " ستاد اجرایی انقلاب فرهنگی " ، تغییر نام داد. در سال ۱٣۶۴، پس از + استقلال دانشگاه ها و جدا شدن وزارت فرهنگ و آموزش عالی از آن، مجدداً به عن + وان جهاد دانشگاهی تغییر نام، و در سال ۱٣۶٩، به عنوان پلی میان دانشگاه و بخ + ش صنعتی و خدماتی کشور معرفی و محل استقرار آن بیرون از دانشگاه تعیین شد. +DTEND;VALUE=DATE:20120807 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120806 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:تشکیل جهاد دانشگاهی +UID:SHAMSI13910516-282 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120808 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120807 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٧ مرداد +UID:FARSIDATE13910517 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:روز خبرنگار با موافقت شورای فرهنگ عمومی هفدهم مرداد، سالروز شها + دت محمود صارمی، به عنوان روز خبرنگار نام‌گذاری گردید. هفدهم مرداد ماه این + روز ارزشمند اجتماعی، بر همة خبرنگاران، روزنامه‌نگاران و نویسند‌گان گرامی ب + اد. +DTEND;VALUE=DATE:20120808 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120807 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز خبرنگار +UID:SHAMSI13910517-283 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DTEND;VALUE=DATE:20120808 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120807 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شب قدر +UID:GHAMARI14330918-391 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120809 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120808 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٨ مرداد +UID:FARSIDATE13910518 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120810 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120809 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٩ مرداد +UID:FARSIDATE13910519 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120811 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120810 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٠ مرداد +UID:FARSIDATE13910520 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم قمری +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٢۱ رمضان - شهادت حضرت علی(ع) - سال ۴٠ هجری قمری پس از ضربت خورد + ن حضرت علی(ع) ، ایشان تا شب ٢۱ رمضان، در بستر بیماری بود و در این شب گاهی + بی هوش می گردید و گاهی به هوش می آمد . سرانجام چشمان مبارکش را بر هم گذاشت + و پاهای خود را به سوی قبله نمود و گفت: اشهد ان لا اله الا الله وحده لا شر + یک له و اشهد انّ محمداً عبده و رسوله. این کلمات را گفت و روح مبارکش به اعل + ی علیین پرواز کرد. امام حسن مجتبی(ع) و امام حسین(ع) ، او را غسل و کفن کرده + و طبق سفارش آن حضرت، شبانه وی را در بیرون شهر کوفه، در جایی که هم اکنون م + عروف به نجف اشرف است، به خاک سپردند . +DTEND;VALUE=DATE:20120811 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120810 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت حضرت علی تعطیل +UID:GHAMARI14330921-392 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120812 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120811 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۱ مرداد +UID:FARSIDATE13910521 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DTEND;VALUE=DATE:20120812 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120811 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شب قدر +UID:GHAMARI14330922-393 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120813 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120812 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٢ مرداد +UID:FARSIDATE13910522 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120814 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120813 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٣ مرداد +UID:FARSIDATE13910523 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:شورای عالی انقلاب فرهنگی روز ٢٣ مرداد سال ۱٣٨٧ را به مناسبت ‌پي + روزی حزب‌الله لبنان بر رژيم صهيونيستی، به نام «روز مقاومت» نامگذاری كرد.\n +DTEND;VALUE=DATE:20120814 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120813 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز مقاومت اسلامی +UID:SHAMSI13910523-437 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120815 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120814 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۴ مرداد +UID:FARSIDATE13910524 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120816 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120815 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۵ مرداد +UID:FARSIDATE13910525 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120817 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120816 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۶ مرداد +UID:FARSIDATE13910526 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120817 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120816 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:آغاز بازگشت آزادگان به میهن اسلامی ( ۱٣۶٩ ه ش) +UID:SHAMSI13910526-438 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120818 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120817 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٧ مرداد +UID:FARSIDATE13910527 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120819 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120818 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٨ مرداد +UID:FARSIDATE13910528 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:پس از شکست کودتای ٢۵ مرداد ۱٣٢٢ ، کودتای دوم با طرح مراحلی چون + تلاش برای عزل مصدق و انتخاب زاهدی به نخست‌وزیری، اقدام برای جلب حمایت نظام + یان از کودتا و کشاندن اوباش و چاقو کشان به خیابان‌ها و حمله به اداره‌های د + ولتی و ایجاد ترس و وحشت در میان مردم آغاز شد. +DTEND;VALUE=DATE:20120819 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120818 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:کودتای آمریکا برای بازگرداندن شاه +UID:SHAMSI13910528-284 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120820 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120819 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٩ مرداد +UID:FARSIDATE13910529 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120821 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120820 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣٠ مرداد +UID:FARSIDATE13910530 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120821 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120820 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت علامه مجلسی +UID:SHAMSI13910530-285 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم قمری +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱ شوال - عید سعید فطر نخستین روز ماه شوال، عید سعید فطر است و ا + ین روز، عید مشترک تمامی مسلمانان جهان، از هر مذهب و طایفه ای می باشد. مؤمن + ان، با پشت سر گذاشتن ماه مبارک رمضان و تزکیه نفس و پالایش روح و روان و تعب + د و تلاش عبادی در این ماه شریف، رابطه نیکوی خویش را با خالق خود نزدیکتر و + صمیمانه تر می کنند و رضا و خرسندی پروردگار متعال را به دست می آورند. +DTEND;VALUE=DATE:20120821 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120820 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:عید سعید فطر تعطیل +UID:GHAMARI14331001-394 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120822 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120821 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣۱ مرداد +UID:FARSIDATE13910531 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:بنا به در خواست جمهوری اسلامی ایران، ٢١ آگوست (٣٠ مرداد ماه ) ا + ز سوی سازمان کنفرانس اسلامی به عنوان روز جهانی مسجد نامگذاری شده است که مت + عاقب آن از این تاریخ یک هفته، هفته تکریم، تجلیل، اعزاز و اکرام مساجد است. + ٢١ آگوست مصادف است با به آتش کشیدن مسجد الاقصی توسط صهیونیست جهانی. هفته ت + کریم و تجلیل مساجد از ٣٠ مرداد ماه تا ۵ شهریورماه در کشور ایران به طور گست + رده برگزار می شود . +DTEND;VALUE=DATE:20120822 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120821 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی مسجد +UID:MILADI20120821-417 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120823 +DTSTAMP:20120614T172321 +DTSTART;VALUE=DATE:20120822 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱ شهریور +UID:FARSIDATE13910601 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:روز اول شهریورماه، به پاس بزرگداشت ابوعلی سینا ستاره پرفروغ عرص + ه طب در ایران، روز پزشک نامیده شده است. " ابوعلی حسین بن عبدالله " معروف ب + ه ابن سینا ، پدرش از مردم بلخ و مادرش ستاره از اهل افشنه نزدیک بخارا بود.ا + و در سال ٣٧٠ هجری قمری در افشنه یا خورمشین متولد شد و در بخارا به کسب علم + پرداخت.ادبیات، قرآن، فقه و حساب را نزد پدر آموخت و سپس نزد ابوعبدالله ناتل + ی منطق، هندسه و نجوم را فرا گرفت، از آن پس به تعقیب علوم طبیعی، مابعدالطبی + عه و طب پرداخت .ابن سینا پس از معالجه نوح بن منصور پادشاه سامانی به دربار + نوح راه یافت و در سن بیست و یک سالگی شروع به تالیف کتب مختلف نمود و پس از + چندی در سراسر ایران شهرت بسزائی یافت. وی سالهای آخر عمر خود را دراصفهان در + حمایت علاءالدوله کاکویه گذرانید و در سفری که همراه او به همدان می رفت بیم + ار شد و به سال ۴٢٨ درگذشت آرامگاه وی هم اکنون در شهر همدان قرار دارد.ابن س + ینا عمر خود را در راه کسب علم و دانش و تالیف کتب مختلف صرف کرد و آنی از کا + ر علمی فراغت نیافت.تعداد تالیفات او تا یکصد و بیست کتاب گفته شده که اغلب آ + نها به زبان عربی است و از آن جمله کتاب شفا در فلسفه و حکمت،قانون در طب واش + ارات شهرت جهانی دارد. +DTEND;VALUE=DATE:20120823 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120822 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت بوعلی‌سینا و روز پزشک +UID:SHAMSI13910601-286 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120824 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120823 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢ شهریور +UID:FARSIDATE13910602 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120824 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120823 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:آغاز هفته دولت +UID:SHAMSI13910602-287 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120825 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120824 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣ شهریور +UID:FARSIDATE13910603 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120826 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120825 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۴ شهریور +UID:FARSIDATE13910604 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:همه ساله در هفته دولت روز ٤شهریور به عنوان روز کارمند اختصاص می + یابد و در این روز به منظور تجلیل از کارگزاران دولت جمهوری اسلامی و ارج نه + ادن به خدمت، با تبیین ملاک های انتخاب، کارمندان نمونه به عنوان نمایندگان خ + یل عظیم کارکنان نظام در اقصی نقاط کشور، انتخاب و مورد تشویق و تقدیر قرار م + ی گیرند. +DTEND;VALUE=DATE:20120826 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120825 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز کارمند +UID:SHAMSI13910604-288 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120827 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120826 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۵ شهریور +UID:FARSIDATE13910605 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:«ابوبکر محمد بن زکریای رازی» از مفاخر دانشمندان ایران و جهان و + کاشف الکل در ۵ شهریور ماه سال ٢٠٩ هجری شمسی در ری متولد شد. رازی هوشی سرشا + ر و حافظه ای قوی در فراگیری علوم داشت و با اینکه از ۴٠ سالگی بطور جدی به ک + سب علوم پرداخت در مد ت ٢٠ سال به پیشرفتهای خارق العاده ای در علوم مختلف دس + ت یافت. رازی کاشف بزرگ ایرانی دهها تألیف از خود به یادگار گذاشته است که از + آن جمله به آثارش در «علوم پزشکی، ریاضیات، نجوم، الهیات و کیمیا» و دهها کت + اب دیگر درباره موضوعات مختلف می توان اشاره کرد. «الحاوی» یکی از مهمترین کت + اب های رازی است که شامل همه نظرات پزشکی قبل از خود اوست و به قول مورخان ار + وپایی بزرگترین دایره المعارف طبی به زبان عربی است اما عمر زکریای رازی مهلت + نداد تا آن را به اتمام برساند. ۴۱٢ صفحه از کتاب «الحاوی» درباره داروسازی + است و نیز یکی از آثار ارزنده رازی کتابی است که در موزه آستان قدس موجود است + . او در این کتاب شکل گیاهان دارویی را نیز ترسیم کرده است. رازی این نابغه ع + لم شیمی و داروسازی علاوه بر تألیفات ارزشمند متعدد، بزرگترین نتیجه تحقیقات + علمی خود یعنی «الکل» را که کشف آن کاری در خور ستایش و خدمتی ارزنده به جهان + علم بود از خود به یادگار گذاشت . +DTEND;VALUE=DATE:20120827 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120826 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت محمد بن زکریای رازی و روز داروسازی +UID:SHAMSI13910605-289 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120828 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120827 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۶ شهریور +UID:FARSIDATE13910606 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120829 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120828 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٧ شهریور +UID:FARSIDATE13910607 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120830 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120829 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٨ شهریور +UID:FARSIDATE13910608 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:روز مبارزه با تروریسم( شهادت مظلومانه شهیدان رجائی و باهنر- ۱٣۶ + ٠ ه.ش) پدیده تروریسم، موضوعی است که برای ما ایرانیان که از قربانیان آن هست + یم، آشناست. آمریکایی‏ها به مدت دو دهه، سازمان تروریستی منافقین را زیر چتر + حمایت مالی، سیاسی و تبلیغی خود درآوردند و همه گونه امکانات در اختیارشان قر + ار دادند و از جنایات تروریستی آنان بر ضد مردم یا مسئولان نظام جمهوری اسلام + ی حمایت کردند. این گروهک شیطان‏صفت با شیوه قهرآمیز و ترورهای فراوان، درصدد + حذف فیزیکی عناصر کار آمد و طراحان نظام بر آمد تا با ایجاد خلأهای جدی در ا + رکان حساس کشور، ضربه‏ای اساسی به جمهوی اسلامی ایران وارد آورد. ترور شهدای + محراب، شهدای هفتم تیر و شهدای هشتم شهریور، برخی از مهم‏ترین این ترورها به + شمار می‏آید. در این راستا، هشتم شهریور، سالروز شهادت مظلومانه شهیدان باهنر + و رجایی، «روز مبارزه با تروریسم» نام‏گذاری شده است. +DTEND;VALUE=DATE:20120830 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120829 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز مبارزه با تروریسم +UID:SHAMSI13910608-290 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120831 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120830 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٩ شهریور +UID:FARSIDATE13910609 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120901 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120831 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٠ شهریور +UID:FARSIDATE13910610 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در ایران اولین بانک ایرانی که با سرمایه‎ ی ایرانی شکل گرفت «بان + ک پهلوی و قشون» بود که در حال حاضر تبدیل به «بانک سپه» شده است، بعد از انق + لاب تاریخچه ‎ی بانکداری دچار تحول شد و در ۱٧ خرداد ماه سال ۱٣۵٨ شمسی، شورا + ی انقلاب، نظام بانک‎داری کشور را ملی اعلام کرد. آنچه در بانکداری اسلامی مد + نظر است کارآمدی بانکداری بدون ربا در ایجاد عدالت اجتماعی است. بانک‎داری ا + سلامی بایستی اولین هدف نظام اقتصاد اسلام را که عدالت اجتماعی است تأمین کند + . در ایران به دنبال پیروزی انقلاب اسلامی و برقراری جمهوری اسلامی، لزوم است + قرار نظام اقتصاد اسلامی بعنوان یکی از ضرورتهای اساسی کشور مطرح شد. مهمترین + اقدام عملی در این جهت می توانست ریشه کن کردن ربا از سیستم بانکی کشور باشد + تا بدینوسیله بنیان یک اقتصاد توحیدی مبتنی بر قسط و عدل گذارده شود. بهمین + منظور پس از انقلاب در سال ۱٣۵٨ اقداماتی در جهت اسلامی کردن نظام بانکی بعمل + آمد، که این اقدامات را می توان در کوششهای اولیه برای حذف بهره و برقراری ک + ارمزد در سیستم بانکی و تأسیس بانک اسلامی و توسعه صندوقهای قرض الحسنه خلاصه + نمود +DTEND;VALUE=DATE:20120901 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120831 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بانکداری اسلامی +UID:SHAMSI13910610-291 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120902 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120901 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۱ شهریور +UID:FARSIDATE13910611 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:با توجه به تمدن غنی ایران ورود صنعت چاپ به ایران تحول شگرفى در + آثار ادبى، فرهنگى آن و همچنین اسلام به حساب مى آید. اولین چاپخانه را در ای + ران مسیحیان در اصفهان در عهد شاه عباس دوم صفوى دایر نمودند که بنا به دلائل + ی با موفقیت روبرو نشد. در سال ۱٢٣٣ق عباس میرزا کارخانه چاپ سربى را در تبری + ز دایر و اولین کتاب چاپ سربى را منتشر کرد و بدین ترتیب نشر کتاب از دستنویس + به چاپ تغییرِ ماهیت داد. ولى چاپ سربى در ایران دیرى نپایید و چاپ سنگى جای + گزین آن گردید. نخستین مطبعه چاپ سنگى را محمدصالح شیرازى از روسیه به تبریز + وارد کرد و اولین نسخه اى که در آن مطبعه چاپ شد قرآن مجید به خط میرزا حسین + خوشنویس معروف به سال ۱٢۵٠ بود. از اولین کتاب هاى چاپ سنگى ایران مى توان کت + اب هاى زادالمعاد تألیف علامه محمدباقر مجلسى چاپ شده در سال۱٢۵۱ق وحدیقةالشی + عه تألیف ملااحمد مقدس اردبیلى چاپ شده در ۱٢۶٠ق. نام برد. از میان روزنامه ه + ا نیزمی توان روزنامه ملتى تبریز و روزنامه وقایع اتفاقیه را نام برد. در اوا + یل سده چهاردهم هجرى چاپ سربى دوباره به کار افتاد و به تدریج جاى چاپ سنگى ر + ا گرفت. شوراى عالى انقلاب فرهنگى کشور هر سال روز یازدهم شهریور را به عنوان + روز صنعت چاپ نامگذارى کرده است. +DTEND;VALUE=DATE:20120902 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120901 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز صنعت چاپ +UID:SHAMSI13910611-292 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120903 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120902 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٢ شهریور +UID:FARSIDATE13910612 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:۱٢شهريور سالروز شهادت رئيسعلي دلواري به عنوان روز ملي مبارزه با + استعمار انگليس در تاريخ كشور به ثبت رسيد.\n +DTEND;VALUE=DATE:20120903 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120902 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز مبارزه با استعمار انگلیس +UID:SHAMSI13910612-439 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120904 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120903 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٣ شهریور +UID:FARSIDATE13910613 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:ابوریحان محمد بن احمد بیرونی- از دانشمندان بزرگ ایران در علوم ح + کمت و اخترشناسی و ریاضیات و تاریخ و جغرافیا-در سال ٣۶٢ هجری قمری دراطراف خ + وارزم متولد شد و به این خاطر به بیرونی یعنی خارج از خوارزم معروف شده است. + او از اولین کسانی است که به پیدا کردن وزن مخصوص بسیاری از اجسام مبادرت کرد + و آن‌چنان این کار را دقیق انجام داد که اختلاف وزن‌های محاسبه‌شده‌اش با وز + ن‌هایی که دانشمندان در قرن‌های اخیر با توجه به تمام وسایل جدید خود تهیه کر + ده‌اند، بسیار ناچیز است. ابوریحان در طول عمر خود به شهرهای مختلفی سفر می‌ک + رد و به اندازه‌گیری طول و عرض جغرافیایی آن شهرها می‌پرداخت و سپس موقعیت هر + شهر را روی یک کره مشخص می‌کرد و پس از سال‌ها توانست آن نقاط را روی یک نقش + ه مسطح پیاده کند و این مقدمه علم کارتوگرافی بود که این‌کار با ابوریحان شرو + ع شد. نزد ابونصر منصور علم آموخت، در ۱٧ سالگی ارتفاع خورشیدی نصف‌النهار را + رصد کرد و بدین ترتیب عرض جغرافیایی زمینی آن را استنتاج کرد. ابوریحان در ط + ول زندگی خود حدود یک‌صد و ۴٣ کتاب در زمینه‌های نجوم، هیأت، منطق و حکمت نوش + ت. +DTEND;VALUE=DATE:20120904 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120903 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت ابوریحان بیرونی +UID:SHAMSI13910613-293 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:تعاون و همکاری از اعمال پسندیده ای است که علاوه بر دلایل منطقی + و علمی، اقتصادی و اجتماعی... آن به اشکال مختلف نیز مورد تأیید و تشویق دین + مبین اسلام قرار داشته است. در واقع تعاون در زمینه های گوناگون موجب شکوفایی + جامعه است. با تقویت و گسترش فرهنگ تعاون علاوه بر افزایش وحدت و یکدلی در ع + رصه های اجتماعی، ابتکارها و خلاقیت های فردی و جمعی نمایان تر می شود. به دل + یل بهره مند شدن از ثمرات تعاونی و به موجب اصل چهل و چهارم قانون اساسی نظام + اقتصادی جمهوری اسلامی ایران بخش تعاونی در کنار پایه های دولتی و خصوصی مطر + ح شده است. به منظور تحقق اهداف مقرر، قانون بخش تعاونی اقتصاد کشور در سیزده + م شهریور سال ۱٣٧٠ به تصویب مجلس شورای اسلامی رسید و به همین مناسبت، این رو + ز به عنوان روز تعاون در کشور نامگذاری شد. +DTEND;VALUE=DATE:20120904 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120903 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز تعاون +UID:SHAMSI13910613-294 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120905 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120904 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۴ شهریور +UID:FARSIDATE13910614 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:شهید قدوسی در سال ۱٣٠۶ ه ش در خانواده ای روحانی در شهر نهاوند ب + ه دنیا آمد. او تحصیلات مقدماتی اش را در زادگاهش به انجام رساند و در سال ۱٣ + ٢٣ه ش وارد حوزه علمیه قم شد و دوره کامل فقه و اصول را در محضر آیت الله الع + ظمی بروجردی و امام خمینی ره به پایان رسانید و به در جه اجتهاد نایل آمد. شه + ید قدوسی فلسفه را از استاد بزرگوار خویش علامه طباطبایی فراگرفت. قدوسی در م + یدان مبارزه علیه رژیم شاهنشاهی از پیشگامان بود و سابقه مبارزاتی وی به ساله + ا پیش از ۱۵ خرداد ۱٣۴٢ بر می گردد. شهید قدوسی پس از پیروزی انقلاب اسلامی ب + ه فرمان امام خمینی ره به سمت دادستان انقلاب اسلامی برگزیده شد و پس از سی و + یک ماه خدمت به دنبال انفجار یک بمب آتش زا در محل دادستانی کل انقلاب اسلام + ی به فیض عظمای شهادت نایل آمد. همچنین در این روز سرتیپ وحید دستجردی که خدم + ات شایانی به کشور و انقلاب کرد توسط منافقین کوردل به درجه رفیع شهادت نایل + آمد.رییس شهربانی کل کشور( شهید دستجردی) در سال ۱٣۶٠هجری شمسی درحادثه بمب گ + ذاری دفترنخست وزیری به درجه شهادت نایل آمد. +DTEND;VALUE=DATE:20120905 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120904 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت آیت‌الله قدوسی و سرتیپ وحید دستجردی +UID:SHAMSI13910614-295 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120906 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120905 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۵ شهریور +UID:FARSIDATE13910615 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120907 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120906 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۶ شهریور +UID:FARSIDATE13910616 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120908 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120907 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٧ شهریور +UID:FARSIDATE13910617 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در اولین ساعات جمعه ۱٧ شهریور سال ۱٣۵٧ارتشبد اویسى از رادیوى ته + ران و حومه اعلام حکومت نظامى کرد........ مردم تهران که از حکومت نظامى اطلا + ع نداشتند پیش از ساعت ۶ صبح و پس از اداى فریضه نماز، از خانه ها بیرون آمده + و سیل آسا روى به خیابانها آوردند، مرکز تجمع آنان میدان ژاله (میدان شهداى + کنونى) بود،‌همین که مردم به خیابانها رسیدند، ناگهان با دیدن تانک ها و زره + پوشهاى نظامى و ماموران مسلسل به دست حکومت نظامى غافلگیر شدند. مردم بدون اع + تنا به سربازان به حرکت خود ادامه دادند از خیابانهاى اطراف سیل، انبوه جمعیت + با سر دادن شعارهاى انقلابى به سمت میدان ژاله در حرکت بودند ماموران مسلح پ + س از چند بار اخطار دادند، فریاد الله اکبر و لا اله الا الله همه جا را پر ک + رد. با نزدیک شدن ظهر بتدریج میدان ژاله که اینک به میدان شهدا تبدیل گشته بو + د. در هاله اى از سکوت مرگبار فرو رفت. ۱٧ شهریور از ایام الله است؛ روزى که + شهدا سند «استقلال، آزادى، جمهورى اسلامى» را با خون خویش امضا کردند و با خر + وش سرخ تکبیر، کاخ سیاه استکبار را سرنگون ساختند. +DTEND;VALUE=DATE:20120908 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120907 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:قیام ۱٧ شهریور +UID:SHAMSI13910617-296 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120909 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120908 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٨ شهریور +UID:FARSIDATE13910618 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120910 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120909 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٩ شهریور +UID:FARSIDATE13910619 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:سید محمود علایی طالقانی در ۱۵ اسفند ماه سال ۱٢٨٩ به‌دنیا آمد. س + ید محمود در سن هفت سالگی سواد خواندن و نوشتن را کامل آموخت. در سال ۱٣۱٠ پد + ر ایشان مریض شدند و دارفانی را وداع گفتند. در همان سال به نجف اشرف رفت و ا + ز اساتید معروف بهره برد و پس از شش سال از عالم بزرگ آیت‌الله اصفهانی اجازه + ٔ اجتهاد گرفت و به ایران بازگشت.ایشان رسماً وارد مبارزه با رژیم و برای اول + ین بار توسط مأموران رضاخان دستگیر و به شش ماه حبس محکوم شد. آقای طالقانی د + ر سال ۱٣٢٧ رسماً امام جماعت مسجد هدایت شد. یکی از کارهای مهمی که آقای طالق + انی در سال ۱٣۴٠ انجام داد حضور در هیأت مؤسس نهضت آزادی ایران بود. مهندس مه + دی بازرگان و دکتر یدالله سحابی عضو نهضت آزادی را تشکیل می‌دادند.اعلامیه‌ها + ی معروف آیت‌الله طالقانی معروف به دیکتاتور خون می‌ریزد در صدها نسخه انتشار + یافت و بعدها برایش پرونده‌ای شد که او را به ده سال زندان محکوم کردند. یکی + از مهم‌ترین نظرات آقای طالقانی بعد از انقلاب طرح مسأله شوراها بود. اولین + نماز جمعه تهران به امامت ایشان در ۵ مرداد ماه در دانشگاه تهران برگزار شد و + سپس ایشان به عنوان نمایندهٔ مردم در مجلس خبرگان انتخاب شد و عاقبت در ۱٩ ش + هریور سال ۱٣۵٨ از دنیا رفت. +DTEND;VALUE=DATE:20120910 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120909 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:وفات آیت‌الله سید محمود طالقانی +UID:SHAMSI13910619-297 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120911 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120910 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٠ شهریور +UID:FARSIDATE13910620 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:آیت اللّه‏ سید اسدالله مدنی دهخوارقانی، در سال ۱٢٩٣، در روستای + آذرشهر یا دهخوارقان، از توابع تبریز پا به عرصه وجود نهاد. آیت الله مدنی در + نخستین برخورد آشکار با رژیم طاغوتی، مردم را به مقابله با تولید و فروش محص + ولات کارخانه بزرگ مشروب‏سازی آذرشهر تشویق کرد و خواستار برچیده شدن فوری ای + ن کارخانه شد.آیت‏الله‏سید اسدالله مدنی، درشمار عالمانی است که از عمر شریف + خود در راه احیای معارف اسلامی و نشر فرهنگ اهل‏بیت علیهم‏السلام بهره برد و + در سنگرهای گوناگون،به ستیز با جهل و تباهی و ستم پرداخت. وی از جوانی قدم در + راه مبارزه با طاغوت نهاد و در این راه، دستگیری‏ها و تبعیدهای مداوم را به + جان خرید. همزمان با اوج‏گیری قیام مردمی در خرداد ۱٣۴٢ و تبعید امام خمینی ر + حمه‏الله به نجف اشرف، همواره مدافع امام بود و در کنار آن رهبر فرزانه، در پ + اسداری از اسلام کوشید. وی پس از انقلاب نیز در کنار امام و یاران گران‏قدرش، + در حفظ آرمان‏های نظام اسلامی و دفع توطئه‏های دشمنان نظام، عاشقانه تلاش می + ‏کرد. شهید مدنی،پس از ده‏ها سال مبارزه بی‏امان با ظلم طاغوت، در بیستم شهری + ورماه سال۱٣۶٠، در محراب نماز جمعه تبریز پس از اقامه نماز جمعه و پیش از اقا + مه نماز عصر، به دست منافقان کوردل به شهادت رسید و سر به سجودی ابدی نهاد. +DTEND;VALUE=DATE:20120911 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120910 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت آیت‌الله مدنی +UID:SHAMSI13910620-298 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120912 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120911 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۱ شهریور +UID:FARSIDATE13910621 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20120912 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120911 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز سینما +UID:SHAMSI13910621-299 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120913 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120912 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٢ شهریور +UID:FARSIDATE13910622 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120914 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120913 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٣ شهریور +UID:FARSIDATE13910623 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم قمری +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٢۵ شوال - شهادت امام جعفر صادق(ع) - سال ۱۴٨ هجری قمری امام صادق + (ع) در زمان خلافت با هشت خلیفه اموی و دو خلیفه عباسی، هم عصر بود و از اکثر + آن ها رنج ها و آزارهای فراوانی متحمل گردید. سر انجام آن حضرت در ۶۵ سالگی + به دست عوامل منصور دوانقی مسموم شد و بر اثر آن، به شهادت رسید. پس از شهادت + آن حضرت، بدن مطهرش را حضرت امام موسی کاظم(ع) غسل داد و بر وی کفن پوشید و + در قبرستان بقیع، در کنار سه امام معصوم دیگر، یعنی امام حسن مجتبی(ع)، امام + زین العابدین(ع) و امام محمد باقر(ع) به خاک سپرد . +DTEND;VALUE=DATE:20120914 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120913 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت امام جعفر صادق تعطیل +UID:GHAMARI14331025-395 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120915 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120914 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۴ شهریور +UID:FARSIDATE13910624 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120916 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120915 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۵ شهریور +UID:FARSIDATE13910625 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120917 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120916 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۶ شهریور +UID:FARSIDATE13910626 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120918 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120917 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٧ شهریور +UID:FARSIDATE13910627 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:سید محمد حسین بهجت تبریزی متخلص به شهریار در سال ۱٢٨۵ شمسی در خ + انواده ای اهل ادب در تبریز به دنیا آمد. ایام کودکی او با جنبش آزادی خواهان + مشروطه به رهبری ستارخان و باقرخان همراه بود. وی در کودکی با قرآن و دیوان + حافظ آشنا شد. پس از تحصیلات مقدماتی حوزوی به تهران رفت و وارد مدرسه دارالف + نون گردید. او در نیشابور به دیدار کمال الملک نقاش مشهور رفت و شعری درباره + وی سرود. شهریار از آن پس مدتی در تهران سکونت داشت و از سال ۱٣۱٩ ش. در تبری + ز اقامت گزید. شهریار به عنوان یکی از مشهورترین غزل سران معاصر مطلوب خاص و + عام است. حیدربابا نام کوهی در زادگاه استاد محمد حسین بهجتی تبریزی ملقب به + شهریار است. منظومه «حیدر بابایه سلام» نخستین بار در سال ١٣٣٢ منتشر شد و از + آن زمان تاکنون به زبانهای مختلفی ترجمه شده است. شهریار سرانجام در بیست و + هفتم شهریور ۱٣۶٧ ش. در سن ٨٢ سالگی در تهران درگذشت و در مقبره مقبرة الشعرا + ی تبریز، که مدفن بسیاری از شعرا و هنرمندان آن دیار است، به خاک سپرده شد. ب + منظور پاسداشت مقام ادبی استاد محمد حسین شهریار و نکوداشت این شاعر پرآوازه، + سالگرد درگذشت وی برابر با بیست و هفتم شهریور، به عنوان روز شعر و ادب فارس + ی نامگذاری شده است. +DTEND;VALUE=DATE:20120918 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120917 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت شهریار و شعر و ادب فارسی +UID:SHAMSI13910627-300 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120919 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120918 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٨ شهریور +UID:FARSIDATE13910628 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱ ذیقعده - میلاد فرخنده حضرت فاطمه معصومه(س). - سال ۱٧٣ قمری حض + رت معصومه (س) در این روز فرخنده دیده به جهان گشودند . امام موسی کاظم(ع) پد + ر و نجمه که ، معروف به ام البنین بود مادرشان می باشد . امام رضا(ع) به همرا + ه قاسم (ع) برادر بزرگوار ایشان می باشند +DTEND;VALUE=DATE:20120919 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120918 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت معصومه +UID:GHAMARI14331101-396 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120920 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120919 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٩ شهریور +UID:FARSIDATE13910629 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120921 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120920 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣٠ شهریور +UID:FARSIDATE13910630 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120922 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120921 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣۱ شهریور +UID:FARSIDATE13910631 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:٣۱ شهریور سالروز شروع جنگ تحمیلی از سوی رژیم بعث عراق علیه جمهو + ری اسلامی ایران، به عنوان آغاز هفته دفاع مقدس نامگذاری شده است. دوران هشت + ساله دفاع مشروع امت سلحشور ایران در حفظ و اعتلای نظام مقدس اسلامی و حراست + از مرزهای عزت و شرف این رمز و بوم، به مثابه یکی از حساس ترین و بارزترین بر + هه های حیات راستین این ملت، همچون نگینی تابناک، تا همیشه زمان، بر تارک تار + یخ حماسه و ایثار و پایداری آزادگان جهان می درخشد. جنگ تحمیلی عراق علیه ایر + ان ٢٨٨٧ روز به طول انجامید که طی آن هزار روز نبرد فعال صورت گرفت که ٧٩٣ رو + ز حمله از سوی رزمندگان اسلام بود و ٢٠٧ روز از سوی ارتش متجاوز بعثی در طول + جنگ شمار ٣٨۱ هزار و ۶٨٠ نفر از نیروهای دشمن کشته و یا زخمی شدند و ٧٢ هزار + نفر به اسارت نیروهای اسلام در آمدند. در این هشت سال ٣٧۱ فروند هواپیما و ٨٢ + فروند بالگرد دشمن منهدم شد. ۱٧٠٠ دستگاه تانک و نفربر، ۴٨٠ قبضه توپ و سه ه + زار و ٣۶٣ دستگاه خودرو نظامی به غنیمت ایران در آمد و و پنج هزار و ٧۵٨ دستگ + اه تانک و نفربر، ۵٣٢ قبضه توپ و پنج هزار و ۱۵٢ دستگاه و خودرو نظامی دشمن م + نهدم گردید . +DTEND;VALUE=DATE:20120922 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120921 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:آغاز جنگ تحمیلی و هفته دفاع مقدس +UID:SHAMSI13910631-301 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120923 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120922 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱ مهر +UID:FARSIDATE13910701 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120924 +DTSTAMP:20120614T172322 +DTSTART;VALUE=DATE:20120923 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢ مهر +UID:FARSIDATE13910702 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120925 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120924 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣ مهر +UID:FARSIDATE13910703 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120926 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120925 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۴ مهر +UID:FARSIDATE13910704 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120927 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120926 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۵ مهر +UID:FARSIDATE13910705 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:عملیات بزرگ ثامن الائمه با رمز نورانی «نَصر من الله و فتح قریب» + در جبهه جنوب شرق و شمال آبادان در شرق رود کارون در وسعت ۱۵٠ کیلومتر مربع + از ۵ مهر ۱٣۶٠، با هدف شکست حصر آبادان و با همکاری ارتش و سپاه انجام شد. بد + ین ترتیب، اولین همکاری سپاه و ارتش در این عملیات و در مقیاس وسیع به مرحله + ظهور رسید و تحقق یافت.با آغاز جنگ تحمیلی در شهریور ۱٣۵٩ بخشهایی از شهرهای + مرزی کشور که به ناگاه هدف تجاوزات آشکار رژیم بعث عراق قرار گرفته بودند، عل + ی رغم ۴٠ روز مقاومت جانفشانه مردم به دست دشمن افتاد که در این میان شهر آبا + دان نیز به محاصره کامل نیروهای بعثی درآمد. در همین زمان ارتش عراق در آبان + ماه ۱٣۵٩ وارد آبادان شد، اما به دنبال صدور فرمان تاریخی حضرت امام خمینی (ر + ه) مبنی بر شکستن حصر آبادان، این مساله اهمیت خاصی برای رزمندگان اسلام یافت + .بدین طریق بود که طرح عملیات ثامن الائمه تکمیل شد و پس از انجام مقدمات، زم + ان حمله، ساعت یک بامداد روز پنجم مهر ۱٣۶٠ به واحدهای عمل کننده اعلام شد. +DTEND;VALUE=DATE:20120927 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120926 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شکست حصر آبادان +UID:SHAMSI13910705-302 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120928 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120927 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۶ مهر +UID:FARSIDATE13910706 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:جهانگردی در دنیای امروز، یکی از بهترین ابزارهای تبادل تعامل فره + نگی است و سیاحت یا گشت و گذار در سرزمین مختلف، از روش های موفق و گذران سال + م اوقات فراغت می باشد. جهانگردی در واقع مجموعه ای از سیر و سفرها و سیاحت ه + ای داخلی و خارجی است که با اهداف و نیت های مختلف انجام می گیرد. جهانگرد کس + ی است که به منظور تفریح، بازدید از نقاط دیدنی، معالجه، تجارت، ورزش و زیارت + به کشور دیگر سفر کند، مشروط بر این که مدت اقامت از بیست و چهار ساعت کمتر + و شش ماه بیشتر نباشد و در فاصله ای کمتر از هفتاد کیلومتر انجام نگیرد. در ا + یران، مسأله جهانگردی با نگرش جدید از سال ۱٣۱٧ش، مورد توجه قرار گرفت و برای + اولین بار در وزارت کشور، اداره ای تحت عنوان امور جهانگردی، سازمان یافت. د + ر سال ۱٣٢٠، این اداره به شورای عالی جهانگردی تغییر نام داد و در سال ۱٣۴٢، + سازمان جلب سیاحان، تصویب و کار خود را شروع کرد. در حال حاضر سازمان ایرانگر + دی و جهانگردی، زیر نظر وزارت فرهنگ و ارشاد اسلامی، متولی این امر می باشد. +DTEND;VALUE=DATE:20120928 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120927 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی جهانگردی +UID:MILADI20120927-418 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120929 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120928 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٧ مهر +UID:FARSIDATE13910707 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:هفتم مهرماه به نام «آتش نشانی و ایمنی» نامگذاری شده است. در واق + ع این روز بهانه ای است تا به گرامیداشت انسان هایی بپردازیم که از جان و آسا + یش خود در راه حفظ جان و آسایش ما می گذرند تا بتوانیم در امنیت زندگی کنم. ا + یمنی را مصونیت در برابر آسیب های ناشی از حوادث، اعم از طبیعی و غیرطبیعی مع + نا کرده اند.هدف از نامگذارى این روز به عنوان روز ملى ایمنى و آتش نشانى، تب + دیل ایمنى در کشور به یک فرهنگ میباشد. در کشور ما بیش از ۱۶٠ سال از تأسیس ا + ولین ایستگاه آتش نشانی در شهر تبریز به سال ۱٢٢۱ شمسی و نزدیک به هشتاد سال + از تأسیس آتش نشانی پایتخت می گذرد. پس از انقلاب اسلامی، با انحلال سازمان د + فاع غیر نظامی، فلسفه وجودی آتش نشانی های کشور توسط بندهای ۱۴ و ٢٠ ماده ۵۵ + قانون شهرداری تعریف گشت و از همین رو سازمان های آتش نشانی زیر مجموعه شهردا + ری ها قلمداد می شوند . +DTEND;VALUE=DATE:20120929 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120928 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز آتشنشانی و ایمنی +UID:SHAMSI13910707-303 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱۱ ذیقعده - میلاد مسعود امام علی بن موسی الرضا(ع) - سال ۱۴٨ هجر + ی قمری امام رضا(ع) در این روز در مدینه منوره دیده به جهان گشود و عالم هستی + را با انوار الهی و ذاتی خویش، منور ساخت. نام مبارکش: علی بن موسی الرضا(ع) + و پدرش امام موسی کاظم(ع (،‌ نام مادرش نجمه بود. تولد بابرکت امام رضا(ع) ر + ا برخی از معصومان پیش از وی، پیش گویی کرده و به آن بشارت داده بودند. مادر + امام رضا(ع) در حدیثی گفت: هنگامی که فرزندم رضا را به دنیا آوردم، پدرش امام + موسی کاظم(ع) به من فرمود: او را بگیر و خوب نگه دار زیرا او بقیه الله در ز + مین است. آن حضرت را از این جهت "رضا" نامیدند، که پسندیده خدا در آسمان و مو + رد خرسندی رسول خدا(ص) و ائمه اطهار(ع) در زمین بود و دوستان و دشمنان، به ات + فاق از وی خشنود و راضی بودند . +DTEND;VALUE=DATE:20120929 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120928 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت امام رضا +UID:GHAMARI14331111-397 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20120930 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120929 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٨ مهر +UID:FARSIDATE13910708 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:جلال الدین محمد ملقب به مولانا از بزرگترین عرفا، شعرا و حکمای ع + الی قدر اسلامی است که در ربیع الاول سال ۶٠۴ هجری قمری در بلخ به دنیا آمد. + پدرش واعظ سرشناس شهر، بهاء الدین محمد معروف به بهاء ولد بود که مدرس و واعظ + ی خوش بیان و خطیب بود. جلال الدین به روایتی ۱۴ ساله بود که پدرش بلخ را ترک + گفت و قصد حج کرد و به جانب بغداد رهسپار شد. هنگامی که به نیشابور رسیدند، + شیخ عطار کتاب اسرار نامه خود را به جلال الدین محمد هدیه داد و به پدرش گفت: + «زود باشد که پسر تو آتش در سوختگان عالم زند.» زندگی مولانا پس از آشنایی ب + ا شمس تبریزی که شوریده ای از شوریدگان روزگار خود بود دگرگون شد. شمس، مولان + ا را با افق دیگری از معنویت و عرفان آشنا کرد و روح او را در آسمانهای برتر + به پرواز درآورد. او در سال ۶۴٢ به قونیه وارد شد و در سال ۶۴٣ از قونیه به د + مشق رفت و مولانا را در آتش هجران گداخت.مولانا پس از آگاهی از اقامت شمس در + دمشق نخست با غزلها، نامه ها و پیام ها از او خواستار بازگشت شد و پسر خود را + به جستجوی شمس فرستاد. شمس این دعوت را پذیرفت و به سال ۶۴۴ به قونیه بازگشت + اما بار دیگر با جهل و خودخواهی مردم و تعصب عوام روبه رو شد و ناگزیر به سا + ل ۶۴۵ از قونیه رفت. +DTEND;VALUE=DATE:20120930 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120929 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت مولوی +UID:SHAMSI13910708-304 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121001 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120930 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٩ مهر +UID:FARSIDATE13910709 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در سال ۱٩٧٧ مجمع عمومی سازمان ملل متحد طی قطعنامه ای ٢٩ نوامبر + هر سال را روز همبستگی با ملت فلسطین تعیین نمود. در این قطعنامه نسبت به اشغ + ال سرزمین اعراب و فلسطینیان توسط اشغالگران اسرائیل و محروم بودن مردم فلسطی + ن از حقوق اولیه خود ابراز نگرانی شده است. تصویب این قطعنامه در حالی صورت گ + رفت؛ که در سی سال پیش در همین روز یعنی ٢٩ نوامبر سال ۱٩۴٧ مجمع عمومی سازما + ن ملل طی قطعنامه ای تفکیک فلسطین را تصویب و به رسمیت شناخت. آنچه مسلم است + این است که با گذشت سالیان متمادی؛ سازمان ملل و دیگر مجامع بین المللی در خص + وص قضیه فلسطین تنها به تصویب قطعنامه ها و نشست های اضطراری بسنده کرده و هی + چ اقدام جدی و عملی خاصی را در این خصوص انجام نداده اند. مردم دنیا طی سالیا + ن اخیر به وضوح شاهد سخت ترین فشارها، سرکوب ها و ترورهایی که بر مردم مظلوم + فلسطین وارد شده؛ بوده اند و کم تر کسى به داد آنان رسیدگى کرده است. در جهان + گسترده و مبتنى بر ارتباطات که بشریت بدان می بالد؛ فلسطین از جمله محک های + سنجش حقیقت بشمار می آید. +DTEND;VALUE=DATE:20121001 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120930 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز همبستگی با کودکان و نوجوانان فلسطینی +UID:SHAMSI13910709-305 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:روز ملی ناشنوایان، هفته جهانی بزرگداشت ناشنوایان مناسبت روز ملی + ناشنوایان در هفته چهارم سپتامبر هر ساله، تحت عنوان هفته جهانی ناشنوایان د + ر سراسر دنیا برگزار میشود. به نقل از فدراسیون جهانی ناشنوایان هدف از این ج + شن: "ترفیع فرهنگ ناشنوایان، دانسته هایی از زبان علم و اشاره، آگاهی مقامات + و سیاستمداران جامعه شنوا و همچنین عموم مردم از دستاوردهای این قشر و مشکلات + ی است که جامعه ناشنوایان با آنها روبرو میباشند." +DTEND;VALUE=DATE:20121001 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120930 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی ناشنوایان +UID:MILADI20120930-419 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:کشتیرانی یکی از مطرح ترین صنایع جهان در عرصه بین المللی باشد که + در عین حال مخاطره آمیزترین آنها نیز محسوب می شود. به تجربه ثابت گردیده اس + ت که بهترین راه افزایش امنیت در دریا با توسعه قوانین بین المللی امکان پذیر + خواهد بود که از نیمه قرن نوزدهم میلادی از سوی تمامی کشورهای تابعه به مورد + اجرا گذارده شده است. کشورهای متعددی با ارائه پیشنهاداتی خواستار تشکیل نها + دی بین المللی دائمی برای برقراری امنیت و افزایش آن شدند. در همین راستا در + سال ۱٩۴٨ میلادی طی کنفرانسی در ژنو سازمان بین دولتی شورایی در امور دریانور + دی ( (IMCOتأسیس گردید که بعدها به سازمان جهانی دریانوردی ((IMO تغییر نام د + اد. سازمان جهانی دریانوردی همه ساله روز جهانی دریانوردی را گرامی می دارد. + تاریخ دقیقی که به این مناسبت اختصاص یافته است در بین کشورها و دولتهای جهان + متغیر است، اما معمولاً هفته آخر سپتامبر (مصادف با اوایل مهر ماه) در اکثر + نقاط جهان به این مهم پرداخته می شود. +DTEND;VALUE=DATE:20121001 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20120930 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی دریا نوردی +UID:MILADI20120930-420 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121002 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121001 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٠ مهر +UID:FARSIDATE13910710 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:تا قبل از قرن بیستم و یکم میلادی، میانگین عمر، بسیار پایین بود. + اما بهبود وضع تغذیه و پیشرفت های چشمگیر پزشکی و ارتقای سطح بهداشت، سبب اف + زایش میانگین عمر گردیده است. وجود شمار روز افزون سالمندان در اکثر کشورها م + وجب شده که مقامات دولتی و برنامه ریزان اجتماعی، توجه بیشتری به این مسأله ا + براز نموده و به وضع مقررات تأمین اجتماعی مطلوب تر آنان همت گمارند. همچنین + با وجود کمک های مالی فرزندان به ویژه در کشورهای آسیایی، بازهم اتکای سالخور + دگان به تأمین اجتماعی بسیار است و از این رو باز هم حمایت های مادی و معنوی + دولت ها را در این زمینه طلب می کند. اگر چه در پرتو تحولات ناشی از انقلاب و + به دلیل آداب و رسوم فرهنگی در جامعه ما، کهنسالان از جایگاه ویژه ای برخورد + ار هستند. اما این بدان معنا نیست که هیچ سالمندی از محیط گرم خانواده اش محر + وم نمی ماند. زیرا همه ساله، بر شمار سالخوردگانی که به آسایشگاه های سالمندا + ن، در سراسر کشور مراجعه می کنند، یا از سوی اطرافیانشان به آنجا سپرده میشون + د، افزوده می شود. با این حال، به حکم الهی و فطری و سنّت اجتماعی، فرزندان ب + اید حرمت پدر و مادر خود را حفظ کنند و به ایشان احسان نمایند. +DTEND;VALUE=DATE:20121002 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121001 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی سالمندان +UID:MILADI20121001-421 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121003 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121002 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۱ مهر +UID:FARSIDATE13910711 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121004 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121003 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٢ مهر +UID:FARSIDATE13910712 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121005 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121004 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٣ مهر +UID:FARSIDATE13910713 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:سیستم نوین ایجاد نظم و امنیت داخلى یعنى سازمان پلیس در ایران به + حدود یکصد سال پیش مربوط مى‌‌باشد. شاه قاجار ناصرالدین شاه در سفرهاى سه گا + نه خود به اروپا و مشاهده پلیس نوین در آن کشورها و با استخدام یک مستشار بلژ + یکى به نام کنت دو بینو اولین سیستم پلیسى جدید را در ایران پایه گذارى نمود. + پلیس ایران براى مدتهاى طولانى از دو قسمت مهم پلیس شهرى و ژاندارمرى (مرزى و + روستایى) تشکیل شده بوده، کمیته انقلاب اسلامى نیز به عنوان یکى از ارکان مه + م حفظ نظم و امنیت داخلى و دفاع از ارزشهاى انقلاب در داخل کشور در بعد از پی + روزى انقلاب به این مجموعه افزوده شد. کثرت نیروهاى پلیس در بعد از انقلاب و + ضرورتهاى ادغام این نیروها باعث شد تا در سال ۱٣٧٠ با تصمیم مجلس شوراى اسلام + ى این سه نیرو در یکدیگر ادغام و سیستم پلیس واحد به وجود آید. +DTEND;VALUE=DATE:20121005 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121004 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز نیروی انتظامی +UID:SHAMSI13910713-306 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:سیزده سال پس از ورود امام خمینی (ره) به عراق و اقامت در نجف، به + دنبال فشارهای دولت بعثی این کشور برای محدود کردن فعالیت های سیاسی ایشان، + حضرت امام خمینی (ره) با چند تن از نزدیکان، صبح روز ۱٢ مهر ۱٣۵٧ش به سوی کشو + ر کویت مهاجرت کردند. ولی دولت کویت از ورود ایشان با وجود داشتن ویزا، جلوگی + ری نمود. از این رو، ساعاتی را در مرز ماندند. در ساعات پایانی این روز، مأمو + ران مرزی عراق به امام اطلاع دادند که بازگشتشان به نجف بلامانع است، اما اما + م از بازگشت به نجف خودداری کردند و شب را در بصره گذرانده، تصمیم گرفتند به + پاریس بروند، عراقی ها نیز موافقت خود را اعلام کردند.عصر روز سیزدهم مهر ۵٧، + امام و همراهان به بغداد منتقل شده و روز بعد، این مهاجر بزرگ با کاروان کوچ + ک همراهش برای خدا، به سوی خدا و در راه، هجرتی تاریخی و سرنوشت ساز را آغاز + نمود و معظم له در محله «نوفل لوشاتو» در حومه پاریس اقامت گزید. +DTEND;VALUE=DATE:20121005 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121004 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:هجرت امام خمینی از عراق به پاریس +UID:SHAMSI13910713-307 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121006 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121005 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۴ مهر +UID:FARSIDATE13910714 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:از زمانی که انسان‌‌ راه اهلی کردن حیوانات را آموخت و به نگهداری + آنها در نزدیکی محل سکونت خود پرداخت، دامپروری همواره یکی از موضوعات مورد + توجه بشر گردید.ابتلای دامها به برخی بیماریها و تلفات وسیعی که در پی داشت و + نیز مشترک بودن بعضی بیماری‌ها میان دام و انسان، سبب گردید که رشتة دامپزشک + ی بعنوان رشته‌ای کاربردی مورد عنایت افراد جامعه قرار بگیرد.بررسی تاریخچة پ + یدایش تشکیلات دامپزشکی در جهان نشانگر آن است که، اغلب این تشکیلات به واسطة + بروز بیماری طاعون گاوی پدید آمده‌اند. ایران نیز از این ماجرا مستثنی نبوده + است. در زمان جنگ جهانی اول در سال ۱٩۱۶ و با سرایت بیماری طاعون گاوی به نو + احی شمالی و مرکزی ایران و ورود خسارات فراوان به دامپروری کشور، کم کم توجه + مقامات به ضرورت وجود این تشکیلات جلب شد و عاقبت در سال ۱٣٠٣ ش.‌‌با شیوع مج + دد این بیماری در همدان و اردبیل ادارة کوچک فلاحت در وزارت فوائد عامه، ایجا + د و عهده دار مبارزه با این بیماری گردید. +DTEND;VALUE=DATE:20121006 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121005 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز دامپزشکی +UID:SHAMSI13910714-308 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121007 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121006 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۵ مهر +UID:FARSIDATE13910715 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121008 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121007 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۶ مهر +UID:FARSIDATE13910716 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121009 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121008 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٧ مهر +UID:FARSIDATE13910717 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:بار دیگر روز جهانی کودک، روز پاسداشت کودک و کودکی، روز پاسداشت + نیک سرشتی انسان و ارج نهادن به این پاکی و مهر فرا رسید. روزی که باید اندیش + ه‌ای دوباره به آینده کنیم و کودکان را که مظهر آینده هستند، بیشتر دریابیم. + این روز بزرگ و این رویداد مبارک را به همه کودکان شادباش می گوییم. شانزده م + هرماه (٨ اکتبر) در برخی نقاط دنیا از جمله ایران روز جهانی کودک است. +DTEND;VALUE=DATE:20121009 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121008 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی کودک +UID:MILADI20121008-422 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121010 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121009 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٨ مهر +UID:FARSIDATE13910718 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:۱٧ مهرماه روز جهانی پست سالگرد تأسیس اتحادیه جهانی پست (UPU) رو + ز هفدهم مهر ۱٢۵٣ برابر با ٩ اکتبر ۱٨٧۴ میلادی نخستین بار به پیشنهاد هنریخ + ون استفان، مدیر کل پست کنفدراسیون آلمان شرقی قرار دادی با عنوان قرار داد ب + رن در زمینه تاسیس اتحادیه پست در برن سوییس توسط ٢٢ کشور جهان به تصویب رسید + . کشور های امضا کننده بر اساس توافق به عمل آمده قلمرو پستی را تشکیل دادند + . این قرار داد آزادی ترانزیت برای مبادله متقابل مراسلات را در سراسر قلمرو + اتحادیه تامین و تضمین می کرد. نام این اتحادیه پس از چند سال به اتحادیه جها + نی پست تغییر نام یافت. در سال ۱٩۶٩ کنگره توکیو در قطعنامه ٢۱۱ خود به کشور + های عضو توصیه کرد روز نهم اکتبر هر سال را به عننان روز جهانی پست تعیین کنن + د. همچنین می توانید برای دیدن عکس اولین تمبر پستی در ایران از لینک زیر دید + ن فرمایید. +DTEND;VALUE=DATE:20121010 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121009 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی پست +UID:MILADI20121009-423 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121011 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121010 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٩ مهر +UID:FARSIDATE13910719 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121012 +DTSTAMP:20120614T172323 +DTSTART;VALUE=DATE:20121011 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٠ مهر +UID:FARSIDATE13910720 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:خواجه شمس الدین حافظ شیرازی مشهور به لسان الغیب از شاعران توانا + و بنام ایران است. دربارة تاریخ تولد و مرگ وی اختلافاتی وجود دارد، امّا به + طور قطع بعد از سال ٧٠٠ ق. به دنیا آمده است. محل تولد او را شیراز ذکر کرده + ‌اند. وی از همان کودکی پدر خود را از دست داد و مجبور به کسب معاش بود، امّا + این کار او را از اندیشیدن به کسب علم و دانش باز نداشت، چنان که به تلمذ در + محضر استادانی چون قوام الدین اصفهانی شیرازی پرداخت. همانگونه که خود در اش + عارش بیان داشته، حافظ کل قرآن کریم بود و شهرتش با عنوان حافظ نیز از همین م + سأله نشأت گرفته است. حافظ بر خلاف سعدی به سفر علاقة زیادی نداشته است و به + علت عشق فراوانی که به زادگاهش داشت، اکثر عمر پر برکت خود را در شیراز گذران + د. +DTEND;VALUE=DATE:20121012 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121011 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت حافظ +UID:SHAMSI13910720-309 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:دهه٩٠ میلادی از سوی سازمان ملل متحد و سازمان هواشناسی جهانی دهه + کاهش بلایای طبیعی اعلام و از تمامی ملل جهان برای دستیابی به این هدف دعوت + به همکاری شد. این فراخوان بین المللی اولین اقدام متمرکز و جامع نهادهای بین + المللی در معرفی و آموزش انسانی در تمامی ابعاد پژوهشی، برنامه ریزی و اجرای + ی در راستای کاهش اثرات بلیه های طبیعی بود. مجمع عمومی سازمان ملل متحد در ٢ + ٢ دسامبر ۱٩٨٩ میلادی با تصویب قطعنامه ای چهارشنبه دوم اکتبر را روز جهانی ک + اهش اثرات بلایای طبیعی نامگذاری نمود. از آنجاییکه ایران در کمربند زلزله دن + یا واقع شده است، اساس مطالعات زمین شناختی، وقوع زلزله های مخرب، ٩٧ درصد از + شهر ها و روستاهای کشور را تهدید می کند و ٣۵٠ شهر در معرض خطرات ناشی از جا + ری شدن سیل های ویرانگر قرار دارد +DTEND;VALUE=DATE:20121012 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121011 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز ملی کاهش اثرات بلایای طبیعی +UID:SHAMSI13910720-310 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121013 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121012 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۱ مهر +UID:FARSIDATE13910721 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121014 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121013 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٢ مهر +UID:FARSIDATE13910722 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121015 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121014 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٣ مهر +UID:FARSIDATE13910723 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در شعبان ۱٣٢٢ قمری، مطابق با ۱٢٨۱ شمسی، در خمینی شهر (سده) از ت + وابع اصفهان در خانواده ای روحانی و اهل علم، فرزندی دیده به جهان گشود که او + را عطاء الله نامیدند. دروس ابتدایی را در همان خمینی شهر آموخت و در ۱٢ سال + گی عازم اصفهان گردید. و در طی ۱٠ سال دروس ادبیات و سطح، فقه و اصول و یک دو + ره درس خارج اصول را در محضر اساتیدی چون آیات عظام سید مهدی درچه ای، بروجرد + ی، سید محمد نجف آبادی، فشارکی، مدرس گذرانید . +DTEND;VALUE=DATE:20121015 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121014 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت آیت‌الله اشرفی اصفهانی +UID:SHAMSI13910723-311 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:استاندارد و استاندارد کردن، از پایه های استوار علم و فن­آوری اس + ت که در پیشرفت صنعت و اقتصاد نقش بسزایی دارد. استاندارد عبارت از: «نظمی مب + تنی بر نتایج ثابت علوم، فنون و تجارب بشری که به صورت قواعد، مقررات و نظام + هایی به منظور ایجاد هماهنگی و وحدت رویه، افزایش میزان تفاهم، تسهیل ارتباطا + ت، توسعه صنعت، صرفه جویی در اقتصاد ملی و حفظ سلامتی و ایمنی عمومی به کار ر + ود ». اندیشه تشکیل سازمان بین المللی استاندارد در ۱۴ اکتبر ۱٩۴۶ میلادی برا + بر با ٢٢ مهر ۱٣٢۵ شمسی در نشست ر‌ؤسای مؤسسه های استاندارد در لندن شکل گرفت + . مقرّ این سازمان در ژنو می باشد. +DTEND;VALUE=DATE:20121015 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121014 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی استاندارد +UID:MILADI20121014-424 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121016 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121015 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۴ مهر +UID:FARSIDATE13910724 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:بیست و چهارم مهر، روز پیوند اولیا و مربیان است. در هفته «پیوند» + که از این روز آغاز مى شود به دعوت مدیر مدرسه، اولیاى دانش آموزان، در جلسه + اى گرد هم مى آیند. مدیر گزارشى از فعالیت هاى سال گذشته خود و همکارانش را + به اولیا ارائه مى دهد و مشکلات مدرسه را با آنها در میان مى گذارد و در پایا + ن تعدادى از اولیا براى عضویت در انجمن داوطلب مى شوند. پس از راى گیرى نماین + دگان اولیا در انجمن تعیین مى شوند. انجمن اولیا و مربیان یکى از قدیمى ترین + نهادهاى مدنى است. آغاز همکارى خانه و مدرسه در قالب انجمن به سال ۱٣٢۶ شمسى + برمى گردد. در آن سال شوراى عالى فرهنگ، تشکیل این انجمن ها را در همه آموزشگ + اه ها و شرح وظایف آنها را تصویب کرد. در سال ۱٣۴۶ شمسى، انجمن اولیا و مربیا + ن ایران تاسیس شد و به ثبت رسید. +DTEND;VALUE=DATE:20121016 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121015 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز پیوند اولیاء و مربیان +UID:SHAMSI13910724-312 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:اولین عصای سفید استفاده از عصا بعنوان وسیله کمکی در رفت و آمد ن + ابینایان از قرن ها پیش متداول بوده است، ولی استفاده از عصای سفید بشکل امرو + زی و بعنوان نمادی برای شناخت نابینایان به بعد از جنگ جهانی اول برمی گردد. + در سال ۱٩٢۱ میلادی یک عکاس اهل شهر بریستول کشور انگلستان با نام جیمز بیگز + که در اثر یک سانحه بینایی خود را از دست داد، برای در امان بودن از خطر وسائ + ل نقلیه که در خیابان های اطراف محل زندگی وی در حال رفت و آمد بودند، ابتکار + استفاده از عصا به رنگ سفید را که براحتی برای همگان قابل دید باشد را بکار + برد. پس از آن دو تن از برجسته ترین محققین‌ آمریکایی به نامهای دکتر ناول‌ پ + ری، ریاضیدان و دکتر جاکوپس تن ‌بروک، حقوقدان توانستند قانونی‌ را در پانزده + مین روز از ماه اکتبر به عنوان قانون عصای سفید به تصویب رسانند و این روز را + به عنوان روز جهانی نابینایان نامگذاری کنند . +DTEND;VALUE=DATE:20121016 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121015 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی نابینایان(عصای سفید) +UID:MILADI20121015-425 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121017 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121016 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۵ مهر +UID:FARSIDATE13910725 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:از سال ۱٩۴٨ که در بیانیه جهانی حقوق بشر برای اولین بار حق دسترس + ی به غذا به رسمیت شناخته شد، اقدامات بین‌المللی دیگری هم این حق را تحکیم ب + خشیده است. با تصویب عهدنامه بین‌المللی درمورد حقوق اقتصادی، اجتماعی و فرهن + گی، ۱۵۶ کشور حق دسترسی به غذا را به عنوان یک تعهد قانونا لازم‌الاجرا پذیرف + تند. فائو یا سازمان خواربار و کشاورزی سازمان ملل متحد در ماه اکتبر سال ۱٩۴ + ۵ بر اساس گردهمائی نمایندگان ۴٢ کشور جهان در «کبک» کانادا تأسیس شد و در حا + ل حاضر بزرگترین مؤسسه تخصصی سازمان ملل متحد به شمار می رود. +DTEND;VALUE=DATE:20121017 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121016 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی غذا +UID:MILADI20121016-426 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121018 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121017 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۶ مهر +UID:FARSIDATE13910726 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:هفته تربیت بدنی همه ساله از ٢۶ مهر تا دوم آبان به منظور آشنایی + جامعه با اهمیت و اثرات کاربرد ورزش در زندگی فردی و اجتماعی، اشاعه و توسعه + و ترویج ورزش در خانه و خانواده و هدایت و ارشاد جامعه به ورزش های همگانی بر + گزار می شود. ورزش و فعالیت فیزیکی در سلامت روان نیز مؤثر است. مطالعات نشان + می دهد که موارد افسردگی، اضطراب و .... در اثر فعالیت فیزیکی بهبود یافته و + ورزش به عنوان یک عالم حمایتی در درمان بیماری روانی پذیرفته شده است. ورزش + و فعالیت جسمانی به همراه رژیم غذایی مناسب، عدم استعمال مشروبات الکلی و دخا + نیات و انجام مراقبتهای دوره ای، در پیشگیری از بیماری ها و رسیدن به بالاتری + ن سطح سلامتی و بازدهی اقتصادی و اجتماعی نقش دارند. ورزش های سبک مانند پیاد + ه روی، باعث مصرف انرژی شده و سهم بسیار مهمی در کنترل وزن و کاهش چربی در بد + ن دارد. همچنین فعالیت فیزیکی سبک و منظم از طریق تقویت کارکردهای ایمنی، باع + ث افزایش سطح فعالیت سیستم ایمنی در بدن شده و در پیشگیری از سرطان مؤثر می ب + اشد. +DTEND;VALUE=DATE:20121018 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121017 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز تربیت‌ بدنی و ورزش +UID:SHAMSI13910726-313 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٣٠ ذیقعده - شهادت امام محمد تقی(ع) - سال ٢٢٠ هجری قمری نقشه قتل + امام محمد تقی(ع) را معتصم و سایر بزرگان عباسی پی ریزی کردند . آنان، با تو + طئه خود ، ام الفضل را به قتل همسرش امام محمد تقی(ع) تحریک و تشویق نمودند و + آن نادان و بی خرد ، آن حضرت را در آخرین روزهای ذیقعده سال ٢٢٠ قمری مسموم + نمود و بر اثر شدت زهر، آن حضرت در ٢۵ سالگی، در آخرین روز ذیقعده همان سال، + غریبانه و مظلومانه در بغداد به شهادت رسید. بدن مطهر امام جواد(ع) در مقابر + قریش بغداد، در کنار قبر مطهر جدش امام موسی کاظم(ع)، که هم اکنون معروف به ک + اظمین است، به خاک سپرده شد . +DTEND;VALUE=DATE:20121018 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121017 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت حضرت امام محمد تقی +UID:GHAMARI14331130-451 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121019 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121018 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٧ مهر +UID:FARSIDATE13910727 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱ ذیحجه - ازدواج حضرت علی(ع) با فاطمه زهرا(س) - سال دوم هجری قم + ری امام علی بن ابی طالب(ع)، جانشین منصوب پیامبر خدا(ص)، پس از هجرت به مدین + ه منوره، با فاطمه زهرا(س) ازدواج کرد و خانواده پاک و پاکیزه ای را در جهان + هستی پایه گذاری نمود. درباره تاریخ ازدواج آن دو ، برخی روز اول ذی حجّه سال + دوم ، و برخی نوزده ذی حجّه را بیان کرده اند . ممکن است علت اختلاف اقوال، + به خاطر مراحل ازدواج باشد. مثلاً ان حضرت در اول ذی حجّه سال دوم خواستگاری + کرده باشد و در روز ششم، پیامبر(ص) پس از مشورت با دخترش فاطمه زهرا(س) به وی + پاسخ مثبت داده باشد و در نوزدهم ذی حجه، عقد نکاح خوانده شود . +DTEND;VALUE=DATE:20121019 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121018 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:سالروز ازدواج حضرت علی و حضرت فاطمه +UID:GHAMARI14331201-398 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121020 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121019 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٨ مهر +UID:FARSIDATE13910728 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121021 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121020 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٩ مهر +UID:FARSIDATE13910729 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:بیست و نهم مهرماه، روز ملی صادرات، شناخته و معرفی شده است. تعیی + ن یک روز از روزهای سال برای ،صادرات، ضمن ترویج فرهنگ صادرات در میان توده م + ردم، تقدیر از سربازان و ایثارگران جبهه اقتصادی، فرصتی برای تبادل افکار، شن + اخت گیرها و تنگناها و بررسی راهکارهایی برای رسیدن به هدف والای جهش صادراتی + می‌باشد . ضمن ارج نهادن به تلاش‌های بازرگانانی که در کار صادرات اهتمام می + ‌ورزند و ماحصل تلاش خود و کارکنانشان را به بازارهای جهانی عرضه داشته و سهم + جمهوری اسلامی ایران را در عرصه رقابت اقتصادی افزایش می‌دهند، روز ملی صادر + ات را می‌بایست فرصت ارزشمندی تلقی کرد که مباحث مربوط به صادرات بار دیگر مو + رد توجه مسؤولان و دست‌اندرکاران امر قرار گیرد. +DTEND;VALUE=DATE:20121021 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121020 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز صادرات +UID:SHAMSI13910729-314 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121022 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121021 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣٠ مهر +UID:FARSIDATE13910730 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121023 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121022 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱ آبان +UID:FARSIDATE13910801 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:اول آبان به عنوان روز آمار و برنامه ریزی نامگذاری شده است.شاید + خیلی از ما آمار را فقط وسیله ای برای بیان اطلاعات و مقادیر عددی درباره موض + وعات اقتصادی،جمعیت شناسی،سیاسی و اجتماعی بدانیم.ولی این تنها بخش کوچکی از + علم آمار است.تواناییها و قابلیتهای این علم بسیار وسیع است و لزوم توجه به آ + ن امروزه در کشورهای توسعه یافته کاملاً مشهود است.متأسفانه در کشور ما نه تن + ها عامه مردم اهمیت آمار را نمی دانند،بلکه حتی مدیران نیز در بهترین شکل از + آمار فقط برای بیان یکسری اطلاعات توصیفی استفاده می کنند.برای دانستن اطلاعا + ت بیشتر در مورد این علم بد نیست مطالب زیر را بخوانید: "نقش روز افزون آمار + و اطلاعات به عنوان پیش نیاز کلیه تصمیم گیریها،سیاستگزاریها و برنامه ریزیها + بر کسی پوشیده نیست.این نقش در عصر اطلاعات به قدری بدیهی است که نظام آماری + کشورها و حجم و کیفیت بانکهای اطلاعاتی آنها نه تنها یکی از مهمترین شاخصهای + توسعه یافتگی کشورها به شمار می رود،بلکه متقابلاً نیز سیاستگزاریها و برنام + ه ریزیهای توسعه اقتصادی،اجتماعی و فرهنگی کشورها،بدون در اختیار داشتن آمار + کافی،صحیح و دقیق و بهنگام ممکن نیست."* +DTEND;VALUE=DATE:20121023 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121022 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز آمار و برنامه‌ریزی +UID:SHAMSI13910801-315 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121024 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121023 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢ آبان +UID:FARSIDATE13910802 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121025 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121024 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣ آبان +UID:FARSIDATE13910803 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٧ ذیحجه - شهادت امام محمد باقر (ع) - سا ل۱۱۴هجری قمری امام محمد + باقر(ع) پس از امامتش با حاکمان غاصبی معاصر بود و از اکثر آنان، رنج ها و آ + زارهای فراوانی متحمل شد. سر انجام در عصر هشام بن عبدالملک، به دسیسه و دستو + ر وی و مباشرت ابراهیم بن ولید، حاکم مدینه مسموم گردید و در هفتم ذی حجّه سا + ل ۱۱۴ و به قولی در ربیع الاول و یا ربیع الثانی سال۱۱۴ به شهادت رسید. بدن ش + ریفش در کنار قبر مطهر پدرش امام زین العابدین(ع) و قبر مطهر جد بزرگوارش اما + م حسن مجتبی(ع) در قبرستان بقیع به خاک سپرده شد . +DTEND;VALUE=DATE:20121025 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121024 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت حضرت امام محمد باقر +UID:GHAMARI14331207-399 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121026 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121025 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۴ آبان +UID:FARSIDATE13910804 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در تاریخ معاصر ایران، قضاوت کنسولی (کاپیتولاسیون) مسئله ای اساس + ی است. نفوذ بیگانگان بیشتر از همین طریق بوده و از این راه، تحمیل عمال و کا + رگزاران بیگانه و به دنبال آن جنایات فجیعی در این سرزمین انجام گرفت. قوانین + جزایی که باید مظهر حاکمیت دولت باشد، بصورت بازیچه ای درآمد و هر متجاوزی م + ی توانست به سادگی آن را کنار زده، خود را تحت حمایت قدرتهای خارجی قرار دهد. + رژیم شاه که به خوبی می دانست بازتاب عمومی این لایحه ننگین تا چه حد خطرناک + خواهد بود، سانسور شدیدی بر رسانه های گروهی حاکم کرد تا هیچگونه خبری در مو + رد لایحه کاپیتولاسیون به بیرون درز پیدا نکند. ولی چند روزی از تصویب این لا + یحه نگذشته بود که مجله داخلی مجلس شورای ملی که متن کامل مذاکرات مجلس را در + برداشت بدست امام خمینی (ره) رسید. امام خمینی (ره) به منظور افشای این خیان + ت تصمیم گرفتند که طی ایراد نطقی، این عمل رژیم شاه را به اطلاع عموم برسانند + . +DTEND;VALUE=DATE:20121026 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121025 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:افشاگری امام خمینی علیه پذیرش کاپیتولاسیون +UID:SHAMSI13910804-316 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121027 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121026 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۵ آبان +UID:FARSIDATE13910805 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121028 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121027 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۶ آبان +UID:FARSIDATE13910806 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DTEND;VALUE=DATE:20121028 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121027 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:عید سعید قربان +UID:GHAMARI14331210-400 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121029 +DTSTAMP:20120614T172324 +DTSTART;VALUE=DATE:20121028 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٧ آبان +UID:FARSIDATE13910807 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121030 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121029 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٨ آبان +UID:FARSIDATE13910808 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20121030 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121029 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز نوجوان +UID:SHAMSI13910808-317 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:کوروش دوم، معروف به کوروش بزرگ (۵٧۶-۵٢٩ پیش از میلاد). این نام + در پارسی باستان‏ ،در کتیبه‌های عیلامی، Ku-rash ، درکتیبه‌های بابلی، Ku-ra- + ash و در یونانی، آمده‌است. صورت لاتینی شده ی آن سیروس یا سایروس (Cyrus) و + صورت عبری آن کورش (Koresh) می‌باشد. شاه پارسی، به‌خاطر بخشندگی‌، بنیان گذا + شتن حقوق بشر، پایه‌گذاری نخستین امپراتوری چند ملیتی و بزرگ جهان، آزاد کردن + برده‌ها و بندیان، احترام به دین‌ها و کیش‌های گوناگون، گسترش تمدن و غیره ش + ناخته شده‌است. کوروش نخستین شاه و بنیان‌گذار دوره ی شاهنشاهی هخامنشی است. + درباره شخصیت ذوالقرنین که در کتابهای آسمانی یهودیان، مسیحیان و مسلمانان از + آن سخن به میان آمده، چندگانگی وجود دارد و این که به واقع ذوالقرنین چه کسی + است به طور قطعی مشخص نشده‌است. +DTEND;VALUE=DATE:20121030 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121029 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی بزرگداشت کورش کبیر +UID:MILADI20121029-427 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121031 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121030 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٩ آبان +UID:FARSIDATE13910809 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121101 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121031 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٠ آبان +UID:FARSIDATE13910810 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:شهید بزرگوار آیت الله سید محمود قاضی طباطبایی اولین امام جمعه ت + بریز در سال ۱٣٣٣ هجری قمری در تبریز متولد شد. پدرش حاج میرزا باقر و عمویش + میرزا اسدا... از علمای بنام تبریز بودند و ایشان تحصیلات مقدماتی علوم دینی + را در مدرسه طالبیه نزد آن دو فرا گرفت. در سن ٢۴ سالگی در بحبوحه مبارزات در + تبریز به همراه پدرش به تهران تبعید شد و پس از چند ماه توقف در تهران و ری + به تبریز مراجعه نمود. دو سال بعد جهت تحصیل در حوزه علمیه قم به شهر قم مشرف + شد و از محضر آیات عظام مرحوم آیت الله سید محمد خوانساری، مرحوم آیت الله س + ید محمد حجت کوه کمره ای و مرحوم آیت الله صدر و نیز مرحوم آیت الله بروجردی + و آیت الله گلپایگانی کسب فیض نمود. آن شهید بزرگوار از محضر امام خمینی نیز + بهره برد و از شاگردان و علاقمندان ایشان بشمار می رفت. در سال ۱٣۶٩ هجری قمر + ی شهید قاضی از قم به نجف عزیمت کرد و نزد علمای برجسته نجف یعنی مرحوم آیت ا + لله حکیم عبدالحسین رشتی، میرزا باقر زنجانی و بجنوردی به کسب علوم دینی پردا + خت. راهنمایی شهید قاضی در مسائل سیاسی و انقلابی زبانزد خاص و عام بود. +DTEND;VALUE=DATE:20121101 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121031 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت آیت‌الله قاضی طباطبایی +UID:SHAMSI13910810-318 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121102 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121101 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۱ آبان +UID:FARSIDATE13910811 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱۵ ذیحجه - میلاد مسعود امام علی النّقی(ع) - سال ٢۱٢ هجری قمری ا + مام علی بن محمد(ع) ،که از لقب هایش می توان به هادی و نقی اشاره کرد ، امام + دهم شیعیان می باشد. پدر بزرگوارش امام محمد تقی(ع) ، معروف به جوادالأئمه(ع) + ، امام نهم شیعیان است . مادر امام هادی(ع) ، بانویی شریف و نجیب ، به نامسم + انه مغربیه است میلاد مسعود امام هادی (ع) درقریه صُریا واقع در سه مایلی مدی + نه منوره واقع گردید . +DTEND;VALUE=DATE:20121102 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121101 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت امام علی النقی الهادی +UID:GHAMARI14331215-401 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121103 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121102 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٢ آبان +UID:FARSIDATE13910812 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121104 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121103 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٣ آبان +UID:FARSIDATE13910813 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:۱٣ آبان در تاریخ انقلاب اسلامی ایران همواره روز تقابل حق و باطل + بوده است. دقیقاً به همین دلیل یکسال پس از شهادت دانش آموزان در دانشگاه و + درست در سالروز ۱٣ آبان ۵٨ ایران اسلامی شاهد جلوه دیگری از این رویارویی میا + ن جبهه حق علیه باطل بود. در این روز به یکباره به حیات سیاسی مملو از خباثت + امریکا و عملکرد سازمان جهنمی سیا در ایران خاتمه داده شد و مزدورانی که پس ا + ز پیروزی انقلاب دائماً به فتنه انگیزی و ماجراجویی علیه نهضت اسلامی ایران م + شغول بودند به گروگان گرفته شدند و لانه پر از فساد و جاسوسی آنان که به اشتب + اه (سفارت) لقب گرفته بود،‌ تعطیل گردید. اشغال لانه جاسوسی امریکا در تهران + و گروگانگیری جاسوسان دیپلمات نمای کاخ سفید، تنها یک حادثه سیاسی در حد تعطی + ل شدن سفارتخانه یک کشور در کشور دیگر نبوده و بلکه آغاز تحول عمیقی بود که د + ر خاورمیانه و در سطح جهان در جهت عریان ساختن ماهیت پنهان شده زمامداران واش + نگتن و گردانندگان سیاست خارجی امریکا به وقوع پیوسته بود. +DTEND;VALUE=DATE:20121104 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121103 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز دانش‌آموز-تسخیر لانه‌ی جاسوسی آمریکا به دست دانشجویان-روز ملی م + بارزه با استکبار جهانی +UID:SHAMSI13910813-319 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121105 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121104 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۴ آبان +UID:FARSIDATE13910814 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم قمری +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱٨ ذیحجه - منصوب شدن حضرت علی(ع) به جانشینی پیامبر(ص) - سال دهم + هجری قمری روز هیجدهم ذی حجّه، از ایام الله و از عیدهای بزرگ اسلام و جهان + تشیع است . این روز، به خاطر رویدادهای مهم و سرنوشت سازی که برای برخی از پی + امبران،از جمله پیامبر اسلام(ص)و تعیین جانشین منصوب خداوند متعال برای آن حض + رت به وقوع پیوست ، عظیم ترین و شریفترین روز سال محسوب می گردد. در این روز + آن حضرت دست علی (ع) را بالا برد و فرمود : همانا هرکسی که من مولا و رهبر او + یم،پس علی (ع) رهبر و مولای اوست . +DTEND;VALUE=DATE:20121105 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121104 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:عید سعید غدیر خم تعطیل +UID:GHAMARI14331218-402 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121106 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121105 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۵ آبان +UID:FARSIDATE13910815 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121107 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121106 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۶ آبان +UID:FARSIDATE13910816 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121108 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121107 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٧ آبان +UID:FARSIDATE13910817 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121109 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121108 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٨ آبان +UID:FARSIDATE13910818 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در روز ۱٨ آبان هر سال مصادف با روز ملی کیفیت توسط ریاست محترم ج + مهوری اسلامی ایران به برترین و سرآمدترین سازمان های ایرانی حائز شرایط در ب + خش های مختلف کشور (شامل سازمانها، بنگاههای اقتصادی بزرگ، واحدهای عملیاتی، + موسسات بخش عمومی، بنگاههای کوچک و متوسط مستقل و بنگاههای کوچک و متوسط وابس + ته) که در زمینه ارتقاء کیفیت و سرآمدی کسب و کار فعالیت های چشمگیری را انجا + م داده اند، جوائزی اعطا می گردد. عالی ترین مرجع تصمیم گیری در جایزه ملی کی + فیت ایران، شورای سیاستگذاری می باشد و مطابق نظامنامه جایزه، دبیرخانه جایزه + ملی کیفیت ایران مستقر در موسسه استاندارد و تحقیقات صنعتی ایران مجری جایزه + بوده و کلیه عملیات اجرایی مرتبط با جایزه را عهده دار است. یک کمیته فنی مت + شکل از ٢۱ نفر کارشناس متخصص در زمینه مدیریت کیفیت و مباحث سرآمدی نیز، دبیر + خانه و شورای سیاست گذاری را در طرح ریزیی و اجرای ملی کیفیت ایران یاری می ن + مایند. +DTEND;VALUE=DATE:20121109 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121108 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز ملی کیفیت +UID:SHAMSI13910818-320 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121110 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121109 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٩ آبان +UID:FARSIDATE13910819 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121111 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121110 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٠ آبان +UID:FARSIDATE13910820 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:پیامبر(ص) بزرگان مسیحی نجران که عقاید باطلی داشتند را به پذیرش + دین اسلام و یا پرداخت جزیه[مالیات ویژه اهل کتاب] فرا خواند. آنان، برای فرا + ر از پذیرش حق ، پیشنهاد مباهله دادند. آنان همین که دیدند پیامبر(ص) ، اهل ب + یت ویژه خویش را برای مباهله آورد ، از مبارزه و مباهله با آن حضرت منصرف شدن + د و به ناچار از مباهله سر باز زده و به آن حضرت پیشنهاد مصالحه دادند. بدین + ترتیب. در برابر عظمت و حقانیت دین مبین اسلام سر فرود آورده و به پرداخت جزی + ه و کمک به مسلمانان در جنگ با دشمنان اسلام، رضایت دادند و صلحنامه ای دراین + باب امضا نمودند. این واقعه، علاوه بر این که یکی از معجزات بزرگ پیامبر(ص)ا + ست، دلیل روشنی بر حقانیت و معصومیت خاندان پاک رسول خدا(ص) می باشد . +DTEND;VALUE=DATE:20121111 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121110 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز مباهله پیامبر اسلام +UID:GHAMARI14331224-403 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121112 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121111 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۱ آبان +UID:FARSIDATE13910821 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:علت انتخاب این روز شأن نزول آیه «هل اتی» در سوره الانسان که راج + ع به خانواده و استحکام پایه‌های آن است عنوان شده است. سوره هل اتی در روز ٢ + ۵ ذی الحجه در شان اهل بیت پیامبر (ص)نازل شد که پس از سه روز روزه و انفاق ا + فطار خود، از طرف خداوند اطعام شدند. اما در شورای فرهنگ عمومی اتفاق نظر بر + این بود که روز بازنشستگان با یک روز در تقویم رسمی کشور تلفیق شود که بهترین + روز برای این منظور روز ٢۵ ذی الحجه یعنی روز خانواده بود. در دین مبین اسلا + م خانواده یکی از مهم ترین ارکان جامعه محسوب می گردد. پایبندی به خانواده و + جلوگیری از بی‌بند وباری و همچنین ارتقاء جایگاه و تحکیم بنیان خانواده، از ج + مله مسائلی است که به آن شفارش فراوان شده است. خانواده به عنوان کوچک ترین ن + هاد اجتماعی ، آسیب پذیرترین گروه در برابر آسیب های اجتماعی است به طوری که + اکثر مشکلات و آسیب ها ابتدا در خانواده ها بروز پیدا می کند و در صورت عدم پ + یشگیری و برخورد نا صحیح با آنها ، به درون جامعه نیز رسوخ می کند و در این ش + رایط دشوار دیگر نمی توان به راحتی مشکلات و آسیب ها را کنترل کرد. +DTEND;VALUE=DATE:20121112 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121111 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز خانواده - تکریم بازنشستگان +UID:GHAMARI14331225-440 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121113 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121112 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٢ آبان +UID:FARSIDATE13910822 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121114 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121113 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٣ آبان +UID:FARSIDATE13910823 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121115 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121114 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۴ آبان +UID:FARSIDATE13910824 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:کتاب از دیر باز حافظ و احیا کننده تفکر و اندیشه های والا و منبع + عظیمی بوده است که طالبان علم و اندیشه و حقیقت را سیراب کرده است. ارزیابی + شرایط و امکانات موجود فرهنگی مبین این است که امروز نیز کتاب به عنوان یک وس + یله مطمئن و کارآمد در بستر سازی موجود فرهنگ می تواند مورد استفاده قرار گیر + د. شک نیست که ترویج فرهنگ کتاب و کتابخوانی در جامعه، اولا به توجه بیشتر مس + ئوولان فرهنگی و آموزشی کشور نیاز دارد و ثانیاً محتاج تلاشی همه جانبه فراگی + ر و ملی است. از این رو به همت وزارت فرهنگ و ارشاد اسلامی و همکاری نهادهای + فرهنگی و ارشاد اسلامی و در اجرای فرمان مقام معظم رهبری در مورد توسعه نمایش + گاههای کتاب در سطح کشور و تشویق مردم به کتاب خوانی، نخستین هفته کتاب جمهور + ی اسلامی ایران در روزهای چهارم تا دهم دی ماه سال ۱٣٧٢ با پیام رهبر فرزانه + انقلاب اسلامی برگزار شد. +DTEND;VALUE=DATE:20121115 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121114 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز کتاب و کتابخوانی +UID:SHAMSI13910824-321 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:علامه طباطبایی در آخرین روز ماه ذیحجه سال ۱٣٢۱ هـ.ق در شاد آباد + تبریز متولد شد، و ٨۱ سال عمر پربرکت کرد، و در صبح یکشنبه ۱٨ محرم الحرام س + ال ۱۴٠٢ هـ.ق سه ساعت به ظهر مانده رحلت کردند.اجداد علامه طباطبایی از طرف پ + در از اولاد حضرت امام حسن مجتبی علیه السلام و از اولاد ابراهیم بن اسماعیل + دیباج هستند، و از طرف مادر اولاد حضرت امام حسین علیه السلام می باشند. در س + ن پنج سالگی مادرشان، و در سن نه سالگی پدرشان بدرود حیات می گویند و از آنها + اولادی جز ایشان و برادر کوچکتر از ایشان بنام سید محمد حسن کسی دیگر باقی ن + مانده بود. سید محمد حسین به مدت شش سال (۱٢٩٠ تا ۱٢٩۶هـ.ش) پس از آموزش قرآن + که در روش درسی آن روزها قبل از هر چیز تدریس می شد، آثاری چون گلستان، بوست + ان و ... را فراگرفت . +DTEND;VALUE=DATE:20121115 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121114 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت آیت‌الله محمدحسین طباطبایی +UID:SHAMSI13910824-322 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121116 +DTSTAMP:20120614T172325 +DTSTART;VALUE=DATE:20121115 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۵ آبان +UID:FARSIDATE13910825 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121117 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121116 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۶ آبان +UID:FARSIDATE13910826 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:در ۱۶ محرم عمر بن خطاب تصمیم گرفت برای مسلمانان تاریخ ویژه ای ت + دوین نماید. امیر مؤمنان (ع) ، پیشنهاد کرد: به خاطر اهمیت هجرت پیامبر اسلام + (ص) از مکه به مدینه، آن را مبدأ تاریخ اسلام قرار دهند . درباره ابتدای سال + قمری که از چه ماهی از ماه های عرب آغاز گردد عمر بن خطاب به پیشنهاد عثمان ب + ن عفان که معتقد بود اول محرم را، نخستین روز سال بدانند، ترتیب اثر داد و فر + مان داد که ماه محرم، نخستین ماه سال هجری قمری باشد. +DTEND;VALUE=DATE:20121117 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121116 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:آغاز سال هجری قمری +UID:GHAMARI14340101-354 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121118 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121117 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٧ آبان +UID:FARSIDATE13910827 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121119 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121118 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٨ آبان +UID:FARSIDATE13910828 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121120 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121119 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٩ آبان +UID:FARSIDATE13910829 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121121 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121120 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣٠ آبان +UID:FARSIDATE13910830 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121122 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121121 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱ آذر +UID:FARSIDATE13910901 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121123 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121122 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢ آذر +UID:FARSIDATE13910902 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121124 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121123 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣ آذر +UID:FARSIDATE13910903 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121125 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121124 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۴ آذر +UID:FARSIDATE13910904 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم قمری +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:فرمان حمله عمومی به خیمه های امام حسین(ع) از سوی عمر بن سعد - س + ال ۶۱ هجری قمری شب عاشورا از شب های بزرگ سال و شبی است که پیشوای شیعیان و + سيّد شهیدان، حضرت ابا عبدالله الحسین(ع)، با نماز، تهجّد و راز و نیاز با پر + وردگارش آن را زنده نگه داشت، در حالی که دشمنان اهل بیت(ع) وی را از هر سو ا + حاطه کرده و قصد کشتن او و یاران وفادارش و به اسارت بردن بازماندگان و اهل ب + یتش را داشتند. +DTEND;VALUE=DATE:20121125 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121124 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:تاسوعای حسینی تعطیل +UID:GHAMARI14340109-355 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121126 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121125 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۵ آذر +UID:FARSIDATE13910905 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:دنبال پیروزی انقلاب، چون دست غارتگران استعمارگر از ایران قطع شد + و منافع آنان به خطر افتاد ، برای حفظ منافع خود ، از هیچ دشمنی و شرارت علی + ه ایران فروگذار نکردند. در سالهای اولیه پیروزی انقلاب ، یکی ازخطراتی که ان + قلاب نوپای اسلامی را تهدید می کرد ، حمله نظامی بود. امام خمینی در پنجم آذر + ماه ۱٣۵٨، فرمان تشکیل بسیج را صادر و چنین فرمودند : « باید همه قوایمان را + مجتمع کنیم برای نجات دادن یک کشور ، باید اگر مسائلی برای ما پیش بیاید ، ه + ر چه هم سخت باشد ، تحمل کنیم ؛ قوای خودتان را مجهز کنید ، تعلیمات نظامی پی + دا کنید و به دوستانتان هم تعلیم دهید ؛ مملکت اسلامی همه اش باید نظامی باشد + و تعلیمات نظامی داشته باشد ؛ همه جا باید اینطور بشود که یک مملکتی بعد از + چند سالی که بیست میلیون جوان دارد ، بیست میلیون تفنگدار داشته باشد و بیست + میلیون ارتش داشته باشد.» +DTEND;VALUE=DATE:20121126 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121125 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بسیج مستضعفین +UID:SHAMSI13910905-323 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم قمری +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:محرم - عاشورا واقعه جانگداز کربلا - سال ۶۱ هجری قمری در این روز + بزرگ، پای مردی، فداکاری و سربلندی گروه اندکی از انسان های به خدا پیوسته د + ر برابر خیل عظیم و کثیر دشمنان و جنایت پیشه گان به نمایش درآمد. امام حسین( + ع) در میدان جنگ نا برابر پس از آن که همه یاران خود را از دست داد، به تنهای + ی، ساعاتی با نیروهای گسترده دشمن مبارزه کرد . خود آن حضرت نیز زخم های فراو + انی در میدان مبارزه متحمل شد و بر اثر آن ها، از زین اسبش به زمین افتاد و م + ورد هجوم وحشیانه دشمن قرار گرفت. سرانجام شمر بن ذی الجوشن، با قساوت و بی ر + حمی تمام به بدن خونین و کم رمق آن حضرت نزدیک شد و سر مبارکش را از قفا جدا + کرد و بدین طریق، روح شریفش را به اعلی علیین به پرواز در آورد. این روز، روز + فداکاری امام حسین(ع) و یاران باوفای وی می باشد و تا ابد به آنان تعلق خواه + د داشت. در این روز، حوادث و رویدادهای مهمی در سرزمین کربلا به وقوع پیوست ک + ه برای همیشه در تاریخ انسان ها ثبت و درج خواهد ماند . +DTEND;VALUE=DATE:20121126 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121125 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:عاشورای حسینی تعطیل +UID:GHAMARI14340110-356 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121127 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121126 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۶ آذر +UID:FARSIDATE13910906 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱۱ محرم - اسارت بازماندگان شهدای کربلا - سال ۶۱ هجری قمری عمر ب + ن سعد در روز یازدهم محرم دستور داد که کشته های خود را گردآوری کرده و بر آن + ان نماز بخوانند و سپس دفن کنند. ولی بدن های بی سر شهیدان را در آن بیابان ر + ها کرد. آن گاه دستور داد زنان، کودکان و بازماندگان واقعه عاشورا را اسیر و + به همراه خود به کوفه ببرند. هنگام خروج آنان از سرزمین کربلا، به خواسته اسی + ران و یا به دستور عمر بن سعد جهت تازه کردن داغ اسیران و عزیز از دست دادگان + ، آنان را از کنار پیکرهای شهیدان عبور دادند. لحظه وداع بازماندگان با بدن ه + ای بی سر شهیدان، محشری بود و دل هر سنگی را آب می کرد . +DTEND;VALUE=DATE:20121127 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121126 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز تجلیل از اسرا و مفقودان +UID:GHAMARI14340111-357 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121128 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121127 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٧ آذر +UID:FARSIDATE13910907 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20121128 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121127 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز نیروی دریایی +UID:SHAMSI13910907-324 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:درباره تاریخ شهادت امام زین العابدین(ع)، گرچه تمامی مورخان و سی + ره نگاران، اتفاق دارند که این واقعه عظیم در ماه محرم واقع شد، ولی در تعیین + روز و سال وقوع آن، اتفاق نظر و دیدگاه واحدی وجود ندارد. برخی از آنان، روز + دوازدهم محرم، برخی هیجدهم محرم و برخی دیگر بیست و پنجم محرم را روز شهادتش + می دانند. +DTEND;VALUE=DATE:20121128 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121127 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت حضرت امام زین العابدین +UID:GHAMARI14340112-358 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121129 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121128 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٨ آذر +UID:FARSIDATE13910908 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121130 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121129 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٩ آذر +UID:FARSIDATE13910909 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20121130 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121129 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت شیخ مفید +UID:SHAMSI13910909-325 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121201 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121130 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٠ آذر +UID:FARSIDATE13910910 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:براساس مصوبه مجلس شورای اسلامی در سال ۱٣٧٢ ، دهم آذر سالروز شها + دت مجاهد نستوه و اسوه بزرگ حق مداری و ظلم ستیزی ، آیت الله سید حسن مدرس " + روز مجلس" نامگذاری شده است ؛ حضور و مبارزات خستگی ناپذیر شهید مدرس در سنگر + مجلس شورا علیه استبداد و استعمار و نقش خاص و ویژه مجلس شورای اسلامی در پا + سداری و صیانت از راه پاک آن شهید والامقام و همه شهدای راه خدا می باشد. +DTEND;VALUE=DATE:20121201 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121130 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت سید حسن مدرس روز مجلس +UID:SHAMSI13910910-326 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121202 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121201 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۱ آذر +UID:FARSIDATE13910911 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:از سال ۱٩٨٨ به منظور افزایش بودجه‌ها و همچنین برای بهبود آگاهی، + آموزش و مبارزه با تبعیض‌ها اول دسامبر هرسال (برابر ۱٠ آذر) به عنوان روز ج + هانی ایدز معین شده‌است ،هر ساله برای این روز شعاری نیز در نظر گرفته می‌شود + ایدز معضلی پزشکی بهداشتی است که ابعاد اجتماعی، فرهنگی و اقتصادی آن بسیار + گسترده‌ است. در سال ۱٩٩۶‌، سازمان ملل متحد ایدز را نه تنها به عنوان یک مشک + ل سلامتی مورد توجه قرار داد بلکه آن را یک مسئله بر سر راه پیشرفت بشری برشم + ردبیش از ٩٠ درصد موارد آلودگی مربوط به کشورهای جهان سوم و در حال توسعه‌ اس + ت . +DTEND;VALUE=DATE:20121202 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121201 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی مبارزه با ایدز +UID:MILADI20121201-428 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121203 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121202 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٢ آذر +UID:FARSIDATE13910912 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:تصویب قانون اساسی جمهوری اسلامی ایران(۱٣۵٨ ه.ش) متن اولیه قانون + اساسی جمهوری اسلامی ایران در سال ۱٣۵٨ (ش) و با ۱٧۵ اصل به تصویب دو سوم نم + ایندگان مجلس وقت رسید و در سال ۱٣۶٨ طی بازنگری قانون اساسی دو اصل ۱٧۶و ۱٧٧ + به آن افزوده شد و ۴٧ اصل تغییر یافت . +DTEND;VALUE=DATE:20121203 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121202 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:تصویب قانون اساسی +UID:SHAMSI13910912-327 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121204 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121203 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٣ آذر +UID:FARSIDATE13910913 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:پس از پیروزی انقلاب اسلامی، شرکتهای بیمه، ملی شدند که اقدام شای + سته ای برای حفظ سرمایه ملی بود. این شرکتها در ظاهر، مستقل از هم هستند، اما + تمام آنها در زیر چتر بیمه مرکزی جمهوری اسلامی ایران قرار دارند و دارای دس + تورالعملهای واحدی می باشند. فقط سطح پوشش آنها با یکدیگر اندکی تفاوت دارد . +DTEND;VALUE=DATE:20121204 +DTSTAMP:20120614T172326 +DTSTART;VALUE=DATE:20121203 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بیمه +UID:SHAMSI13910913-328 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱٨ محرم – تغییر قبله مسلمین – سال دوم هجری قمری پیامبر اکرم(ص) + پیش از هجرت ، نمازهای خویش را به سمت بیت المقدس، واقع در فلسطین به جای می + آوردند. در آن زمان برخی از یهودیان ، حضرت محمد(ص) را سرزنش کرده و می گفتند + : شما تابع قبله مائید. پیامبر(ص)، از این جهت اندوهناک بود و به آفاق آسمان + ها نظر می کرد و منتظر امر پروردگار منان بود. سرانجام هنگامی که آن حضرت مشغ + ول نماز ظهر بود و دو رکعت آن را به سمت بیت المقدس به جای آورده بود، جبرئیل + امین فرود آمد و بازوی مبارکش را گرفت و او را به جانب کعبه برگردانید. از آ + ن پس، کعبه و مسجدالحرام، قبله گاه مسلمانان شد و از هر کجا عالم به سوی آن ع + بادت می کنند . +DTEND;VALUE=DATE:20121204 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121203 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:تغییر قبله مسلمین از بیت المقدس به مکه معظمه +UID:GHAMARI14340118-359 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:روزسوم دسامبر مصادف با ۱٢ آذرماه برای نخستین بار در سال ۱٩٩٢ می + لادی از سوی مجمع عمومی سازمان ملل متحد بعنوان روز جهانی معلولین اعلام گردی + د. هدف از تعیین این روز ارتقاء رشد اذهان عمومی درباره مسائل مربوط به معلول + یتهای مختلف؛ و افزایش آگاهیهایی بوده است که می بایست از مساله پیوستن افراد + معلول در تمامی جنبه های سیاسی؛ اجتماعی؛ اقتصادی و فرهنگی زندگی منتج شود. +DTEND;VALUE=DATE:20121204 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121203 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی معلولان +UID:MILADI20121203-429 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121205 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121204 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۴ آذر +UID:FARSIDATE13910914 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121206 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121205 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۵ آذر +UID:FARSIDATE13910915 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121207 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121206 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۶ آذر +UID:FARSIDATE13910916 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:از مهمترین حرکتهای سیاسی، اعتراض دانشجویان در۱۶ آذر۱٣٣٢، به ورو + د معاون رئیس جمهورآمریکا بود ونقطه اوج آن را می توان در اشغال لانه جاسوسی + آمریکا در۱٣ آبان ۱٣۵٨، مشاهده کرد.این حرکت که توسط دانشجویان مسلمان پیرو خ + ط امام آغازشد و مورد تایید امام نیز قرارگرفت، نشانه طرد تفکرلیبرالی ومارکس + یستی در دانشگاههای کشور وغلبه گسترش اسلام خواهی بود. +DTEND;VALUE=DATE:20121207 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121206 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز دانشجو +UID:SHAMSI13910916-329 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121208 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121207 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٧ آذر +UID:FARSIDATE13910917 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:تاریخ شکل‌گیری سازمان هواپیمایی کشوری درست به زمان بعد از جنگ ج + هانی دوم برمی‌گردد، در هفتم دسامبر ۱٩۴۴ اساسنامه‌ای در شیکاگو به امضای ۵٢ + کشور رسید که ایران نیز در ٢٨ تیرماه ۱٣٢٨ به عضویت این سازمان درآمد و از‌آن + پس حمل‌ونقل هوایی جهان با محوریت این سازمان و با اتکا به انکس‌ها و مقررات + ارائه شده به اعضا فعال است. +DTEND;VALUE=DATE:20121208 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121207 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی هواپیمایی +UID:MILADI20121207-430 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121209 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121208 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٨ آذر +UID:FARSIDATE13910918 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20121209 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121208 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:معرفی عراق به عنوان آغازگر جنگ +UID:SHAMSI13910918-330 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121210 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121209 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٩ آذر +UID:FARSIDATE13910919 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20121210 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121209 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:تشکیل شورای عالی انقلاب فرهنگی +UID:SHAMSI13910919-331 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121211 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121210 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٠ آذر +UID:FARSIDATE13910920 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20121211 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121210 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت آیت‌الله دستغیب +UID:SHAMSI13910920-332 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:درباره تاریخ شهادت امام زین العابدین(ع)، گرچه تمامی مورخان و سی + ره نگاران، اتفاق دارند که این واقعه عظیم در ماه محرم واقع شد، ولی در تعیین + روز و سال وقوع آن، اتفاق نظر و دیدگاه واحدی وجود ندارد. برخی از آنان، روز + دوازدهم محرم، برخی هیجدهم محرم و برخی دیگر بیست و پنجم محرم را روز شهادتش + می دانند. +DTEND;VALUE=DATE:20121211 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121210 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت امام زین العابدین به روایتی +UID:GHAMARI14340125-360 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121212 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121211 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۱ آذر +UID:FARSIDATE13910921 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121213 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121212 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٢ آذر +UID:FARSIDATE13910922 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121214 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121213 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٣ آذر +UID:FARSIDATE13910923 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121215 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121214 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۴ آذر +UID:FARSIDATE13910924 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121216 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121215 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۵ آذر +UID:FARSIDATE13910925 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20121216 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121215 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز پژوهش +UID:SHAMSI13910925-333 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121217 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121216 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۶ آذر +UID:FARSIDATE13910926 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:حمل و نقل عرصه گسترده ای از تجارت جهانی ، ارتباطات ، مسافرتهای + تفریحی و کاری ، جابجایی شهری و عرصه های متفاوت و متنوع دیگر را شامل می شود + . تاثیر حمل و نقل و میزان کارایی آن براقتصاد کشور بر کسی پوشیده نیست . تا + ثیر جاده ابریشم بر اقتصاد گذشته ایران را می توان در این مورد مثال زد: در آ + ن زمان ایران بخشی از راه ارتباطی اروپا – شرق دور بود ، و در سایه این رویدا + د شهرها ، تجارت خانه ها و راهها توسعه یافته، بخشی از ثروت و سرمایه جابجا ش + ده در ایران مصرف شده و باعث شده بود که ایران از قطب های اقتصادی قرون گذشته + باشد. موج های آخرین این رویداد در دوران صفویه به پایان رسید و اقتصاد ایرا + ن پس از آن رو به افول نهاد . به هر صورت این مثال تاثیر حمل و نقل بر اقتصاد + یک کشور را عیان می سازد . +DTEND;VALUE=DATE:20121217 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121216 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز حمل و نقل +UID:SHAMSI13910926-334 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121218 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121217 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٧ آذر +UID:FARSIDATE13910927 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:شهادت آیت الله دکتر محمد مفتح(۱٣۵٨ ه.ش)- روز وحدت حوزه و دانشگا + ه وحدت حوزه و دانشگاه ، یعنی وحدت در هدف. هدف این است که همه به سمت ایجاد + یک جامعه ی اسلاميِ پیشرفته مستقل، جامعه ی امام، جامعه ی پیشاهنگ، جامعه ی ا + لگو، ملت شاهد – ملتی که مردم دنیا با نگاه به او جرأت پیدا کنند، تا فکر تحو + ل را در ذهن خودشان بگذرانند و در عملشان پیاده کنند – حرکت نمایند ... +DTEND;VALUE=DATE:20121218 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121217 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت دکتر محمد مفتح روز وحدت حوزه و دانشگاه +UID:SHAMSI13910927-335 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121219 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121218 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٨ آذر +UID:FARSIDATE13910928 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٣ صفر - میلاد مسعود امام محمدباقر(ع) - سال ۵٧ هجرى قمرى امام مح + مدبن علی بن الحسین(ع)، معروف به "امام محمد باقر" در اول رجب و به قولی در س + وم صفر سال ۵٧قمری،در مدینه منوره دیده به جهان گشود. تولد مبارک آثار وی، در + حیات جد بزرگوارش حضرت اباعبدالله الحسین(ع) واقع گردید و موجب خوشحالی و خر + سندی آن حضرت شد. امام محمد باقر (ع)، قریب به چهار سال ،حیات جدّش امام حسین + (ع) و به مدت ٣٨ سال حیات پدرش حضرت امام علی بن الحسین(ع)،معروف به"امام زی + ن العابدین(ع)" را درک نمود و پس از شهادت پدرش امام زین العابدین(ع)، در ماه + محرم سال ٩۵ قمری، به مدت بیست سال امامت شیعیان را بر عهده گرفت و آن را با + صلابت و زیبایی ادامه داد . +DTEND;VALUE=DATE:20121219 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121218 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت امام محمد باقر +UID:GHAMARI14340203-361 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121220 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121219 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٩ آذر +UID:FARSIDATE13910929 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121221 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121220 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣٠ آذر +UID:FARSIDATE13910930 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:شب یَلدا یا شب چلّه بلندترین شب سال در نیم‌کره شمالی زمین است. + این شب به زمان بین غروب آفتاب از ۳۰ آذر (آخرین روز پاییز) تا طلوع آفتاب در + اول ماه دی (نخستین روز زمستان) اطلاق می‌شود. ایرانیان و بسیاری از دیگر اق + وام شب یلدا را جشن می‌گیرند.\n\nاین شب در نیم‌کره شمالی با انقلاب زمستانی + مصادف است و به همین دلیل از آن زمان به بعد طول روز بیش‌تر و طول شب کوتاه‌ت + ر می‌شود.\n +DTEND;VALUE=DATE:20121221 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121220 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شب یلدا +UID:SHAMSI13910930-449 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121222 +DTSTAMP:20120614T172327 +DTSTART;VALUE=DATE:20121221 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱ دی +UID:FARSIDATE13911001 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121223 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121222 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢ دی +UID:FARSIDATE13911002 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٧ صفر - میلاد مسعود امام موسى‏کاظم (ع) - سال ۱٢٨ هجرى قمرى امام + موسى‏کاظم)ع( در هفتم صفر سال ۱٢٨ هجرى قمرى در أبوا دیده به جهان گشود و با + نور خود جهان هستى را روشن کرد. و در بیست سالگی، پس از شهادت پدرش امام جعف + ر صادق(ع)، به امامت شیعیان نایل آمد . امام موسى‏ بن ‏جعفر)ع( ملقب به کاظم + است. مدت امامت آن حضرت، ٣۵ سال بود و امامت آن حضرت مصادف بود با خلافت و حک + ومت‏هاى پى‏درپى منصور، مهدى، هادى و هارون‏الرشید +DTEND;VALUE=DATE:20121223 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121222 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت امام موسی کاظم +UID:GHAMARI14340207-362 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121224 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121223 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣ دی +UID:FARSIDATE13911003 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:سازمان ثبت احوال کشور یکی از سازمانهای دولتی ایران است که جمع آ + وری اطلاعات و آمار جمعیتی کشور ایران را به عهده دارد. این سازمان با وظایف + و عملکردی مستقل، از نهادهای زیرمجموعه وزارت کشور است. این سازمان وظیفه تهی + ه اطلاعات ثبتی اساسی مانند زاد و ولد، مرگ و میر و ازدواج و نیز صدور مدارک + هویتی مانند شناسنامه را بر عهده دارد. +DTEND;VALUE=DATE:20121224 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121223 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز ثبت احوال +UID:SHAMSI13911003-450 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121225 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121224 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۴ دی +UID:FARSIDATE13911004 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121226 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121225 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۵ دی +UID:FARSIDATE13911005 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:روز پنجم دی ماه مصادف با واقعه زلزله بم در تقویم رسمی کشور روز + "ملی ایمنی در برابر زلزله" نامگذاری شد. بعد از وقوع این زمین لرزه مهیب در + بم ، ٨٠‬درصد شهر تخریب شد و به ۱٧‬درصد ساختمانهای آن آسیب جدی سازه‌ای، ‪ ٢ + .٨‬دهم آسیب جدی غیر سازه‌ای و حدود ‪‬دو درصد آسیب غیر جدی وارد شد. همچنین + ‪ ٣۱‬هزار نفر زخمی و ‪ ٢۵‬هزار نفر از جمعیت ٩٠‬هزار نفری بم کشته شدند. +DTEND;VALUE=DATE:20121226 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121225 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز ملی ایمنی در برابر زلزله +UID:SHAMSI13911005-336 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:در باور مسیحیان عیسی تجسم خدا در جسم انسانی و آغازگر جریان مسیح + یت است. او در شهر بیت‌لحم از شهرهای ایالت ناصره منطقه یهودیه به دنیا آمد. + مسلمانان به عیسی به عنوان یک پیامبر باور دارند و برخی از دیگر مذاهب نیز او + را شخصیت مهمی در نظر می‌گیرند.\n\nمنابع اصلی برای بررسی زندگی عیسی چهار ا + نجیل رسمی هستند، هر چند برخی از محققین معتقدند که متن‌های دیگر چون انجیل ت + وماس نیز به اندازه چهار انجیل سنتی برای ترسیم تاریخی عیسی اهمیت دارند.\n +DTEND;VALUE=DATE:20121226 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121225 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:میلاد حضرت عیسی مسیح علیه السلام +UID:MILADI20121225-448 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121227 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121226 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۶ دی +UID:FARSIDATE13911006 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121228 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121227 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٧ دی +UID:FARSIDATE13911007 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:سواد آموزی به توفیق فرمان امام خمینی (ره) از یک حرکت محدود فرهن + گی، به نهضتی فراگیر تبدیل شد و از آن پس در شمار مقدس ترین آرمانهای انقلاب + اسلامی در آمد.به حتم، چنین آرمان مقدسی، شایستگی آن را دارد که در کنار مهم + ترین اهداف و برنامه های معجزه قرن، یعنی انقلاب شکوهمند اسلامی بنشیند و سطر + ی طلایی در کارنامه نهضت اسلامی در جهان معاصر باشد. نیاز به توصیه و توجیه ن + یست؛ زیرا همگان می دانند که آموختن تنها دستاویز انسان در سراشیب نشناختن و + ندانستن است. اما همتی بلند می خواهد و توفیقی مدام. در دین و آیینی که تعلیم + و تعلم، عبادت است، جستجوی دانش، فریضه و عالم ارجمندترین کس در میان مردم ا + ست، محرومیت از خواندن و نوشتن، بخشودنی نیست. اولین کلمه و نخستین فرمان آخر + ین کتاب آسمانی، امر به خواندن است. چنین کتابی و چنان آیینی، مسلمانی را که + نخواند و ننویسد، سرزنش می کند. آموزاندن، بهایی بود که پیامبر گرامی اسلام ح + ضرت محمد (ص) برای آزادی اسیران جنگ بدر مقرر فرمود، و آموختن، هنری است که ه + مه توانایی ها و هنری های دگر، از آن می جوشد و سر برمی آورد. +DTEND;VALUE=DATE:20121228 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121227 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:تشکیل نهضت سواد آموزی +UID:SHAMSI13911007-337 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121229 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121228 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٨ دی +UID:FARSIDATE13911008 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121230 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121229 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٩ دی +UID:FARSIDATE13911009 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20121231 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121230 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٠ دی +UID:FARSIDATE13911010 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130101 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20121231 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۱ دی +UID:FARSIDATE13911011 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130102 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20130101 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٢ دی +UID:FARSIDATE13911012 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:بنابر اعتقاد ارامنه ایران؛ حضرت "عیسی مسیح (ع)" در شب پنجم ژانو + یه به دنیا آمده و در روز ششم بدست منتظرانش غسل تعمید شده است. در ایران مسی + حیان ارمنی در نخستین روز سال نو میلادی پس از شرکت در مراسم مذهبی برای دید + و بازدید تبریک و شاد باش گویی به دیدار بزرگان خانواده می روند و این مراسم + تا شب پنجم ژانویه که ارامنه در این شب جشن میلاد حضرت مسیح (ع) را برگزار می + کنند ادامه می یابد. در کلیساهای ارامنه بر خلاف کاتولیک ها و پروتستان ها ک + ه ٢۵ دسامبر را روز میلاد حضرت مسیح (ع) می دانند؛ شب پنجم و صبح روز ششم ژان + ویه را به عنوان عید میلاد و تعمید حضرت عیسی (ع) جشن می گیرند. در شب عید می + لاد حضرت عیسی (ع) که بزرگترین عید مسیحیان ارامنه است بار دیگر مراسم مذهبی + باداراک در کلیسا برگزار می شود که همه مسیحیان در آن شرکت می کنند. اکثریت م + سیحیان ایران را ارامنه گریگوری تشکیل می دهند که دارای استقلال کلیسایی هستن + د و مطابق سنت و اعتقادات خود عمل می کنند. +DTEND;VALUE=DATE:20130102 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20130101 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:آغاز سال میلادی +UID:MILADI20130101-404 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130103 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20130102 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٣ دی +UID:FARSIDATE13911013 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130104 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20130103 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۴ دی +UID:FARSIDATE13911014 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130105 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20130104 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۵ دی +UID:FARSIDATE13911015 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم قمری +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٢٠ صفر - اربعین امام حسین (ع) - سال ۶۱ هجرى قمرى بیستم صفر روز + اربعین شهادت امام حسین(ع)و یارانش است. این روز، روز زیارت امام حسین(ع) است + . جابر بن ‏عبدالله‏ انصارى، پس از اطلاع کامل از نحوه شهادت و به دست آوردن + نشانى محل شهادت امام حسین(ع)، عازم سرزمین کربلا گردید و نخستین کسى بود که + توفیق زیارت قبر امام حسین(ع) را به دست آورد و پایه‏گذار سنت حسنه زیارت مر + قد پیشواى شهیدان، حضرت امام حسین(ع)گردید . +DTEND;VALUE=DATE:20130105 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20130104 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:اربعین حسینی تعطیل +UID:GHAMARI14340220-363 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130106 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20130105 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۶ دی +UID:FARSIDATE13911016 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130107 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20130106 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٧ دی +UID:FARSIDATE13911017 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130108 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20130107 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٨ دی +UID:FARSIDATE13911018 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130109 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20130108 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٩ دی +UID:FARSIDATE13911019 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در اواسط دی ماه ۱٣۵۶، پیک دربار نامه ممهور به مهر دربار را به د + اریوش همایون، وزیر اطلاعات و جهانگردی داد و او نامه را جهت انتشار به روزنا + مه اطلاعات داد. مسعودی صاحب امتیاز روزنامه، مفاد مقاله‌ را برای آینده روزن + امه خطرناک یافت و نگران واکنش علما و روحانیون شد. اما در تماس‌هایی که با و + زیر اطلاعات و جهانگردی و نخست وزیر وقت (آموزگار) گرفت، دریافت که برخی از م + فاد تند و تحریک آمیز آن به خواست شخص شاه در مقاله آمده است. در این مقاله – + که نویسنده آن «احمد رشیدی مطلق» ذکر شده بود – به طور صریح بی‌ حجابی را فض + یلت و حجاب، کهنه پرستی و ارتجاع معرفی و به ساحت مقدس امام (ره) اهانت، و قی + ام ۱۵ خرداد ۱٣۴٢، توطئه استعمار سرخ و سیاه معرفی شده بود. با پخش روزنامه ا + طلاعات و رسیدن آن به شهر قم، اولین واکنش‌ها آغاز شد. مدرسین حوزه علمیه قم + در بیت آیت ‌ا... حسین نوری گرد آمدند تا اقدامی هماهنگ داشته باشند و پس از + بررسی تصمیم گرفته شد تا هجدهم دی درس‌های حوزه تعطیل شود. +DTEND;VALUE=DATE:20130109 +DTSTAMP:20120614T172328 +DTSTART;VALUE=DATE:20130108 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:قیام خونین مردم قم +UID:SHAMSI13911019-338 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130110 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130109 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٠ دی +UID:FARSIDATE13911020 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:٢٠ دی مصادف است با شهادت میرزا تقی خان امیرکبیر، ستاره بی نظیر + تاریخ ایران زمین که صد و پنجاه و اندی سال پیش به عنوان صدراعظم ایران درخشی + د و در کمتر از سه سال و دو ماه بعد از شروع صدارتش خاموش شد.میرزا تقی ‌خان + فراهانی از نوادر تاریخ کشور ماست. روحیه اصلاح طلب و عشق عمیق وی به استقلال + و آزادی و اقتدار ملت مسلمان ایران، زمانی به فریاد دادخواهی ملت مظلوم لبیک + گفت، که می‌رفت تمامی ثروت و عزت کشور برای همیشه در کام جهنمی استعمار و اس + تکبار جهانی بلعیده شود. میرزا تقی خان امیرکبیر در خانواده‌ای از طبقات پایی + نی ملت ایران در روستای هزاوه به دنیا آمد و با حفظ این امتیاز در دامان یکی + از بهترین‌ و اصیل‌ترین خاندان‌های آن روز ایران تربیت یافت و رشد نمود. سران + جام دشمنی امثال آقاخان نوری و مهدعلیا و... و نادانی ناصرالدین شاه باعث شد + تا در ٢٠ محرم ۱٢۶٨ هجری قمری، امیرکبیر از صدارت معزول شود و در ٢۵ محرم از + امارت نظام و از تمام مشاغل دولتی برکنار گردد و چند روز بعد به کاشان تبعید + شود. سرانجام به فرمان نامرد روزگار ناصرالدین شاه به دست نالایقی چون حاج عل + یخان مراغه‌یی معروف به حاجب‌الدوله به طرز فیجعی در حمام فین کاشان به لقاء + حق برسد . +DTEND;VALUE=DATE:20130110 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130109 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت میرزا تقی‌خان امیرکبیر +UID:SHAMSI13911020-339 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130111 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130110 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۱ دی +UID:FARSIDATE13911021 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130112 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130111 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٢ دی +UID:FARSIDATE13911022 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:با اوج گیری نهضت اسلامی در سال ۱٣۵٧ اندیشه طرح تشکلی به نام شور + ای انقلاب در میان روحانیون معتمد حضرت امام (ره) پدید آمد که در سفر شهید مط + هری به پاریس این طرح با امام در میان گذارده شد. با موافقت معظم له این شورا + تشکیل گردید و اعضای آن انتخاب شدند. پس از آن امام خمینی (ره) طی اطلاعیه ا + ی اعضای شورای انقلاب اسلامی را تعیین و وظایف آن را برای مردم تشریح نمودند. + معظم له در بخشی از اطلاعیه خویش فرمودند: به موجب حق شرعی و بر اساس رأی اع + تماد اکثریت قاطع مردم ایران که نسبت به این جانب ابراز شده است، در جهت تحقق + اهداف اسلامی ملت شورایی به نام شورای انقلاب اسلامی مرکب از افراد با صلاحی + ت و مسلمان و متعهد و مورد وثوق موقتاً تعیین شده و شروع به کار خواهند کرد. + در آستانه پیروزی انقلاب، اعضای این شورا، مهندس بازرگان را به عنوان نخست وز + یر دولت موقت پیشنهاد کردند که حضرت امام با این پیشنهاد موافقت نمودند. +DTEND;VALUE=DATE:20130112 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130111 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:تشکیل شورای انقلاب +UID:SHAMSI13911022-340 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:" فأما من اعطی و اتقی،‌ و صدق بالحسنی، فسینسره للیسری: کسی را ک + ه از مال یا جان خود می‌بخشد، تقوا پیشه می‌کند و نیکوکاری را فراموش نمی کند + ‌به گشایش در کارها نوید داده میشود." آیات پنج و شش سوره مبارکه لیل +DTEND;VALUE=DATE:20130112 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130111 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز وقف +UID:GHAMARI14340227-442 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130113 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130112 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٣ دی +UID:FARSIDATE13911023 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٢٨ صفر - رحلت جانگداز پیامبر اسلام (ص) - سال ۱۱ هجرى قمرى آثار + بیمارى در حضرت محمد(ص) در ۶٣ سالگى پس از انجام مراسم حجةالوداع و معرفى حضر + ت على(ع) به جانشینى خویش در غدیرخم، هویدا شد و پس از تحمل چندین روز بیمارى + روح ملکوتى‏اش به اعلى علیین پیوست و در جوار رحمت الهى قرار گرفت. به هر تق + دیر، علّت وفات آن حضرت، تناول کردن غذاى مسمومى بود که یک زن یهودى به نام " + زینب" در جریان جنگ خیبر به آن حضرت خورانیده بود . +DTEND;VALUE=DATE:20130113 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130112 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:رحلت رسول اکرم +UID:GHAMARI14340228-364 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم قمری +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٢٨ صفر - شهادت امام حسن‏مجتبی (ع) - سال ۵٠ هجرى قمرى امام حسن)ع + ( به خاطر نوشیدن زهری که توسط همسرش به وی خورانید، مسموم شد و به مدت چهل ر + وز در بسترى بیمارى افتاد و روز به روز، حالش وخیم‏تر گردید، تا این که در ٢٨ + صفر سال پنجاه هجرى قمرى، مصادف با سى‏ و دومین سال رحلت پیامبر (ص) در مدین + ه به شهادت رسید و محبان اهل‏بیت (ع) را در سوگ بزرگى فرو برد . +DTEND;VALUE=DATE:20130113 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130112 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت حضرت امام حسن مجتبی تعطیل +UID:GHAMARI14340228-365 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130114 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130113 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۴ دی +UID:FARSIDATE13911024 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130115 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130114 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۵ دی +UID:FARSIDATE13911025 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:هجرت حضرت رسول اکرم(ص) از مکه به مدینه(مبدا گاه شماری هجری قمری + ) ۱ ربیع الاول - هجرت رسول خدا (ص) - نخستین سال هجرت علت هجرت رسول خدا به + علت دشمنی بیش از حد مشرکان با وی بود .سرانجام سران قریش در واپسین روزهاى م + اه صفر، تصمیم به کشتن پیامبر(ص) گرفتند. ولی پیامبر همراه ابوبکر از مکه گری + خت و پس از سه شب پنهان ماندن در غار ثور، در شب چهارم ربیع الاول به سوى مدی + نه هجرت کرد و در دوازدهم همین ماه وارد مدینه شد و مورد استقبال باشکوه اهال + ى مدینه قرار گرفت. این شهر از آن پس، به مدینة الرّسول (ص) شهرت یافت . +DTEND;VALUE=DATE:20130115 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130114 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:هجرت حضرت رسول اکرم از مکه به مدینه +UID:GHAMARI14340301-366 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130116 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130115 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۶ دی +UID:FARSIDATE13911026 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:٢۶ دی ماه سال ۵٧ روز فرار شاه از ایران است. شاه که سالها تحت حم + ایت اربابان آمریکایی خویش و با تکیه بر اریکه سلطنت، کشور را تحت سلطه گرفته + و عرصه ترکتازی و غارتگری‌های خود قرار داده بود، سرانجام فرار را بر قرار ت + رجیح داد و مجبور به ترک ایران شد. پادشاهی و سلطنت به عنوان موهبتی الهی و ا + ز طریق ارث تحت حمایت‌های امپراطوری انگلیس به وی تفویض شده بود. وی طی سالها + ی سلطنت خود، از هیچ گونه جنایتی دریغ نکرد و ضمن ترویج فساد و ایجاد رعب و و + حشت، دلاور مردان بسیاری را در زندان‌ها تحت شکنجه قرار داده و یا به شهادت ر + سانید. تبعیض و شکاف‌های طبقاتی به اوج رسیده بود و دیکتاتور با توسل به حربه + ‌های گوناگون تلاش می‌کرد تا ملت آگاه و شجاع ایران را در خوابی خرگوشی فرو ب + رد . +DTEND;VALUE=DATE:20130116 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130115 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:فرار شاه +UID:SHAMSI13911026-341 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130117 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130116 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٧ دی +UID:FARSIDATE13911027 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130118 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130117 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٨ دی +UID:FARSIDATE13911028 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130119 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130118 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٩ دی +UID:FARSIDATE13911029 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:روز ٢٩ دی ماه ۱٣٨٨برابر با ۱٨ ژانویه ٢٠۱٠ مصادف با ٢۱ محرم ۱۴٣٠ + به عنوان غزه نماد مقاومت فلسطین اعلام و در تقویم رسمی جمهوری اسلامی ایران + ثبت می شود.\n +DTEND;VALUE=DATE:20130119 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130118 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز غزه +UID:SHAMSI13911029-441 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130120 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130119 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣٠ دی +UID:FARSIDATE13911030 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130121 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130120 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱ بهمن +UID:FARSIDATE13911101 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130122 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130121 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢ بهمن +UID:FARSIDATE13911102 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٨ ربیع الاول - شهادت امام حسن عسکرى (ع) - سال ٢۶٠ هجرى قمرى اما + م حسن عسکرى)ع(، امام یازدهم شیعیان، در هشتم ربیع الاوّل سال ٢۶٠ هجرى قمرى + در شهر سامرا به شهادت رسید. امام حسن عسکری (ع) از سوی خلفاى عباسى ، فشارها + و سختى‏هاى زیادى متحمل گردید و سرانجام به وسیله زهرى که معتمد عباسى به آن + حضرت خورانید، مسموم و پس از چند روز تحمل بیمارى، روح ملکوتى‏اش به لقاءالل + ه پیوست . +DTEND;VALUE=DATE:20130122 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130121 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:شهادت حضرت امام حسن عسکری +UID:GHAMARI14340308-367 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130123 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130122 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣ بهمن +UID:FARSIDATE13911103 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130124 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130123 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۴ بهمن +UID:FARSIDATE13911104 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130125 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130124 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۵ بهمن +UID:FARSIDATE13911105 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130126 +DTSTAMP:20120614T172329 +DTSTART;VALUE=DATE:20130125 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۶ بهمن +UID:FARSIDATE13911106 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:میلاد حضرت رسول اکرم(ص) به روایت اهل سنت تاریخ نگاران و سیره نو + یسان شیعه و اهل سنت، درباره روز تولد وى، اختلاف نظر دارند. شیعیان، معتقدند + که رسول خدا(ص) در روز جمعه، مصادف با ۱٧ ربیع الاوّل، به دنیا آمد و اهل سن + ت مى‏گویند که تولد وى، روز دوشنبه دوازدهم ربیع الاوّل بوده است . +DTEND;VALUE=DATE:20130126 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130125 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:میلاد حضرت رسول اکرم به روایت اهل سنت +UID:GHAMARI14340312-368 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130127 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130126 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٧ بهمن +UID:FARSIDATE13911107 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130128 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130127 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٨ بهمن +UID:FARSIDATE13911108 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130129 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130128 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٩ بهمن +UID:FARSIDATE13911109 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130130 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130129 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٠ بهمن +UID:FARSIDATE13911110 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130131 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130130 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۱ بهمن +UID:FARSIDATE13911111 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱٧ ربیع الاول - میلاد مسعود پیامبر اکرم (ص) - اوّل عام الفیل حض + رت محمد(ص)، آخرین پیامبر الهى در ۱٧ ربیع الاوّل از پدرى به نام "عبدالله بن + عبدالمطلب" و مادرى به نام " آمنه " دیده به جهان گشود . با انوار رخسار و ج + مال منوّرش، جهان تیره و تاریک، به ویژه عربستان را روشن گردانید . پدرش عبدا + لله بن عبدالمطلب، دو ماه پیش از تولد وی، از دنیا رفته بود. مادرش آمنه نیز + پس از دو سال و چهار ماه از تولد تنها فرزند دلبندش حضرت محمد(ص)، بدرود حیات + گفت. رسول خدا(ص) در کفالت جدش عبدالمطلب، بزرگ و سید قریش مکه، قرار گرفت . +DTEND;VALUE=DATE:20130131 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130130 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:میلاد حضرت رسول اکرم +UID:GHAMARI14340317-369 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱٧ ربیع الاول - زادروز فرخنده امام جعفر صادق (ع) - سال ٨٣ هجرى + قمرى عبدالله، جعفر بن محمد ، امام ششم شیعیان در روز جمعه، هفدهم ربیع‏الاوّ + ل سال ٨٣ قمرى دیده به جهان گشود.شیعیان و محبّان اهل بیت(ع) وى را به " صادق + آل محمد(ص) " مى‏شناسند. زیرا آن حضرت، هرگز سخنى جز راست و درست، چیزى نفرم + ود. آن حضرت به مدت ٣٢ سال از وجود شریف پدرش امام محمد باقر (ع) برخوردار بو + د و در تمام رویدادهاى مهم در کنار پدر ارجمندش قرار داشت. مدت امامت امام جع + فر صادق (ع)، ٣٣ سال و ده ماه (از ذى حجه سال ۱۱۴ تا ٢۵ شوال سال ۱۴٨ قمرى ) + بود . +DTEND;VALUE=DATE:20130131 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130130 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:میلاد حضرت امام جعفر صادق +UID:GHAMARI14340317-370 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130201 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130131 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٢ بهمن +UID:FARSIDATE13911112 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:بازگشت حضرت امام خمینی به ایران(۱٣۵٧ ه.ش) و آغاز دهه فجر ۱٢ بهم + ن ۱٣۵٧ (یکم فوریه ۱٩٧٩) آیة الله العظمی خمینی پس از ۱۵ سال اقامت اجباری در + خارج و عمدتا در عراق، از پاریس به ایران بازگشت و مورد استقبال میلیونی قرا + رگرفت. وی نزدیک به چهارماه در فرانسه اقامت داشت. با هواپیمای حامل او، یکصد + و پنجاه روزنامه نگار نیز به تهران آمده بودند تا شاهد تحولات باشند. آیة ال + له خمینی از فرودگاه عازم گورستان بهشت زهرا محل دفن جان باختگان انقلاب شد و + در آنجا ضمن سخنانی، مجلس و دولت شاه را غیر قانونی اعلام و از ارتش خواست ک + ه با چنین افرادی (شاپور بختیار نخست وزیر وقت) همکاری نکند . +DTEND;VALUE=DATE:20130201 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130131 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:بازگشت امام خمینی به ایران وآغاز دهه فجر +UID:SHAMSI13911112-342 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130202 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130201 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٣ بهمن +UID:FARSIDATE13911113 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130203 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130202 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۴ بهمن +UID:FARSIDATE13911114 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:۱۴ بهمن ماه با تصویب شورای عالی انقلاب فرهنگی روز فناوری فضایی + نامگذاری شد. \nاولین ماهواره ایرانی با نام امید ۱۴ بهمن ۱٣٨٧ گذشته به فضا + پرتاب شد که به دنبال آن نام جمهوری اسلامی ایران در میان کشورهای دارای فناو + ری ماهواره ای در جهان ثبت شد.\n +DTEND;VALUE=DATE:20130203 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130202 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز فناوری فضایی +UID:SHAMSI13911114-443 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130204 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130203 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۵ بهمن +UID:FARSIDATE13911115 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130205 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130204 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۶ بهمن +UID:FARSIDATE13911116 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130206 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130205 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٧ بهمن +UID:FARSIDATE13911117 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130207 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130206 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٨ بهمن +UID:FARSIDATE13911118 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130208 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130207 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٩ بهمن +UID:FARSIDATE13911119 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DTEND;VALUE=DATE:20130208 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130207 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز نیروی هوایی +UID:SHAMSI13911119-343 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130209 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130208 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٠ بهمن +UID:FARSIDATE13911120 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130210 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130209 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۱ بهمن +UID:FARSIDATE13911121 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130211 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130210 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٢ بهمن +UID:FARSIDATE13911122 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم شمسی +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:پیروزی انقلاب اسلامی ایران و سقوط نظام شاهنشاهی در این روز در س + ال ۱٣۵٧ ( ۱٩٧٩ میلادی ) انقلاب ایران ، دوازده روز پس از بازگشت آیة الله عظ + ما خمینی از تبعید ۱۵ ساله به تهران به پیروزی رسید . ارتش در پی بی اعتنایی + مردم به حکومت نظامی و ریختن به خیابانها اعلام بی طرفی کرد ، آخرین نخست وزی + ر نظام سلطنتی پنهان شد و نخست وزیر دولت موقت انقلاب زمام امور را به دست گر + فت و٢٢ بهمن سالروز پیروزی انقلاب اعلام شده است. +DTEND;VALUE=DATE:20130211 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130210 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:پیروزی انقلاب اسلامی تعطیل +UID:SHAMSI13911122-344 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130212 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130211 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٣ بهمن +UID:FARSIDATE13911123 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130213 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130212 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۴ بهمن +UID:FARSIDATE13911124 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130214 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130213 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۵ بهمن +UID:FARSIDATE13911125 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130215 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130214 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۶ بهمن +UID:FARSIDATE13911126 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130216 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130215 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٧ بهمن +UID:FARSIDATE13911127 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130217 +DTSTAMP:20120614T172330 +DTSTART;VALUE=DATE:20130216 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٨ بهمن +UID:FARSIDATE13911128 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130218 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130217 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٩ بهمن +UID:FARSIDATE13911129 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:قیام مردم تبریز به مناسبت چهلمین روز شهادت شهدای قم(۱٣۵۶ ه.ش) ر + وز ٢٩ بهمن ۱٣۵۶، که مصادف با چهلم فاجعه قم در ۱٩ دی بود، در بسیاری از شهره + ا و نقاط کشور به یاد و خاطره شهدای آن فاجعه، مجالس ختم و سوگواری برگزار شد + .در تبریز نیز قرار بود ساعت ۱٠ صبح مردم در مسجد قزللی (میرزا آقا یوسف مجته + د) تجمع نمایند. دعوت از سوی آیت الله قاضی و ده تن دیگر از علمای تبریز صورت + گرفته بود.همچنین در ٢۵ بهمن آیات عظام گلپایگانی و شریعتمداری نیز به همین + مناسبت اعلامیه هایی صادر و این روز را عزای عمومی اعلام کرده بودند. در روز + ٢٩ بهمن مردم در حالی که جمع می شدند، در مقابل مسجد، اعلامیه ها را نیز مطال + عه می کردند.به عزا می نشاند! +DTEND;VALUE=DATE:20130218 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130217 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:قیام مردم تبریز +UID:SHAMSI13911129-345 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130219 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130218 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣٠ بهمن +UID:FARSIDATE13911130 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130220 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130219 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱ اسفند +UID:FARSIDATE13911201 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130221 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130220 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢ اسفند +UID:FARSIDATE13911202 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:٨ ربیع الثانی - میلاد مسعود امام حسن عسکرى (ع) - سال ٢٣٢ هجرى ق + مرى امام حسن بن على )ع(، که شیعیان وى را "امام حسن عسکرى(ع)" مى‏نامند، در + روز جمعه، مصادف با هشتم ربیع الثانى سال ٢٣٢ قمرى، در مدینه منوّره دیده به + جهان گشود. وى، امام یازدهم شیعیان و پدر ارجمندش امام على النقى )ع ( است. ب + ا تولد امام حسن عسکرى)ع( ، در مدینه منوّره شور و شعف ویژه اى در خاندان پیا + مبر (ص) و دوستداران اهل بیت (ع) به وجود آمد و حرم اهل بیت (ع) را غرق در شا + دى و شادمانى نمود. تولد امام حسن عسکرى)ع( در مدینه منوّره، مقارن بود با خل + افت متوکل عباسى . +DTEND;VALUE=DATE:20130221 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130220 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت امام حسن عسکری +UID:GHAMARI14340408-371 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130222 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130221 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣ اسفند +UID:FARSIDATE13911203 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130223 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130222 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۴ اسفند +UID:FARSIDATE13911204 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۱٠ربیع الثانی – وفات حضرت معصومه (س) حضرت فاطمه معصومه(س) در پی + برادر ارجمندش امام رضا (ع) ، از مدینه منوره، راهی خراسان شد. اما میان راه + بیمار و به شهر قم رفتند . چون سختی راه دراز و تحمل رفتار و کردار برخی از + مغرضان و دشمنان، روح شریف و بلندش را آزرده کرده بود ،‌ چندان دوام نیاورد و + پس از شانزده روز ، دار فانی را وداع گفت و روح بلندش به اعلی علیین پیوست . +DTEND;VALUE=DATE:20130223 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130222 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:وفات حضرت معصومه +UID:GHAMARI14340410-372 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130224 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130223 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۵ اسفند +UID:FARSIDATE13911205 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:روز بزرگداشت خواجه نصیرالدین طوسی- روز مهنسی محمد بن حسن جهرودی + طوسی مشهور به خواجه نصیرالدین طوسی در تاریخ ۱۵ جمادی الاول ۵٩٨ هجری قمری + در طوس ولادت یافته است. او به تحصیل دانش علاقه زیادی داشت و از دوران کودکی + جوانی در علوم ریاضی و نجوم و حکمت سرآمد شدو از دانشمندان معروف زمان خود گ + ردید طوسی یکی از سرشناس ترین و با نفوذترین چهره های تاریخ فکری اسلامی است + علوم دینی و علوم عملی را زیر نظر پدرش و منطق و حکمت طبیعی را نزد خالویش با + با افضل ایوبی کاشانی آموخت تحصیلاتش را در نیشابور به اتمام رسانید و در آنج + ا به عنوان دانشمندی برجسته شهرت یافت خواجه نصیرالدین طوسی را دسته ای از دا + نشوران خاتم فلاسفه ای و گروهی او را عقل حادی عشر(یازدهم) نام نهاده اند. +DTEND;VALUE=DATE:20130224 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130223 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت خواجه نصیرالدین طوسی و روز مهندسی +UID:SHAMSI13911205-346 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130225 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130224 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۶ اسفند +UID:FARSIDATE13911206 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130226 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130225 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٧ اسفند +UID:FARSIDATE13911207 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130227 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130226 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٨ اسفند +UID:FARSIDATE13911208 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در چنین روزی در سال ۱٣۵٩ به همت شهیدان رجایی و باهنر امور تربیت + ی به عنوان یکی بخش جدایی ناپذیر از تعلیمات تاسیس شد.پس از انقلاب اسلامی یک + ی از مهمترین دغدغه های مردم و مسوولان ایجاد روحیه دینی و تقویت نماد های در + میان دانش آموزان به عنوان نسل نوپای جامعه بود.به همین دلیل نام آموزش و پر + ورش باید در پرورش دینی نیز تجلی می یافت . +DTEND;VALUE=DATE:20130227 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130226 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز امور تربیتی و تربیت اسلامی +UID:SHAMSI13911208-347 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130228 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130227 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٩ اسفند +UID:FARSIDATE13911209 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:سنگ بنای اولیه تشکیلات موسسه استاندارد همزمان با تصویب قانون او + زان و مقیاس ها در سال ۱٣٠۴ مطرح شد اما بعدها در سال ۱٣٣٢ بنا به ضرورت تعیی + ن ویژگیها و نظارت بر کیفیت کالاهای صادراتی و وارداتی، تشکیلات سازمانی موسس + ه در قالب اداره ای در وزارت تجارت وقت ایجاد گردید، موسسه استاندارد در سال + ۱٣٣٩ با تصویب قانون تاسیس، کار خود را در چارچوب هدفها و مسئولیت های تعیین + شده آغاز نمود و در همان سال به عضویت سازمان بین المللی استاندارد ایزو (ISO + ) در آمد و در کمیته های فنی ایزو حضور فعال دارد و در ۱٠۴ کمیته فنی اصلی و + فرعی عضو فعال و در ۱٣۴ کمیته فنی اصلی و فرعی عضو ناظر است . +DTEND;VALUE=DATE:20130228 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130227 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز حمایت از حقوق مصرف کنندگان +UID:SHAMSI13911209-348 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130301 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130228 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٠ اسفند +UID:FARSIDATE13911210 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130302 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130301 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۱ اسفند +UID:FARSIDATE13911211 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130303 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130302 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٢ اسفند +UID:FARSIDATE13911212 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130304 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130303 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٣ اسفند +UID:FARSIDATE13911213 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130305 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130304 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۴ اسفند +UID:FARSIDATE13911214 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:در ۱۴ اسفندماه ۱٣۵٧ هجری شمسی فرمان امام خمینی (ره) مبنی بر تشک + یل کمیته امداد صادر شد. این نهاد برای ایجاد رفاه و برقراری تسهیلاتی در امر + کمک رسانی به محرومان جامعه دایر شد. گفتنی است این نهاد انقلابی اکنون بنام + کمیته امداد امام خمینی مشغول فعالیت است. سابقه کمیته امداد امام خمینی (ره + ) به سالهای قبل از پیروزی انقلاب اسلامی ایران ـ حدوداً سالهای ۱٣۴٢- ۱٣۴٣ ب + از می گردد که تعدادی از انقلابیون که در زمره یاران امام (ره) بودند، ماموری + ت یافتند که به خانواده های زندانیان، نیازمندان و مبارزین رسیدگی کنند. +DTEND;VALUE=DATE:20130305 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130304 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز احسان و نیکوکاری +UID:SHAMSI13911214-349 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130306 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130305 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۵ اسفند +UID:FARSIDATE13911215 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:هر ساله با نزدیک‌تر شدن به بهار و در پانزدهم اسفندماه روزی به ن + ام روز درختکاری نامیده می‌شود؛ روزی که اغلب مردم و نیز مسئولان کشور با کاش + ت نهالی تلاش می‌کنند که به نوبه خود ضمن تشویق مردم به امر توجه کردن به درخ + ت و درختکاری خودشان هم سهمی در گسترش فضای سبز داشته باشند و همچنین سنت حسن + ه‌ای را برپا دارند.حال که صحبت از درخت و کاشتن این موهبت الهی به میان آمد، + قصد داریم به سراغ کتاب نجات‌بخش خداوندی برویم و از میان آیات نورانی آن سخ + نی چند در باب درختان نام برده شده در این کتاب بیان کنیم. باشد که مورد قبول + واقع شود.قبل از هر سخنی ذکر این نکته را واجب می‌دانیم آنچه در باب درختان + موجود در قرآن کریم بیان می‌شود، تنها برخی از این درختان هستند. +DTEND;VALUE=DATE:20130306 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130305 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز درختکاری +UID:SHAMSI13911215-350 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130307 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130306 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱۶ اسفند +UID:FARSIDATE13911216 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130308 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130307 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٧ اسفند +UID:FARSIDATE13911217 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130309 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130308 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٨ اسفند +UID:FARSIDATE13911218 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد میلادی +CLASS:PUBLIC +DESCRIPTION:در هشتم مارس ۱٨۵٧، زنان کارگر کارگاه‌های پارچه‌بافی و لباس دوزی + در نیویورک آمریکا به خیابان‌ها ریختند و خواهان افزایش دستمزد، کاهش ساعات + کار و بهبود شرایط بسیار نامناسب کار شدند. این تظاهرات با حمله پلیس و کتک‌ز + دن زنان برهم خورد. سال ۱٩٠٧ در دوره‌ای که مبارزات زنان برای تأمین حقوق سیا + سی و اجتماعی اوج گرفته بود، بمناسبت پنجاهمین سالگشت تظاهرات نیویورک در هشت + م مارس، زنان دست به تظاهرات زدند. ایده انتخاب روزی از سال به‌عنوان «روز زن + » نخستین بار در جریان مبارزه زنان نیویورک با شعار "حق رای برای زنان" مطرح + شد. دو هزار زن تظاهر کننده در ٢٣ فوریه ۱٩٠٩ پیشنهاد کردند که هر سال در روز + یکشنبه آخر فوریه، یک تظاهرات سراسری در آمریکا بمناسبت «روز زن» برگزار شود + . +DTEND;VALUE=DATE:20130309 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130308 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز جهانی زن +UID:MILADI20130308-405 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130310 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130309 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:۱٩ اسفند +UID:FARSIDATE13911219 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130311 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130310 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٠ اسفند +UID:FARSIDATE13911220 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130312 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130311 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۱ اسفند +UID:FARSIDATE13911221 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130313 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130312 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٢ اسفند +UID:FARSIDATE13911222 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:روز بزرگداشت شهدا بسم الله الرحمن الرحیم مَن طَلَبَنی وَجَدَنی + وَ مَن وَجَدَنی عَرَفَنی وَ مَن عَرَفَنی عَشَقَنی وَ مَن عَشَقَنی عَشَقتُه + ُ وَ مَن عَشَقتُهُ قَتَلتُهُ وَ مَن قَتَلتُهُ فَعَلی دِیَتُه وَ مَن عَلی د + ِیَتُه وَ اَنَا دِیَتُه هرکس من را طلب می کند می یابد مرا، و کسیکه مرا یاف + ت می شناسد مرا، و کسیکه من را دوست داشت، عاشق من می شود و کسیکه عاشق من می + شود، من عاشق او می شوم و کسیکه من عاشق او بشوم، او را می کشم و کسیکه من ا + و را بکشم، خونبهایش بر من واجب است، پس خون بهای او من هستم. +DTEND;VALUE=DATE:20130313 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130312 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز بزرگداشت شهدا +UID:SHAMSI13911222-351 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130314 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130313 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٣ اسفند +UID:FARSIDATE13911223 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130315 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130314 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۴ اسفند +UID:FARSIDATE13911224 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130316 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130315 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۵ اسفند +UID:FARSIDATE13911225 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:بمباران شیمیایی حلبچه توسط ارتش بعث عراق(۱٣۶۶ ه.ش) چند سال پیش + در چنین روزی در سال ۱٣۶۶ ه.ش ، مردم مظلوم حَلَبچه بدست عوامل رژیم بعثی عرا + ق قتل عام شدند.حَلَبچه یا حلبجه یکی از شهرهای کردستان عراق در ۱۵-۱٠ کیلومت + ری مرز ایران و٢٢۵ کیلومتری شمال شرقی بغداد است. جمعیت حلبچه در حدود ٨٠٠٠٠ + نفر است که بیشتر ایشان کرد هستند. حلبچه از مناطق گورانی‌زبان بوده که در آن + کردی سورانی به مرور جانشین گویش گورانی گشته است.مردم بی دفاع حلبچه در جری + ان جنگ ایران و عراق، در تاریخ ۱۶ تا ۱٧ مارس ۱٩٨٨ توسط رژیم بعث عراق طی عمل + یاتی مرسوم به عملیات انفال بمباران شیمیایی شدند .عملیات انفال، نام عملیاتی + در سال ۱٩٨٨ بود که در آن نیروهای رژیم بعث عراق که به طور مستقیم از صدام ح + سین تکریتی فرمان میگرفتند، بیش از صد هزار کرد عراقی را قتل عام کردند.دراین + فاجعه ۵٠٠٠ تن شهید و ٧٠٠٠ نفرمجروح شدند. +DTEND;VALUE=DATE:20130316 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130315 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:بمباران شیمیایی حلبچه توسط ارتش عراق +UID:SHAMSI13911225-352 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130317 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130316 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢۶ اسفند +UID:FARSIDATE13911226 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130318 +DTSTAMP:20120614T172331 +DTSTART;VALUE=DATE:20130317 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٧ اسفند +UID:FARSIDATE13911227 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130319 +DTSTAMP:20120614T172332 +DTSTART;VALUE=DATE:20130318 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٨ اسفند +UID:FARSIDATE13911228 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:رخداد هجری قمری +CLASS:PUBLIC +DESCRIPTION:۵ جمادی الاول - حضرت زینب کبری(س) – سال ۶ هجری قمری حضرت زینب(س + ) در سال ششم قمری، در حیات جدش حضرت محمد(ص)، در مدینه منوره دیده به جهان گ + شود . پدرش امیرمؤمنان علی بن ابی طالب(ع) و مادرش فاطمه زهرا(س) می باشند. ا + ین کودک سعادتمند، در خردسالی مادرش را از دست داد و در خانه خویش، به جای ما + در مهربان مورد احترام همگان قرار گرفت. اوج ایثارگری، فداکاری و کمالات روحی + وی در واقعه کربلا به منصه ظهور رسید. وی با سرپرستی اسیران و بازماندگان شه + یدان کربلا و تحمل اسارت کوفه و شام و خواندن خطبه های غرّا در مجلس عبیدالله + بن زیاد در کوفه و در مجلس یزید بن معاویه در شام ، قیام برادرش امام حسین(ع + ) را به کمال رسانید . +DTEND;VALUE=DATE:20130319 +DTSTAMP:20120614T172332 +DTSTART;VALUE=DATE:20130318 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:ولادت حضرت زینب و روز پرستار و بهورز +UID:GHAMARI14340505-373 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130320 +DTSTAMP:20120614T172332 +DTSTART;VALUE=DATE:20130319 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٢٩ اسفند +UID:FARSIDATE13911229 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تعطیل - تقویم شمسی +CATEGORIES:رخداد هجری شمسی +CLASS:PUBLIC +DESCRIPTION:روز ملی شدن صنعت نفت ایران(۱٣٢٩ ه.ش) دکتر محمد مصدق نخست وزیر و + قت و مبارز راه ملی شدن نفت ایران روز ٢٩ اسفند هر سال را روز ملی شدن نفت ، + یک روز ملی و تعطیل عمومی اعلام کرد. سال پیش از این در ٢٩ اسفند طرح ملی شدن + نفت ایران به صورت قانون در آمده بود که در اجرای آن پس از پنج دهه از انگلس + تان در نفت ایران خلع ید شد و این دولت را چنان بر آشفت که تا بر اندازی حکوم + ت دکتر مصدق در مرداد ۱٣٣٢ دست از مخالفت ، تحریک ، تحریم و توطئه نکشید.یک ر + وز پیش از اعلام روز ٢٩ اسفند به عنوان یک روز ملی ، دکتر مصدق جزئیات ظلمهای + انگلستان به ملت ایران در طول ۱۵٠ سال و مداخلات این دولت از جمله انحصار نف + ت ایران در دست خود را برای دهها روزنامه نگار آمریکایی که به تهران آمده بود + ند تشریح کرده بود و چند روز پیش از آن هم آب پاکی روی دست نمایندگان بانک جه + انی که برای میانجیگری به تهران آمده بودند ریخته بود. +DTEND;VALUE=DATE:20130320 +DTSTAMP:20120614T172332 +DTSTART;VALUE=DATE:20130319 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:روز ملی شدن صنعت نفت تعطیل +UID:SHAMSI13911229-353 +END:VEVENT +BEGIN:VEVENT +CATEGORIES:تاریخ +CLASS:PUBLIC +DTEND;VALUE=DATE:20130321 +DTSTAMP:20120614T172332 +DTSTART;VALUE=DATE:20130320 +SEQUENCE:0 +STATUS:Confirmed +SUMMARY:٣٠ اسفند +UID:FARSIDATE13911230 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/IrishHolidays2003-2011.ics b/media/caldata/IrishHolidays2003-2011.ics new file mode 100644 index 00000000000..c5e4a2d8df4 --- /dev/null +++ b/media/caldata/IrishHolidays2003-2011.ics @@ -0,0 +1,1852 @@ +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :2306c192-11b0-11d8-b3f4-e5c2589ab385 +SUMMARY + :New Year's Day +DESCRIPTION + :New Year's Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=1 +DTSTART + ;VALUE=DATE + :20020101 +DTEND + ;VALUE=DATE + :20020102 +DTSTAMP + :20031108T054248Z +LAST-MODIFIED + :20031108T055618Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :695e82ec-11b0-11d8-91b3-c766356102f2 +SUMMARY + :St. Patrick's Day +DESCRIPTION + :St. Patrick's Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=3 +DTSTART + ;VALUE=DATE + :20020317 +DTEND + ;VALUE=DATE + :20020318 +DTSTAMP + :20031108T055644Z +LAST-MODIFIED + :20031108T055845Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :c1d11fb6-11b0-11d8-82f9-a3176239fec5 +SUMMARY + :Christmas Day +DESCRIPTION + :Christmas Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=12 +DTSTART + ;VALUE=DATE + :20021225 +DTEND + ;VALUE=DATE + :20021226 +DTSTAMP + :20031108T055924Z +LAST-MODIFIED + :20031108T060009Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e0c3c5f4-11b0-11d8-8335-dc99c537b661 +SUMMARY + :St. Stephen's Day +DESCRIPTION + :St. Stephen's Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=12 +DTSTART + ;VALUE=DATE + :20021226 +DTEND + ;VALUE=DATE + :20021227 +DTSTAMP + :20031108T060012Z +LAST-MODIFIED + :20031108T065136Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :7cdb2e80-1483-11d8-ab39-ad8d64337c11 +SUMMARY + :Good Friday +DESCRIPTION + :Good Friday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20030418 +DTEND + ;VALUE=DATE + :20030419 +DTSTAMP + :20031111T201242Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :8f50a34c-1483-11d8-bb16-921ae262e711 +SUMMARY + :Easter Monday +DESCRIPTION + :Easter Monday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20030421 +DTEND + ;VALUE=DATE + :20030422 +DTSTAMP + :20031111T201320Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :a29f0e16-1483-11d8-aa76-fc69c4f55191 +SUMMARY + :May Day +DESCRIPTION + :May Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20030505 +DTEND + ;VALUE=DATE + :20030506 +DTSTAMP + :20031111T201401Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :b156118e-1483-11d8-8153-f721661c0a41 +SUMMARY + :June Holiday +DESCRIPTION + :June Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20030602 +DTEND + ;VALUE=DATE + :20030603 +DTSTAMP + :20031111T201430Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :cc6b47e6-1483-11d8-8cb0-d542a286a101 +SUMMARY + :August Holiday +DESCRIPTION + :August Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20030804 +DTEND + ;VALUE=DATE + :20030805 +DTSTAMP + :20031111T201452Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e27dcd1a-1483-11d8-b7a1-ca283f970c81 +SUMMARY + :October Holiday +DESCRIPTION + :October Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20031027 +DTEND + ;VALUE=DATE + :20031028 +DTSTAMP + :20031111T201553Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :a29f0e16-1483-11d8-aa76-fc69c4f55196 +SUMMARY + :May Day +DESCRIPTION + :May Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20080505 +DTEND + ;VALUE=DATE + :20080506 +DTSTAMP + :20031111T201401Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :b156118e-1483-11d8-8153-f721661c0a46 +SUMMARY + :June Holiday +DESCRIPTION + :June Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20080602 +DTEND + ;VALUE=DATE + :20080603 +DTSTAMP + :20031111T201430Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :cc6b47e6-1483-11d8-8cb0-d542a286a106 +SUMMARY + :August Holiday +DESCRIPTION + :August Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20080804 +DTEND + ;VALUE=DATE + :20080805 +DTSTAMP + :20031111T201452Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e27dcd1a-1483-11d8-b7a1-ca283f970c86 +SUMMARY + :October Holiday +DESCRIPTION + :October Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20081027 +DTEND + ;VALUE=DATE + :20081028 +DTSTAMP + :20031111T201553Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :7cdb2e80-1483-11d8-ab39-ad8d64337c12 +SUMMARY + :Good Friday +DESCRIPTION + :Good Friday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20040409 +DTEND + ;VALUE=DATE + :20040410 +DTSTAMP + :20031111T201242Z +LAST-MODIFIED + :20031111T203335Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :8f50a34c-1483-11d8-bb16-921ae262e712 +SUMMARY + :Easter Monday +DESCRIPTION + :Easter Monday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20040412 +DTEND + ;VALUE=DATE + :20040413 +DTSTAMP + :20031111T201320Z +LAST-MODIFIED + :20031111T203344Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :a29f0e16-1483-11d8-aa76-fc69c4f55192 +SUMMARY + :May Day +DESCRIPTION + :May Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20040503 +DTEND + ;VALUE=DATE + :20040504 +DTSTAMP + :20031111T201401Z +LAST-MODIFIED + :20031111T203356Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :b156118e-1483-11d8-8153-f721661c0a42 +SUMMARY + :June Holiday +DESCRIPTION + :June Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20040607 +DTEND + ;VALUE=DATE + :20040608 +DTSTAMP + :20031111T201430Z +LAST-MODIFIED + :20031111T203407Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :cc6b47e6-1483-11d8-8cb0-d542a286a102 +SUMMARY + :August Holiday +DESCRIPTION + :August Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20040802 +DTEND + ;VALUE=DATE + :20040803 +DTSTAMP + :20031111T201452Z +LAST-MODIFIED + :20031111T203419Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e27dcd1a-1483-11d8-b7a1-ca283f970c82 +SUMMARY + :October Holiday +DESCRIPTION + :October Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20041025 +DTEND + ;VALUE=DATE + :20041026 +DTSTAMP + :20031111T201553Z +LAST-MODIFIED + :20031111T203429Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :8f50a34c-1483-11d8-bb16-921ae262e713 +SUMMARY + :Easter Monday +DESCRIPTION + :Easter Monday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20050328 +DTEND + ;VALUE=DATE + :20050329 +DTSTAMP + :20031111T201320Z +LAST-MODIFIED + :20031111T203454Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :7cdb2e80-1483-11d8-ab39-ad8d64337c13 +SUMMARY + :Good Friday +DESCRIPTION + :Good Friday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20050325 +DTEND + ;VALUE=DATE + :20050326 +DTSTAMP + :20031111T201242Z +LAST-MODIFIED + :20031111T203507Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :a29f0e16-1483-11d8-aa76-fc69c4f55193 +SUMMARY + :May Day +DESCRIPTION + :May Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20050502 +DTEND + ;VALUE=DATE + :20050503 +DTSTAMP + :20031111T201401Z +LAST-MODIFIED + :20031111T203524Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :b156118e-1483-11d8-8153-f721661c0a43 +SUMMARY + :June Holiday +DESCRIPTION + :June Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20050606 +DTEND + ;VALUE=DATE + :20050607 +DTSTAMP + :20031111T201430Z +LAST-MODIFIED + :20031111T203533Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :cc6b47e6-1483-11d8-8cb0-d542a286a103 +SUMMARY + :August Holiday +DESCRIPTION + :August Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20050801 +DTEND + ;VALUE=DATE + :20050802 +DTSTAMP + :20031111T201452Z +LAST-MODIFIED + :20031111T203542Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e27dcd1a-1483-11d8-b7a1-ca283f970c83 +SUMMARY + :October Holiday +DESCRIPTION + :October Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20051031 +DTEND + ;VALUE=DATE + :20051101 +DTSTAMP + :20031111T201553Z +LAST-MODIFIED + :20031111T203554Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :7cdb2e80-1483-11d8-ab39-ad8d64337c14 +SUMMARY + :Good Friday +DESCRIPTION + :Good Friday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20060414 +DTEND + ;VALUE=DATE + :20060415 +DTSTAMP + :20031111T201242Z +LAST-MODIFIED + :20031111T203611Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :8f50a34c-1483-11d8-bb16-921ae262e714 +SUMMARY + :Easter Monday +DESCRIPTION + :Easter Monday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20060417 +DTEND + ;VALUE=DATE + :20060418 +DTSTAMP + :20031111T201320Z +LAST-MODIFIED + :20031111T203619Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :a29f0e16-1483-11d8-aa76-fc69c4f55194 +SUMMARY + :May Day +DESCRIPTION + :May Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20060501 +DTEND + ;VALUE=DATE + :20060502 +DTSTAMP + :20031111T201401Z +LAST-MODIFIED + :20031111T203629Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :b156118e-1483-11d8-8153-f721661c0a44 +SUMMARY + :June Holiday +DESCRIPTION + :June Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20060605 +DTEND + ;VALUE=DATE + :20060606 +DTSTAMP + :20031111T201430Z +LAST-MODIFIED + :20031111T203639Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :cc6b47e6-1483-11d8-8cb0-d542a286a104 +SUMMARY + :August Holiday +DESCRIPTION + :August Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20060807 +DTEND + ;VALUE=DATE + :20060808 +DTSTAMP + :20031111T201452Z +LAST-MODIFIED + :20031111T203651Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e27dcd1a-1483-11d8-b7a1-ca283f970c84 +SUMMARY + :October Holiday +DESCRIPTION + :October Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20061030 +DTEND + ;VALUE=DATE + :20061031 +DTSTAMP + :20031111T201553Z +LAST-MODIFIED + :20031111T203703Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :7cdb2e80-1483-11d8-ab39-ad8d64337c15 +SUMMARY + :Good Friday +DESCRIPTION + :Good Friday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20070406 +DTEND + ;VALUE=DATE + :20070407 +DTSTAMP + :20031111T201242Z +LAST-MODIFIED + :20031111T203721Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :8f50a34c-1483-11d8-bb16-921ae262e715 +SUMMARY + :Easter Monday +DESCRIPTION + :Easter Monday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20070409 +DTEND + ;VALUE=DATE + :20070410 +DTSTAMP + :20031111T201320Z +LAST-MODIFIED + :20031111T203728Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :a29f0e16-1483-11d8-aa76-fc69c4f55195 +SUMMARY + :May Day +DESCRIPTION + :May Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20070507 +DTEND + ;VALUE=DATE + :20070508 +DTSTAMP + :20031111T201401Z +LAST-MODIFIED + :20031111T203738Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :b156118e-1483-11d8-8153-f721661c0a45 +SUMMARY + :June Holiday +DESCRIPTION + :June Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20070604 +DTEND + ;VALUE=DATE + :20070605 +DTSTAMP + :20031111T201430Z +LAST-MODIFIED + :20031111T203747Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :cc6b47e6-1483-11d8-8cb0-d542a286a105 +SUMMARY + :August Holiday +DESCRIPTION + :August Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20070806 +DTEND + ;VALUE=DATE + :20070807 +DTSTAMP + :20031111T201452Z +LAST-MODIFIED + :20031111T203758Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e27dcd1a-1483-11d8-b7a1-ca283f970c85 +SUMMARY + :October Holiday +DESCRIPTION + :October Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20071029 +DTEND + ;VALUE=DATE + :20071030 +DTSTAMP + :20031111T201553Z +LAST-MODIFIED + :20031111T203810Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :7cdb2e80-1483-11d8-ab39-ad8d64337c16 +SUMMARY + :Good Friday +DESCRIPTION + :Good Friday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20080321 +DTEND + ;VALUE=DATE + :20080322 +DTSTAMP + :20031111T201242Z +LAST-MODIFIED + :20031111T203836Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :8f50a34c-1483-11d8-bb16-921ae262e716 +SUMMARY + :Easter Monday +DESCRIPTION + :Easter Monday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20080324 +DTEND + ;VALUE=DATE + :20080325 +DTSTAMP + :20031111T201320Z +LAST-MODIFIED + :20031111T203845Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :7cdb2e80-1483-11d8-ab39-ad8d64337c17 +SUMMARY + :Good Friday +DESCRIPTION + :Good Friday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20090410 +DTEND + ;VALUE=DATE + :20090411 +DTSTAMP + :20031111T201242Z +LAST-MODIFIED + :20031111T203914Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :8f50a34c-1483-11d8-bb16-921ae262e717 +SUMMARY + :Easter Monday +DESCRIPTION + :Easter Monday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20090413 +DTEND + ;VALUE=DATE + :20090414 +DTSTAMP + :20031111T201320Z +LAST-MODIFIED + :20031111T203922Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :a29f0e16-1483-11d8-aa76-fc69c4f55197 +SUMMARY + :May Day +DESCRIPTION + :May Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20090504 +DTEND + ;VALUE=DATE + :20090505 +DTSTAMP + :20031111T201401Z +LAST-MODIFIED + :20031111T203931Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :b156118e-1483-11d8-8153-f721661c0a47 +SUMMARY + :June Holiday +DESCRIPTION + :June Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20090601 +DTEND + ;VALUE=DATE + :20090602 +DTSTAMP + :20031111T201430Z +LAST-MODIFIED + :20031111T203939Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :cc6b47e6-1483-11d8-8cb0-d542a286a107 +SUMMARY + :August Holiday +DESCRIPTION + :August Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20090803 +DTEND + ;VALUE=DATE + :20090804 +DTSTAMP + :20031111T201452Z +LAST-MODIFIED + :20031111T203948Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e27dcd1a-1483-11d8-b7a1-ca283f970c87 +SUMMARY + :October Holiday +DESCRIPTION + :October Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20091026 +DTEND + ;VALUE=DATE + :20091027 +DTSTAMP + :20031111T201553Z +LAST-MODIFIED + :20031111T203958Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :7cdb2e80-1483-11d8-ab39-ad8d64337c18 +SUMMARY + :Good Friday +DESCRIPTION + :Good Friday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20100402 +DTEND + ;VALUE=DATE + :20100403 +DTSTAMP + :20031111T201242Z +LAST-MODIFIED + :20031111T204015Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :8f50a34c-1483-11d8-bb16-921ae262e718 +SUMMARY + :Easter Monday +DESCRIPTION + :Easter Monday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20100405 +DTEND + ;VALUE=DATE + :20100406 +DTSTAMP + :20031111T201320Z +LAST-MODIFIED + :20031111T204022Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :a29f0e16-1483-11d8-aa76-fc69c4f55198 +SUMMARY + :May Day +DESCRIPTION + :May Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20100503 +DTEND + ;VALUE=DATE + :20100504 +DTSTAMP + :20031111T201401Z +LAST-MODIFIED + :20031111T204031Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :b156118e-1483-11d8-8153-f721661c0a48 +SUMMARY + :June Holiday +DESCRIPTION + :June Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20100607 +DTEND + ;VALUE=DATE + :20100608 +DTSTAMP + :20031111T201430Z +LAST-MODIFIED + :20031111T204040Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :cc6b47e6-1483-11d8-8cb0-d542a286a108 +SUMMARY + :August Holiday +DESCRIPTION + :August Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20100802 +DTEND + ;VALUE=DATE + :20100803 +DTSTAMP + :20031111T201452Z +LAST-MODIFIED + :20031111T204049Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e27dcd1a-1483-11d8-b7a1-ca283f970c88 +SUMMARY + :October Holiday +DESCRIPTION + :October Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20101025 +DTEND + ;VALUE=DATE + :20101026 +DTSTAMP + :20031111T201553Z +LAST-MODIFIED + :20031111T204057Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :7cdb2e80-1483-11d8-ab39-ad8d64337c19 +SUMMARY + :Good Friday +DESCRIPTION + :Good Friday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20110422 +DTEND + ;VALUE=DATE + :20110423 +DTSTAMP + :20031111T201242Z +LAST-MODIFIED + :20031111T204112Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :8f50a34c-1483-11d8-bb16-921ae262e719 +SUMMARY + :Easter Monday +DESCRIPTION + :Easter Monday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20110425 +DTEND + ;VALUE=DATE + :20110426 +DTSTAMP + :20031111T201320Z +LAST-MODIFIED + :20031111T204118Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :a29f0e16-1483-11d8-aa76-fc69c4f55199 +SUMMARY + :May Day +DESCRIPTION + :May Day +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20110502 +DTEND + ;VALUE=DATE + :20110503 +DTSTAMP + :20031111T201401Z +LAST-MODIFIED + :20031111T204128Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :b156118e-1483-11d8-8153-f721661c0a49 +SUMMARY + :June Holiday +DESCRIPTION + :June Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20110606 +DTEND + ;VALUE=DATE + :20110607 +DTSTAMP + :20031111T201430Z +LAST-MODIFIED + :20031111T204137Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :cc6b47e6-1483-11d8-8cb0-d542a286a109 +SUMMARY + :August Holiday +DESCRIPTION + :August Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20110801 +DTEND + ;VALUE=DATE + :20110802 +DTSTAMP + :20031111T201452Z +LAST-MODIFIED + :20031111T204146Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e27dcd1a-1483-11d8-b7a1-ca283f970c89 +SUMMARY + :October Holiday +DESCRIPTION + :October Holiday +LOCATION + :Eire +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20111031 +DTEND + ;VALUE=DATE + :20111101 +DTSTAMP + :20031111T201553Z +LAST-MODIFIED + :20031111T204156Z +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/IsraelHolidays.ics b/media/caldata/IsraelHolidays.ics new file mode 100644 index 00000000000..199ae7edbf8 --- /dev/null +++ b/media/caldata/IsraelHolidays.ics @@ -0,0 +1,809 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20100112T072611Z +LAST-MODIFIED:20100112T072739Z +DTSTAMP:20100112T072611Z +UID:a30058de-62ba-4e58-b54d-f517a485239a +SUMMARY:פורים +DTSTART;VALUE=DATE:20100228 +DTEND;VALUE=DATE:20100301 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T072710Z +LAST-MODIFIED:20100112T072753Z +DTSTAMP:20100112T072710Z +UID:94fda3d9-4a55-4c71-aa17-9e44bcde34d5 +SUMMARY:שושן פורים +DTSTART;VALUE=DATE:20100301 +DTEND;VALUE=DATE:20100302 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T072857Z +LAST-MODIFIED:20100112T072919Z +DTSTAMP:20100112T072857Z +UID:e5cac4ca-7970-48aa-9a39-9eefb6bbc288 +SUMMARY:פסח +DTSTART;VALUE=DATE:20100330 +DTEND;VALUE=DATE:20100331 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080506T072920Z +LAST-MODIFIED:20100112T073021Z +DTSTAMP:20100112T072957Z +UID:d0f8e06f-21c0-4c22-abf3-5809a33717f0 +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20100331 +END:VEVENT +BEGIN:VEVENT +CREATED:20080506T072920Z +LAST-MODIFIED:20100112T073055Z +DTSTAMP:20100112T072957Z +UID:52b0e5fd-888a-439e-a9ec-15f967852d7e +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20100401 +END:VEVENT +BEGIN:VEVENT +CREATED:20080506T072920Z +LAST-MODIFIED:20100112T073057Z +DTSTAMP:20100112T072957Z +UID:16170e1a-e4b1-48c8-a75f-3cdfcea6e2f9 +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20100402 +END:VEVENT +BEGIN:VEVENT +CREATED:20080506T072920Z +LAST-MODIFIED:20100112T073058Z +DTSTAMP:20100112T072957Z +UID:82db1d28-3a98-47a5-9c1b-3832cefaf34e +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20100403 +END:VEVENT +BEGIN:VEVENT +CREATED:20080506T072920Z +LAST-MODIFIED:20100112T073059Z +DTSTAMP:20100112T072957Z +UID:ad1fecda-4251-4f59-81a1-47b2f3c261e8 +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20100404 +END:VEVENT +BEGIN:VEVENT +CREATED:20080506T072920Z +LAST-MODIFIED:20100112T073140Z +DTSTAMP:20100112T072957Z +UID:30611035-5904-47d6-9162-1672361e7d93 +SUMMARY:שביעי של פסח +DTSTART;VALUE=DATE:20100405 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073219Z +LAST-MODIFIED:20100112T073250Z +DTSTAMP:20100112T073219Z +UID:9a33f933-0970-46c8-aef8-62501810f8e1 +SUMMARY:יום הזיכרון לשואה ולגבורה +DTSTART;VALUE=DATE:20100412 +DTEND;VALUE=DATE:20100413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073330Z +DTSTAMP:20100112T073310Z +UID:c3594dcd-c5bd-4587-b371-645ed2543cd3 +SUMMARY:יום הזכרון +DTSTART;VALUE=DATE:20100419 +DTEND;VALUE=DATE:20100420 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073352Z +DTSTAMP:20100112T073339Z +UID:ed8d627d-f103-4561-92ba-c8b39a41c048 +SUMMARY:יום העצמאות +DTSTART;VALUE=DATE:20100420 +DTEND;VALUE=DATE:20100421 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073431Z +DTSTAMP:20100112T073339Z +UID:ccf7a728-c5cc-4747-b2db-d6e117c2d73e +SUMMARY:שבועות +DTSTART;VALUE=DATE:20100519 +DTEND;VALUE=DATE:20100520 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073510Z +LAST-MODIFIED:20100112T073525Z +DTSTAMP:20100112T073510Z +UID:747514c3-be4e-4bb2-91a4-c9e766754798 +SUMMARY:צום תשעה באב +DTSTART;VALUE=DATE:20100720 +DTEND;VALUE=DATE:20100721 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073620Z +DTSTAMP:20100112T073339Z +UID:364612c6-ec45-489b-a561-017ed397ecf9 +SUMMARY:ראש השנה +DTSTART;VALUE=DATE:20100909 +DTEND;VALUE=DATE:20100910 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073624Z +DTSTAMP:20100112T073623Z +UID:aeced226-8411-42ab-b9e6-5f3aab3d5649 +SUMMARY:ראש השנה +DTSTART;VALUE=DATE:20100910 +DTEND;VALUE=DATE:20100911 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073656Z +DTSTAMP:20100112T073623Z +UID:85d50de8-7ffe-4a32-b65e-d74f642b19b4 +SUMMARY:יום כיפור +DTSTART;VALUE=DATE:20100918 +DTEND;VALUE=DATE:20100919 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073725Z +DTSTAMP:20100112T073623Z +UID:104ca93b-2173-44c4-809d-5d7b0435b7f0 +SUMMARY:סוכות +DTSTART;VALUE=DATE:20100923 +DTEND;VALUE=DATE:20100924 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073753Z +DTSTAMP:20100112T073728Z +UID:d6554229-20d7-4aac-82d8-b70691f7f62f +SUMMARY: חול המועד סוכות +DTSTART;VALUE=DATE:20100924 +DTEND;VALUE=DATE:20100925 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073802Z +DTSTAMP:20100112T073800Z +UID:a507596f-d007-4567-ae6e-fb7d39890dea +SUMMARY: חול המועד סוכות +DTSTART;VALUE=DATE:20100925 +DTEND;VALUE=DATE:20100926 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073804Z +DTSTAMP:20100112T073800Z +UID:7637a3be-6301-43a5-9bd5-64928ea3e157 +SUMMARY: חול המועד סוכות +DTSTART;VALUE=DATE:20100926 +DTEND;VALUE=DATE:20100927 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073806Z +DTSTAMP:20100112T073800Z +UID:5c3a4cbd-8a21-4afb-8212-b39b49b954e3 +SUMMARY: חול המועד סוכות +DTSTART;VALUE=DATE:20100927 +DTEND;VALUE=DATE:20100928 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073807Z +DTSTAMP:20100112T073800Z +UID:63ef893d-f46a-40d5-bfd0-0c49eb39ab1d +SUMMARY: חול המועד סוכות +DTSTART;VALUE=DATE:20100928 +DTEND;VALUE=DATE:20100929 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T082410Z +DTSTAMP:20100112T073800Z +UID:d13b78c2-1047-43f0-bed3-554c8eb0b81d +SUMMARY:הושענה רבה +DTSTART;VALUE=DATE:20100929 +DTEND;VALUE=DATE:20100930 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073829Z +DTSTAMP:20100112T073800Z +UID:e8265ba7-1728-41d2-9bf7-c333719543d3 +SUMMARY:שמיני עצרת +DTSTART;VALUE=DATE:20100930 +DTEND;VALUE=DATE:20101001 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T073937Z +DTSTAMP:20100112T073800Z +UID:87328be2-95c4-4302-8e0a-1d9d62af84ca +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20101202 +DTEND;VALUE=DATE:20101203 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T074440Z +DTSTAMP:20100112T073800Z +UID:b307b5fc-4716-4c92-8a28-0d6f2495a8a9 +SUMMARY:ט\"ו בשבט +DTSTART;VALUE=DATE:20100130 +DTEND;VALUE=DATE:20100131 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T074513Z +DTSTAMP:20100112T073800Z +UID:c9eb81d5-3da0-4a4d-847e-ad9323280940 +SUMMARY:תענית אסתר +DTSTART;VALUE=DATE:20100225 +DTEND;VALUE=DATE:20100226 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T082151Z +DTSTAMP:20100112T073800Z +UID:7d457e43-15d7-42d1-bf27-b180f6b3e3a7 +SUMMARY:ל\"ג בעומר +DTSTART;VALUE=DATE:20100502 +DTEND;VALUE=DATE:20100503 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T082219Z +DTSTAMP:20100112T073800Z +UID:1ebf77fd-faa2-4159-b2d1-a0b676373447 +SUMMARY:יום ירושלים +DTSTART;VALUE=DATE:20100512 +DTEND;VALUE=DATE:20100513 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T082307Z +DTSTAMP:20100112T073800Z +UID:37ff23d6-441b-4d3c-8064-7203bfc94394 +SUMMARY:צום י\"ז בתמוז +DTSTART;VALUE=DATE:20100629 +DTEND;VALUE=DATE:20100630 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T082507Z +DTSTAMP:20100112T073800Z +UID:de219088-8cea-42a1-80a8-361f53fd3ea6 +SUMMARY:צום י' בטבת +DTSTART;VALUE=DATE:20101217 +DTEND;VALUE=DATE:20101218 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T095319Z +DTSTAMP:20100112T095304Z +UID:bf18b85b-64cf-46df-bb7d-5aeafdda7387 +SUMMARY:צום גדליה +DTSTART;VALUE=DATE:20100912 +DTEND;VALUE=DATE:20100913 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T095415Z +DTSTAMP:20100112T095407Z +UID:be5d23ab-03dc-4da1-b645-8206118078ca +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20101203 +DTEND;VALUE=DATE:20101204 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T095418Z +DTSTAMP:20100112T095407Z +UID:3fbc045a-1fc7-4ffe-96f4-756d6a31d9f6 +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20101204 +DTEND;VALUE=DATE:20101205 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T095444Z +DTSTAMP:20100112T095407Z +UID:d730104c-2437-473e-8da7-d5be9ba0a121 +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20101205 +DTEND;VALUE=DATE:20101206 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T095445Z +DTSTAMP:20100112T095407Z +UID:5aeffa4f-3eff-484d-a3d5-743bef0318d3 +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20101206 +DTEND;VALUE=DATE:20101207 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T095447Z +DTSTAMP:20100112T095407Z +UID:f91c6d53-b658-4232-9094-0588ec615905 +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20101207 +DTEND;VALUE=DATE:20101208 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T095448Z +DTSTAMP:20100112T095407Z +UID:4da4d804-8577-456c-989c-bde75c4ea1d8 +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20101208 +DTEND;VALUE=DATE:20101209 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T095450Z +DTSTAMP:20100112T095407Z +UID:9d73da18-a091-47f5-8345-258d5cecad51 +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20101209 +DTEND;VALUE=DATE:20101210 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T095621Z +DTSTAMP:20100112T095407Z +UID:b83b4814-08f0-4470-b748-b11c96fb8a90 +SUMMARY:ט\"ו בשבט +DTSTART;VALUE=DATE:20110120 +DTEND;VALUE=DATE:20110121 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T125101Z +DTSTAMP:20100112T095407Z +UID:e07a76e9-c672-4d94-9a2f-0effa20be376 +SUMMARY:תענית אסתר +DTSTART;VALUE=DATE:20110317 +DTEND;VALUE=DATE:20110318 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T125127Z +DTSTAMP:20100112T095407Z +UID:924e06aa-1a06-41d2-b8ea-0db7fae47644 +SUMMARY:פורים +DTSTART;VALUE=DATE:20110320 +DTEND;VALUE=DATE:20110321 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T125153Z +DTSTAMP:20100112T125130Z +UID:7baab897-cd27-45a4-8280-a88f1b1ba950 +SUMMARY:שושן פורים +DTSTART;VALUE=DATE:20110321 +DTEND;VALUE=DATE:20110322 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T125234Z +DTSTAMP:20100112T125130Z +UID:2c43f1f0-9bf4-4e70-88f3-2f5fb7933769 +SUMMARY:פסח +DTSTART;VALUE=DATE:20110419 +DTEND;VALUE=DATE:20110420 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T125300Z +DTSTAMP:20100112T125237Z +UID:8be81d7c-d252-4983-be83-779f54389336 +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20110420 +DTEND;VALUE=DATE:20110421 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T125316Z +DTSTAMP:20100112T125313Z +UID:fb1ceb5b-ab98-4cfe-9b11-1934a6b8f0c9 +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T125320Z +DTSTAMP:20100112T125313Z +UID:bfb01882-39f9-4ae0-a5c0-25112a41b8cb +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20110421 +DTEND;VALUE=DATE:20110422 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T125321Z +DTSTAMP:20100112T125313Z +UID:4cb3d0a9-22ea-4672-89a1-98cc3cb7524b +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T125322Z +DTSTAMP:20100112T125313Z +UID:7d1a08c2-018a-43c9-8f7e-86c65d1b9e71 +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20110423 +DTEND;VALUE=DATE:20110424 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T073310Z +LAST-MODIFIED:20100112T125345Z +DTSTAMP:20100112T125313Z +UID:a4ef2e15-ee6c-4d9d-95b8-16bf183d46af +SUMMARY:שביעי של פסח +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T125436Z +LAST-MODIFIED:20100112T125446Z +DTSTAMP:20100112T125436Z +UID:812e9cd2-e89f-44bf-ab2d-5d8e2bffbfef +SUMMARY:יום הזכרון לשואה ולגבורה +DTSTART;VALUE=DATE:20110502 +DTEND;VALUE=DATE:20110503 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T125436Z +LAST-MODIFIED:20100112T125531Z +DTSTAMP:20100112T125503Z +UID:5cb3b27f-1c66-43d8-8423-814902e6a16f +SUMMARY:יום הזכרון +DTSTART;VALUE=DATE:20110509 +DTEND;VALUE=DATE:20110510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T125436Z +LAST-MODIFIED:20100112T125551Z +DTSTAMP:20100112T125503Z +UID:bfc7927d-5171-41a0-8b65-c5369d110138 +SUMMARY:יום העצמאות +DTSTART;VALUE=DATE:20110510 +DTEND;VALUE=DATE:20110511 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T125602Z +LAST-MODIFIED:20100112T125618Z +DTSTAMP:20100112T125602Z +UID:734ee586-6c5d-4efc-be99-0fc0498bb5b0 +SUMMARY:ל\"ג בעומר +DTSTART;VALUE=DATE:20110522 +DTEND;VALUE=DATE:20110523 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T125436Z +LAST-MODIFIED:20100112T125828Z +DTSTAMP:20100112T125759Z +UID:2df3ad4e-8a78-41c9-83e6-dab497d7b7fe +SUMMARY:יום ירושלים +DTSTART;VALUE=DATE:20110601 +DTEND;VALUE=DATE:20110602 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T125436Z +LAST-MODIFIED:20100112T125844Z +DTSTAMP:20100112T125834Z +UID:d7238c81-d1c9-4379-bb69-e8311147b0ab +SUMMARY:שבועות +DTSTART;VALUE=DATE:20110608 +DTEND;VALUE=DATE:20110609 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T125436Z +LAST-MODIFIED:20100112T125922Z +DTSTAMP:20100112T125834Z +UID:3c0d00a9-00ac-47a9-aff4-1cd4c9cddc9b +SUMMARY:צום שבעה עשר בתמוז +DTSTART;VALUE=DATE:20110719 +DTEND;VALUE=DATE:20110720 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T125948Z +LAST-MODIFIED:20100112T130006Z +DTSTAMP:20100112T125948Z +UID:8e80e0f7-ed76-430f-ad10-0686291dd8fa +SUMMARY:צום תשעה באב +DTSTART;VALUE=DATE:20110809 +DTEND;VALUE=DATE:20110810 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130044Z +DTSTAMP:20100112T130033Z +UID:12334e8a-2d9a-4414-8aa4-f2171f03b3d6 +SUMMARY:ראש השנה +DTSTART;VALUE=DATE:20110929 +DTEND;VALUE=DATE:20110930 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130053Z +DTSTAMP:20100112T130051Z +UID:c2635a29-25f9-4730-a60a-c1d3cd51becf +SUMMARY:ראש השנה +DTSTART;VALUE=DATE:20110930 +DTEND;VALUE=DATE:20111001 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130128Z +DTSTAMP:20100112T130051Z +UID:4d92c686-7450-4316-9228-dffb0106e280 +SUMMARY:צום גדליה +DTSTART;VALUE=DATE:20111002 +DTEND;VALUE=DATE:20111003 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130151Z +DTSTAMP:20100112T130051Z +UID:b454e3ae-4fc3-4a06-8f01-8f0482ed6c1c +SUMMARY:יום כיפור +DTSTART;VALUE=DATE:20111008 +DTEND;VALUE=DATE:20111009 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130219Z +DTSTAMP:20100112T130051Z +UID:ae92da90-f019-41ff-9071-1aaf497e4b79 +SUMMARY:סוכות +DTSTART;VALUE=DATE:20111013 +DTEND;VALUE=DATE:20111014 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130247Z +DTSTAMP:20100112T130222Z +UID:958e3ddc-f200-47da-ae24-e64d6a37e3c7 +SUMMARY:חול המועד סוכות +DTSTART;VALUE=DATE:20111014 +DTEND;VALUE=DATE:20111015 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130257Z +DTSTAMP:20100112T130250Z +UID:22b72db7-0d5a-4ab1-aa5f-a4675e870b7e +SUMMARY:חול המועד סוכות +DTSTART;VALUE=DATE:20111018 +DTEND;VALUE=DATE:20111019 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130259Z +DTSTAMP:20100112T130250Z +UID:687eacf3-5202-467a-ac35-4ab380ddc08d +SUMMARY:חול המועד סוכות +DTSTART;VALUE=DATE:20111017 +DTEND;VALUE=DATE:20111018 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130300Z +DTSTAMP:20100112T130250Z +UID:5d41e04a-9c09-4236-921d-bc710783ac37 +SUMMARY:חול המועד סוכות +DTSTART;VALUE=DATE:20111016 +DTEND;VALUE=DATE:20111017 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130302Z +DTSTAMP:20100112T130250Z +UID:3f5c2d62-d488-4e29-a103-5b0f8fcce209 +SUMMARY:חול המועד סוכות +DTSTART;VALUE=DATE:20111015 +DTEND;VALUE=DATE:20111016 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130332Z +DTSTAMP:20100112T130250Z +UID:76e88755-a1ca-47ed-83c6-a7e67c11c605 +SUMMARY:הושענא רבה +DTSTART;VALUE=DATE:20111019 +DTEND;VALUE=DATE:20111020 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130356Z +DTSTAMP:20100112T130250Z +UID:91febc60-08f9-422a-bfd9-bbab8fe191a1 +SUMMARY:שמיני עצרת +DTSTART;VALUE=DATE:20111020 +DTEND;VALUE=DATE:20111021 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130437Z +DTSTAMP:20100112T130250Z +UID:ed64186b-4ca7-49c9-af65-9bc43084f345 +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20111221 +DTEND;VALUE=DATE:20111222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130447Z +DTSTAMP:20100112T130440Z +UID:56dd0e7c-b738-45bf-870b-db68c1486e89 +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20111228 +DTEND;VALUE=DATE:20111229 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130449Z +DTSTAMP:20100112T130440Z +UID:8caea5c1-947a-40d6-b6b6-96493613a394 +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20111227 +DTEND;VALUE=DATE:20111228 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130450Z +DTSTAMP:20100112T130440Z +UID:a7f3b524-1846-4be3-8d25-a0ae3dcabfae +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20111226 +DTEND;VALUE=DATE:20111227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130451Z +DTSTAMP:20100112T130440Z +UID:240504ec-79be-4dd9-bbe0-89aaa9bc4269 +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130452Z +DTSTAMP:20100112T130440Z +UID:f650c9cd-96bd-4759-bbf7-5c11d3dc7448 +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20111222 +DTEND;VALUE=DATE:20111223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130453Z +DTSTAMP:20100112T130440Z +UID:ec305f1b-e753-42d8-af09-ba6c4ac8775d +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20111223 +DTEND;VALUE=DATE:20111224 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100112T130033Z +LAST-MODIFIED:20100112T130455Z +DTSTAMP:20100112T130440Z +UID:6b0842ac-75a6-450c-9469-95c31b8548c4 +SUMMARY:חנוכה +DTSTART;VALUE=DATE:20111224 +DTEND;VALUE=DATE:20111225 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/ItalianHolidays.ics b/media/caldata/ItalianHolidays.ics new file mode 100644 index 00000000000..a649736f751 --- /dev/null +++ b/media/caldata/ItalianHolidays.ics @@ -0,0 +1,826 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173100Z +DTSTAMP:20081230T142934Z +UID:ce6e940f-0f65-4ef0-9c3d-16a653d7e7ba +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20080323 +DTEND;VALUE=DATE:20080324 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173100Z +DTSTAMP:20081230T142934Z +UID:623dfe40-5525-4d3a-9ed5-8482d093e34b +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20010415 +DTEND;VALUE=DATE:20010416 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173100Z +DTSTAMP:20081230T142934Z +UID:c168636a-04cf-4815-b13c-d3cf07c734a1 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20020331 +DTEND;VALUE=DATE:20020401 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173100Z +DTSTAMP:20081230T142934Z +UID:2450f0bf-b363-4dd7-99f3-3e5b2e88db11 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20030420 +DTEND;VALUE=DATE:20030421 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173100Z +DTSTAMP:20081230T142934Z +UID:c1bcf056-0098-421d-99cb-f4b14ef6bd98 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20040411 +DTEND;VALUE=DATE:20040412 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173100Z +DTSTAMP:20081230T142934Z +UID:679d1e78-294b-4f8e-a48b-fc89571268ec +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20050327 +DTEND;VALUE=DATE:20050328 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173100Z +DTSTAMP:20081230T142934Z +UID:bbe1f874-a8ec-4053-91f1-76e1f3a13763 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20060416 +DTEND;VALUE=DATE:20060417 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173100Z +DTSTAMP:20081230T142934Z +UID:f1f2b058-47cc-4a44-86a7-0082ea9e5eca +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20070408 +DTEND;VALUE=DATE:20070409 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173100Z +DTSTAMP:20081230T142934Z +UID:cee8bfd9-eeda-421c-984e-4efda24384e4 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173100Z +DTSTAMP:20081230T142934Z +UID:00dd4c3f-a59b-4860-bdb0-1acf761a3c98 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173100Z +DTSTAMP:20081230T142934Z +UID:38207684-4f01-4f2d-b88a-562b3b91d244 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:034453d3-83fc-4880-85d0-7b3d0b311bff +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:fde7c064-0291-4d94-932d-8c1079350c40 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:1120acce-f654-4a2a-ac3d-dc1eedcfe81f +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:7daa7467-b8f8-41c0-b62d-48a74e946215 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:083af4fd-1b7d-445a-ba78-d0f4ecd5a462 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:4ea2610b-9ec7-4808-a5e9-4ec5a635667f +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:96379801-f792-4b8e-acee-64b2b2a66745 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20180401 +DTEND;VALUE=DATE:20180402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:923c84b8-3e42-45b9-83df-97da9ed92138 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20190421 +DTEND;VALUE=DATE:20190422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:1f02ab79-a661-4c14-ba04-448f80c35afd +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20200412 +DTEND;VALUE=DATE:20200413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:acb48649-c350-4bd1-9df2-f582b472f3c4 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20010416 +DTEND;VALUE=DATE:20010417 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:3bfc852f-272a-419e-a23e-073f1154274b +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20020401 +DTEND;VALUE=DATE:20020402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:23df60f8-01f3-41de-9921-45ffba94ad9b +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20030421 +DTEND;VALUE=DATE:20030422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:3c97c353-9894-461d-90a4-cc364db5a504 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20040412 +DTEND;VALUE=DATE:20040413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:ddddd6a4-f3ce-4868-b4f0-32480f793d9c +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20050328 +DTEND;VALUE=DATE:20050329 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:22e4fa7e-c667-4be5-89cf-16f3f244cc9f +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20060417 +DTEND;VALUE=DATE:20060418 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:32afd70e-596a-41aa-99a5-fae24027f452 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20070409 +DTEND;VALUE=DATE:20070410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:5aea0fcd-428f-48ef-882a-af5243c3b207 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20080324 +DTEND;VALUE=DATE:20080325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:cf92e4fe-e03c-47e5-bec2-f9710b91fb4f +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:8d616e83-8e72-4684-9477-8a56809c6c79 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:206dab31-8a9e-494b-bf39-a0bbcf5f59dc +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:0a557d51-585d-4ee1-b343-479c241181d6 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:a8838507-3280-4d45-9ceb-2fcadd0b699c +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:20028f82-ed33-40fa-8c9e-a02fe8f0ed06 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173101Z +DTSTAMP:20081230T142934Z +UID:cc5bdc40-fdca-4a02-881c-c3d19e9a66e1 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142934Z +UID:8428d4e0-936f-4858-8ae6-3c0609fea923 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20160328 +DTEND;VALUE=DATE:20160329 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142934Z +UID:003091b3-ff06-435d-9283-bc9ba90754a0 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20170417 +DTEND;VALUE=DATE:20170418 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142934Z +UID:fb98f85c-fe12-4626-a200-c39040079f2e +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20190422 +DTEND;VALUE=DATE:20190423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142934Z +UID:df190dd8-2d5b-446c-a9e6-6cff69220ac9 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20200413 +DTEND;VALUE=DATE:20200414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142934Z +UID:a5f9cfec-0b57-4e10-bd50-8243e55a5be0 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20000424 +DTEND;VALUE=DATE:20000425 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142934Z +UID:089762ab-a4d0-4887-bbde-9d9824a95569 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20000423 +DTEND;VALUE=DATE:20000424 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142934Z +UID:e974b0d7-4027-4183-87c9-c4a042a6d3c6 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20180402 +DTEND;VALUE=DATE:20180403 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20110205T171648Z +DTSTAMP:20110205T171648Z +UID:e3dd5faa-1137-4640-8639-422a38966b82 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20210404 +DTEND;VALUE=DATE:20210405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20110205T171720Z +DTSTAMP:20110205T171720Z +UID:994715a2-f83c-428a-b9a2-ad0575096ecf +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20220417 +DTEND;VALUE=DATE:20220418 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20110205T171734Z +DTSTAMP:20110205T171734Z +UID:db106df9-4722-44f2-9747-ace095dc9e4a +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20230409 +DTEND;VALUE=DATE:20230410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20110205T171751Z +DTSTAMP:20110205T171751Z +UID:0380de19-585a-4ac2-9e08-609f926ac454 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20240331 +DTEND;VALUE=DATE:20240401 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20110205T171808Z +DTSTAMP:20110205T171808Z +UID:99a3b6f9-d83c-4b37-a4a2-271d5e3ccb61 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20250420 +DTEND;VALUE=DATE:20250421 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20110205T171822Z +DTSTAMP:20110205T171822Z +UID:1493a858-7d46-41f1-abcb-25d7958bbe91 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20260405 +DTEND;VALUE=DATE:20260406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20110205T171833Z +DTSTAMP:20110205T171833Z +UID:5c8dd7b6-6cd5-4cf0-bc81-94a102e9aa1d +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20270328 +DTEND;VALUE=DATE:20270329 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20110205T171859Z +DTSTAMP:20110205T171859Z +UID:b357c07f-b2fc-4936-b48a-2b76072798ea +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20280416 +DTEND;VALUE=DATE:20280417 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20110205T171917Z +DTSTAMP:20110205T171917Z +UID:d85e4c95-a2cb-476a-bccd-a277aa615446 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20290401 +DTEND;VALUE=DATE:20290402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134121Z +LAST-MODIFIED:20110205T171935Z +DTSTAMP:20110205T171935Z +UID:d4dce04d-32a3-4640-949d-6222502d35f3 +SUMMARY:Pasqua +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20300421 +DTEND;VALUE=DATE:20300422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20110205T172016Z +DTSTAMP:20110205T172016Z +UID:9202a67c-0854-415d-aa5b-2c7375b3049c +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20210405 +DTEND;VALUE=DATE:20210406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20110205T172026Z +DTSTAMP:20110205T172026Z +UID:3c418ec0-1584-48bf-925f-fc116a3dd46d +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20220418 +DTEND;VALUE=DATE:20220419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20110205T172041Z +DTSTAMP:20110205T172041Z +UID:bb1f6990-df54-455f-8662-6ce8d2dfdb81 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20230410 +DTEND;VALUE=DATE:20230411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20110205T172100Z +DTSTAMP:20110205T172100Z +UID:ffe87c13-1124-4ad8-8f67-19bce8a0a406 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20240401 +DTEND;VALUE=DATE:20240402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20110205T172120Z +DTSTAMP:20110205T172120Z +UID:52fef0b8-9b81-4304-b358-4a384eb3f684 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20250421 +DTEND;VALUE=DATE:20250422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20110205T172131Z +DTSTAMP:20110205T172131Z +UID:a4f1ceef-3094-47f8-856c-924a1be8c89a +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20260406 +DTEND;VALUE=DATE:20260407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20110205T172149Z +DTSTAMP:20110205T172149Z +UID:f8071175-9e56-476f-86cb-33eef4b11882 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20270329 +DTEND;VALUE=DATE:20270330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20110205T172159Z +DTSTAMP:20110205T172159Z +UID:24b85b97-2a22-4cc8-96bc-83c3b9c41114 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20280417 +DTEND;VALUE=DATE:20280418 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20110205T172210Z +DTSTAMP:20110205T172210Z +UID:79cfb8b2-bc45-44bd-be3a-c7725d6be313 +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20290402 +DTEND;VALUE=DATE:20290403 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081230T134942Z +LAST-MODIFIED:20110205T172225Z +DTSTAMP:20110205T172225Z +UID:e325ca23-f03f-4e88-ae19-1c8e6a40bfdd +SUMMARY:Lunedì dell'Angelo +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20300422 +DTEND;VALUE=DATE:20300423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110205T170525Z +LAST-MODIFIED:20110206T074805Z +DTSTAMP:20110206T074805Z +UID:6954a4de-a9ec-4320-849a-d89b07b18fb2 +SUMMARY:150° anniversario della proclamazione dell'Unità d'Italia +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20110317 +DTEND;VALUE=DATE:20110318 +TRANSP:TRANSPARENT +DESCRIPTION:Dichiarata festività nazionale \"una tantum\" per il 2011 con + D.L. 30 aprile 2010\, n. 64 art. 7-bis convertito con modificazioni dalla + L. 29 giugno 2010\, n. 100. +END:VEVENT +BEGIN:VEVENT +CREATED:20081229T170006Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142930Z +UID:c88ee012-a63b-4743-b1ad-6ddeeaafd210 +SUMMARY:Festa del Lavoro +RRULE:FREQ=YEARLY +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20000501 +DTEND;VALUE=DATE:20000502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081229T165908Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142930Z +UID:a741ba96-8de1-490e-ae9d-cc77fc6b4a23 +SUMMARY:Anniversario della Liberazione +RRULE:FREQ=YEARLY +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20000425 +DTEND;VALUE=DATE:20000426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081229T171315Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142930Z +UID:f78b6b4c-f120-4758-81eb-0347295fb068 +SUMMARY:Capodanno +RRULE:FREQ=YEARLY +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20000101 +DTEND;VALUE=DATE:20000102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081229T171338Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142930Z +UID:ff5d871a-764f-42db-9b86-7b67a41b37b3 +SUMMARY:Epifania +RRULE:FREQ=YEARLY +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20000106 +DTEND;VALUE=DATE:20000107 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081229T170725Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142930Z +UID:8b8d737e-9724-4326-a39c-2dfb1c2f2ecf +SUMMARY:Assunzione di Maria Vergine +RRULE:FREQ=YEARLY +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20000815 +DTEND;VALUE=DATE:20000816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081229T170958Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142930Z +UID:d7d945eb-d1f6-4a13-b712-38aff15bab78 +SUMMARY:Ognissanti +RRULE:FREQ=YEARLY +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20001101 +DTEND;VALUE=DATE:20001102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081229T171123Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142930Z +UID:bbe3a557-129c-4a5f-a7fb-5632954970b1 +SUMMARY:Immacolata Concezione +RRULE:FREQ=YEARLY +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20001208 +DTEND;VALUE=DATE:20001209 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081229T171224Z +LAST-MODIFIED:20081231T173102Z +DTSTAMP:20081230T142930Z +UID:e49d0656-cdda-48ac-b85f-48e52af0ad9c +SUMMARY:Natale +RRULE:FREQ=YEARLY +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20001225 +DTEND;VALUE=DATE:20001226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081229T171252Z +LAST-MODIFIED:20081231T173103Z +DTSTAMP:20081230T142930Z +UID:ffcb400a-b11f-4b06-9050-39db0e363704 +SUMMARY:Santo Stefano +RRULE:FREQ=YEARLY +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20001226 +DTEND;VALUE=DATE:20001227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081229T170622Z +LAST-MODIFIED:20110206T074649Z +DTSTAMP:20110206T074649Z +UID:338fc6ca-5b4d-41c8-8622-6617588a76b4 +SUMMARY:Festa della Repubblica +RRULE:FREQ=YEARLY +CATEGORIES:Giorno festivo +DTSTART;VALUE=DATE:20010602 +DTEND;VALUE=DATE:20010603 +TRANSP:TRANSPARENT +DESCRIPTION:Dichiarata festività nazionale con D.L.P. 28/5/1947 n. 387 e + legge 27/5/1949 n. 260. Dal 1977 il 2 giugno cessò di essere festività e + la celebrazione della festa della Repubblica fu spostata la prima domeni + ca di giugno. Fu ripristinata per il solo 1986 in occasione del 40° anniv + ersario (legge 22/5/1986 n. 200). Dal 2001 la festività è stata ripristi + nata permanentemente il 2 giugno con legge 20/11/2000 n. 336. +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/JapanHolidays.ics b/media/caldata/JapanHolidays.ics new file mode 100644 index 00000000000..99db8d241bb --- /dev/null +++ b/media/caldata/JapanHolidays.ics @@ -0,0 +1,527 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +BEGIN:VTIMEZONE +TZID:/mozilla.org/20070129_1/Asia/Tokyo +X-LIC-LOCATION:Asia/Tokyo +BEGIN:STANDARD +TZOFFSETFROM:+0900 +TZOFFSETTO:+0900 +TZNAME:JST +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:ae0b79be-fd56-43ce-a325-654f1135fe59 +SUMMARY:元日 / Ganjitsu / New Year's Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070101 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070102 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:4dc6545c-f883-456d-a1ef-e01ea28b5a88 +SUMMARY:成人の日 / Seijin no hi / Coming-of-age Day +RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=2MO +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070108 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070109 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:e0481cd7-ffcc-434c-8f80-6fa023a51a9f +SUMMARY:建国記念の日 / Kenkoku kinen no hi / National Foundation + Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070211 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070212 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:3b75b536-512d-4e8c-b2e9-c4aed80f3421 +SUMMARY:昭和の日 / Shōwa no hi / Shōwa Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070429 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070430 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:350d2e8f-b703-4b36-b4c2-4be3d33ca480 +SUMMARY:憲法記念日 / Kenpō kinenbi / Constitution Memorial Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070503 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070504 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:7e514490-ceb1-46b6-8efe-2e094284b931 +SUMMARY:みどりの日 / Midori no hi / Greenery Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070504 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070505 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:64a745e7-b542-4a93-9f3e-3b5b1991b93b +SUMMARY:敬老の日 / Keirō no hi / Respect for the Aged Day +RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=3MO +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070917 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070918 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:46ab68cd-0f47-4841-9e80-86b882bce50d +SUMMARY:こどもの日 / Kodomo no hi / Children's Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070505 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070506 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:19eb140c-7ea3-49a0-8f59-a3bafe328095 +SUMMARY:海の日 / Umi no hi / Marine Day +RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=3MO +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070716 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070717 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:79ff380f-f70e-4aaf-a934-57fa1b747e23 +SUMMARY:体育の日 / Taiiku no hi / Health-Sports Day +RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=2MO +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20071008 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20071009 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:db458289-cd7d-44e2-8767-86cce5fb3a84 +SUMMARY:文化の日 / Bunka no hi / Culture Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20071103 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20071104 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:ba42e657-76e9-4a6b-8c6c-6aec9d7c750f +SUMMARY:勤労感謝の日 / Kinrō kansha no hi / Labour Thanksgiving + Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20071123 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20071124 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070228T202654Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070228T202654Z +UID:0f5a4799-4082-4921-95e5-183652982b2d +SUMMARY:天皇誕生日 / Tennō tanjōbi / Emperor Akihito's Birthday +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20071223 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20071224 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:4aa06512-ee6a-45ff-aa64-7a4ca8d719f7 +SUMMARY:春分の日 / Shunbun no hi / Vernal Equinox Day +RRULE:FREQ=YEARLY;COUNT=4;INTERVAL=4 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070321 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070322 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:ec50c111-6e0a-4f2d-a7a5-713337ae1518 +SUMMARY:春分の日 / Shunbun no hi / Vernal Equinox Day +RRULE:FREQ=YEARLY;COUNT=4;INTERVAL=4 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20080320 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20080321 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:ca8c29d1-6751-412e-b9aa-4ed747c5fe6e +SUMMARY:春分の日 / Shunbun no hi / Vernal Equinox Day +RRULE:FREQ=YEARLY;COUNT=4;INTERVAL=4 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20090320 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20090321 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:54037f87-1824-49aa-a023-dfbc1f298bda +SUMMARY:春分の日 / Shunbun no hi / Vernal Equinox Day +RRULE:FREQ=YEARLY;COUNT=4;INTERVAL=4 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20100321 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20100322 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:7f753227-ab62-4a12-b702-0ed7c6a081e9 +SUMMARY:秋分の日 / Shūbun no hi / Autumnal Equinox Day +RRULE:FREQ=YEARLY;COUNT=4;INTERVAL=4 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070923 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070924 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:ae063a0a-1e8c-4fc5-941a-3552a724d089 +SUMMARY:秋分の日 / Shūbun no hi / Autumnal Equinox Day +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20080923 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20080924 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:3791f8a9-46c0-4eeb-9e46-53c9bf155a71 +SUMMARY:秋分の日 / Shūbun no hi / Autumnal Equinox Day +RRULE:FREQ=YEARLY;COUNT=3;INTERVAL=4 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20120922 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20120923 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:150db026-22af-46ae-869b-119c15985c16 +SUMMARY:秋分の日 / Shūbun no hi / Autumnal Equinox Day +RRULE:FREQ=YEARLY;COUNT=4;INTERVAL=4 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20090923 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20090924 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:daa855dc-6679-4abe-941b-54e0b5b19839 +SUMMARY:秋分の日 / Shūbun no hi / Autumnal Equinox Day +RRULE:FREQ=YEARLY;COUNT=4;INTERVAL=4 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20100923 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20100924 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:c55d6b48-5780-45b9-9ff3-970ae9489651 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070212 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070213 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:db1c0f74-8ece-481a-b729-e65fec4f9515 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070430 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070501 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:8c50d932-44a9-4231-b08b-5cbd5fea72ab +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070924 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20070925 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:f60c2c62-11f1-428e-a415-a2f7d144fd1e +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20071224 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20071225 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:81d8c2a4-8520-4370-b203-40dd1dab019e +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20080506 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20080507 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:5ebcabe2-8d6f-4fd9-9baf-7f67c78463d7 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20081124 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20081125 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:127efd3c-bb94-43b8-99e9-55de0731d935 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20090506 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20090507 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:319c3595-11a0-4c24-855f-17069a3b6a15 +SUMMARY:国民の休日 / Kokumin no kyūjitsu / National Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20090922 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20090923 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:b8561845-8c6e-4432-8d59-2bcdb16732f9 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20100322 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20100323 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:0b272fd5-eed9-4eb3-abfb-c837db420715 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20120102 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20120103 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:f4603e59-9c5a-4ed6-85b8-14f902bf81b2 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20120430 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20120501 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:6520ec49-b465-438a-8976-cf4d4f304ccc +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20121224 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20121225 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:1cf6fa8d-1acd-4c82-9a4d-1c5a10ab9833 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20130506 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20130507 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:5681dfd4-fcd2-42f1-a68e-104f96edcbac +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20131104 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20131105 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:25cbec47-4f03-46ff-b623-3b3c707305ed +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20140506 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20140507 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:21329224-8f6c-4fd5-9c4c-862be7f81541 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20141124 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20141125 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:bf5e08de-681d-4a7a-bfa7-f5ad316bf74a +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20150506 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20150507 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:766ace1d-ee89-4979-921a-1e4a201d9928 +SUMMARY:国民の休日 / Kokumin no kyūjitsu / National Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20150922 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20150923 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:7f137bcc-ebc4-45b2-9491-a4bc7a547cb4 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20160321 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20160322 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:9604d164-b5c0-464e-98f7-935ace9d8371 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20170102 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20170103 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:cd8808f1-27b7-4815-bf6d-0bf2e0f65f34 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20180212 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20180213 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:bde7f12d-094e-4c4e-b4cc-62e2e6a16538 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20180430 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20180501 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:89363b5d-44d9-488d-9f9b-e0ef54ee39ca +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20180924 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20180925 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:367ec81d-1abd-4052-ac2c-bf4a8d86b1cb +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20181224 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20181225 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:66c460c2-443f-4ebd-a61e-ce165ae85aa8 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20190506 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20190507 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:f3adcd2f-ca60-42cb-b957-d2cc766b1488 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20191104 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20191105 +CATEGORIES:Public Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070701T000000Z +LAST-MODIFIED:20070701T000000Z +DTSTAMP:20070701T000000Z +UID:32f83505-e89b-4388-91f5-ea3ff172df51 +SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20200506 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Asia/Tokyo:20200507 +CATEGORIES:Public Holiday +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/JewishHolidaysEnglish.ics b/media/caldata/JewishHolidaysEnglish.ics new file mode 100644 index 00000000000..bc599cd681a --- /dev/null +++ b/media/caldata/JewishHolidaysEnglish.ics @@ -0,0 +1,495 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Gilead.org.il//NONSGML Luach-iCal $Revision: 1.3 $//EN +X-WR-CALNAME: Hebrew Calendar for 5768-9 Diaspora Style +CALSCALE:GREGORIAN +BEGIN:VEVENT +SUMMARY:Rosh Hashana +DTSTART;VALUE=DATE:20070913 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Hashana +DTSTART;VALUE=DATE:20070914 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Tzom Gdalia +DTSTART;VALUE=DATE:20070916 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Yom Kipur +DTSTART;VALUE=DATE:20070922 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Succot +DTSTART;VALUE=DATE:20070927 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Succot +DTSTART;VALUE=DATE:20070928 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Succot +DTSTART;VALUE=DATE:20070929 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Succot +DTSTART;VALUE=DATE:20070930 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Succot +DTSTART;VALUE=DATE:20071001 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Succot +DTSTART;VALUE=DATE:20071002 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hosha’ana Raba +DTSTART;VALUE=DATE:20071003 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Shmini Atzeret +DTSTART;VALUE=DATE:20071004 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Simchat Tora +DTSTART;VALUE=DATE:20071005 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20071012 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20071013 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20071111 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20071205 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20071206 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20071207 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20071208 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20071209 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka/Rosh Chodesh +DTSTART;VALUE=DATE:20071210 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20071211 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20071212 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Tzom Asara B’Tevet +DTSTART;VALUE=DATE:20071219 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080108 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Tu BiShevat +DTSTART;VALUE=DATE:20080122 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080206 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080207 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080307 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080308 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Taanit Ester +DTSTART;VALUE=DATE:20080320 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Purim +DTSTART;VALUE=DATE:20080321 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Shushan Purim +DTSTART;VALUE=DATE:20080322 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080406 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Pesach +DTSTART;VALUE=DATE:20080420 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Pesach +DTSTART;VALUE=DATE:20080421 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Pesach +DTSTART;VALUE=DATE:20080422 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Pesach +DTSTART;VALUE=DATE:20080423 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Pesach +DTSTART;VALUE=DATE:20080424 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Pesach +DTSTART;VALUE=DATE:20080425 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Pesach +DTSTART;VALUE=DATE:20080426 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Pesach +DTSTART;VALUE=DATE:20080427 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Yom Hashoa +DTSTART;VALUE=DATE:20080502 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080505 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080506 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Yom Hazikaron +DTSTART;VALUE=DATE:20080507 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Yom Haatzmaut +DTSTART;VALUE=DATE:20080508 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Pesach Sheni +DTSTART;VALUE=DATE:20080519 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Lag BaOmer +DTSTART;VALUE=DATE:20080523 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Yom Yerushalaim +DTSTART;VALUE=DATE:20080602 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080604 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Shavuot +DTSTART;VALUE=DATE:20080609 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Shavuot +DTSTART;VALUE=DATE:20080610 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080703 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080704 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Tzom Shiv’a Asar B’Tammuz +DTSTART;VALUE=DATE:20080720 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080802 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Tzom Tish’a B’Av +DTSTART;VALUE=DATE:20080810 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Tu B’Av +DTSTART;VALUE=DATE:20080816 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080831 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20080901 +END:VEVENT +CALSCALE:GREGORIAN +BEGIN:VEVENT +SUMMARY:Rosh Hashana +DTSTART;VALUE=DATE:20080930 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Hashana +DTSTART;VALUE=DATE:20081001 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Tzom Gdalia +DTSTART;VALUE=DATE:20081002 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Yom Kipur +DTSTART;VALUE=DATE:20081009 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Succot +DTSTART;VALUE=DATE:20081014 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Succot +DTSTART;VALUE=DATE:20081015 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Succot +DTSTART;VALUE=DATE:20081016 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Succot +DTSTART;VALUE=DATE:20081017 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Succot +DTSTART;VALUE=DATE:20081018 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Succot +DTSTART;VALUE=DATE:20081019 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hosha’ana Raba +DTSTART;VALUE=DATE:20081020 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Shmini Atzeret +DTSTART;VALUE=DATE:20081021 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Simchat Tora +DTSTART;VALUE=DATE:20081022 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20081029 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20081030 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20081128 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20081222 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20081223 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20081224 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20081225 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20081226 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka/Rosh Chodesh +DTSTART;VALUE=DATE:20081227 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka/Rosh Chodesh +DTSTART;VALUE=DATE:20081228 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Hannuka +DTSTART;VALUE=DATE:20081229 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Tzom Asara B’Tevet +DTSTART;VALUE=DATE:20090106 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20090126 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Tu BiShevat +DTSTART;VALUE=DATE:20090209 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20090224 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20090225 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Taanit Ester +DTSTART;VALUE=DATE:20090309 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Purim +DTSTART;VALUE=DATE:20090310 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Shushan Purim +DTSTART;VALUE=DATE:20090311 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20090326 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Pesach +DTSTART;VALUE=DATE:20090409 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Pesach +DTSTART;VALUE=DATE:20090410 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Pesach +DTSTART;VALUE=DATE:20090411 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Pesach +DTSTART;VALUE=DATE:20090412 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Pesach +DTSTART;VALUE=DATE:20090413 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Chol Hamoed Pesach +DTSTART;VALUE=DATE:20090414 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Pesach +DTSTART;VALUE=DATE:20090415 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Pesach +DTSTART;VALUE=DATE:20090416 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Yom Hashoa +DTSTART;VALUE=DATE:20090421 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20090424 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20090425 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Yom Hazikaron +DTSTART;VALUE=DATE:20090428 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Yom Haatzmaut +DTSTART;VALUE=DATE:20090429 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Pesach Sheni +DTSTART;VALUE=DATE:20090508 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Lag BaOmer +DTSTART;VALUE=DATE:20090512 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Yom Yerushalaim +DTSTART;VALUE=DATE:20090522 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20090524 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Shavuot +DTSTART;VALUE=DATE:20090529 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Shavuot +DTSTART;VALUE=DATE:20090530 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20090622 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20090623 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Tzom Shiv’a Asar B’Tammuz +DTSTART;VALUE=DATE:20090709 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20090722 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Tzom Tish’a B’Av +DTSTART;VALUE=DATE:20090730 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Tu B’Av +DTSTART;VALUE=DATE:20090805 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20090820 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Rosh Chodesh +DTSTART;VALUE=DATE:20090821 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/JewishHolidaysHebrew.ics b/media/caldata/JewishHolidaysHebrew.ics new file mode 100644 index 00000000000..4c65c0d51fa --- /dev/null +++ b/media/caldata/JewishHolidaysHebrew.ics @@ -0,0 +1,470 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Gilead.org.il//NONSGML Luach-iCal $Revision: 1.3 $//EN +X-WR-CALNAME: לוח עברי לשנת ה׳תשסח־ט נוסח ישראל +CALSCALE:GREGORIAN +BEGIN:VEVENT +SUMMARY:ראש השנה +DTSTART;VALUE=DATE:20070913 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש השנה +DTSTART;VALUE=DATE:20070914 +END:VEVENT +BEGIN:VEVENT +SUMMARY:צום גדליה +DTSTART;VALUE=DATE:20070916 +END:VEVENT +BEGIN:VEVENT +SUMMARY:יום כפור +DTSTART;VALUE=DATE:20070922 +END:VEVENT +BEGIN:VEVENT +SUMMARY:סכות +DTSTART;VALUE=DATE:20070927 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד סכות +DTSTART;VALUE=DATE:20070928 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד סכות +DTSTART;VALUE=DATE:20070929 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד סכות +DTSTART;VALUE=DATE:20070930 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד סכות +DTSTART;VALUE=DATE:20071001 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד סכות +DTSTART;VALUE=DATE:20071002 +END:VEVENT +BEGIN:VEVENT +SUMMARY:הושענא רבה +DTSTART;VALUE=DATE:20071003 +END:VEVENT +BEGIN:VEVENT +SUMMARY:שמיני עצרת/שמחת תורה +DTSTART;VALUE=DATE:20071004 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20071012 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20071013 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20071111 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20071205 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20071206 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20071207 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20071208 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20071209 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה/ראש חדש +DTSTART;VALUE=DATE:20071210 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20071211 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20071212 +END:VEVENT +BEGIN:VEVENT +SUMMARY:צום עשרה בטבת +DTSTART;VALUE=DATE:20071219 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080108 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ט״ו בשבט +DTSTART;VALUE=DATE:20080122 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080206 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080207 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080307 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080308 +END:VEVENT +BEGIN:VEVENT +SUMMARY:תענית אסתר +DTSTART;VALUE=DATE:20080320 +END:VEVENT +BEGIN:VEVENT +SUMMARY:פורים +DTSTART;VALUE=DATE:20080321 +END:VEVENT +BEGIN:VEVENT +SUMMARY:שושן פורים +DTSTART;VALUE=DATE:20080322 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080406 +END:VEVENT +BEGIN:VEVENT +SUMMARY:פסח +DTSTART;VALUE=DATE:20080420 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20080421 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20080422 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20080423 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20080424 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20080425 +END:VEVENT +BEGIN:VEVENT +SUMMARY:פסח +DTSTART;VALUE=DATE:20080426 +END:VEVENT +BEGIN:VEVENT +SUMMARY:יום השואה +DTSTART;VALUE=DATE:20080502 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080505 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080506 +END:VEVENT +BEGIN:VEVENT +SUMMARY:יום הזכרון +DTSTART;VALUE=DATE:20080507 +END:VEVENT +BEGIN:VEVENT +SUMMARY:יום העצמאות +DTSTART;VALUE=DATE:20080508 +END:VEVENT +BEGIN:VEVENT +SUMMARY:פסח שני +DTSTART;VALUE=DATE:20080519 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ל״ג בעמר +DTSTART;VALUE=DATE:20080523 +END:VEVENT +BEGIN:VEVENT +SUMMARY:יום ירושלים +DTSTART;VALUE=DATE:20080602 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080604 +END:VEVENT +BEGIN:VEVENT +SUMMARY:שבועות +DTSTART;VALUE=DATE:20080609 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080703 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080704 +END:VEVENT +BEGIN:VEVENT +SUMMARY:צום שבעה עשר בתמוז +DTSTART;VALUE=DATE:20080720 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080802 +END:VEVENT +BEGIN:VEVENT +SUMMARY:צום תשעה באב +DTSTART;VALUE=DATE:20080810 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ט״ו באב +DTSTART;VALUE=DATE:20080816 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080831 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20080901 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש השנה +DTSTART;VALUE=DATE:20080930 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש השנה +DTSTART;VALUE=DATE:20081001 +END:VEVENT +BEGIN:VEVENT +SUMMARY:צום גדליה +DTSTART;VALUE=DATE:20081002 +END:VEVENT +BEGIN:VEVENT +SUMMARY:יום כפור +DTSTART;VALUE=DATE:20081009 +END:VEVENT +BEGIN:VEVENT +SUMMARY:סכות +DTSTART;VALUE=DATE:20081014 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד סכות +DTSTART;VALUE=DATE:20081015 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד סכות +DTSTART;VALUE=DATE:20081016 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד סכות +DTSTART;VALUE=DATE:20081017 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד סכות +DTSTART;VALUE=DATE:20081018 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד סכות +DTSTART;VALUE=DATE:20081019 +END:VEVENT +BEGIN:VEVENT +SUMMARY:הושענא רבה +DTSTART;VALUE=DATE:20081020 +END:VEVENT +BEGIN:VEVENT +SUMMARY:שמיני עצרת/שמחת תורה +DTSTART;VALUE=DATE:20081021 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20081029 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20081030 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20081128 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20081222 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20081223 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20081224 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20081225 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20081226 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה/ראש חדש +DTSTART;VALUE=DATE:20081227 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה/ראש חדש +DTSTART;VALUE=DATE:20081228 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חנכה +DTSTART;VALUE=DATE:20081229 +END:VEVENT +BEGIN:VEVENT +SUMMARY:צום עשרה בטבת +DTSTART;VALUE=DATE:20090106 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20090126 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ט״ו בשבט +DTSTART;VALUE=DATE:20090209 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20090224 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20090225 +END:VEVENT +BEGIN:VEVENT +SUMMARY:תענית אסתר +DTSTART;VALUE=DATE:20090309 +END:VEVENT +BEGIN:VEVENT +SUMMARY:פורים +DTSTART;VALUE=DATE:20090310 +END:VEVENT +BEGIN:VEVENT +SUMMARY:שושן פורים +DTSTART;VALUE=DATE:20090311 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20090326 +END:VEVENT +BEGIN:VEVENT +SUMMARY:פסח +DTSTART;VALUE=DATE:20090409 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20090410 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20090411 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20090412 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20090413 +END:VEVENT +BEGIN:VEVENT +SUMMARY:חול המועד פסח +DTSTART;VALUE=DATE:20090414 +END:VEVENT +BEGIN:VEVENT +SUMMARY:פסח +DTSTART;VALUE=DATE:20090415 +END:VEVENT +BEGIN:VEVENT +SUMMARY:יום השואה +DTSTART;VALUE=DATE:20090421 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20090424 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20090425 +END:VEVENT +BEGIN:VEVENT +SUMMARY:יום הזכרון +DTSTART;VALUE=DATE:20090428 +END:VEVENT +BEGIN:VEVENT +SUMMARY:יום העצמאות +DTSTART;VALUE=DATE:20090429 +END:VEVENT +BEGIN:VEVENT +SUMMARY:פסח שני +DTSTART;VALUE=DATE:20090508 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ל״ג בעמר +DTSTART;VALUE=DATE:20090512 +END:VEVENT +BEGIN:VEVENT +SUMMARY:יום ירושלים +DTSTART;VALUE=DATE:20090522 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20090524 +END:VEVENT +BEGIN:VEVENT +SUMMARY:שבועות +DTSTART;VALUE=DATE:20090529 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20090622 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20090623 +END:VEVENT +BEGIN:VEVENT +SUMMARY:צום שבעה עשר בתמוז +DTSTART;VALUE=DATE:20090709 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20090722 +END:VEVENT +BEGIN:VEVENT +SUMMARY:צום תשעה באב +DTSTART;VALUE=DATE:20090730 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ט״ו באב +DTSTART;VALUE=DATE:20090805 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20090820 +END:VEVENT +BEGIN:VEVENT +SUMMARY:ראש חדש +DTSTART;VALUE=DATE:20090821 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/KazakhstanHolidays.ics b/media/caldata/KazakhstanHolidays.ics new file mode 100644 index 00000000000..f49b5c61ec6 --- /dev/null +++ b/media/caldata/KazakhstanHolidays.ics @@ -0,0 +1,237 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20081214T034903Z +LAST-MODIFIED:20081214T035331Z +DTSTAMP:20081221T041647Z +UID:53747d7c-da8b-4435-ba04-3731d7619885 +SUMMARY:New Year +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090103 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T034903Z +LAST-MODIFIED:20081214T040312Z +DTSTAMP:20081221T041647Z +UID:eebcd2bb-7fb2-4aae-8423-f24cf192df9e +SUMMARY:New Year +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100103 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T040005Z +LAST-MODIFIED:20081214T040326Z +DTSTAMP:20081221T041647Z +UID:580f7be5-105b-4a79-8e1c-ded69773ab65 +SUMMARY:Victory Day +DTSTART;VALUE=DATE:20100509 +DTEND;VALUE=DATE:20100510 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T035356Z +LAST-MODIFIED:20081214T040501Z +DTSTAMP:20081221T041647Z +UID:1bfb2c4c-33d1-4f99-bb89-58f50dd4c3b1 +SUMMARY:Christmas +DTSTART;VALUE=DATE:20100107 +DTEND;VALUE=DATE:20100108 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T035718Z +LAST-MODIFIED:20081214T040518Z +DTSTAMP:20081221T041647Z +UID:98af7cb6-36b8-4b48-8118-7f491833496c +SUMMARY:Nauryz +DTSTART;VALUE=DATE:20090322 +DTEND;VALUE=DATE:20090323 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T035718Z +LAST-MODIFIED:20081214T040530Z +DTSTAMP:20081221T041647Z +UID:7b8e619d-acdb-4615-a306-429b29a14014 +SUMMARY:Nauryz +DTSTART;VALUE=DATE:20100322 +DTEND;VALUE=DATE:20100323 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T035849Z +LAST-MODIFIED:20081214T040535Z +DTSTAMP:20081221T041647Z +UID:75daea00-599a-4637-9e39-60253795e535 +SUMMARY:Day of Union of Kazakhstan People +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:20100502 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T035849Z +LAST-MODIFIED:20081214T040544Z +DTSTAMP:20081221T041647Z +UID:5b5fee18-28bd-4e82-9e07-3b099d516aa0 +SUMMARY:Day of Union of Kazakhstan People +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T035156Z +LAST-MODIFIED:20081214T040617Z +DTSTAMP:20081221T041647Z +UID:b27c405d-6fed-4033-b1e8-c0d22acdbd9d +SUMMARY:Christmas +DTSTART;VALUE=DATE:20090107 +DTEND;VALUE=DATE:20090108 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T040005Z +LAST-MODIFIED:20081214T040823Z +DTSTAMP:20081221T041647Z +UID:e756d3b8-4027-4ee7-afe2-8f81d6dd19fd +SUMMARY:Victory Day +DTSTART;VALUE=DATE:20090509 +DTEND;VALUE=DATE:20090510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T035611Z +LAST-MODIFIED:20081214T040838Z +DTSTAMP:20081221T041647Z +UID:6387da9c-0556-4be3-9738-f145b7318d0c +SUMMARY:Women's Day +DTSTART;VALUE=DATE:20100308 +DTEND;VALUE=DATE:20100309 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T035611Z +LAST-MODIFIED:20081214T040844Z +DTSTAMP:20081221T041647Z +UID:49284073-8501-4084-a959-9f72225ebf65 +SUMMARY:Women's Day +DTSTART;VALUE=DATE:20090308 +DTEND;VALUE=DATE:20090309 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T040950Z +LAST-MODIFIED:20081214T041022Z +DTSTAMP:20081221T041647Z +UID:c465d206-ec24-4509-ac39-d1fbdd2242c3 +SUMMARY:Capital Day +DTSTART;VALUE=DATE:20100706 +DTEND;VALUE=DATE:20100707 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T041106Z +LAST-MODIFIED:20081214T041146Z +DTSTAMP:20081221T041647Z +UID:738928da-6912-455f-90f2-f72a31591110 +SUMMARY:Constitution Day +DTSTART;VALUE=DATE:20090830 +DTEND;VALUE=DATE:20090831 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T041106Z +LAST-MODIFIED:20081214T041157Z +DTSTAMP:20081221T041647Z +UID:c86459fe-2290-42ca-92fb-7ff5241456a5 +SUMMARY:Constitution Day +DTSTART;VALUE=DATE:20100830 +DTEND;VALUE=DATE:20100831 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T041237Z +LAST-MODIFIED:20081214T041317Z +DTSTAMP:20081221T041647Z +UID:1b4e4978-3513-4bde-8ff5-dbc1236cf04c +SUMMARY:Republic Day +DTSTART;VALUE=DATE:20091025 +DTEND;VALUE=DATE:20091026 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T041237Z +LAST-MODIFIED:20081214T041334Z +DTSTAMP:20081221T041647Z +UID:c1ce2360-f5e1-402b-a744-d807937621cb +SUMMARY:Republic Day +DTSTART;VALUE=DATE:20101025 +DTEND;VALUE=DATE:20101026 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T041548Z +LAST-MODIFIED:20081214T041648Z +DTSTAMP:20081221T041647Z +UID:f9b57a0d-c690-4be5-9d38-f436c3d016b5 +SUMMARY:Independence Day +DTSTART;VALUE=DATE:20101216 +DTEND;VALUE=DATE:20101218 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T041548Z +LAST-MODIFIED:20081214T041654Z +DTSTAMP:20081221T041647Z +UID:4a8ab059-10f1-420d-bb37-fa0ab8473362 +SUMMARY:Independence Day +DTSTART;VALUE=DATE:20091216 +DTEND;VALUE=DATE:20091218 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T041359Z +LAST-MODIFIED:20081214T041838Z +DTSTAMP:20081221T041647Z +UID:576a0433-1e22-4abd-80d0-25e8283a64ce +SUMMARY:Kurban Bayram +DTSTART;VALUE=DATE:20101117 +DTEND;VALUE=DATE:20101118 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T040950Z +LAST-MODIFIED:20081221T041700Z +DTSTAMP:20081221T041647Z +UID:6f4f7013-34c6-4e83-b2d2-32ba60d3c5a6 +SUMMARY:Capital Day +DTSTART;VALUE=DATE:20090706 +DTEND;VALUE=DATE:20090707 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081214T041359Z +LAST-MODIFIED:20081221T041815Z +DTSTAMP:20081221T041647Z +UID:618bc928-bd85-4ec0-be09-dae6d898b331 +SUMMARY:Kurban Bayram +DTSTART;VALUE=DATE:20091128 +DTEND;VALUE=DATE:20091129 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/KenyaHolidays.ics b/media/caldata/KenyaHolidays.ics new file mode 100644 index 00000000000..d3af9d04bad --- /dev/null +++ b/media/caldata/KenyaHolidays.ics @@ -0,0 +1,878 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +BEGIN:VTIMEZONE +TZID:/mozilla.org/20070129_1/Africa/Nairobi +X-LIC-LOCATION:Africa/Nairobi +BEGIN:STANDARD +TZOFFSETFROM:+0300 +TZOFFSETTO:+0300 +TZNAME:EAT +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20070613T125002Z +LAST-MODIFIED:20070628T101052Z +DTSTAMP:20070704T081648Z +UID:38437e46-6d5a-470b-a070-83f267aebe02 +SUMMARY:Labour Day +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20000501 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20000502 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070613T125002Z +LAST-MODIFIED:20070628T101111Z +DTSTAMP:20070704T081648Z +UID:c355a79c-b071-4b9d-8224-0cd256feb5b7 +SUMMARY:Madaraka Day +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20000601 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20000602 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070613T125002Z +LAST-MODIFIED:20070628T101141Z +DTSTAMP:20070704T081648Z +UID:31488b4f-25cf-4505-871b-0462d39741ea +SUMMARY:Moi Day +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20001010 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20001011 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070613T125002Z +LAST-MODIFIED:20070628T101219Z +DTSTAMP:20070704T081648Z +UID:8ebd3520-8b48-4dbc-a3d2-bfb96801af88 +SUMMARY:Jamhuri Day +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20001212 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20001213 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070613T125002Z +LAST-MODIFIED:20070628T101241Z +DTSTAMP:20070704T081648Z +UID:bbf57aaa-f41a-488f-b499-46663cb3f503 +SUMMARY:Christmas Day +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20001225 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20001226 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070613T125002Z +LAST-MODIFIED:20070628T101257Z +DTSTAMP:20070704T081648Z +UID:429bb438-b77a-4a93-9846-5715fc8559f9 +SUMMARY:Boxing Day +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20071226 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20071227 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070613T125002Z +LAST-MODIFIED:20070628T101309Z +DTSTAMP:20070704T081648Z +UID:053f2f95-d470-4c02-90ea-4d2f146303c5 +SUMMARY:New Year's Day +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20000101 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20000102 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T101347Z +LAST-MODIFIED:20070628T101404Z +DTSTAMP:20070704T081648Z +UID:bc197f2b-0e34-4d59-a6dc-f10fc89114fd +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20080321 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20080322 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T101410Z +LAST-MODIFIED:20070628T101422Z +DTSTAMP:20070704T081648Z +UID:7529cbfa-5f8f-4777-aa76-58442c2a2e11 +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20080323 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20080324 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T101430Z +LAST-MODIFIED:20070628T101441Z +DTSTAMP:20070704T081648Z +UID:a28148b0-7f58-411d-82f3-180808d8e707 +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20080324 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20080325 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T102222Z +LAST-MODIFIED:20070628T102244Z +DTSTAMP:20070704T081648Z +UID:8429cafe-6565-4769-8462-459dfd0a5def +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20070406 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20070407 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T102248Z +LAST-MODIFIED:20070628T102259Z +DTSTAMP:20070704T081648Z +UID:e8744e85-f046-490b-9f7b-78f28e6ebee8 +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20070408 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20070409 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T102303Z +LAST-MODIFIED:20070628T102315Z +DTSTAMP:20070704T081648Z +UID:424dc15a-eb17-4bc0-9591-abc3b204a8fb +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20070409 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20070410 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T102642Z +LAST-MODIFIED:20070628T102706Z +DTSTAMP:20070704T081648Z +UID:0014ed90-1d7f-4a41-96a0-fb52275ac956 +SUMMARY:Kenyatta Day +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20001020 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20001021 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T102955Z +LAST-MODIFIED:20070628T103007Z +DTSTAMP:20070704T081648Z +UID:e19b0519-016e-46e3-8184-87fc585e08e1 +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20090410 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20090411 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103011Z +LAST-MODIFIED:20070628T103023Z +DTSTAMP:20070704T081648Z +UID:380545e0-1ed9-4f94-8f1f-38902ac022b0 +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20090412 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20090413 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103028Z +LAST-MODIFIED:20070628T103038Z +DTSTAMP:20070704T081648Z +UID:e8e8d878-1c1c-4dd9-8148-a952ed12e9d6 +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20090413 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20090414 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103153Z +LAST-MODIFIED:20070628T103205Z +DTSTAMP:20070704T081648Z +UID:281d6630-6da7-4919-a558-b44a8cf02238 +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20100402 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20100403 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103213Z +LAST-MODIFIED:20070628T103226Z +DTSTAMP:20070704T081648Z +UID:ddfc1182-854b-4a14-bc98-e6c1ad6e03f5 +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20100404 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20100405 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103230Z +LAST-MODIFIED:20070628T103247Z +DTSTAMP:20070704T081648Z +UID:61779000-a84f-4f9d-baed-c9eb2cfef230 +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20100405 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20100406 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103404Z +LAST-MODIFIED:20070628T103419Z +DTSTAMP:20070704T081648Z +UID:f83b3320-3e68-4d12-81ff-a83f1dcef699 +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20110422 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20110423 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103423Z +LAST-MODIFIED:20070628T103435Z +DTSTAMP:20070704T081648Z +UID:c388a616-f92d-4b04-86fb-3d8571d9f0ab +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20110424 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20110425 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103438Z +LAST-MODIFIED:20070628T103454Z +DTSTAMP:20070704T081648Z +UID:421cb884-721e-4086-bade-60e4257d39bd +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20110425 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20110426 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103609Z +LAST-MODIFIED:20070628T103624Z +DTSTAMP:20070704T081648Z +UID:9fdf734f-1a34-4af4-96c8-172dd614da04 +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20120406 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20120407 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103627Z +LAST-MODIFIED:20070628T103642Z +DTSTAMP:20070704T081648Z +UID:cf583239-1277-4d37-81fa-a9e2bfad87fa +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20120408 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20120409 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103645Z +LAST-MODIFIED:20070628T103658Z +DTSTAMP:20070704T081648Z +UID:105b3d1c-2c42-474b-867e-1d5db2b7c4bd +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20120409 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20120410 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T104009Z +LAST-MODIFIED:20070628T104034Z +DTSTAMP:20070704T081648Z +UID:8c4d8835-0cf8-45af-83a1-f748804c3caf +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20130329 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20130330 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T104041Z +LAST-MODIFIED:20070628T104054Z +DTSTAMP:20070704T081648Z +UID:a8f86390-2357-43b7-9d45-94cf2771ffd8 +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20130331 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20130401 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T104059Z +LAST-MODIFIED:20070628T104110Z +DTSTAMP:20070704T081648Z +UID:6cf18ff4-1387-4eed-81cc-a42f0c172aec +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20130401 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20130402 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T104238Z +LAST-MODIFIED:20070628T104251Z +DTSTAMP:20070704T081648Z +UID:7125aa99-c474-4a8d-9998-17a8adec5c5b +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20140418 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20140419 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T104255Z +LAST-MODIFIED:20070628T104306Z +DTSTAMP:20070704T081648Z +UID:5bddc28f-3ca2-49c0-92c6-011ee089a417 +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20140420 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20140421 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T104308Z +LAST-MODIFIED:20070628T104320Z +DTSTAMP:20070704T081648Z +UID:98abadad-2066-43c8-9861-c94a8836cecf +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20140421 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20140422 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T104420Z +LAST-MODIFIED:20070628T104433Z +DTSTAMP:20070704T081648Z +UID:7b7d836e-6741-4c79-aa87-0cb7e6143c68 +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20150403 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20150404 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T104438Z +LAST-MODIFIED:20070628T104449Z +DTSTAMP:20070704T081648Z +UID:d7aee9b4-6983-40a9-9330-b8a2ca828e50 +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20150405 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20150406 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T104455Z +LAST-MODIFIED:20070628T104506Z +DTSTAMP:20070704T081648Z +UID:fcf982d3-6575-4a90-b303-8cafd207ec72 +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20150406 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20150407 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T105807Z +LAST-MODIFIED:20070628T105820Z +DTSTAMP:20070704T081648Z +UID:292a8637-632b-4ead-8ed5-deaf9dde1b29 +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20060414 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20060415 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T105824Z +LAST-MODIFIED:20070628T105839Z +DTSTAMP:20070704T081648Z +UID:b867b0cd-93c3-444a-b66a-096da2c48f8e +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20060416 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20060417 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T105843Z +LAST-MODIFIED:20070628T105855Z +DTSTAMP:20070704T081648Z +UID:d9d927a9-0845-4a1b-94b5-e0d1181a7f16 +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20060417 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20060418 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T105909Z +LAST-MODIFIED:20070628T105919Z +DTSTAMP:20070704T081648Z +UID:841460cb-27dd-41c9-a69b-c40c27465445 +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20050325 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20050326 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T105922Z +LAST-MODIFIED:20070628T105934Z +DTSTAMP:20070704T081648Z +UID:90f91344-fcf8-41b6-8f3d-c8bcc8fc58c1 +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20050327 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20050328 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T105938Z +LAST-MODIFIED:20070628T105952Z +DTSTAMP:20070704T081648Z +UID:8a6721a8-d5b5-4a2c-ba66-eed621848b6f +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20050328 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20050329 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T110008Z +LAST-MODIFIED:20070628T110019Z +DTSTAMP:20070704T081648Z +UID:5fdf6b70-c21d-427a-a6b5-925a7eaebae5 +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20040409 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20040410 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T110023Z +LAST-MODIFIED:20070628T110036Z +DTSTAMP:20070704T081648Z +UID:d0e29360-2705-4d37-b06e-c5445b97628a +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20040411 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20040412 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T110037Z +LAST-MODIFIED:20070628T110049Z +DTSTAMP:20070704T081648Z +UID:c9474983-21b9-4189-8113-a2b161911bfa +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20040412 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20040413 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T110106Z +LAST-MODIFIED:20070628T110123Z +DTSTAMP:20070704T081648Z +UID:502f70c7-1284-4ed5-b644-95c385f2e4e2 +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20030418 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20030419 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T110150Z +LAST-MODIFIED:20070628T110215Z +DTSTAMP:20070704T081648Z +UID:08a975dc-ba29-4b77-8cdb-09415f158350 +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20030420 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20030421 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T110219Z +LAST-MODIFIED:20070628T110231Z +DTSTAMP:20070704T081648Z +UID:d78e4ba2-82e2-44b5-b700-04ef0f990d29 +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20030421 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20030422 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T110252Z +LAST-MODIFIED:20070628T110302Z +DTSTAMP:20070704T081648Z +UID:93290d9c-954f-4b4e-aa69-f1173390f62e +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20020329 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20020330 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T110306Z +LAST-MODIFIED:20070628T110319Z +DTSTAMP:20070704T081648Z +UID:8db38d9d-1c67-444d-849b-a8f3f7191301 +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20020331 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20020401 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T122546Z +LAST-MODIFIED:20070628T122559Z +DTSTAMP:20070704T081648Z +UID:d5ccfc78-80ca-467c-ba48-d4508932169e +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20020401 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20020402 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T122653Z +LAST-MODIFIED:20070628T122755Z +DTSTAMP:20070704T081648Z +UID:1e2a2679-4402-4173-b545-1da547396d18 +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20010413 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20010414 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T122803Z +LAST-MODIFIED:20070628T122816Z +DTSTAMP:20070704T081648Z +UID:8155809c-10e2-4867-9605-b7092188fa85 +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20010415 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20010416 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T122820Z +LAST-MODIFIED:20070628T122835Z +DTSTAMP:20070704T081648Z +UID:dc7481d4-7f44-4cf0-8309-33bb38e501bb +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20010416 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20010417 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T122852Z +LAST-MODIFIED:20070628T122903Z +DTSTAMP:20070704T081648Z +UID:fb656d71-5708-4d41-a18d-8cbb68443f91 +SUMMARY:Good Friday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20000421 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20000422 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T122907Z +LAST-MODIFIED:20070628T122920Z +DTSTAMP:20070704T081648Z +UID:bd63b213-0405-42a9-86af-491a8d09b39f +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20000423 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20000424 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T122925Z +LAST-MODIFIED:20070628T122937Z +DTSTAMP:20070704T081648Z +UID:ffdbbbb7-80d6-4878-912f-13c6b0a09f6d +SUMMARY:Easter Monday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20000424 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20000425 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T072414Z +LAST-MODIFIED:20070704T073026Z +DTSTAMP:20070704T081648Z +UID:70f4d2d0-6cd9-4a98-b334-be33c4b29391 +SUMMARY:Idd ul-Fitr (observed) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20061024 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20061025 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T072906Z +LAST-MODIFIED:20070704T073042Z +DTSTAMP:20070704T081648Z +UID:5533317a-386b-4bbf-a36c-e553d3547e7f +SUMMARY:Idd ul-Fitr (observed) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20051104 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20051105 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T074927Z +LAST-MODIFIED:20070704T074944Z +DTSTAMP:20070704T081648Z +UID:ff6f4a9e-2ea6-4c29-88b6-a5a30ed8d848 +SUMMARY:Idd ul-Fitr (observed) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20031125 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20031126 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T080107Z +LAST-MODIFIED:20070704T080123Z +DTSTAMP:20070704T081648Z +UID:a71eb3f4-495c-4d34-8db8-19f418c4cf60 +SUMMARY:Idd ul-Fitr (observed) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20041115 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20041116 +CATEGORIES:Holiday +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T102821Z +LAST-MODIFIED:20070704T080735Z +DTSTAMP:20070704T081648Z +UID:07ec12a8-262d-48cb-aa1e-08b63a33dc8b +SUMMARY:Idd ul-Fitr (estimated) +STATUS:TENTATIVE +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20081002 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20081003 +CATEGORIES:Holiday +DESCRIPTION:Approximate end of Ramadhan (depending on sighting of the + moon) +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T101512Z +LAST-MODIFIED:20070704T080747Z +DTSTAMP:20070704T081648Z +UID:873a6825-68aa-43da-a66a-656a0b59639d +SUMMARY:Idd ul-Fitr (estimated) +STATUS:TENTATIVE +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20071013 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20071014 +CATEGORIES:Holiday +DESCRIPTION:Approximate end of Ramadhan (depending on sighting of the + moon) +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103110Z +LAST-MODIFIED:20070704T080830Z +DTSTAMP:20070704T081648Z +UID:49fab855-c43d-4082-a72c-f5d9c010706e +SUMMARY:Idd ul-Fitr (estimated) +STATUS:TENTATIVE +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20090921 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20090922 +CATEGORIES:Holiday +DESCRIPTION:Approximate end of Ramadhan (depending on sighting of the + moon) +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103313Z +LAST-MODIFIED:20070704T080838Z +DTSTAMP:20070704T081648Z +UID:cf80b503-51f2-4f20-8c84-c37a73a7994f +SUMMARY:Idd ul-Fitr (estimated) +STATUS:TENTATIVE +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20100910 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20100911 +CATEGORIES:Holiday +DESCRIPTION:Approximate end of Ramadhan (depending on sighting of the + moon) +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103516Z +LAST-MODIFIED:20070704T081030Z +DTSTAMP:20070704T081648Z +UID:2f5a1830-ec6b-4c5b-b837-06be9025fcf3 +SUMMARY:Idd ul-Fitr (estimated) +STATUS:TENTATIVE +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20110830 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20110831 +CATEGORIES:Holiday +DESCRIPTION:Approximate end of Ramadhan (depending on sighting of the + moon) +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T103725Z +LAST-MODIFIED:20070704T081043Z +DTSTAMP:20070704T081648Z +UID:2b28c5c8-69a8-47bb-9d7d-4d433da078a4 +SUMMARY:Idd ul-Fitr (estimated) +STATUS:TENTATIVE +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20120819 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20120820 +CATEGORIES:Holiday +DESCRIPTION:Approximate end of Ramadhan (depending on sighting of the + moon) +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T104200Z +LAST-MODIFIED:20070704T081053Z +DTSTAMP:20070704T081648Z +UID:8d8aaf8b-53cd-48fd-adca-beda2c13df0c +SUMMARY:Idd ul-Fitr (estimated) +STATUS:TENTATIVE +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20130808 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20130809 +CATEGORIES:Holiday +DESCRIPTION:Approximate end of Ramadhan (depending on sighting of the + moon) +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T104341Z +LAST-MODIFIED:20070704T081107Z +DTSTAMP:20070704T081648Z +UID:44efb95b-7dda-4a18-9d60-335237a7fbdc +SUMMARY:Idd ul-Fitr (estimated) +STATUS:TENTATIVE +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20140729 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20140730 +CATEGORIES:Holiday +DESCRIPTION:Approximate end of Ramadhan (depending on sighting of the + moon) +END:VEVENT +BEGIN:VEVENT +CREATED:20070628T104535Z +LAST-MODIFIED:20070704T081124Z +DTSTAMP:20070704T081648Z +UID:f6b06cd1-0989-49ad-9b61-5622a5509794 +SUMMARY:Idd ul-Fitr (estimated) +STATUS:TENTATIVE +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20150718 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20150719 +CATEGORIES:Holiday +DESCRIPTION:Approximate end of Ramadhan (depending on sighting of the + moon) +END:VEVENT +BEGIN:VEVENT +CREATED:20070704T081216Z +LAST-MODIFIED:20070704T081234Z +DTSTAMP:20070704T081648Z +UID:d6b4c29f-5563-40de-be8f-f28c67819793 +SUMMARY:Idd ul-Fitr (observed) +CLASS:PUBLIC +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20021206 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Africa/Nairobi:20021207 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/LatviaHolidays.ics b/media/caldata/LatviaHolidays.ics new file mode 100644 index 00000000000..808acb23b9d --- /dev/null +++ b/media/caldata/LatviaHolidays.ics @@ -0,0 +1,664 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20090114T200624Z +LAST-MODIFIED:20090114T200743Z +DTSTAMP:20090114T200624Z +UID:c35af797-f62a-495a-bee3-d231f40542a1 +SUMMARY:Brīvdiena (Latvijas Republikas Neatkarības deklarācijas + pasludināšanas diena) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130506 +DTEND;VALUE=DATE:20130507 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T200847Z +LAST-MODIFIED:20090114T200928Z +DTSTAMP:20090114T200847Z +UID:cbb82900-37ee-4f80-a2af-87357f292a29 +SUMMARY:Brīvdiena (Latvijas Republikas Neatkarības deklarācijas + pasludināšanas diena) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140505 +DTEND;VALUE=DATE:20140506 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T201131Z +LAST-MODIFIED:20090114T201217Z +DTSTAMP:20090114T201131Z +UID:44a8e4f9-8f1a-4a8f-bf15-cdceba2ee80e +SUMMARY:Brīvdiena (Latvijas Republikas Proklamēšanas diena) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20121119 +DTEND;VALUE=DATE:20121120 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T201640Z +LAST-MODIFIED:20090114T201702Z +DTSTAMP:20090114T201640Z +UID:0f112ff0-e725-44a9-be15-0b681afabee9 +SUMMARY:Lielā Piektdiena +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T201755Z +LAST-MODIFIED:20090114T201820Z +DTSTAMP:20090114T201755Z +UID:70256661-449a-476d-aa61-e392e7e15dd2 +SUMMARY:Lieldienas +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T201904Z +LAST-MODIFIED:20090114T201926Z +DTSTAMP:20090114T201904Z +UID:7c1e0052-0329-4969-bc80-daa08c808461 +SUMMARY:2. Lieldienas +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T202122Z +LAST-MODIFIED:20090114T202141Z +DTSTAMP:20090114T202122Z +UID:d52c6bf4-8471-4f4c-9c14-14793c16902a +SUMMARY:Lieldienas +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T202158Z +LAST-MODIFIED:20090114T202222Z +DTSTAMP:20090114T202158Z +UID:f57d58b3-c8bf-42d6-ab17-e1fcf3950bd5 +SUMMARY:Lielā Piektdiena +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T202233Z +LAST-MODIFIED:20090114T202252Z +DTSTAMP:20090114T202233Z +UID:16785c48-e313-4079-9905-d2c824cdf6d4 +SUMMARY:2. Lieldienas +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T202330Z +LAST-MODIFIED:20090114T202404Z +DTSTAMP:20090114T202330Z +UID:b998848d-261a-4ac0-9ebc-8a6580ca4d1f +SUMMARY:Lieldienas +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T202413Z +LAST-MODIFIED:20090114T202429Z +DTSTAMP:20090114T202413Z +UID:e93fcd65-83fb-43b2-b552-9210ff6fb296 +SUMMARY:Lielā Piektdiena +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T202501Z +LAST-MODIFIED:20090114T202547Z +DTSTAMP:20090114T202501Z +UID:edfd7063-435f-43ec-9923-ec6b90ebe8f2 +SUMMARY:2. Lieldienas +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T202608Z +LAST-MODIFIED:20090114T202639Z +DTSTAMP:20090114T202608Z +UID:cd4b18f7-61b0-49f5-9d47-493ffe9b5e75 +SUMMARY:Lieldienas +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T202655Z +LAST-MODIFIED:20090114T202719Z +DTSTAMP:20090114T202655Z +UID:6034f801-a25d-4b10-8593-5d96f98dec61 +SUMMARY:Lielā Piektdiena +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T202735Z +LAST-MODIFIED:20090114T202754Z +DTSTAMP:20090114T202735Z +UID:200bd39d-49c5-4939-9f13-cc8fb21905ee +SUMMARY:2. Lieldienas +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T202909Z +LAST-MODIFIED:20090114T202943Z +DTSTAMP:20090114T202909Z +UID:735382c8-0438-4b64-a6a2-55f115c4cba1 +SUMMARY:Lieldienas +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T202952Z +LAST-MODIFIED:20090114T203009Z +DTSTAMP:20090114T202952Z +UID:b9d2ca47-3676-4ade-964b-7608868c9074 +SUMMARY:Lielā Piektdiena +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T203029Z +LAST-MODIFIED:20090114T203046Z +DTSTAMP:20090114T203029Z +UID:661f4dbf-a458-4f28-b251-546b140182b1 +SUMMARY:2. Lieldienas +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T203112Z +LAST-MODIFIED:20090114T203128Z +DTSTAMP:20090114T203112Z +UID:f6550385-5cf9-4971-b021-05f17213ba9b +SUMMARY:2. Lieldienas +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T203140Z +LAST-MODIFIED:20090114T203155Z +DTSTAMP:20090114T203140Z +UID:03eafe1d-7769-4a5d-806c-c3a988f5cfc2 +SUMMARY:Lieldienas +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T203206Z +LAST-MODIFIED:20090114T203222Z +DTSTAMP:20090114T203206Z +UID:dee13bb0-6627-483b-81a6-50560d724d0a +SUMMARY:Lielā Piektdiena +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T190841Z +LAST-MODIFIED:20090114T200347Z +DTSTAMP:20090113T190841Z +UID:eee40042-f3bc-4e96-92b3-7eef369d547b +SUMMARY:Līgo diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090623 +DTEND;VALUE=DATE:20090624 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T192435Z +LAST-MODIFIED:20090114T200347Z +DTSTAMP:20090113T192435Z +UID:55c4bef5-164a-4357-bbb9-1c01aee326e6 +SUMMARY:Zinību diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090901 +DTEND;VALUE=DATE:20090902 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T192544Z +LAST-MODIFIED:20090114T200347Z +DTSTAMP:20090113T192544Z +UID:5ac506e0-9af0-4544-a2cb-25a819c8606e +SUMMARY:Baltu vienības diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090922 +DTEND;VALUE=DATE:20090923 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T192615Z +LAST-MODIFIED:20090114T200347Z +DTSTAMP:20090113T192615Z +UID:44d4e37c-4e9d-4c08-b3df-a1fb0adaf18a +SUMMARY:Skolotāju diena +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=10 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20091004 +DTEND;VALUE=DATE:20091005 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T192711Z +LAST-MODIFIED:20090114T200347Z +DTSTAMP:20090113T192711Z +UID:54f47846-2a16-41f8-afaa-510355be88ea +SUMMARY:Lāčplēša diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20091111 +DTEND;VALUE=DATE:20091112 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T192754Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T192754Z +UID:827bb0ee-4aca-409e-adeb-fda222047869 +SUMMARY:Pret latviešu tautu vērstā totalitārā komunistiskā režīma + genocīda upuru piemiņas diena +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=12 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20091206 +DTEND;VALUE=DATE:20091207 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T190527Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T190527Z +UID:8cd73122-61db-4d29-b777-8053268f2855 +SUMMARY:Jaungada diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T190715Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T190715Z +UID:95a8f8dd-6824-438d-9e82-64c36b344f30 +SUMMARY:Darba svētkus\, Latvijas Republikas Satversmes sapulces + sasaukšanas diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T190759Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T190759Z +UID:71dcef01-1c6a-473d-8560-dbe22412fe60 +SUMMARY:Latvijas Republikas Neatkarības deklarācijas pasludināšanas + diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090504 +DTEND;VALUE=DATE:20090505 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T194314Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T194314Z +UID:5194167e-2c9c-4449-95cb-f4c76a02c856 +SUMMARY:Mātes diena +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=5 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090510 +DTEND;VALUE=DATE:20090511 +LOCATION:Latvia +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T190912Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T190912Z +UID:a1d4beea-ab27-4a4a-bc29-2837a01d309f +SUMMARY:Jāņu diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090624 +DTEND;VALUE=DATE:20090625 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T190947Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T190947Z +UID:812d2c76-0206-4b14-b478-0ecaf050af82 +SUMMARY:Latvijas Republikas Proklamēšanas diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20091118 +DTEND;VALUE=DATE:20091119 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191045Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T191045Z +UID:27e2f0fd-d77c-4c4e-a739-ad81821c4ecb +SUMMARY:Ziemassvētki +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20091224 +DTEND;VALUE=DATE:20091227 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191239Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T191239Z +UID:d6d2f720-b9df-4a7a-9d86-e8af1c67a4a0 +SUMMARY:1991. gada barikāžu aizstāvju atceres diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090120 +DTEND;VALUE=DATE:20090121 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191312Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T191312Z +UID:edc6221e-8ced-4833-97b6-f2028477f111 +SUMMARY:Latvijas Republikas starptautiskās (de jure) atzīšanas diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090126 +DTEND;VALUE=DATE:20090127 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191348Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T191348Z +UID:7ff685a5-fcef-4ebb-ade3-fde6b35a9767 +SUMMARY:Starptautisko sieviešu diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090308 +DTEND;VALUE=DATE:20090309 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191421Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T191421Z +UID:b3b7507e-9a6a-4206-a523-f0f51eae400d +SUMMARY:Komunistiskā genocīda upuru piemiņas diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090325 +DTEND;VALUE=DATE:20090326 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191457Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T191457Z +UID:6fc2a743-cf81-43d4-b8fa-d0f60833ff79 +SUMMARY:Nacisma sagrāves dienu un Otrā pasaules kara upuru piemiņas + diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090508 +DTEND;VALUE=DATE:20090509 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191528Z +LAST-MODIFIED:20090114T200348Z +DTSTAMP:20090113T191528Z +UID:67e06316-a8cd-427f-92bb-a2b17dcef4da +SUMMARY:Eiropas diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090509 +DTEND;VALUE=DATE:20090510 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191559Z +LAST-MODIFIED:20090114T200349Z +DTSTAMP:20090113T191559Z +UID:a1518cf5-5fa2-4d79-8741-777dc30ae720 +SUMMARY:Starptautisko ģimenes diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090515 +DTEND;VALUE=DATE:20090516 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191634Z +LAST-MODIFIED:20090114T200349Z +DTSTAMP:20090113T191634Z +UID:e865b079-27b1-435d-b377-60105b76633a +SUMMARY:Starptautisko bērnu aizsardzības diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090601 +DTEND;VALUE=DATE:20090602 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191844Z +LAST-MODIFIED:20090114T200349Z +DTSTAMP:20090113T191844Z +UID:cfd1bdca-e8d7-41f4-8a5a-9641171c670a +SUMMARY:Komunistiskā genocīda upuru piemiņas diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090614 +DTEND;VALUE=DATE:20090615 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191928Z +LAST-MODIFIED:20090114T200349Z +DTSTAMP:20090113T191928Z +UID:90593e15-b371-4fad-acc7-430531818343 +SUMMARY:Latvijas Republikas okupācijas diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090617 +DTEND;VALUE=DATE:20090618 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191958Z +LAST-MODIFIED:20090114T200349Z +DTSTAMP:20090113T191958Z +UID:5d100ff8-ab5e-4d24-9269-bc36be4b6dd7 +SUMMARY:Varoņu piemiņas diena (Cēsu kaujas atceres diena) +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090622 +DTEND;VALUE=DATE:20090623 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T192100Z +LAST-MODIFIED:20090114T200349Z +DTSTAMP:20090113T192100Z +UID:17985423-5781-4178-aad4-67791179b0e4 +SUMMARY:Ebreju tautas genocīda upuru piemiņas diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090704 +DTEND;VALUE=DATE:20090705 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T192202Z +LAST-MODIFIED:20090114T200349Z +DTSTAMP:20090113T192202Z +UID:e1243561-a2ef-4550-8afb-96a9f034bd23 +SUMMARY:Jūras svētku diena +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SA;BYMONTH=7 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090711 +DTEND;VALUE=DATE:20090712 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T192330Z +LAST-MODIFIED:20090114T200349Z +DTSTAMP:20090113T192330Z +UID:e93d3f5f-7158-4bb4-a0d3-472b1c152bb3 +SUMMARY:Latvijas brīvības cīnītāju piemiņas diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090811 +DTEND;VALUE=DATE:20090812 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T192410Z +LAST-MODIFIED:20090114T200349Z +DTSTAMP:20090113T192410Z +UID:5cda73c1-a09f-4e33-aa4b-0c4bacee64bc +SUMMARY:Konstitucionālā likuma \"Par Latvijas Republikas valstisko + statusu\" pieņemšanas un Latvijas Republikas faktiskās neatkarības + atjaunošanas diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090821 +DTEND;VALUE=DATE:20090822 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090113T191126Z +LAST-MODIFIED:20090114T200349Z +DTSTAMP:20090113T191126Z +UID:916679db-b7d7-4947-ba4f-2e849f0a81f3 +SUMMARY:Vecgada diena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20091231 +DTEND;VALUE=DATE:20100101 +LOCATION:Latvia +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/LebanonHolidays.ics b/media/caldata/LebanonHolidays.ics new file mode 100644 index 00000000000..441ec0067f0 --- /dev/null +++ b/media/caldata/LebanonHolidays.ics @@ -0,0 +1,772 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:Lebanese Holidays +X-WR-TIMEZONE:UTC +X-WR-CALDESC:Lebanese Holidays provided by www.tyros.leb.net +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231017Z +DTSTAMP:20090212T231324Z +UID:gb155alusirg7411uiap054rsg@google.com +SUMMARY:Independence Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20091122 +DTEND;VALUE=DATE:20091123 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231017Z +DTSTAMP:20090212T231324Z +UID:4ao1a05oi3n1b16k696d11egt0@google.com +SUMMARY:Resistance and Liberation Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090525 +DTEND;VALUE=DATE:20090526 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231018Z +DTSTAMP:20090212T231324Z +UID:8resca7n0d1k9ifd3dqmmmht64@google.com +SUMMARY:Prophet Mohammad's Birthday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090309 +DTEND;VALUE=DATE:20090310 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T104524Z +DTSTAMP:20090212T231324Z +UID:8rff6po5gunhs1cc4nf06ii6dk@google.com +SUMMARY:Mother's Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090321 +DTEND;VALUE=DATE:20090322 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T110548Z +DTSTAMP:20090212T231324Z +UID:c3k6pkqg4v8csfdthuh7r48bp0@google.com +SUMMARY:Christmas Day (E) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090107 +DTEND;VALUE=DATE:20090108 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231018Z +DTSTAMP:20090212T231324Z +UID:t63adec8ipeb40e3bjuipd16dg@google.com +SUMMARY:Ashoura Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090107 +DTEND;VALUE=DATE:20090108 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T132613Z +DTSTAMP:20090212T231324Z +UID:k0r1t1n4nu02a10m3n62hvurhs@google.com +SUMMARY:Christmas Day (W) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:OPAQUE +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231017Z +DTSTAMP:20090212T231324Z +UID:2ldicgffmlm8u0vmdbbbjvg95g@google.com +SUMMARY:Eid al-Fitr (Feast of End of Ramadan) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090920 +DTEND;VALUE=DATE:20090921 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231247Z +DTSTAMP:20090212T231324Z +UID:9jivhrha2ri3tf68cn2qu9ut7s@google.com +SUMMARY:Commemoration of Qana Massacre +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090418 +DTEND;VALUE=DATE:20090419 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T110404Z +DTSTAMP:20090212T231324Z +UID:9ilntmph48qc9i520ejbf63td8@google.com +SUMMARY:New Year's Day +STATUS:CONFIRMED +CLASS:PUBLIC +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T110637Z +DTSTAMP:20090212T231324Z +UID:25jr5s27a7gl76h273qqd0muj8@google.com +SUMMARY:St-Maroun's Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090209 +DTEND;VALUE=DATE:20090210 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231018Z +DTSTAMP:20090212T231324Z +UID:v8fa39i9jfus0fu3qdn0nomb14@google.com +SUMMARY:Easter Sunday (E) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090419 +DTEND;VALUE=DATE:20090420 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090215T192849Z +LAST-MODIFIED:20090215T192849Z +DTSTAMP:20090215T192913Z +UID:skvegmahvacbndu4u53sblmlv0@google.com +SUMMARY:All Saints' Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20091101 +DTEND;VALUE=DATE:20091102 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T115511Z +DTSTAMP:20090212T231324Z +UID:qu01s4cij74i5qqnh3pirs56k8@google.com +SUMMARY:Lebanese Army Day +STATUS:CONFIRMED +CLASS:PUBLIC +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20090801 +DTEND;VALUE=DATE:20090802 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231017Z +DTSTAMP:20090212T231324Z +UID:p4fghinevt4n02s0eoi2g6jma8@google.com +SUMMARY:Martyrs' Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090506 +DTEND;VALUE=DATE:20090507 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231224Z +DTSTAMP:20090212T231324Z +UID:uc7bsfli8fj0nvphrogd91tbak@google.com +SUMMARY:Good Friday (E) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090417 +DTEND;VALUE=DATE:20090418 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231018Z +DTSTAMP:20090212T231324Z +UID:ad1j0recp01gd1s1f137kihtos@google.com +SUMMARY:Good Friday (W) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231017Z +DTSTAMP:20090212T231324Z +UID:fcif9og3pdhqp3rjtmbtkb80qo@google.com +SUMMARY:The Assumption of the Virgin Mary +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090815 +DTEND;VALUE=DATE:20090816 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231018Z +DTSTAMP:20090212T231324Z +UID:s9odu67lsjmedfoeg5ki9ui320@google.com +SUMMARY:Labor Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T111122Z +DTSTAMP:20090212T231324Z +UID:n1uchoamdgsrk2b8gfo8gg20r4@google.com +SUMMARY:Teacher's Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090302 +DTEND;VALUE=DATE:20090303 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231018Z +DTSTAMP:20090212T231324Z +UID:o54pjck9r599233q3vjhabm91c@google.com +SUMMARY:Easter Sunday (W) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090212T231017Z +DTSTAMP:20090212T231324Z +UID:ddkrvtggicku4fu8mmvfgdf8n8@google.com +SUMMARY:Eid al-Adha (Feast of Sacrifice) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20091127 +DTEND;VALUE=DATE:20091128 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T104649Z +DTSTAMP:20090823T104545Z +UID:62ed917c-1ae3-4e58-8492-ce43fa8dfcd3 +SUMMARY:Hijri New Year's Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20091219 +DTEND;VALUE=DATE:20091220 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090215T192700Z +LAST-MODIFIED:20090823T104656Z +DTSTAMP:20090823T104556Z +UID:1747d21e-bee4-41c2-addd-49432dd5ff42 +SUMMARY:Ashoura Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20091228 +DTEND;VALUE=DATE:20091229 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090215T192700Z +LAST-MODIFIED:20090823T105437Z +DTSTAMP:20090823T104556Z +UID:c0055a88-372f-46d0-914c-3d087de855b0 +SUMMARY:Ashoura Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20101217 +DTEND;VALUE=DATE:20101218 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +DESCRIPTION:may differ\, depends on hijri calendar ( muharram 10th) +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T105849Z +DTSTAMP:20090823T105457Z +UID:8ca0bad5-6926-4bcb-a453-69313ef4feb4 +SUMMARY:Hijri New Year's Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20101208 +DTEND;VALUE=DATE:20101209 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +DESCRIPTION:may differ\, depends on hijri calendar( muharram first) +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T110437Z +DTSTAMP:20090823T110417Z +UID:acac63ec-2b31-45cb-82cd-9070608da484 +SUMMARY:New Year's Day +STATUS:CONFIRMED +CLASS:PUBLIC +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T110613Z +DTSTAMP:20090823T110555Z +UID:384cf212-2b6b-47db-9ad8-6ab823025aaa +SUMMARY:Christmas Day (E) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100107 +DTEND;VALUE=DATE:20100108 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T110717Z +DTSTAMP:20090823T110648Z +UID:63e4999d-f836-468a-bdd4-b3eeb2e575d5 +SUMMARY:St-Maroun's Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100209 +DTEND;VALUE=DATE:20100210 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T111217Z +DTSTAMP:20090823T111131Z +UID:9ce97213-63e7-429b-b1b8-430d8c55193e +SUMMARY:Teacher's Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100301 +DTEND;VALUE=DATE:20100302 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +DESCRIPTION:First Monday of March +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T112400Z +DTSTAMP:20090823T112247Z +UID:f503108a-d58d-4902-8a1d-cc40e549c812 +SUMMARY:Prophet Mohammad's Birthday +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100227 +DTEND;VALUE=DATE:20100228 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +DESCRIPTION:Hijri calendar : 9th of Rabie Al-Awwal +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T112523Z +DTSTAMP:20090823T112437Z +UID:8e592dd5-9fb2-4a00-b958-37d84036d47a +SUMMARY:Mother's Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100321 +DTEND;VALUE=DATE:20100322 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T114826Z +DTSTAMP:20090823T114802Z +UID:a44cbbfc-6694-48c3-b186-3e0d52c5c28f +SUMMARY:Good Friday (W) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T114857Z +DTSTAMP:20090823T114837Z +UID:066c002a-318e-4079-8695-d9490dc9e7bd +SUMMARY:Easter Sunday (W) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T115245Z +DTSTAMP:20090823T115234Z +UID:c1b3d6a2-86cf-42d6-8763-3cbe31749657 +SUMMARY:Good Friday (E) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100409 +DTEND;VALUE=DATE:20100410 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T115317Z +DTSTAMP:20090823T115300Z +UID:1f57b664-43e9-4d52-8964-3f3e431260b9 +SUMMARY:Easter Sunday (E) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100411 +DTEND;VALUE=DATE:20100412 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T115409Z +DTSTAMP:20090823T115332Z +UID:b6c6a447-3a61-4505-9021-8823e143b0ba +SUMMARY:Labor Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:20100502 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T115438Z +DTSTAMP:20090823T115427Z +UID:c9565f70-7f72-4ffd-a77b-524fe3b758ab +SUMMARY:Martyrs' Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100506 +DTEND;VALUE=DATE:20100507 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T115455Z +DTSTAMP:20090823T115444Z +UID:06d45028-8a60-4d19-a4fb-2b31e6aea75c +SUMMARY:Resistance and Liberation Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100525 +DTEND;VALUE=DATE:20100526 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T115540Z +DTSTAMP:20090823T115514Z +UID:b6b04ad3-811a-48ee-89b9-fab1bc3e5487 +SUMMARY:Lebanese Army Day +STATUS:CONFIRMED +CLASS:PUBLIC +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100801 +DTEND;VALUE=DATE:20100802 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T115631Z +DTSTAMP:20090823T115619Z +UID:573069cf-605b-4b04-9d96-c09ec60bf727 +SUMMARY:The Assumption of the Virgin Mary +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100815 +DTEND;VALUE=DATE:20100816 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T115753Z +DTSTAMP:20090823T115704Z +UID:be33551d-f245-479e-9352-91503a2e828c +SUMMARY:Eid al-Fitr (Feast of End of Ramadan) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20100911 +DTEND;VALUE=DATE:20100912 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +DESCRIPTION:depends on hijri calendar : first of shawwal +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090215T192849Z +LAST-MODIFIED:20090823T123803Z +DTSTAMP:20090823T123749Z +UID:a3126393-cee7-44d0-95cc-fcbd383a95b9 +SUMMARY:All Saints' Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20101101 +DTEND;VALUE=DATE:20101102 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T123834Z +DTSTAMP:20090823T123819Z +UID:f73ab983-e1e4-4b6f-a00e-7c720439dda5 +SUMMARY:Independence Day +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20101122 +DTEND;VALUE=DATE:20101123 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T132511Z +DTSTAMP:20090823T132355Z +UID:06a3a3ed-a932-4bee-a0d2-2d67689a45c8 +SUMMARY:Eid al-Adha (Feast of Sacrifice) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20101117 +DTEND;VALUE=DATE:20101118 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +DESCRIPTION:Hijri Calendar. 10 th of Zul-Hijja +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090210T204924Z +LAST-MODIFIED:20090823T132703Z +DTSTAMP:20090823T132648Z +UID:f5ee8638-8d8b-414c-9c0c-46127c96b630 +SUMMARY:Christmas Day (W) +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION + property. Removing entire property: +LOCATION:Lebanon +SEQUENCE:1 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/LithuanianHolidays.ics b/media/caldata/LithuanianHolidays.ics new file mode 100644 index 00000000000..d3a5a7ca6e5 --- /dev/null +++ b/media/caldata/LithuanianHolidays.ics @@ -0,0 +1,181 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20111003T165330Z +LAST-MODIFIED:20111003T174912Z +DTSTAMP:20111003T174912Z +UID:637ba1f6-636a-4d65-9da7-e7718b93f250 +SUMMARY:Visų Šventųjų diena +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20111031 +DTEND;VALUE=DATE:20111102 +CLASS:PRIVATE +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION pro + perty. Removing entire property: +SEQUENCE:1 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20111003T164643Z +LAST-MODIFIED:20111003T174912Z +DTSTAMP:20111003T174912Z +UID:43b61560-6ee3-499b-a63a-c5e14168d873 +SUMMARY:šv.Kūčios\, Šv. Kalėdos +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:http://schemas.google.com/g/2005#event +DTSTART;VALUE=DATE:20111224 +DTEND;VALUE=DATE:20111227 +CLASS:PRIVATE +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION pro + perty. Removing entire property: +SEQUENCE:1 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20111003T164450Z +LAST-MODIFIED:20111003T174912Z +DTSTAMP:20111003T174912Z +UID:1eefb545-417b-4ade-9d27-387f2fea4917 +SUMMARY:Naujieji metai +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20120101 +DTEND;VALUE=DATE:20120102 +CLASS:PRIVATE +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION pro + perty. Removing entire property: +SEQUENCE:0 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111003T164705Z +LAST-MODIFIED:20111003T174912Z +DTSTAMP:20111003T174912Z +UID:56ae3c0b-94d2-4e30-84b5-d26792483e41 +SUMMARY:Valstybės atkūrimo diena +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20110216 +DTEND;VALUE=DATE:20110217 +CLASS:PRIVATE +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION pro + perty. Removing entire property: +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111003T164624Z +LAST-MODIFIED:20111003T174913Z +DTSTAMP:20111003T174913Z +UID:960febb3-62d9-4d55-ac50-c61f85a06e12 +SUMMARY:Nepriklausomybės atkūrimo diena +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20110311 +DTEND;VALUE=DATE:20110312 +CLASS:PRIVATE +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION pro + perty. Removing entire property: +SEQUENCE:0 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111003T165357Z +LAST-MODIFIED:20111003T174913Z +DTSTAMP:20111003T174913Z +UID:f20e7006-7228-4bcc-9909-f704878c147a +SUMMARY:Joninės +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20120624 +DTEND;VALUE=DATE:20120625 +CLASS:PRIVATE +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION pro + perty. Removing entire property: +SEQUENCE:2 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111003T165408Z +LAST-MODIFIED:20111003T174913Z +DTSTAMP:20111003T174913Z +UID:3f35cd32-9ff8-4775-9f1a-d197d2d69e26 +SUMMARY:Velykos +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120410 +CLASS:PRIVATE +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION pro + perty. Removing entire property: +SEQUENCE:1 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111003T165450Z +LAST-MODIFIED:20111003T174913Z +DTSTAMP:20111003T174913Z +UID:c1deb358-30da-4d14-ad69-b1d033419018 +SUMMARY:Tarptautinė darbo diena\, Motinos diena +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20110501 +DTEND;VALUE=DATE:20110502 +CLASS:PRIVATE +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION pro + perty. Removing entire property: +SEQUENCE:0 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111003T165557Z +LAST-MODIFIED:20111003T174913Z +DTSTAMP:20111003T174913Z +UID:6452d0a9-83c7-4892-abe2-28a5fbede552 +SUMMARY:Tėvo diena +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20120605 +DTEND;VALUE=DATE:20120606 +CLASS:PRIVATE +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION pro + perty. Removing entire property: +SEQUENCE:0 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111003T165822Z +LAST-MODIFIED:20111003T174914Z +DTSTAMP:20111003T174914Z +UID:7606951a-b92f-41d8-9987-74ca947ec856 +SUMMARY:Valstybės diena +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20110706 +DTEND;VALUE=DATE:20110707 +CLASS:PRIVATE +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION pro + perty. Removing entire property: +SEQUENCE:0 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20111003T170702Z +LAST-MODIFIED:20111003T174914Z +DTSTAMP:20111003T174914Z +UID:0ff54db0-315b-47b8-a330-76f0b7ca03cb +SUMMARY:Žolinės +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20110815 +DTEND;VALUE=DATE:20110816 +CLASS:PRIVATE +X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION pro + perty. Removing entire property: +SEQUENCE:0 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/LuxembourgHolidays.ics b/media/caldata/LuxembourgHolidays.ics new file mode 100644 index 00000000000..5d34f54608b --- /dev/null +++ b/media/caldata/LuxembourgHolidays.ics @@ -0,0 +1,408 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20100510T134925Z +LAST-MODIFIED:20100510T134950Z +DTSTAMP:20100510T134925Z +UID:984f349b-3033-462a-b21a-968a5722d244 +SUMMARY:Nouvel An +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T134956Z +LAST-MODIFIED:20100510T134959Z +DTSTAMP:20100510T134956Z +UID:add1bcfc-5aae-4f1b-90a3-1934eb94fb40 +SUMMARY:lundi de Pâques +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135005Z +LAST-MODIFIED:20100510T135018Z +DTSTAMP:20100510T135005Z +UID:f11b27c4-ddd3-4816-b3c2-fa49ac2980cd +SUMMARY:Fête du Travail +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:20100502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135037Z +LAST-MODIFIED:20100510T135039Z +DTSTAMP:20100510T135037Z +UID:2d34b277-4080-4a4c-aa3f-88b26ab10a36 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE:20100524 +DTEND;VALUE=DATE:20100525 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135026Z +LAST-MODIFIED:20100510T135048Z +DTSTAMP:20100510T135026Z +UID:5e327e94-2a77-4b9a-9d31-45faef3827d5 +SUMMARY:Ascension +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135059Z +LAST-MODIFIED:20100510T135103Z +DTSTAMP:20100510T135059Z +UID:7be69ec3-6b8c-4569-a188-6510676f4e92 +SUMMARY:Fête nationale +DTSTART;VALUE=DATE:20100623 +DTEND;VALUE=DATE:20100624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135112Z +LAST-MODIFIED:20100510T135117Z +DTSTAMP:20100510T135112Z +UID:a9cae473-cdc4-4508-b302-460d9578215b +SUMMARY:Assomption +DTSTART;VALUE=DATE:20100815 +DTEND;VALUE=DATE:20100816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135126Z +LAST-MODIFIED:20100510T135130Z +DTSTAMP:20100510T135126Z +UID:a016c050-2992-42b5-95f2-b1ce5838127a +SUMMARY:Toussaint +DTSTART;VALUE=DATE:20101101 +DTEND;VALUE=DATE:20101102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135137Z +LAST-MODIFIED:20100510T135140Z +DTSTAMP:20100510T135137Z +UID:3788a881-4698-4695-9cc1-7baa767e1309 +SUMMARY:Noël +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135147Z +LAST-MODIFIED:20100510T135149Z +DTSTAMP:20100510T135147Z +UID:6daaeff8-bfe3-41cb-ab59-39387520c7e6 +SUMMARY:Saint-Etienne +DTSTART;VALUE=DATE:20101226 +DTEND;VALUE=DATE:20101227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135204Z +LAST-MODIFIED:20100510T135206Z +DTSTAMP:20100510T135204Z +UID:16ebeecf-044b-4397-8dd0-c6f8359b7006 +SUMMARY:Nouvel An +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:20110102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135222Z +LAST-MODIFIED:20100510T135225Z +DTSTAMP:20100510T135222Z +UID:f8770e53-f60b-4bfc-a520-85e98653b1c7 +SUMMARY:Fête du Travail +DTSTART;VALUE=DATE:20110501 +DTEND;VALUE=DATE:20110502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135241Z +LAST-MODIFIED:20100510T135259Z +DTSTAMP:20100510T135241Z +UID:390275c6-ce3f-4b36-b158-8b9a1907ceb7 +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135214Z +LAST-MODIFIED:20100510T135401Z +DTSTAMP:20100510T135214Z +UID:a624a427-67a1-452c-8471-3539addd7eab +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135232Z +LAST-MODIFIED:20100510T135417Z +DTSTAMP:20100510T135232Z +UID:de1b719d-c3cf-4517-a240-66894b3f96af +SUMMARY:Ascension +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135433Z +LAST-MODIFIED:20100510T135441Z +DTSTAMP:20100510T135433Z +UID:2beea4e1-5182-4efc-a2ab-3d31f9f12606 +SUMMARY:Fête nationale +DTSTART;VALUE=DATE:20110623 +DTEND;VALUE=DATE:20110624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135450Z +LAST-MODIFIED:20100510T135452Z +DTSTAMP:20100510T135450Z +UID:c8116d78-7203-4603-89bf-269c3c863b2c +SUMMARY:Assomption +DTSTART;VALUE=DATE:20110815 +DTEND;VALUE=DATE:20110816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135501Z +LAST-MODIFIED:20100510T135503Z +DTSTAMP:20100510T135501Z +UID:b98e018b-11ba-487a-bd4f-6e5fd92a726a +SUMMARY:Toussaint +DTSTART;VALUE=DATE:20111101 +DTEND;VALUE=DATE:20111102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135509Z +LAST-MODIFIED:20100510T135511Z +DTSTAMP:20100510T135509Z +UID:166db420-774f-4762-8db2-b8e1336aa1a8 +SUMMARY:Noël +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135517Z +LAST-MODIFIED:20100510T135519Z +DTSTAMP:20100510T135517Z +UID:ff706a8e-1bae-4dc7-a184-ec2f108f12e5 +SUMMARY:Saint-Etienne +DTSTART;VALUE=DATE:20111226 +DTEND;VALUE=DATE:20111227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135531Z +LAST-MODIFIED:20100510T135540Z +DTSTAMP:20100510T135531Z +UID:dcc98d1c-197c-4c62-a047-5355f7cf1263 +SUMMARY:Nouvel An +DTSTART;VALUE=DATE:20120101 +DTEND;VALUE=DATE:20120102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135600Z +LAST-MODIFIED:20100510T135603Z +DTSTAMP:20100510T135600Z +UID:878c60e2-47e2-4591-9c9c-bdff290dc3be +SUMMARY:Fête du Travail +DTSTART;VALUE=DATE:20120501 +DTEND;VALUE=DATE:20120502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135818Z +LAST-MODIFIED:20100510T135822Z +DTSTAMP:20100510T135818Z +UID:2a1d8357-cedb-4b85-bb00-66e9a660843f +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135834Z +LAST-MODIFIED:20100510T135836Z +DTSTAMP:20100510T135834Z +UID:086c9f2c-7ce6-4bc5-a0ed-1bfcc21e39e0 +SUMMARY:Ascension +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135841Z +LAST-MODIFIED:20100510T135843Z +DTSTAMP:20100510T135841Z +UID:df08360a-c01c-48d9-abe4-967cf58f48ec +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE:20120528 +DTEND;VALUE=DATE:20120529 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135849Z +LAST-MODIFIED:20100510T135852Z +DTSTAMP:20100510T135849Z +UID:1a0eb572-e564-4a8f-b0ae-9e69f8f66cd2 +SUMMARY:Fête nationale +DTSTART;VALUE=DATE:20120623 +DTEND;VALUE=DATE:20120624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135859Z +LAST-MODIFIED:20100510T135901Z +DTSTAMP:20100510T135859Z +UID:fb42601f-5913-47d0-9e63-53a2a36101e1 +SUMMARY:Assomption +DTSTART;VALUE=DATE:20120815 +DTEND;VALUE=DATE:20120816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135908Z +LAST-MODIFIED:20100510T135911Z +DTSTAMP:20100510T135908Z +UID:5f1bb701-c4bf-491a-9113-46047b5ce26d +SUMMARY:Toussaint +DTSTART;VALUE=DATE:20121101 +DTEND;VALUE=DATE:20121102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135919Z +LAST-MODIFIED:20100510T135921Z +DTSTAMP:20100510T135919Z +UID:8a67cba4-739d-4327-aaf3-98bc95e7c162 +SUMMARY:Noël +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135926Z +LAST-MODIFIED:20100510T135928Z +DTSTAMP:20100510T135926Z +UID:dbe91ed1-8e44-4449-b632-58f49126984f +SUMMARY:Saint-Etienne +DTSTART;VALUE=DATE:20121226 +DTEND;VALUE=DATE:20121227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135941Z +LAST-MODIFIED:20100510T135944Z +DTSTAMP:20100510T135941Z +UID:67a1312c-8052-4b7f-bb9a-f4b9d1cf5268 +SUMMARY:Nouvel An +DTSTART;VALUE=DATE:20130101 +DTEND;VALUE=DATE:20130102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135951Z +LAST-MODIFIED:20100510T135953Z +DTSTAMP:20100510T135951Z +UID:6a92fef5-65da-4be0-bda9-8e81c851f841 +SUMMARY:Lundi de Pâques +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T135959Z +LAST-MODIFIED:20100510T140002Z +DTSTAMP:20100510T135959Z +UID:4f750342-9566-4408-b13f-aee2e31dd9a8 +SUMMARY:Fête du Travail +DTSTART;VALUE=DATE:20130501 +DTEND;VALUE=DATE:20130502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T140008Z +LAST-MODIFIED:20100510T140010Z +DTSTAMP:20100510T140008Z +UID:3c62ed67-08e7-4054-9a3a-1b6e5f12c52d +SUMMARY:Ascension +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T140030Z +LAST-MODIFIED:20100510T140039Z +DTSTAMP:20100510T140030Z +UID:8ad34c63-9e2f-4da4-9d67-64df2086d4be +SUMMARY:Lundi de Pentecôte +DTSTART;VALUE=DATE:20130520 +DTEND;VALUE=DATE:20130521 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T140047Z +LAST-MODIFIED:20100510T140049Z +DTSTAMP:20100510T140047Z +UID:21425b43-9cd9-4234-a4cb-c2a1c443220b +SUMMARY:Fête nationale +DTSTART;VALUE=DATE:20130623 +DTEND;VALUE=DATE:20130624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T140057Z +LAST-MODIFIED:20100510T140059Z +DTSTAMP:20100510T140057Z +UID:ca8211e9-c447-4a5d-a736-b500d650e5e8 +SUMMARY:Assomption +DTSTART;VALUE=DATE:20130815 +DTEND;VALUE=DATE:20130816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T140105Z +LAST-MODIFIED:20100510T140108Z +DTSTAMP:20100510T140105Z +UID:9f4e6e65-4b09-4221-b86f-89449b191977 +SUMMARY:Toussaint +DTSTART;VALUE=DATE:20131101 +DTEND;VALUE=DATE:20131102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T140113Z +LAST-MODIFIED:20100510T140116Z +DTSTAMP:20100510T140113Z +UID:903666e0-11c4-413e-94d8-73b3d7a9fc02 +SUMMARY:Noël +DTSTART;VALUE=DATE:20131225 +DTEND;VALUE=DATE:20131226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100510T140121Z +LAST-MODIFIED:20100510T140124Z +DTSTAMP:20100510T140121Z +UID:a30aa3e6-1bd6-4295-b262-e44de8b540ce +SUMMARY:Saint-Etienne +DTSTART;VALUE=DATE:20131226 +DTEND;VALUE=DATE:20131227 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/MalaysiaHolidays.ics b/media/caldata/MalaysiaHolidays.ics new file mode 100644 index 00000000000..4ff2c243c26 --- /dev/null +++ b/media/caldata/MalaysiaHolidays.ics @@ -0,0 +1,584 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20100210T090208Z +LAST-MODIFIED:20101228T022103Z +DTSTAMP:20101228T022103Z +UID:0f8f4306-60f0-46fe-969a-f99a442a6b14 +SUMMARY:New Year +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:20110102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +SEQUENCE:2 +LOCATION:All except Johor\, Kedah\, Kelantan\, Perlis & Terengganu +END:VEVENT +BEGIN:VEVENT +CREATED:20100210T090836Z +LAST-MODIFIED:20101228T021901Z +DTSTAMP:20101228T021901Z +UID:7fd8157c-47e6-4caf-a029-cf5040cd98f9 +SUMMARY:Christmas +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111226 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +LOCATION:National +END:VEVENT +BEGIN:VEVENT +CREATED:20100210T090312Z +LAST-MODIFIED:20101228T020701Z +DTSTAMP:20101228T020701Z +UID:10be03d6-12ba-43e5-8065-1e40a7b1dd74 +SUMMARY:Prophet Muhammad's Birthday\,(Maulidur Rasul) +DTSTART;VALUE=DATE:20110215 +DTEND;VALUE=DATE:20110216 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +LOCATION:National +END:VEVENT +BEGIN:VEVENT +CREATED:20100210T090508Z +LAST-MODIFIED:20101228T020915Z +DTSTAMP:20101228T020915Z +UID:71cad7a2-750a-4ede-bfc7-aefab3e1db71 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +LOCATION:Sabah & Sarawak only +END:VEVENT +BEGIN:VEVENT +CREATED:20100210T090616Z +LAST-MODIFIED:20101228T021213Z +DTSTAMP:20101228T021213Z +UID:cd505324-c648-47b1-bfc6-e04bc7879da7 +SUMMARY:Israk & Mikraj +DTSTART;VALUE=DATE:20110629 +DTEND;VALUE=DATE:20110630 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +LOCATION:Kedah\, Negeri Sembilan & Perlis only +END:VEVENT +BEGIN:VEVENT +CREATED:20100210T090750Z +LAST-MODIFIED:20101228T021743Z +DTSTAMP:20101228T021743Z +UID:1579da25-62e3-4660-b6ef-95fd1af9e461 +SUMMARY:Hari Raya Haji +DTSTART;VALUE=DATE:20111106 +DTEND;VALUE=DATE:20111107 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +SEQUENCE:2 +LOCATION:National +END:VEVENT +BEGIN:VEVENT +CREATED:20100210T090710Z +LAST-MODIFIED:20101228T021413Z +DTSTAMP:20101228T021413Z +UID:82429d5a-9a6a-4dc2-8e50-adc398468902 +SUMMARY:Hari Raya Puasa +DTSTART;VALUE=DATE:20110830 +DTEND;VALUE=DATE:20110831 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:3 +LOCATION:National +END:VEVENT +BEGIN:VEVENT +CREATED:20100210T090728Z +LAST-MODIFIED:20101228T021456Z +DTSTAMP:20101228T021456Z +UID:c103310e-79c9-4f9a-b2f4-dc3f851c557f +SUMMARY:Hari Raya Puasa (2nd Day) +DTSTART;VALUE=DATE:20110831 +DTEND;VALUE=DATE:20110901 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:4 +LOCATION:National +END:VEVENT +BEGIN:VEVENT +CREATED:20100210T090555Z +LAST-MODIFIED:20101228T022320Z +DTSTAMP:20101228T022320Z +UID:633417f2-b0ad-40c9-83b3-63e3f0cb086b +SUMMARY:Vesak Day +DTSTART;VALUE=DATE:20110517 +DTEND;VALUE=DATE:20110518 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:3 +LOCATION:National +END:VEVENT +BEGIN:VEVENT +CREATED:20100210T090818Z +LAST-MODIFIED:20101228T021827Z +DTSTAMP:20101228T021827Z +UID:45f4d6f4-2f0c-4995-b177-90c83e586bd4 +SUMMARY:Awal Muharram (Maal Hijrah) +DTSTART;VALUE=DATE:20111127 +DTEND;VALUE=DATE:20111128 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +SEQUENCE:2 +LOCATION:National +END:VEVENT +BEGIN:VEVENT +CREATED:20100210T090230Z +LAST-MODIFIED:20101228T020617Z +DTSTAMP:20101228T020617Z +UID:0b9756bb-5156-4190-9f6b-a7347953db1d +SUMMARY:Chinese New Year +DTSTART;VALUE=DATE:20110203 +DTEND;VALUE=DATE:20110204 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:3 +LOCATION:National +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T020126Z +LAST-MODIFIED:20101228T020318Z +DTSTAMP:20101228T020318Z +UID:853648c9-20e6-46d0-9674-9c83f358f8b9 +SUMMARY:Hari Hol Almarhum Sultan Johor +DTSTART;VALUE=DATE:20110111 +DTEND;VALUE=DATE:20110112 +LOCATION:Johor only +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T020407Z +LAST-MODIFIED:20101228T020445Z +DTSTAMP:20101228T020445Z +UID:1468e6b0-eea2-4f40-9abb-65132d3916ac +SUMMARY:Yang di-Pertuan Besar\,Negeri Sembilan's Birthday +DTSTART;VALUE=DATE:20110114 +DTEND;VALUE=DATE:20110115 +LOCATION:Negeri Sembilan only +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T020425Z +LAST-MODIFIED:20101228T020451Z +DTSTAMP:20101228T020451Z +UID:dbe3b6d0-804f-41ff-9973-ddf17cae30b6 +SUMMARY:Sultan of Kedah's Birthday +DTSTART;VALUE=DATE:20110116 +DTEND;VALUE=DATE:20110117 +LOCATION:Kedah only +X-MOZ-GENERATION:2 +TRANSP:TRANSPARENT +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T020501Z +LAST-MODIFIED:20101228T020510Z +DTSTAMP:20101228T020510Z +UID:0e91508b-6d97-4f62-9043-54520f878def +SUMMARY:Thaipusam +DTSTART;VALUE=DATE:20110120 +DTEND;VALUE=DATE:20110121 +LOCATION:Kuala Lumpur\, Putrajaya\, Johor\, Negeri Sembilan\, Perak\, Pena + ng & Selangor only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T020550Z +LAST-MODIFIED:20101228T020600Z +DTSTAMP:20101228T020600Z +UID:0d19e242-060a-40e9-9c56-c700bf29ceaa +SUMMARY:Federal Territory Day +DTSTART;VALUE=DATE:20110201 +DTEND;VALUE=DATE:20110202 +LOCATION:Federal Territory of Kuala Lumpur\, Labuan & Putrajaya only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T020619Z +LAST-MODIFIED:20101228T020631Z +DTSTAMP:20101228T020631Z +UID:0df4b18d-7a80-46f2-b683-2ddbbd956497 +SUMMARY:Chinese New Year (2nd Day) +DTSTART;VALUE=DATE:20110204 +DTEND;VALUE=DATE:20110205 +LOCATION:National except Kelantan and Terengganu +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T020716Z +LAST-MODIFIED:20101228T022625Z +DTSTAMP:20101228T022625Z +UID:ff72a650-c2ab-446e-9be6-e2342cb18e12 +SUMMARY:Anniversary of Installation of Sultan of Terengganu +DTSTART;VALUE=DATE:20110304 +DTEND;VALUE=DATE:20110305 +LOCATION:Terengganu only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T020739Z +LAST-MODIFIED:20101228T020750Z +DTSTAMP:20101228T020750Z +UID:ee29d4f3-730e-4a5b-9c55-e7e4677cbeb8 +SUMMARY:Sultan of Kelantan's Birthday +DTSTART;VALUE=DATE:20110330 +DTEND;VALUE=DATE:20110331 +LOCATION:Kelantan only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T020756Z +LAST-MODIFIED:20101228T020805Z +DTSTAMP:20101228T020805Z +UID:691c15ad-8e64-415d-b8de-a94281d37324 +SUMMARY:Sultan of Kelantan's Birthday +DTSTART;VALUE=DATE:20110331 +DTEND;VALUE=DATE:20110401 +LOCATION:Kelantan only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T020818Z +LAST-MODIFIED:20101228T020842Z +DTSTAMP:20101228T020842Z +UID:19d60f11-fcb2-4c03-9b9e-cfb38184a1aa +SUMMARY:Declaration of Malacca as a Historical City +DTSTART;VALUE=DATE:20110415 +DTEND;VALUE=DATE:20110416 +LOCATION:Malacca only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T020856Z +LAST-MODIFIED:20101228T020902Z +DTSTAMP:20101228T020902Z +UID:99e0f0f0-d37d-4770-b409-80eeba9278f8 +SUMMARY:Sultan of Perak's Birthday +DTSTART;VALUE=DATE:20110419 +DTEND;VALUE=DATE:20110420 +LOCATION:Perak only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T020936Z +LAST-MODIFIED:20101228T020947Z +DTSTAMP:20101228T020947Z +UID:420410f2-438e-4e83-9ab9-be615f2d86f9 +SUMMARY:Labour Day +DTSTART;VALUE=DATE:20110501 +DTEND;VALUE=DATE:20110502 +LOCATION:National +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021003Z +LAST-MODIFIED:20101228T022249Z +DTSTAMP:20101228T022249Z +UID:29a4dd4f-f424-4ce5-8aa1-6c5a7e545e59 +SUMMARY:Hari Hol Pahang +DTSTART;VALUE=DATE:20110507 +DTEND;VALUE=DATE:20110508 +LOCATION:Pahang only +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021056Z +LAST-MODIFIED:20101228T022309Z +DTSTAMP:20101228T022309Z +UID:2eb23fef-32b0-420c-9abe-2c504f75ee3d +SUMMARY:Raja Perlis' Birthday +DTSTART;VALUE=DATE:20110517 +DTEND;VALUE=DATE:20110518 +LOCATION:Perlis only +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021127Z +LAST-MODIFIED:20101228T021135Z +DTSTAMP:20101228T021135Z +UID:0bb94d17-e50a-4346-ad28-dec775a920a3 +SUMMARY:Harvest Festival +DTSTART;VALUE=DATE:20110530 +DTEND;VALUE=DATE:20110531 +LOCATION:Sabah & Labuan only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021140Z +LAST-MODIFIED:20101228T022528Z +DTSTAMP:20101228T022528Z +UID:d29069ec-8488-41c5-b892-4c6a3d7fc810 +SUMMARY:Harvest Festival +DTSTART;VALUE=DATE:20110531 +DTEND;VALUE=DATE:20110601 +LOCATION:Sabah & Labuan only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021225Z +LAST-MODIFIED:20101228T021233Z +DTSTAMP:20101228T021233Z +UID:332e51be-3c85-4035-824e-b6fd012f2516 +SUMMARY:Georgetown World Heritage City Day +DTSTART;VALUE=DATE:20110707 +DTEND;VALUE=DATE:20110708 +LOCATION:Penang only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021241Z +LAST-MODIFIED:20101228T021247Z +DTSTAMP:20101228T021247Z +UID:5feef17d-9498-4b67-8768-d32c9479c71e +SUMMARY:Penang Governor's Birthday +DTSTART;VALUE=DATE:20110709 +DTEND;VALUE=DATE:20110710 +LOCATION:Penang only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021258Z +LAST-MODIFIED:20101228T021305Z +DTSTAMP:20101228T021305Z +UID:87f74fd9-f7a1-4189-baa7-45dc02a0da0d +SUMMARY:Sultan of Terengganu's Birthday +DTSTART;VALUE=DATE:20110720 +DTEND;VALUE=DATE:20110721 +LOCATION:Terengganu only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021322Z +LAST-MODIFIED:20101228T021330Z +DTSTAMP:20101228T021330Z +UID:4cc3f262-bee8-4d86-bdf9-dc2d9cc82b92 +SUMMARY:Awal Ramadan +DTSTART;VALUE=DATE:20110801 +DTEND;VALUE=DATE:20110802 +LOCATION:Johor\, Kedah & Malacca only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021340Z +LAST-MODIFIED:20101228T021348Z +DTSTAMP:20101228T021348Z +UID:898b451b-888d-40b7-ae39-b772fd03ecfe +SUMMARY:Nuzul Al-Quran +DTSTART;VALUE=DATE:20110817 +DTEND;VALUE=DATE:20110818 +LOCATION:Kelantan\, Pahang\, Perak\, Perlis\, Penang\, Selangor & Terengga + nu only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021521Z +LAST-MODIFIED:20101228T021528Z +DTSTAMP:20101228T021528Z +UID:db25206c-0ecf-4564-9481-f701b6361b05 +SUMMARY:National Day +DTSTART;VALUE=DATE:20110831 +DTEND;VALUE=DATE:20110901 +LOCATION:National +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021554Z +LAST-MODIFIED:20101228T021600Z +DTSTAMP:20101228T021600Z +UID:958d0158-e56c-43d6-86ef-118010858226 +SUMMARY:Sarawak Governor's Birthday +DTSTART;VALUE=DATE:20110910 +DTEND;VALUE=DATE:20110911 +LOCATION:Sarawak only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021617Z +LAST-MODIFIED:20101228T021624Z +DTSTAMP:20101228T021624Z +UID:88a99062-6630-4c58-bbb1-35aa218e9e9b +SUMMARY:Malaysia Day +DTSTART;VALUE=DATE:20110916 +DTEND;VALUE=DATE:20110917 +LOCATION:National +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021630Z +LAST-MODIFIED:20101228T021636Z +DTSTAMP:20101228T021636Z +UID:f667831e-0b63-47d7-bdbc-d129643a7a96 +SUMMARY:Sabah Governor's Birthday +DTSTART;VALUE=DATE:20111001 +DTEND;VALUE=DATE:20111002 +LOCATION:Sabah only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021643Z +LAST-MODIFIED:20101228T022110Z +DTSTAMP:20101228T022110Z +UID:b5d02b45-38ef-4fb7-835a-79e5a2bf7916 +SUMMARY:Malacca Governor's Birthday +DTSTART;VALUE=DATE:20111008 +DTEND;VALUE=DATE:20111009 +LOCATION:Malacca only +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021658Z +LAST-MODIFIED:20101228T021705Z +DTSTAMP:20101228T021705Z +UID:1623af5f-250a-4519-9485-75abfdce41fd +SUMMARY:Sultan of Pahang's Birthday +DTSTART;VALUE=DATE:20111024 +DTEND;VALUE=DATE:20111025 +LOCATION:Pahang only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021711Z +LAST-MODIFIED:20101228T021717Z +DTSTAMP:20101228T021717Z +UID:1b0ec1e7-f232-4b7b-8dca-eed8454fb4e1 +SUMMARY:Deepavali +DTSTART;VALUE=DATE:20111026 +DTEND;VALUE=DATE:20111027 +LOCATION:National +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021751Z +LAST-MODIFIED:20101228T021757Z +DTSTAMP:20101228T021757Z +UID:ce83d199-d324-4b00-8c56-1b27dab5aba7 +SUMMARY:Hari Raya Haji (2nd Day) +DTSTART;VALUE=DATE:20111107 +DTEND;VALUE=DATE:20111108 +LOCATION:Kedah\, Kelantan\, Perlis & Terengganu Only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021809Z +LAST-MODIFIED:20101228T021815Z +DTSTAMP:20101228T021815Z +UID:6afb6134-e242-47e5-94ce-cd3c08ee9549 +SUMMARY:Sultan of Johor's Birthday +DTSTART;VALUE=DATE:20111122 +DTEND;VALUE=DATE:20111123 +LOCATION:Johor only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T021839Z +LAST-MODIFIED:20101228T021845Z +DTSTAMP:20101228T021845Z +UID:2d4b606f-3f90-4bf6-9e1f-8773c0677285 +SUMMARY:Sultan of Selangor's Birthday +DTSTART;VALUE=DATE:20111211 +DTEND;VALUE=DATE:20111212 +LOCATION:Selangor only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T022504Z +LAST-MODIFIED:20101228T022516Z +DTSTAMP:20101228T022516Z +UID:5ab26ff3-9c03-4bb0-b7ed-03e18fbcee10 +SUMMARY:Hari Gawai +DTSTART;VALUE=DATE:20110601 +DTEND;VALUE=DATE:20110602 +LOCATION:Sarawak only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T022530Z +LAST-MODIFIED:20101228T022537Z +DTSTAMP:20101228T022537Z +UID:d9b09012-029a-40aa-afb7-6545779d3be7 +SUMMARY:Hari Gawai +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +LOCATION:Sarawak only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T022542Z +LAST-MODIFIED:20101228T022551Z +DTSTAMP:20101228T022551Z +UID:246e530e-affd-490d-9e08-7935a943d629 +SUMMARY:Agong's Birthday +DTSTART;VALUE=DATE:20110604 +DTEND;VALUE=DATE:20110605 +LOCATION:National +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T022829Z +LAST-MODIFIED:20101228T023432Z +DTSTAMP:20101228T023432Z +UID:4f5c1323-d230-4aad-b138-1d0eac1ae843 +SUMMARY:School Holiday +DTSTART;VALUE=DATE:20110312 +DTEND;VALUE=DATE:20110321 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T023052Z +LAST-MODIFIED:20101228T023417Z +DTSTAMP:20101228T023417Z +UID:ff4941f1-f473-4c35-adb6-3b26acd06b93 +SUMMARY:School Holiday +DTSTART;VALUE=DATE:20110528 +DTEND;VALUE=DATE:20110613 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T023525Z +LAST-MODIFIED:20101228T023614Z +DTSTAMP:20101228T023614Z +UID:417d849a-fb4f-4920-a044-6b3cbb36530c +SUMMARY:School Holiday +DTSTART;VALUE=DATE:20110827 +DTEND;VALUE=DATE:20110905 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101228T023712Z +LAST-MODIFIED:20101228T024740Z +DTSTAMP:20101228T024740Z +UID:639bb386-690a-4403-905a-7e530569b6af +SUMMARY:School Holiday +DTSTART;VALUE=DATE:20111119 +DTEND;VALUE=DATE:20120102 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/MaltaHolidays.ics b/media/caldata/MaltaHolidays.ics new file mode 100644 index 00000000000..82c38dd0345 --- /dev/null +++ b/media/caldata/MaltaHolidays.ics @@ -0,0 +1,289 @@ +BEGIN:VCALENDAR +METHOD:PUBLISH +VERSION:2.0 +X-WR-CALNAME:Maltese Holidays +PRODID:-//Apple Inc.//iCal 4.0.1//EN +X-APPLE-CALENDAR-COLOR:#0F8080 +X-WR-TIMEZONE:America/Toronto +CALSCALE:GREGORIAN +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:25CE7FC5-ECB8-4C6A-979F-B6501143AFCE +DTEND;VALUE=DATE:20090401 +TRANSP:OPAQUE +SUMMARY:Freedom Day +DTSTART;VALUE=DATE:20090331 +DTSTAMP:20081120T062802Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:1B66F689-1617-4DCF-A786-AA9EAB567890 +DTEND;VALUE=DATE:20090211 +TRANSP:OPAQUE +SUMMARY:Feast of St Paul's Shipwreck +DTSTART;VALUE=DATE:20090210 +DTSTAMP:20081120T062721Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:B145DFD9-747E-4C61-9CD6-DB8B9DE5D776 +DTEND;VALUE=DATE:20090630 +TRANSP:OPAQUE +SUMMARY:Feast of St Peter and St Paul +DTSTART;VALUE=DATE:20090629 +DTSTAMP:20081120T062841Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:0B9E28EA-E4AC-46B2-A85D-120806CCA1C8 +DTEND;VALUE=DATE:20090909 +TRANSP:OPAQUE +SUMMARY:Feast of Our Lady of Victories +DTSTART;VALUE=DATE:20090908 +DTSTAMP:20081120T063132Z +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:E32975DC-D26C-45E0-BF92-1A9EA5D822E6 +DTEND;VALUE=DATE:20090816 +TRANSP:OPAQUE +SUMMARY:Feast of the Assumption +DTSTART;VALUE=DATE:20090815 +DTSTAMP:20081120T063121Z +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:60A5DA17-6B96-4FD7-8BBB-358B804214EE +DTEND;VALUE=DATE:20090608 +TRANSP:OPAQUE +SUMMARY:Sette Giugno +DTSTART;VALUE=DATE:20090607 +DTSTAMP:20081120T062829Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:A9C05C7B-9980-4206-BA6D-397D474642B9 +DTEND;VALUE=DATE:20090320 +TRANSP:OPAQUE +SUMMARY:St Joseph's Day +DTSTART;VALUE=DATE:20090319 +DTSTAMP:20081120T062742Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:F2A6B546-D4B5-4361-BE89-DBE0FA15D334 +DTEND;VALUE=DATE:20091209 +TRANSP:OPAQUE +SUMMARY:Feast of the Immaculate Conception +DTSTART;VALUE=DATE:20091208 +DTSTAMP:20081120T063151Z +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:BB38541C-2B2F-4A17-B7EC-C3ECF5383CDC +DTEND;VALUE=DATE:20090411 +TRANSP:OPAQUE +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20090410 +DTSTAMP:20081204T045823Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:AEAEB89E-7220-46E1-A0D3-88F444AB26AA +DTEND;VALUE=DATE:20090922 +TRANSP:OPAQUE +SUMMARY:Independence Day +DTSTART;VALUE=DATE:20090921 +DTSTAMP:20081120T062912Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:B474902C-F38B-44F3-9F04-E3C5198FF50B +DTEND;VALUE=DATE:20090413 +TRANSP:OPAQUE +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20090412 +DTSTAMP:20081204T045851Z +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:F08181E1-40E2-4734-B386-7A57CAB58A9B +DTEND;VALUE=DATE:20091214 +TRANSP:OPAQUE +SUMMARY:Republic Day +DTSTART;VALUE=DATE:20091213 +DTSTAMP:20081120T062934Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090118T175538Z +UID:346F81E7-9C64-436E-A407-7F9D5010262F +DTEND;VALUE=DATE:20090502 +TRANSP:OPAQUE +SUMMARY:Workers' Day +DTSTART;VALUE=DATE:20090501 +DTSTAMP:20081120T063048Z +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T164853Z +UID:DB19FB81-EA85-41DD-8E5B-283643290A38 +DTEND;VALUE=DATE:20100211 +TRANSP:TRANSPARENT +SUMMARY:St. Paul’s Shipwreck +DTSTART;VALUE=DATE:20100210 +DTSTAMP:20091205T165944Z +SEQUENCE:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T164924Z +UID:7E8325A4-F086-4DE8-8051-5805A4436C24 +DTEND;VALUE=DATE:20100320 +TRANSP:TRANSPARENT +SUMMARY:St Joseph's Day +DTSTART;VALUE=DATE:20100319 +DTSTAMP:20091205T164927Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T164936Z +UID:81401BBF-2208-465B-82D8-8648EFB872F9 +DTEND;VALUE=DATE:20100401 +TRANSP:TRANSPARENT +SUMMARY:Freedom Day +DTSTART;VALUE=DATE:20100331 +DTSTAMP:20091205T164939Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T164955Z +UID:ECA59DAE-4896-43E7-8E04-A9370797D0D4 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20100402 +DTSTAMP:20091205T164958Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T165008Z +UID:81E78144-BD56-46F0-86DB-D05F8DB1CEB0 +DTEND;VALUE=DATE:20100502 +TRANSP:TRANSPARENT +SUMMARY:Workers' Day +DTSTART;VALUE=DATE:20100501 +DTSTAMP:20091205T170038Z +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T165018Z +UID:C2261059-DA6B-47CD-A5EA-775F4B408768 +DTEND;VALUE=DATE:20100608 +TRANSP:TRANSPARENT +SUMMARY:Sette Giugno +DTSTART;VALUE=DATE:20100607 +DTSTAMP:20091205T165021Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T165029Z +UID:A059C903-CCB5-4E46-8702-217C66485E72 +DTEND;VALUE=DATE:20100630 +TRANSP:TRANSPARENT +SUMMARY:St Peter and St Paul +DTSTART;VALUE=DATE:20100629 +DTSTAMP:20091205T170243Z +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T165043Z +UID:E435BD38-14DC-40F2-91FC-5438A8CF8A1F +DTEND;VALUE=DATE:20100816 +TRANSP:TRANSPARENT +SUMMARY:Assumption Day +DTSTART;VALUE=DATE:20100815 +DTSTAMP:20091205T165045Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T165052Z +UID:802DDB3C-0D16-4EAF-8754-36A50CB70A74 +DTEND;VALUE=DATE:20100909 +TRANSP:TRANSPARENT +SUMMARY:Our Lady of Victories +DTSTART;VALUE=DATE:20100908 +DTSTAMP:20091205T165055Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T165100Z +UID:4E51604E-E4D8-4255-BFCF-5503F7D016F8 +DTEND;VALUE=DATE:20100922 +TRANSP:TRANSPARENT +SUMMARY:Independence Day +DTSTART;VALUE=DATE:20100921 +DTSTAMP:20091205T165102Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T165112Z +UID:C2F48055-4B08-4EE1-8FC6-6CF0442B087B +DTEND;VALUE=DATE:20101209 +TRANSP:TRANSPARENT +SUMMARY:Immaculate Conception +DTSTART;VALUE=DATE:20101208 +DTSTAMP:20091205T165434Z +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T165121Z +UID:1B430D27-5433-4E52-82A0-0FFDB7C2CC19 +DTEND;VALUE=DATE:20101214 +TRANSP:TRANSPARENT +SUMMARY:Republic Day +DTSTART;VALUE=DATE:20101213 +DTSTAMP:20091205T165542Z +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T165920Z +UID:449F95FE-B649-42A1-A457-2F280091A1E6 +DTEND;VALUE=DATE:20100102 +TRANSP:TRANSPARENT +SUMMARY:New Year’s Day +DTSTART;VALUE=DATE:20100101 +DTSTAMP:20091205T165924Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T170022Z +UID:80F44BC7-17EE-4FE5-B42B-F406564D0A9F +DTEND;VALUE=DATE:20100405 +TRANSP:TRANSPARENT +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20100404 +DTSTAMP:20091205T170025Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091205T170130Z +UID:51CC4F8B-BC54-4DFE-B238-6C77646C738F +DTEND;VALUE=DATE:20101226 +TRANSP:TRANSPARENT +SUMMARY:Christmas Day +DTSTART;VALUE=DATE:20101225 +DTSTAMP:20091205T170140Z +SEQUENCE:3 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/MexicanHolidays.ics b/media/caldata/MexicanHolidays.ics new file mode 100644 index 00000000000..2da4e2acfb5 --- /dev/null +++ b/media/caldata/MexicanHolidays.ics @@ -0,0 +1,362 @@ +\uFEFFBEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20100113T170740Z +LAST-MODIFIED:20100113T170740Z +DTSTAMP:20090130T234608Z +UID:417533e5-b39f-4f29-ab8b-4bad180b2c97 +SUMMARY:DIA FESTIVO +CATEGORIES:Aniversario +DTSTART;VALUE=DATE:20090202 +DTEND;VALUE=DATE:20090203 +CLASS:PUBLIC +DESCRIPTION:Aniversario de la promulgacin de la constitucin poltica de Mxico. +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170740Z +LAST-MODIFIED:20100113T170740Z +DTSTAMP:20090130T234808Z +UID:bd7535ec-a961-48d6-8a1a-8b134968f286 +SUMMARY:DIA FESTIVO +CATEGORIES:Aniversario +DTSTART;VALUE=DATE:20090316 +DTEND;VALUE=DATE:20090317 +CLASS:PUBLIC +DESCRIPTION:Aniversario del natalicio de Don Benito Jurez +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170740Z +LAST-MODIFIED:20100113T170740Z +DTSTAMP:20090130T234857Z +UID:63b31121-6aa0-4a61-b6cd-844415f26e34 +SUMMARY:DIA FESTIVO +CATEGORIES:Feriados +DTSTART;VALUE=DATE:20090409 +DTEND;VALUE=DATE:20090411 +CLASS:PUBLIC +DESCRIPTION:Jueves y Viernes SANTO (Semana Santa) +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170740Z +LAST-MODIFIED:20100113T170740Z +DTSTAMP:20090130T234951Z +UID:4ec24db6-c221-4094-82fe-1abeb224ab20 +SUMMARY:DIA FESTIVO +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +CLASS:PUBLIC +DESCRIPTION:Da del Trabajo +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170740Z +LAST-MODIFIED:20100113T170740Z +DTSTAMP:20090130T235132Z +UID:115af817-e568-430a-8b9a-c2a7ce9a5cf0 +SUMMARY:DIA FESTIVO +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20090915 +DTEND;VALUE=DATE:20090916 +CLASS:PUBLIC +DESCRIPTION:Da del Grito de Independencia +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170740Z +LAST-MODIFIED:20100113T170740Z +DTSTAMP:20090130T235213Z +UID:f1e49e55-4fdd-4c79-82b9-5f15c2c5fc63 +SUMMARY:DIA FESTIVO +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20091116 +DTEND;VALUE=DATE:20091117 +CLASS:PUBLIC +DESCRIPTION:Conmemorando Aniversario de la Revolucin Mexicana (20 de Noviembre) +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170740Z +LAST-MODIFIED:20100113T170740Z +DTSTAMP:20090130T235328Z +UID:790522ef-2789-45b0-acc0-38bd5df4ec1a +SUMMARY:DIA FESTIVO +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +CLASS:PUBLIC +DESCRIPTION:Navidad +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170741Z +LAST-MODIFIED:20100113T170741Z +DTSTAMP:20090131T000526Z +UID:23e80ad0-07f4-4eb1-9a70-d3f0d29dab6b +SUMMARY:Dia Nacional del Deporte +DTSTART;VALUE=DATE:20091025 +DTEND;VALUE=DATE:20091026 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170741Z +LAST-MODIFIED:20100201T170146Z +DTSTAMP:20100201T170146Z +UID:29b89b98-3f22-4caf-a8a6-e9220ba33dbc +SUMMARY:Da de la Batalla de Puebla +ATTACH:http://es.wikipedia.org/wiki/Batalla_de_puebla +RRULE:FREQ=YEARLY;BYMONTHDAY=5;BYMONTH=5 +CATEGORIES:Feriados +DTSTART;VALUE=DATE:20090505 +DTEND;VALUE=DATE:20090506 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170740Z +LAST-MODIFIED:20100201T165046Z +DTSTAMP:20100201T165046Z +UID:040000008200E00074C5B7101A82E0080000000010B7F79D4294CA0100000000000005631D458F8481AA5CEBA83F +SUMMARY:DIA FESTIVO +ATTACH:http://es.wikipedia.org/wiki/A%C3%B1o_nuevo +RRULE:FREQ=YEARLY;BYMONTHDAY=1;BYMONTH=1 +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +CLASS:PUBLIC +DESCRIPTION:Ao Nuevo +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170740Z +LAST-MODIFIED:20100113T173508Z +DTSTAMP:20090130T235328Z +UID:040000008200E00074C5B7101A82E0080908888799CB3A5631D458F8481AA5CEBA83F +SUMMARY:DIA FESTIVO +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20100201 +DTEND;VALUE=DATE:20100202 +CLASS:PUBLIC +DESCRIPTION:Da de la Constitucin - Da Feriado +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170740Z +LAST-MODIFIED:20100113T175531Z +DTSTAMP:20090130T235328Z +UID:040000008200E00074C5B7101A82E0080000000010B89ED24294CA0100009CB3A5631D458F8481AA5CEBA83F +SUMMARY:DIA FESTIVO +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20100315 +DTEND;VALUE=DATE:20100316 +CLASS:PUBLIC +DESCRIPTION:Natalicio de Benito Jurez - Da Feriado +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170740Z +LAST-MODIFIED:20100113T172351Z +DTSTAMP:20090130T235328Z +UID:040000008200E00074C5B7103479346346960CEBA83F +SUMMARY:DIA FESTIVO +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20100401 +DTEND;VALUE=DATE:20100403 +CLASS:PUBLIC +DESCRIPTION:Semana Santa +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T170740Z +LAST-MODIFIED:20100113T175608Z +DTSTAMP:20090130T235328Z +UID:040000008200E00074C5B7101A82E00800003679679458F8481AA5CEBA83F +SUMMARY:DIA FESTIVO +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20101115 +DTEND;VALUE=DATE:20101116 +CLASS:PUBLIC +DESCRIPTION:Revolucin Mexicana - Da Feriado +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T173531Z +LAST-MODIFIED:20100201T165213Z +DTSTAMP:20100201T165213Z +UID:040000008239C7E47B870070C50A1863482348539058989 +SUMMARY:Da de la Constitucin Poltica +ATTACH:http://es.wikipedia.org/wiki/Constituci%C3%B3n_Pol%C3%ADtica_de_los_Estados_Unidos_Mexicanos_de_1917 +RRULE:FREQ=YEARLY;BYMONTHDAY=5;BYMONTH=2 +DTSTART;VALUE=DATE:20100205 +DTEND;VALUE=DATE:20100206 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T173808Z +LAST-MODIFIED:20100201T165436Z +DTSTAMP:20100201T165436Z +UID:040000008200E00074C5B7101A82E00800000000A011FFE04494CA01076541A314908549054600 +SUMMARY:Natalicio de Benito Jurez +ATTACH:http://es.wikipedia.org/wiki/Benito_Ju%C3%A1rez +RRULE:FREQ=YEARLY;BYMONTHDAY=21;BYMONTH=3 +DTSTART;VALUE=DATE:20100321 +DTEND;VALUE=DATE:20100322 +CLASS:PUBLIC +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T175819Z +LAST-MODIFIED:20100113T180204Z +DTSTAMP:20090130T235328Z +UID:040000008200E00074C5B7101A82E00800000000D06BF46AC9845B8FBADFF579800D0 +SUMMARY:DIA FESTIVO +RECURRENCE-ID;VALUE=DATE:20110101 +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20110207 +DTEND;VALUE=DATE:20110208 +CLASS:PUBLIC +DESCRIPTION:Da de la Constitucin - Da Feriado +END:VEVENT +BEGIN:VEVENT +CREATED:20100201T164900Z +LAST-MODIFIED:20100201T164900Z +DTSTAMP:20100201T164900Z +UID:040000008200E00074C5B7101A82E00800000000C0346FC14794C800D0 +RDATE;VALUE=DATE-TIME:20110101T060000Z +DTSTART;VALUE=DATE:20110101 +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T175819Z +LAST-MODIFIED:20100113T180146Z +DTSTAMP:20090130T235328Z +UID:040000008200E00074C5B7101A82E0080000000040C623E46AC9845B8FBADFF579800D0 +SUMMARY:DIA FESTIVO +RECURRENCE-ID;VALUE=DATE:20110101 +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20110321 +DTEND;VALUE=DATE:20110322 +CLASS:PUBLIC +DESCRIPTION:Natalicio de Benito Jurez +END:VEVENT +BEGIN:VEVENT +CREATED:20100201T164900Z +LAST-MODIFIED:20100201T164900Z +DTSTAMP:20100201T164900Z +UID:040000008200E00074C5B7101A82E0080000000000940C623E46AC9845B8FBADFF579800D0 +RDATE;VALUE=DATE-TIME:20110101T060000Z +DTSTART;VALUE=DATE:20110101 +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T175819Z +LAST-MODIFIED:20100113T180131Z +DTSTAMP:20090130T235328Z +UID:040000008200E00074C5B7101A82E008000000BADFF579800D0 +SUMMARY:DIA FESTIVO +RECURRENCE-ID;VALUE=DATE:20110101 +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20110421 +DTEND;VALUE=DATE:20110423 +CLASS:PUBLIC +DESCRIPTION:Semana Santa +END:VEVENT +BEGIN:VEVENT +CREATED:20100201T164900Z +LAST-MODIFIED:20100201T164900Z +DTSTAMP:20100201T164900Z +UID:040000008200E00074C5B7101A82E00800000000802D04E74794CA0369039BCD +RDATE;VALUE=DATE-TIME:20110101T060000Z +DTSTART;VALUE=DATE:20110101 +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T175819Z +LAST-MODIFIED:20100113T180046Z +DTSTAMP:20090130T235328Z +UID:040000008200E00074C5B7101A82E00800000000802D04E74794CA010099768346 +SUMMARY:DIA FESTIVO +RECURRENCE-ID;VALUE=DATE:20110101 +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20110916 +DTEND;VALUE=DATE:20110917 +CLASS:PUBLIC +DESCRIPTION:Da de la Independencia +END:VEVENT +BEGIN:VEVENT +CREATED:20100201T164900Z +LAST-MODIFIED:20100201T164900Z +DTSTAMP:20100201T164900Z +UID:040000008200E00074C5B7101A82E0080000000010D0A9F04794CA0100036496000 +RDATE;VALUE=DATE-TIME:20110101T060000Z +DTSTART;VALUE=DATE:20110101 +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T175819Z +LAST-MODIFIED:20100113T180028Z +DTSTAMP:20090130T235328Z +UID:040000008200E00074C5B7101A82E0080000000010D0A9F04794CA01000000123456 +SUMMARY:DIA FESTIVO +RECURRENCE-ID;VALUE=DATE:20110101 +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20111121 +DTEND;VALUE=DATE:20111122 +CLASS:PUBLIC +DESCRIPTION:Revolucin Mexicana - Da Feriado +END:VEVENT +BEGIN:VEVENT +CREATED:20100201T170006Z +LAST-MODIFIED:20100201T170113Z +DTSTAMP:20100201T170113Z +UID:ac9111b7-7ff5-4041-bcda-2f8a904ff81c +SUMMARY:Dia Internacional del Trabajo +ATTACH:http://es.wikipedia.org/wiki/D%C3%ADa_del_Trabajo +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:20100502 +END:VEVENT +BEGIN:VEVENT +CREATED:20100113T175819Z +LAST-MODIFIED:20100201T174829Z +DTSTAMP:20100201T174829Z +UID:dc0700be-85e0-4e88-a2ba-895ea0a7f222 +SUMMARY:DIA FESTIVO +RECURRENCE-ID;VALUE=DATE:20120401 +CATEGORIES:Feriados Pblicos +DTSTART;VALUE=DATE:20120720 +DTEND;VALUE=DATE:20120722 +CLASS:PUBLIC +DESCRIPTION:Semana Santa +END:VEVENT +BEGIN:VEVENT +CREATED:20100201T174857Z +LAST-MODIFIED:20100201T174932Z +DTSTAMP:20100201T174932Z +UID:3ac40ae0-52c6-4022-a794-f384118f5470 +SUMMARY:DIA FESTIVO +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20120405 +DTEND;VALUE=DATE:20120407 +DESCRIPTION:SEMANA SANTA +END:VEVENT +BEGIN:VEVENT +CREATED:20100201T175004Z +LAST-MODIFIED:20100201T175021Z +DTSTAMP:20100201T175021Z +UID:7224c9c7-0536-4db6-b95d-bdc19a5db74a +SUMMARY:DIA FESTIVO +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20130328 +DTEND;VALUE=DATE:20130330 +DESCRIPTION:SEMANA SANTA +END:VEVENT +BEGIN:VEVENT +CREATED:20100201T175051Z +LAST-MODIFIED:20100201T175110Z +DTSTAMP:20100201T175110Z +UID:4513b6ed-43ae-40d8-88fc-497d52537536 +SUMMARY:DIA FESTIVO +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20140417 +DTEND;VALUE=DATE:20140419 +DESCRIPTION:SEMANA SANTA +END:VEVENT +BEGIN:VEVENT +CREATED:20100201T175150Z +LAST-MODIFIED:20100201T175206Z +DTSTAMP:20100201T175206Z +UID:6c78261f-609f-4ff7-b2b9-7797548f649a +SUMMARY:DIA FESTIVO +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20150402 +DTEND;VALUE=DATE:20150404 +DESCRIPTION:SEMANA SANTA +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/NamibiaHolidays.ics b/media/caldata/NamibiaHolidays.ics new file mode 100644 index 00000000000..97752760814 --- /dev/null +++ b/media/caldata/NamibiaHolidays.ics @@ -0,0 +1,196 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20090816T170833Z +LAST-MODIFIED:20090816T170849Z +DTSTAMP:20091027T110138Z +UID:f4db3998-94f9-4ec3-9f9d-d43d8d195b60 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090816T170856Z +LAST-MODIFIED:20090816T170908Z +DTSTAMP:20091027T110138Z +UID:26a60afb-3653-4855-b7bf-b905c32774e2 +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091027T105849Z +LAST-MODIFIED:20091027T105903Z +DTSTAMP:20091027T105849Z +UID:5e838adf-3f33-44bb-8676-bc807d7c6e03 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091027T105909Z +LAST-MODIFIED:20091027T105921Z +DTSTAMP:20091027T105909Z +UID:5ca2b200-f207-4661-bebc-46e9d2c372de +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091027T110010Z +LAST-MODIFIED:20091027T110020Z +DTSTAMP:20091027T110010Z +UID:d2e859bf-1575-4a3a-9e20-a0268ebcfe0c +SUMMARY:Ascension Day +DTSTART;VALUE=DATE:20090524 +DTEND;VALUE=DATE:20090525 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091027T110147Z +LAST-MODIFIED:20091027T110158Z +DTSTAMP:20091027T110147Z +UID:4dd362fe-e716-43de-a738-2d726db60d6d +SUMMARY:Public Holiday +DTSTART;VALUE=DATE:20100322 +DTEND;VALUE=DATE:20100323 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091027T110245Z +LAST-MODIFIED:20091027T110255Z +DTSTAMP:20091027T110245Z +UID:6b83bb44-e119-46ba-8c22-bfaaa3465328 +SUMMARY:Public Holiday +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091027T110328Z +LAST-MODIFIED:20091027T110339Z +DTSTAMP:20091027T110328Z +UID:e7d07f8f-d701-4693-bb4a-56dd0ac18137 +SUMMARY:Ascencion Day +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091027T110509Z +LAST-MODIFIED:20091027T110520Z +DTSTAMP:20091027T110509Z +UID:99f7e372-5240-4f1e-a505-8af3e3962f28 +SUMMARY:Public Holiday +DTSTART;VALUE=DATE:20101227 +DTEND;VALUE=DATE:20101228 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090807T190020Z +LAST-MODIFIED:20090807T190450Z +DTSTAMP:20091027T082603Z +UID:8948c645-db82-4adf-b0f4-664a8eb669b5 +SUMMARY:New Years Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090807T190454Z +LAST-MODIFIED:20090807T191021Z +DTSTAMP:20091027T082603Z +UID:d35ba130-b27c-4b3f-b80f-9c8cc7e3fccd +SUMMARY:Independence Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20090321 +DTEND;VALUE=DATE:20090322 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090807T191122Z +LAST-MODIFIED:20090807T191152Z +DTSTAMP:20091027T082603Z +UID:f82944c5-5884-4ea0-9404-70a10721e567 +SUMMARY:Workers Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090807T191302Z +LAST-MODIFIED:20090807T191333Z +DTSTAMP:20091027T082603Z +UID:a1a8f2d8-3327-4e33-9d38-ba9212d84a04 +SUMMARY:Africa Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20090525 +DTEND;VALUE=DATE:20090526 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090807T191447Z +LAST-MODIFIED:20090807T191523Z +DTSTAMP:20091027T082603Z +UID:eb61a29f-f3ca-4ba5-80d2-f03e238586b8 +SUMMARY:Heroes' Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20090826 +DTEND;VALUE=DATE:20090827 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090807T191526Z +LAST-MODIFIED:20090807T191606Z +DTSTAMP:20091027T082603Z +UID:c2cc14d6-e827-4ea3-be7c-608c941827c6 +SUMMARY:Int. Human Rights Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20091210 +DTEND;VALUE=DATE:20091211 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090807T191609Z +LAST-MODIFIED:20090807T191654Z +DTSTAMP:20091027T082603Z +UID:6b978434-f32d-4b88-add7-7296e78d7f1c +SUMMARY:Christmas Day :-) +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090807T191759Z +LAST-MODIFIED:20090807T191859Z +DTSTAMP:20091027T082604Z +UID:1b1be69d-1712-4187-8725-8289f284ad6e +SUMMARY:Family Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090807T191210Z +LAST-MODIFIED:20091027T110359Z +DTSTAMP:20091027T082604Z +UID:cc8351d1-0e65-475f-a971-b017d0d5af67 +SUMMARY:Cassinga Day +RRULE:FREQ=YEARLY;INTERVAL=1 +EXDATE:20100504T000000 +DTSTART;VALUE=DATE:20090504 +DTEND;VALUE=DATE:20090505 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/NewZealandHolidays.ics b/media/caldata/NewZealandHolidays.ics new file mode 100644 index 00000000000..8233a81666d --- /dev/null +++ b/media/caldata/NewZealandHolidays.ics @@ -0,0 +1,840 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20100317T025436Z +LAST-MODIFIED:20100317T025504Z +DTSTAMP:20100317T025504Z +UID:911fad55-1be0-44ef-bc20-a7172742cb90 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T025436Z +LAST-MODIFIED:20100317T025527Z +DTSTAMP:20100317T025527Z +UID:0ea1dd84-1bf6-46df-b409-c35ec56ebd2b +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T025436Z +LAST-MODIFIED:20100317T025550Z +DTSTAMP:20100317T025550Z +UID:5f204a2c-87d8-47e7-9172-4fa053c4fb8d +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T025436Z +LAST-MODIFIED:20100317T025634Z +DTSTAMP:20100317T025634Z +UID:4e63496c-86f4-4244-a9d2-eb40352cea30 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T025717Z +LAST-MODIFIED:20100317T025755Z +DTSTAMP:20100317T025755Z +UID:2c7d92f5-74e4-4244-8239-c5a6fecfb579 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T025717Z +LAST-MODIFIED:20100317T025926Z +DTSTAMP:20100317T025926Z +UID:9b8ebc69-236a-4ef1-993b-ce3b44aa5058 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T025717Z +LAST-MODIFIED:20100317T025941Z +DTSTAMP:20100317T025941Z +UID:93599c46-0fcb-4d2b-a8de-d30718af7c5b +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T025717Z +LAST-MODIFIED:20100317T030423Z +DTSTAMP:20100317T030423Z +UID:fa5e1c23-6296-4078-849b-52fe4979dd62 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T031722Z +LAST-MODIFIED:20100317T031812Z +DTSTAMP:20100317T031812Z +UID:63e1c26e-f588-4412-ac25-17bdf4800fa2 +SUMMARY:Auckland Anniversary Day +DTSTART;VALUE=DATE:20100201 +DTEND;VALUE=DATE:20100202 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T031722Z +LAST-MODIFIED:20100317T031902Z +DTSTAMP:20100317T031902Z +UID:78a438b0-cf67-40c2-bb78-2133521c425c +SUMMARY:Auckland Anniversary Day +DTSTART;VALUE=DATE:20110131 +DTEND;VALUE=DATE:20110201 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T031722Z +LAST-MODIFIED:20100317T031930Z +DTSTAMP:20100317T031930Z +UID:f42365b0-110a-4c04-8d97-dd9c352be645 +SUMMARY:Auckland Anniversary Day +DTSTART;VALUE=DATE:20120130 +DTEND;VALUE=DATE:20120131 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T031722Z +LAST-MODIFIED:20100317T031944Z +DTSTAMP:20100317T031944Z +UID:7d45710e-d43e-467a-96ae-c6bd20d7f9f2 +SUMMARY:Auckland Anniversary Day +DTSTART;VALUE=DATE:20130128 +DTEND;VALUE=DATE:20130129 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032104Z +DTSTAMP:20100317T032104Z +UID:6b74a3e5-b90a-47da-97a7-54f0e32bec2c +SUMMARY:Taranaki Anniversary Day +DTSTART;VALUE=DATE:20100308 +DTEND;VALUE=DATE:20100309 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032121Z +DTSTAMP:20100317T032121Z +UID:93822403-0f91-4f20-aa08-804f2a6fac55 +SUMMARY:Taranaki Anniversary Day +DTSTART;VALUE=DATE:20110314 +DTEND;VALUE=DATE:20110315 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032135Z +DTSTAMP:20100317T032135Z +UID:38ddb74d-f1e0-48d2-a5c7-9db4e6a6aff3 +SUMMARY:Taranaki Anniversary Day +DTSTART;VALUE=DATE:20120312 +DTEND;VALUE=DATE:20120313 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032158Z +DTSTAMP:20100317T032158Z +UID:a95f4db9-b381-48cc-a447-3b6b3efa03f3 +SUMMARY:Taranaki Anniversary Day +DTSTART;VALUE=DATE:20130311 +DTEND;VALUE=DATE:20130312 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032311Z +DTSTAMP:20100317T032311Z +UID:6fae8251-c5f9-4b88-b2bf-51e7b2ac7442 +SUMMARY:Hawkes' Bay Anniversary Day +DTSTART;VALUE=DATE:20101022 +DTEND;VALUE=DATE:20101023 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032333Z +DTSTAMP:20100317T032333Z +UID:985d179f-8900-4487-9a71-60825f9e3d6e +SUMMARY:Hawkes' Bay Anniversary Day +DTSTART;VALUE=DATE:20111021 +DTEND;VALUE=DATE:20111022 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032342Z +DTSTAMP:20100317T032342Z +UID:19a18064-9cec-4d17-bd30-29c660270856 +SUMMARY:Hawkes' Bay Anniversary Day +DTSTART;VALUE=DATE:20121019 +DTEND;VALUE=DATE:20121020 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032413Z +DTSTAMP:20100317T032413Z +UID:935a52ee-cd9d-4e0f-a59b-8a1a8ff7144e +SUMMARY:Hawkes' Bay Anniversary Day +DTSTART;VALUE=DATE:20131025 +DTEND;VALUE=DATE:20131026 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032500Z +DTSTAMP:20100317T032500Z +UID:b8c6ee2c-b625-4c91-9a51-e3820233c2db +SUMMARY:Wellington Anniversary Day +DTSTART;VALUE=DATE:20100125 +DTEND;VALUE=DATE:20100126 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032518Z +DTSTAMP:20100317T032518Z +UID:cbce4c03-6a1e-41fd-a8c8-ac557644bd6e +SUMMARY:Wellington Anniversary Day +DTSTART;VALUE=DATE:20110124 +DTEND;VALUE=DATE:20110125 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032531Z +DTSTAMP:20100317T032531Z +UID:6451ba40-1797-4b01-9450-183700223291 +SUMMARY:Wellington Anniversary Day +DTSTART;VALUE=DATE:20120123 +DTEND;VALUE=DATE:20120124 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032554Z +DTSTAMP:20100317T032554Z +UID:2cf61b9e-f910-4849-9f2f-e8107df37b4b +SUMMARY:Wellington Anniversary Day +DTSTART;VALUE=DATE:20130121 +DTEND;VALUE=DATE:20130122 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032658Z +DTSTAMP:20100317T032658Z +UID:1dd6fe0b-673b-45ec-807e-142645c7acff +SUMMARY:Marlborough Anniversary Day +DTSTART;VALUE=DATE:20101101 +DTEND;VALUE=DATE:20101102 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032728Z +DTSTAMP:20100317T032728Z +UID:937d11f5-7ed6-4bc3-adf7-1cd1e3eeb5c3 +SUMMARY:Marlborough Anniversary Day +DTSTART;VALUE=DATE:20111031 +DTEND;VALUE=DATE:20111101 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032742Z +DTSTAMP:20100317T032742Z +UID:823a1f88-ac0a-4df0-98d1-4759b1f2bc6d +SUMMARY:Marlborough Anniversary Day +DTSTART;VALUE=DATE:20121029 +DTEND;VALUE=DATE:20121030 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032819Z +DTSTAMP:20100317T032819Z +UID:bc3aa31d-93f0-4c8b-bc09-493b3b05bad0 +SUMMARY:Marlborough Anniversary Day +DTSTART;VALUE=DATE:20131104 +DTEND;VALUE=DATE:20131105 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032915Z +DTSTAMP:20100317T032915Z +UID:8cdd9a08-6cce-42aa-a57e-16c3ca384932 +SUMMARY:Nelson Anniversary Day +DTSTART;VALUE=DATE:20100201 +DTEND;VALUE=DATE:20100202 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T032934Z +DTSTAMP:20100317T032934Z +UID:4faec56a-d65e-4208-935a-c30720a62fba +SUMMARY:Nelson Anniversary Day +DTSTART;VALUE=DATE:20110131 +DTEND;VALUE=DATE:20110201 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033011Z +DTSTAMP:20100317T033011Z +UID:3ddcb4c8-6a49-4576-a453-e1184792a5b1 +SUMMARY:Nelson Anniversary Day +DTSTART;VALUE=DATE:20120130 +DTEND;VALUE=DATE:20120131 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033027Z +DTSTAMP:20100317T033027Z +UID:4f01d523-832c-493e-8bcd-07e7ce424608 +SUMMARY:Nelson Anniversary Day +DTSTART;VALUE=DATE:20130204 +DTEND;VALUE=DATE:20130205 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033310Z +DTSTAMP:20100317T033310Z +UID:6ad55dff-f82a-4d5b-acbc-239bee010336 +SUMMARY:Canterbury Anniversary Day +DTSTART;VALUE=DATE:20101112 +DTEND;VALUE=DATE:20101113 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033331Z +DTSTAMP:20100317T033331Z +UID:068bbcb7-0623-4b7a-912e-52b059041fc1 +SUMMARY:Canterbury Anniversary Day +DTSTART;VALUE=DATE:20111111 +DTEND;VALUE=DATE:20111112 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033340Z +DTSTAMP:20100317T033340Z +UID:7c8eecdf-20d9-4a10-ba1d-56da49e107de +SUMMARY:Canterbury Anniversary Day +DTSTART;VALUE=DATE:20121116 +DTEND;VALUE=DATE:20121117 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033348Z +DTSTAMP:20100317T033348Z +UID:496ef825-dd3f-4748-b881-055b05637837 +SUMMARY:Canterbury Anniversary Day +DTSTART;VALUE=DATE:20131115 +DTEND;VALUE=DATE:20131116 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033442Z +DTSTAMP:20100317T033442Z +UID:d09522b7-0668-4709-a0bd-619a3f270682 +SUMMARY:South Canterbury Anniversary Day +DTSTART;VALUE=DATE:20100927 +DTEND;VALUE=DATE:20100928 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033458Z +DTSTAMP:20100317T033458Z +UID:f624671d-f3a0-467e-a42e-f15e14f7cdc8 +SUMMARY:South Canterbury Anniversary Day +DTSTART;VALUE=DATE:20110926 +DTEND;VALUE=DATE:20110927 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033508Z +DTSTAMP:20100317T033508Z +UID:39dfbe0c-3cef-4711-8955-b558baf49716 +SUMMARY:South Canterbury Anniversary Day +DTSTART;VALUE=DATE:20120924 +DTEND;VALUE=DATE:20120925 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033526Z +DTSTAMP:20100317T033526Z +UID:71d4ae8c-2d17-42e6-8795-b5742e79c725 +SUMMARY:South Canterbury Anniversary Day +DTSTART;VALUE=DATE:20130923 +DTEND;VALUE=DATE:20130924 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033606Z +DTSTAMP:20100317T033606Z +UID:b887a217-0358-4759-bb7c-39bc5e14b78b +SUMMARY:Westland Anniversary Day +DTSTART;VALUE=DATE:20101129 +DTEND;VALUE=DATE:20101130 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033632Z +DTSTAMP:20100317T033632Z +UID:f5518312-e271-49cf-bb23-aada4a273b89 +SUMMARY:Westland Anniversary Day +DTSTART;VALUE=DATE:20111205 +DTEND;VALUE=DATE:20111206 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033641Z +DTSTAMP:20100317T033641Z +UID:d6dc3439-0fd5-45fb-8020-27e46b8b8429 +SUMMARY:Westland Anniversary Day +DTSTART;VALUE=DATE:20121203 +DTEND;VALUE=DATE:20121204 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033649Z +DTSTAMP:20100317T033649Z +UID:82f24145-0c2d-47e2-8b9f-e82dff66c840 +SUMMARY:Westland Anniversary Day +DTSTART;VALUE=DATE:20131202 +DTEND;VALUE=DATE:20131203 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T033727Z +DTSTAMP:20100317T033727Z +UID:1f92352a-e2a6-4e81-959e-e3aae80d611f +SUMMARY:Otago Anniversary Day +DTSTART;VALUE=DATE:20100322 +DTEND;VALUE=DATE:20100323 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T034150Z +DTSTAMP:20100317T034150Z +UID:6e680c98-109f-4fd9-a893-02a98ec6f445 +SUMMARY:Otago Anniversary Day +DTSTART;VALUE=DATE:20110321 +DTEND;VALUE=DATE:20110322 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T034459Z +DTSTAMP:20100317T034459Z +UID:d4b171bd-e707-48c7-b99f-39bd73f014c6 +SUMMARY:Otago Anniversary Day +DTSTART;VALUE=DATE:20120326 +DTEND;VALUE=DATE:20120327 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T034511Z +DTSTAMP:20100317T034511Z +UID:9d8015df-a725-45e5-a461-44553b0952ce +SUMMARY:Otago Anniversary Day +DTSTART;VALUE=DATE:20130325 +DTEND;VALUE=DATE:20130326 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T034555Z +DTSTAMP:20100317T034555Z +UID:64a9ce80-7a4f-4682-a75a-1ba20e991381 +SUMMARY:Southland Anniversary Day +DTSTART;VALUE=DATE:20100118 +DTEND;VALUE=DATE:20100119 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T034608Z +DTSTAMP:20100317T034608Z +UID:466893f7-028c-4e99-aabe-bc21e5c5bf0c +SUMMARY:Southland Anniversary Day +DTSTART;VALUE=DATE:20110117 +DTEND;VALUE=DATE:20110118 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T034624Z +DTSTAMP:20100317T034624Z +UID:c5a34c85-3fdb-44a9-a66a-8207262095e4 +SUMMARY:Southland Anniversary Day +DTSTART;VALUE=DATE:20120116 +DTEND;VALUE=DATE:20120117 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T034639Z +DTSTAMP:20100317T034639Z +UID:a6ccc638-3eee-4d48-b3bb-acf4000ae156 +SUMMARY:Southland Anniversary Day +DTSTART;VALUE=DATE:20130121 +DTEND;VALUE=DATE:20130122 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T034731Z +DTSTAMP:20100317T034731Z +UID:1d24d13c-7e26-43a5-b2cf-b6aef2b4f802 +SUMMARY:Chatham Islands Anniversary Day +DTSTART;VALUE=DATE:20101129 +DTEND;VALUE=DATE:20101130 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:10 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T034807Z +DTSTAMP:20100317T034807Z +UID:b76a1c38-7513-4f73-aee1-f0d022967c99 +SUMMARY:Chatham Islands Anniversary Day +DTSTART;VALUE=DATE:20111128 +DTEND;VALUE=DATE:20111129 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:10 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T034822Z +DTSTAMP:20100317T034822Z +UID:5a89cec5-495c-4e3f-820d-fcbc15093e3f +SUMMARY:Chatham Islands Anniversary Day +DTSTART;VALUE=DATE:20121203 +DTEND;VALUE=DATE:20121204 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:10 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T032007Z +LAST-MODIFIED:20100317T034833Z +DTSTAMP:20100317T034833Z +UID:5203c263-62da-4e5c-a108-66362191114e +SUMMARY:Chatham Islands Anniversary Day +DTSTART;VALUE=DATE:20131202 +DTEND;VALUE=DATE:20131203 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +X-MOZ-GENERATION:10 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T023845Z +LAST-MODIFIED:20100317T024244Z +DTSTAMP:20100317T024244Z +UID:6c193cf3-989a-4ac5-993f-b7a1674aa821 +SUMMARY:New Year's Day +RRULE:FREQ=YEARLY;COUNT=4;BYMONTHDAY=1;BYMONTH=1 +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html\n\nObserved on the actual day when it falls on a weekday. When i + t falls on a Saturday/Sunday:\n\n * If the employee would normally have + worked on the Saturday/Sunday\, the public holiday is observed on the Sat + urday/Sunday\n\n * If the employee would not normally have worked on th + e Saturday/Sunday\, the public holiday is observed on the following Monday + /Tuesday\n +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T024417Z +LAST-MODIFIED:20100317T024558Z +DTSTAMP:20100317T024558Z +UID:675acaf9-1205-4ad2-b0d9-ca04e0cdb0dc +SUMMARY:Day after New Year's Day +RRULE:FREQ=YEARLY;COUNT=4;BYMONTHDAY=2;BYMONTH=1 +DTSTART;VALUE=DATE:20100102 +DTEND;VALUE=DATE:20100103 +TRANSP:TRANSPARENT +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html\n\nObserved on the actual day when it falls on a weekday. When i + t falls on a Saturday/Sunday:\n\n * If the employee would normally have + worked on the Saturday/Sunday\, the public holiday is observed on the Sat + urday/Sunday\n\n * If the employee would not normally have worked on th + e Saturday/Sunday\, the public holiday is observed on the following Monday + /Tuesday\n +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T024708Z +LAST-MODIFIED:20100317T024758Z +DTSTAMP:20100317T024758Z +UID:76b9dc85-8091-4578-9b98-d63ec0f9394b +SUMMARY:Christmas Day +RRULE:FREQ=YEARLY;COUNT=4;BYMONTHDAY=25;BYMONTH=12 +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html\n\nObserved on the actual day when it falls on a weekday. When i + t falls on a Saturday/Sunday:\n\n * If the employee would normally have + worked on the Saturday/Sunday\, the public holiday is observed on the Sat + urday/Sunday\n\n * If the employee would not normally have worked on th + e Saturday/Sunday\, the public holiday is observed on the following Monday + /Tuesday\n +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T024924Z +LAST-MODIFIED:20100317T025003Z +DTSTAMP:20100317T025003Z +UID:2337b671-be7e-4259-a9e9-0b13bb54fd1a +SUMMARY:Boxing Day +RRULE:FREQ=YEARLY;COUNT=4;BYMONTHDAY=26;BYMONTH=12 +DTSTART;VALUE=DATE:20101226 +DTEND;VALUE=DATE:20101227 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html\n\nObserved on the actual day when it falls on a weekday. When i + t falls on a Saturday/Sunday:\n\n * If the employee would normally have + worked on the Saturday/Sunday\, the public holiday is observed on the Sat + urday/Sunday\n\n * If the employee would not normally have worked on th + e Saturday/Sunday\, the public holiday is observed on the following Monday + /Tuesday\n +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T025129Z +LAST-MODIFIED:20100317T025310Z +DTSTAMP:20100317T025310Z +UID:bcca699a-ea9b-4546-80f3-eb73a5a7fd01 +SUMMARY:Waitangi Day +RRULE:FREQ=YEARLY;COUNT=4;BYMONTHDAY=6;BYMONTH=2 +DTSTART;VALUE=DATE:20100206 +DTEND;VALUE=DATE:20100207 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T030718Z +LAST-MODIFIED:20100317T030841Z +DTSTAMP:20100317T030841Z +UID:54a0a699-1e92-4650-834c-fcfdb993aee0 +SUMMARY:Queen's Birthday +RRULE:FREQ=YEARLY;COUNT=4;BYDAY=1MO;BYMONTH=6 +DTSTART;VALUE=DATE:20100607 +DTEND;VALUE=DATE:20100608 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T030546Z +LAST-MODIFIED:20100317T030905Z +DTSTAMP:20100317T030905Z +UID:f50bd0ec-00c0-45b3-9d65-01909013fffc +SUMMARY:Anzac Day +RRULE:FREQ=YEARLY;COUNT=4;BYMONTHDAY=25;BYMONTH=4 +DTSTART;VALUE=DATE:20100425 +DTEND;VALUE=DATE:20100426 +TRANSP:TRANSPARENT +DESCRIPTION:http://www.ers.dol.govt.nz/holidays_act_2003/dates/2010_13.htm + l +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100317T031046Z +LAST-MODIFIED:20100317T031135Z +DTSTAMP:20100317T031135Z +UID:a8ceeea2-3b8c-47e7-b941-20d541dbc077 +SUMMARY:Labour Day +RRULE:FREQ=YEARLY;COUNT=4;BYDAY=4MO;BYMONTH=10 +DTSTART;VALUE=DATE:20101025 +DTEND;VALUE=DATE:20101026 +DESCRIPTION:Source: http://www.ers.dol.govt.nz/holidays_act_2003/dates/201 + 0_13.html +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/NorwegianHolidays.ics b/media/caldata/NorwegianHolidays.ics new file mode 100644 index 00000000000..45aa8caa749 --- /dev/null +++ b/media/caldata/NorwegianHolidays.ics @@ -0,0 +1,531 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20090121T203828Z +LAST-MODIFIED:20090121T203852Z +DTSTAMP:20090121T203828Z +UID:fac20abc-0269-4516-b1f9-2d30e1dfd1b4 +SUMMARY:Palmesøndag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20090405 +DTEND;VALUE=DATE:20090406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T203828Z +LAST-MODIFIED:20090121T203911Z +DTSTAMP:20090121T203857Z +UID:9eadf86b-93ea-42ae-b182-dd5f9718c490 +SUMMARY:Palmesøndag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20100328 +DTEND;VALUE=DATE:20100329 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T203828Z +LAST-MODIFIED:20090121T203938Z +DTSTAMP:20090121T203857Z +UID:038f0636-7211-4d2e-97e5-98c085eed1c5 +SUMMARY:Palmesøndag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20110417 +DTEND;VALUE=DATE:20110418 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T203828Z +LAST-MODIFIED:20090121T203955Z +DTSTAMP:20090121T203857Z +UID:bbc40b75-60f4-46c8-8da3-685ba08d214d +SUMMARY:Palmesøndag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20120401 +DTEND;VALUE=DATE:20120402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T203828Z +LAST-MODIFIED:20090121T204010Z +DTSTAMP:20090121T203857Z +UID:15b6de68-e599-4a09-8031-6584b80141a9 +SUMMARY:Palmesøndag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20130324 +DTEND;VALUE=DATE:20130325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204053Z +LAST-MODIFIED:20090121T204107Z +DTSTAMP:20090121T204053Z +UID:2123da7e-f7e0-40bf-8787-442452457c77 +SUMMARY:Skjærtorsdag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20130328 +DTEND;VALUE=DATE:20130329 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204053Z +LAST-MODIFIED:20090121T204216Z +DTSTAMP:20090121T204137Z +UID:d0463c31-a01f-4298-80f0-cc4d5864c4ea +SUMMARY:Skjærtorsdag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20120405 +DTEND;VALUE=DATE:20120406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204053Z +LAST-MODIFIED:20090121T204234Z +DTSTAMP:20090121T204137Z +UID:89965f67-0aa0-47bb-9c00-d2d6796d5813 +SUMMARY:Skjærtorsdag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20110421 +DTEND;VALUE=DATE:20110422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204053Z +LAST-MODIFIED:20090121T204302Z +DTSTAMP:20090121T204137Z +UID:e09389ea-eecc-4c9c-aba5-61f0e09ec515 +SUMMARY:Skjærtorsdag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20100401 +DTEND;VALUE=DATE:20100402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204053Z +LAST-MODIFIED:20090121T204312Z +DTSTAMP:20090121T204137Z +UID:cb119db8-5928-46f5-b354-7a3d708a49d6 +SUMMARY:Skjærtorsdag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20090409 +DTEND;VALUE=DATE:20090410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T204344Z +DTSTAMP:20090121T204317Z +UID:29c1c469-5b28-4ea1-915f-db347da29811 +SUMMARY:Langfredag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T204401Z +DTSTAMP:20090121T204348Z +UID:e76d9135-5a66-413a-b6d6-6fff46428fb8 +SUMMARY:Påskedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T204552Z +DTSTAMP:20090121T204539Z +UID:34c3155e-c924-4fe9-89be-c578ad5cd344 +SUMMARY:2. påskedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T204828Z +DTSTAMP:20090121T204539Z +UID:0b2ab96f-9672-4a78-ba58-c9b3c9370f26 +SUMMARY:Kristi himmelfartsdag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20090521 +DTEND;VALUE=DATE:20090522 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T204847Z +DTSTAMP:20090121T204539Z +UID:38255f9c-39f1-4931-a415-1a6091baedfb +SUMMARY:Pinsedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20090531 +DTEND;VALUE=DATE:20090601 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T204941Z +DTSTAMP:20090121T204539Z +UID:2d6e313b-131a-4233-ad6c-ba12423473c4 +SUMMARY:2. pinsedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20090601 +DTEND;VALUE=DATE:20090602 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205041Z +DTSTAMP:20090121T205010Z +UID:7dc67b67-e165-46f2-ae9b-2db4ea1ff434 +SUMMARY:Langfredag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205041Z +DTSTAMP:20090121T205010Z +UID:518f9a5f-ba9b-40b2-8351-217eecc86e9c +SUMMARY:Påskedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205041Z +DTSTAMP:20090121T205010Z +UID:4cdfdc86-fe63-4bed-b138-fd229d847cda +SUMMARY:2. påskedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205041Z +DTSTAMP:20090121T205010Z +UID:235a3dd4-5c61-4826-9fc1-194c5b5e7fc3 +SUMMARY:Kristi himmelfartsdag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205041Z +DTSTAMP:20090121T205010Z +UID:2facbe9b-d99c-4de7-b7c1-c60bf1b52542 +SUMMARY:Pinsedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205041Z +DTSTAMP:20090121T205010Z +UID:8ce75385-d274-4872-906c-411f4e3bde63 +SUMMARY:2. pinsedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20100524 +DTEND;VALUE=DATE:20100525 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205147Z +DTSTAMP:20090121T205010Z +UID:d3d68dae-c58e-42ef-8920-76673fd0e43d +SUMMARY:Langfredag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205147Z +DTSTAMP:20090121T205010Z +UID:ed1e1483-bb5d-4d10-ac73-27a70ed4224f +SUMMARY:Påskedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205147Z +DTSTAMP:20090121T205010Z +UID:910e75b0-40e8-4b3d-8dc1-523b0410e84b +SUMMARY:2. påskedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205147Z +DTSTAMP:20090121T205010Z +UID:b54d0010-f685-47dc-b04d-0b1a76d831e1 +SUMMARY:Kristi himmelfartsdag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205147Z +DTSTAMP:20090121T205010Z +UID:8609ea98-7ed8-4d96-8f75-b23ad4e3980c +SUMMARY:Pinsedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205147Z +DTSTAMP:20090121T205010Z +UID:6c538a56-a2ce-4e92-80ec-e762e180dd66 +SUMMARY:2. pinsedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205221Z +DTSTAMP:20090121T205010Z +UID:37a41df8-310b-40d3-bb8a-2c6423f393b4 +SUMMARY:Langfredag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205222Z +DTSTAMP:20090121T205010Z +UID:1bbd1ef1-3811-4cec-8ac4-dfb8a63d9c0f +SUMMARY:Påskedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205222Z +DTSTAMP:20090121T205010Z +UID:97922178-595c-412b-9664-6e9c5b3c12d1 +SUMMARY:2. påskedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205222Z +DTSTAMP:20090121T205010Z +UID:d33aae74-a45d-4b68-8b9f-ff1038cc40c3 +SUMMARY:Kristi himmelfartsdag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205222Z +DTSTAMP:20090121T205010Z +UID:ac838e70-7b7a-4596-82d8-794f4b7a8cce +SUMMARY:Pinsedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20120527 +DTEND;VALUE=DATE:20120528 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205222Z +DTSTAMP:20090121T205010Z +UID:bb2da19b-1008-4c7a-be31-27b093825fc5 +SUMMARY:2. pinsedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20120528 +DTEND;VALUE=DATE:20120529 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205252Z +DTSTAMP:20090121T205010Z +UID:2e737900-8d24-4f80-9b7a-45b25f4b3d13 +SUMMARY:Langfredag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205252Z +DTSTAMP:20090121T205010Z +UID:5f7d8c40-b0c4-4641-87c0-db58da0963a1 +SUMMARY:Påskedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205252Z +DTSTAMP:20090121T205010Z +UID:1a93add4-e096-4600-b615-a45bda7139da +SUMMARY:2. påskedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205252Z +DTSTAMP:20090121T205010Z +UID:ae60e5b6-cd1f-45f4-b9b7-eb16c4c328cf +SUMMARY:Kristi himmelfartsdag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205252Z +DTSTAMP:20090121T205010Z +UID:7a2ffb91-89a9-477d-8086-a1293195a041 +SUMMARY:Pinsedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T204317Z +LAST-MODIFIED:20090121T205252Z +DTSTAMP:20090121T205010Z +UID:c35cb955-d090-44bc-b2d2-f05c4932faed +SUMMARY:2. pinsedag +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20130520 +DTEND;VALUE=DATE:20130521 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T200526Z +LAST-MODIFIED:20090121T200728Z +DTSTAMP:20090121T200526Z +UID:b53305e6-eaad-4db6-98f3-1f5816949afa +SUMMARY:Nyttårsdag +RRULE:FREQ=YEARLY;COUNT=5;INTERVAL=1;BYMONTHDAY=1;BYMONTH=1 +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T200616Z +LAST-MODIFIED:20090121T200758Z +DTSTAMP:20090121T200616Z +UID:fc1ba45e-cd99-46af-ae14-a274efb925c5 +SUMMARY:Offentlig høytidsdag +RRULE:FREQ=YEARLY;COUNT=5;INTERVAL=1;BYMONTHDAY=1;BYMONTH=5 +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T200848Z +LAST-MODIFIED:20090121T200917Z +DTSTAMP:20090121T200848Z +UID:4d78cb0e-415e-44c1-97bd-a1676200b6b0 +SUMMARY:Grunnlovsdag +RRULE:FREQ=YEARLY;COUNT=5;INTERVAL=1;BYMONTHDAY=17;BYMONTH=5 +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20090517 +DTEND;VALUE=DATE:20090518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T201200Z +LAST-MODIFIED:20090121T201224Z +DTSTAMP:20090121T201200Z +UID:6824736f-7b8e-4f8b-8af9-284935a70fd5 +SUMMARY:Juledag +RRULE:FREQ=YEARLY;COUNT=5;INTERVAL=1;BYMONTHDAY=25;BYMONTH=12 +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090121T201235Z +LAST-MODIFIED:20090121T201303Z +DTSTAMP:20090121T201235Z +UID:a485265c-341a-433d-aee7-75cf9e437d72 +SUMMARY:2. juledag +RRULE:FREQ=YEARLY;COUNT=5;INTERVAL=1;BYMONTHDAY=26;BYMONTH=12 +CATEGORIES:Helligdager +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/PakistanHolidays.ics b/media/caldata/PakistanHolidays.ics new file mode 100644 index 00000000000..8584e083087 --- /dev/null +++ b/media/caldata/PakistanHolidays.ics @@ -0,0 +1,134 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +BEGIN:VTIMEZONE +TZID:/mozilla.org/20070129_1/Europe/Berlin +X-LIC-LOCATION:Europe/Berlin +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20070920T105626Z +LAST-MODIFIED:20070920T105748Z +DTSTAMP:20070920T120237Z +UID:168d52c0-e697-4470-9750-f7b62cd8f09c +SUMMARY:یوم کاریگر +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080501 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080502 +DESCRIPTION:Labor day in Pakistan +END:VEVENT +BEGIN:VEVENT +CREATED:20070920T105925Z +LAST-MODIFIED:20070920T110034Z +DTSTAMP:20070920T120237Z +UID:b2c80250-3838-4486-b7b2-7caf04e13844 +SUMMARY:یوم آذادی +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080814 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080815 +DESCRIPTION:Commemorates Pakistan's independence from the United Kingdom + on August 14th\, 1947 +END:VEVENT +BEGIN:VEVENT +CREATED:20070920T110126Z +LAST-MODIFIED:20070920T110258Z +DTSTAMP:20070920T120237Z +UID:0841b6f9-592a-49a9-aedd-227784d94a18 +SUMMARY:یوم دفاع +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080906 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080907 +DESCRIPTION:Pakistan Defense Day +END:VEVENT +BEGIN:VEVENT +CREATED:20070920T110349Z +LAST-MODIFIED:20070920T110619Z +DTSTAMP:20070920T120237Z +UID:9ae7a408-5dd2-4312-a0d4-cc2a31e31f00 +SUMMARY:یوم وفات قائد اعظم +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080911 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080912 +DESCRIPTION:Death of Quaid-e-Azam Muhammad Ali Jinnah. +END:VEVENT +BEGIN:VEVENT +CREATED:20070920T110635Z +LAST-MODIFIED:20070920T110713Z +DTSTAMP:20070920T120237Z +UID:3ced098d-f2bf-4e03-bf7f-4e4c8aff1d44 +SUMMARY:یوم ولادت محمد اقبال +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20081109 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20081110 +DESCRIPTION:Birthday of national poet Muhammad Iqbal +END:VEVENT +BEGIN:VEVENT +CREATED:20070920T110729Z +LAST-MODIFIED:20070920T111012Z +DTSTAMP:20070920T120237Z +UID:f1734034-058f-437b-9a91-1e68f421c086 +SUMMARY: یوم ولادت قائداعظم، عيد الميلاد + المسيح +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20081225 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20081226 +DESCRIPTION:Birthday of Quaid-e-Azam Muhammad Ali Jinnah\nChristmas +END:VEVENT +BEGIN:VEVENT +CREATED:20070920T105106Z +LAST-MODIFIED:20070920T111323Z +DTSTAMP:20070920T120237Z +UID:a3f668f9-567c-4c6d-84d6-bc13049aa857 +SUMMARY:یوم پاکستان +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080323 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080324 +DESCRIPTION:Commemorates Pakistan Resolution on March 23\, 1940 in Lahore +END:VEVENT +BEGIN:VEVENT +CREATED:20070920T112627Z +LAST-MODIFIED:20070920T112858Z +DTSTAMP:20070920T120237Z +UID:57c5ccf2-e9b2-4e69-84cc-00dee4facbfe +SUMMARY:یوم وفات محمد اقبال +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080421 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080422 +DESCRIPTION:Anniversary of the Death of national poet Muhammad Iqbal +END:VEVENT +BEGIN:VEVENT +CREATED:20070920T111439Z +LAST-MODIFIED:20070920T120232Z +DTSTAMP:20070920T120237Z +UID:c59717c1-ac2f-4ff3-a066-900804b2388a +SUMMARY:یوم تکبیر +CLASS:PUBLIC +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080528 +DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Berlin:20080529 +DESCRIPTION:On 28th of May 1998\, Pakistan claimed to be a nuclear state + by detonating nuclear explosions in retaliation for similar nuclear tests + by India. +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/PeruHolidays.ics b/media/caldata/PeruHolidays.ics new file mode 100644 index 00000000000..a3b852b3256 --- /dev/null +++ b/media/caldata/PeruHolidays.ics @@ -0,0 +1,604 @@ +BEGIN:VCALENDAR +PRODID:-//Google Inc//Google Calendar 70.9054//EN +VERSION:2.0 +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:Peruvian holidays +X-WR-TIMEZONE:America/Lima +X-WR-CALDESC: +BEGIN:VTIMEZONE +TZID:America/Lima +X-LIC-LOCATION:America/Lima +BEGIN:STANDARD +TZOFFSETFROM:-0500 +TZOFFSETTO:-0500 +TZNAME:PET +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090409 +DTEND;VALUE=DATE:20090410 +DTSTAMP:20090114T052140Z +UID:rup1qo19g1ts966ni6k1ec6884@google.com +CLASS:PRIVATE +CREATED:20090114T044939Z +DESCRIPTION: +LAST-MODIFIED:20090114T044939Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Jueves Santo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120617 +DTEND;VALUE=DATE:20120618 +DTSTAMP:20090114T052140Z +UID:ebl0p8eumpvfem80dhivqkvp2c@google.com +CLASS:PRIVATE +CREATED:20090114T052000Z +DESCRIPTION: +LAST-MODIFIED:20090114T052000Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Día del padre +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080615 +DTEND;VALUE=DATE:20080616 +DTSTAMP:20090114T052140Z +UID:vstt3kbjkrff5n8n2i0knhulqc@google.com +CLASS:PRIVATE +CREATED:20090114T051656Z +DESCRIPTION: +LAST-MODIFIED:20090114T051656Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Día del padre +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080320 +DTEND;VALUE=DATE:20080321 +DTSTAMP:20090114T052140Z +UID:eg92s6kfh3uql9q0g9avr81sqs@google.com +CLASS:PRIVATE +CREATED:20090114T051623Z +DESCRIPTION: +LAST-MODIFIED:20090114T051623Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Jueves Santo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +DTSTAMP:20090114T052140Z +UID:2t93jflgkpt5l9i2vma7om92j4@google.com +CLASS:PRIVATE +CREATED:20090114T051013Z +DESCRIPTION: +LAST-MODIFIED:20090114T051013Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Viernes Santo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110508 +DTEND;VALUE=DATE:20110509 +DTSTAMP:20090114T052140Z +UID:roit8lpuemoh2rr9spr2apmg9c@google.com +CLASS:PRIVATE +CREATED:20090114T051821Z +DESCRIPTION: +LAST-MODIFIED:20090114T051821Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Día de la madre +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130328 +DTEND;VALUE=DATE:20130329 +DTSTAMP:20090114T052140Z +UID:1beaiq9rgnv5g9rrjfg23q05gk@google.com +CLASS:PRIVATE +CREATED:20090114T052113Z +DESCRIPTION: +LAST-MODIFIED:20090114T052113Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Jueves Santo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100620 +DTEND;VALUE=DATE:20100621 +DTSTAMP:20090114T052140Z +UID:a7pfivop3lpijfsn3elfmh64ic@google.com +CLASS:PRIVATE +CREATED:20090114T051110Z +DESCRIPTION: +LAST-MODIFIED:20090114T051110Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Día del padre +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090510 +DTEND;VALUE=DATE:20090511 +DTSTAMP:20090114T052140Z +UID:hdk1a5gfog37ok4n3anr9dl3c8@google.com +CLASS:PRIVATE +CREATED:20090114T045233Z +DESCRIPTION: +LAST-MODIFIED:20090114T045233Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Día de la madre +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120405 +DTEND;VALUE=DATE:20120406 +DTSTAMP:20090114T052140Z +UID:9cfh6hc056fpdb6mrimdvsdeko@google.com +CLASS:PRIVATE +CREATED:20090114T051922Z +DESCRIPTION: +LAST-MODIFIED:20090114T051922Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Jueves Santo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090621 +DTEND;VALUE=DATE:20090622 +DTSTAMP:20090114T052140Z +UID:1rm072vjnn0bu2ehldvg5o3sps@google.com +CLASS:PRIVATE +CREATED:20090114T045410Z +DESCRIPTION: +LAST-MODIFIED:20090114T045410Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Día del padre +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +DTSTAMP:20090114T052140Z +UID:b8gol9ec0g6d1t5mvu1o7r5edg@google.com +CLASS:PRIVATE +CREATED:20090114T051812Z +DESCRIPTION: +LAST-MODIFIED:20090114T051812Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Viernes Santo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110421 +DTEND;VALUE=DATE:20110422 +DTSTAMP:20090114T052140Z +UID:h43i29lpbe2rnv6ruue7v0gd40@google.com +CLASS:PRIVATE +CREATED:20090114T051812Z +DESCRIPTION: +LAST-MODIFIED:20090114T051812Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Jueves Santo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100401 +DTEND;VALUE=DATE:20100402 +DTSTAMP:20090114T052140Z +UID:6rsk4j3qhn9dqs8u87aj5bp0jc@google.com +CLASS:PRIVATE +CREATED:20090114T051006Z +DESCRIPTION: +LAST-MODIFIED:20090114T051006Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Jueves Santo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080511 +DTEND;VALUE=DATE:20080512 +DTSTAMP:20090114T052140Z +UID:36pdeojb2cnn0t8t2onkfc7ggs@google.com +CLASS:PRIVATE +CREATED:20090114T051648Z +DESCRIPTION: +LAST-MODIFIED:20090114T051648Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Día de la madre +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +DTSTAMP:20090114T052140Z +UID:k3kbqdsarrd2vgs8ka6fr87274@google.com +CLASS:PRIVATE +CREATED:20090114T052119Z +DESCRIPTION: +LAST-MODIFIED:20090114T052119Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Viernes Santo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110619 +DTEND;VALUE=DATE:20110620 +DTSTAMP:20090114T052140Z +UID:4obqn1gig815m9mjb2hfnvtusc@google.com +CLASS:PRIVATE +CREATED:20090114T051832Z +DESCRIPTION: +LAST-MODIFIED:20090114T051832Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Día del padre +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +DTSTAMP:20090114T052140Z +UID:k01qahd4kffvld8tcmk0dpvcac@google.com +CLASS:PRIVATE +CREATED:20090114T051927Z +DESCRIPTION: +LAST-MODIFIED:20090114T051927Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Viernes Santo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130616 +DTEND;VALUE=DATE:20130617 +DTSTAMP:20090114T052140Z +UID:34j9ntk9mokc4fnrjihmneuo2g@google.com +CLASS:PRIVATE +CREATED:20090114T052113Z +DESCRIPTION: +LAST-MODIFIED:20090114T052113Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Día del padre +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100509 +DTEND;VALUE=DATE:20100510 +DTSTAMP:20090114T052140Z +UID:fnivv85r08s9novl3luckt00ro@google.com +CLASS:PRIVATE +CREATED:20090114T051058Z +DESCRIPTION: +LAST-MODIFIED:20090114T051058Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Día de la madre +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080321 +DTEND;VALUE=DATE:20080322 +DTSTAMP:20090114T052140Z +UID:8vou4u3u35r9mjcthno0bdkeic@google.com +CLASS:PRIVATE +CREATED:20090114T051629Z +DESCRIPTION: +LAST-MODIFIED:20090114T051629Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Viernes Santo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120513 +DTEND;VALUE=DATE:20120514 +DTSTAMP:20090114T052140Z +UID:98c2tu8q8nk9db19iefg2ar0r8@google.com +CLASS:PRIVATE +CREATED:20090114T051944Z +DESCRIPTION: +LAST-MODIFIED:20090114T051944Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Día de la madre +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +DTSTAMP:20090114T052140Z +UID:al3rb08r0mefr7an0luh2i6se0@google.com +CLASS:PRIVATE +CREATED:20090114T044956Z +DESCRIPTION: +LAST-MODIFIED:20090114T044956Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Viernes Santo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20081031 +DTEND;VALUE=DATE:20081101 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:b0bg1q62a5ldkrs8d6edb4eu0c@google.com +CLASS:PRIVATE +CREATED:20090114T050305Z +DESCRIPTION: +LAST-MODIFIED:20090114T051444Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Día de la canción criolla +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080728 +DTEND;VALUE=DATE:20080729 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:n21vj67h791kjekik0npamgd0g@google.com +CLASS:PRIVATE +CREATED:20090114T045512Z +DESCRIPTION: +LAST-MODIFIED:20090114T051351Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Independencia del Perú +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080729 +DTEND;VALUE=DATE:20080730 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:9jl0m10ebf9gr3jiv28u700nmo@google.com +CLASS:PRIVATE +CREATED:20090114T045629Z +DESCRIPTION: +LAST-MODIFIED:20090114T051359Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Día de las Fuerzas Armadas y Policía Nacional +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080806 +DTEND;VALUE=DATE:20080807 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:ngfr66hkshiu7fq3hviteaommk@google.com +CLASS:PRIVATE +CREATED:20090114T045702Z +DESCRIPTION: +LAST-MODIFIED:20090114T051412Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Batalla de Junín +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080101 +DTEND;VALUE=DATE:20080102 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:tnm8jgafohajebpkhb7vdgae38@google.com +CLASS:PRIVATE +CREATED:20090114T044015Z +DESCRIPTION: +LAST-MODIFIED:20090114T051244Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Año nuevo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080501 +DTEND;VALUE=DATE:20080502 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:cvbqnjq8u3gm8dac6pim2k4bo8@google.com +CLASS:PRIVATE +CREATED:20090114T045142Z +DESCRIPTION: +LAST-MODIFIED:20090114T051311Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Día del trabajo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080827 +DTEND;VALUE=DATE:20080828 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:ve3irj0igve880vd64o008cdpo@google.com +CLASS:PRIVATE +CREATED:20090114T045742Z +DESCRIPTION: +LAST-MODIFIED:20090114T051419Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Día de la reincorporación de Tacna al Perú +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20081225 +DTEND;VALUE=DATE:20081226 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:e7t7hca2geq0i65jis6d2eommg@google.com +CLASS:PRIVATE +CREATED:20090114T050420Z +DESCRIPTION: +LAST-MODIFIED:20090114T051511Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Navidad +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080624 +DTEND;VALUE=DATE:20080625 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:cve0lmpa35p6jfgilu2g6oikmg@google.com +CLASS:PRIVATE +CREATED:20090114T045426Z +DESCRIPTION: +LAST-MODIFIED:20090114T051339Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Día del campesino +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080502 +DTEND;VALUE=DATE:20080503 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:lnuf5hndi93ns6r8dur339hk8k@google.com +CLASS:PRIVATE +CREATED:20090114T045131Z +DESCRIPTION: +LAST-MODIFIED:20090114T051318Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Combate del Dos de Mayo +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080607 +DTEND;VALUE=DATE:20080608 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:7rdivk7hoka8rulnm9mfhrr51k@google.com +CLASS:PRIVATE +CREATED:20090114T045353Z +DESCRIPTION: +LAST-MODIFIED:20090114T051331Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Día de la bandera +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20080830 +DTEND;VALUE=DATE:20080831 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:fio8st7rt15gcolh5k39ervhq0@google.com +CLASS:PRIVATE +CREATED:20090114T045804Z +DESCRIPTION: +LAST-MODIFIED:20090114T051428Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Día de Santa Rosa de Lima +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20081208 +DTEND;VALUE=DATE:20081209 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:2nl4mdpq4eskuc61cdct03d46g@google.com +CLASS:PRIVATE +CREATED:20090114T050357Z +DESCRIPTION: +LAST-MODIFIED:20090114T051503Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Inmaculada concepción +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20081101 +DTEND;VALUE=DATE:20081102 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:5ilg72te07aq6i33rn2f5uftrc@google.com +CLASS:PRIVATE +CREATED:20090114T050329Z +DESCRIPTION: +LAST-MODIFIED:20090114T051450Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Día de todos los santos +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20081008 +DTEND;VALUE=DATE:20081009 +RRULE:FREQ=YEARLY;WKST=MO +DTSTAMP:20090114T052140Z +UID:ii83tdkhdnmdem7t8cp4labc9k@google.com +CLASS:PRIVATE +CREATED:20090114T045900Z +DESCRIPTION: +LAST-MODIFIED:20090114T051438Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Combate de Angamos +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/PolishHolidays.ics b/media/caldata/PolishHolidays.ics new file mode 100644 index 00000000000..80342f7e3e3 --- /dev/null +++ b/media/caldata/PolishHolidays.ics @@ -0,0 +1,833 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +X-WR-CALNAME:PolishHolidays +X-WR-TIMEZONE:Europe/Warsaw +BEGIN:VTIMEZONE +TZID:Europe/Warsaw +X-LIC-LOCATION:Europe/Warsaw +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20101218T145505Z +DTSTAMP:20101218T145505Z +UID:{582c7073-0929-4c40-a716-ea41d8f87253} +SUMMARY:Święto Pracy +PRIORITY:5 +RRULE:FREQ=YEARLY +CATEGORIES:Święto +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T223944Z +DTSTAMP:20091025T223944Z +UID:{7a63afcc-13df-48f9-8ba7-3657a212cf6d} +SUMMARY:Wniebowzięcia NMP / Święto Wojska Polskiego +PRIORITY:5 +RRULE:FREQ=YEARLY +CATEGORIES:Święto +DTSTART;VALUE=DATE:20090815 +DTEND;VALUE=DATE:20090816 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T223148Z +DTSTAMP:20091025T223148Z +UID:9f012bc8-eaf7-4eb6-a6f0-f2afe3950989 +SUMMARY:Boże Ciało +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20100603 +DTEND;VALUE=DATE:20100604 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20070317T123421Z +DTSTAMP:20070317T123421Z +UID:6cb3bcd1-fe3c-423d-8333-282d660e43ba +SUMMARY:Wielkanoc +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T202512Z +DTSTAMP:20091025T202512Z +UID:{5c88bdef-b7d8-4cf7-b918-900ce4a346a3} +SUMMARY:Wszystkich Świętych +PRIORITY:5 +RRULE:FREQ=YEARLY +CATEGORIES:Święto +DTSTART;VALUE=DATE:20091101 +DTEND;VALUE=DATE:20091102 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20070317T123421Z +DTSTAMP:20070317T123421Z +UID:b2a17d29-4cd9-429d-a2ea-6e62272be786 +SUMMARY:Boże Ciało +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20090611 +DTEND;VALUE=DATE:20090612 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20070317T123421Z +DTSTAMP:20070317T123421Z +UID:fae07949-5b1c-4ccc-88c3-df66afc553cc +SUMMARY:Wielkanoc +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T213142Z +DTSTAMP:20091025T213142Z +UID:{277dcc9c-5295-4d95-8a65-5cb978bf073a} +SUMMARY:Boże Narodzenie +PRIORITY:5 +RRULE:FREQ=YEARLY +CATEGORIES:Święto +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091227 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T225934Z +DTSTAMP:20091025T225934Z +UID:{28750805-c40a-4db2-b9f8-803ab4c30c16} +SUMMARY:Święto Narodowe Trzeciego Maja +PRIORITY:5 +RRULE:FREQ=YEARLY +CATEGORIES:Święto +DTSTART;VALUE=DATE:20090503 +DTEND;VALUE=DATE:20090504 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T202549Z +DTSTAMP:20091025T202549Z +UID:{9637e1da-f635-4bd4-a8ce-012fcf421fd2} +SUMMARY:Nowy rok +PRIORITY:5 +RRULE:FREQ=YEARLY +CATEGORIES:Święto +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:3 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20101218T143743Z +DTSTAMP:20101218T143743Z +UID:{c2ffd0df-b7fa-49b8-baea-b5bfb0b30a02} +SUMMARY:Narodowe Święto Niepodległości +PRIORITY:5 +RRULE:FREQ=YEARLY +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20091111 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20091112 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20101218T143908Z +DTSTAMP:20101218T143908Z +UID:{891776dc-6d0f-4fa4-89e6-e7d5a1f53053} +SUMMARY:Drugi dzień Bożego Narodzenia +PRIORITY:5 +RRULE:FREQ=YEARLY +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20091226 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20091227 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:2 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20101218T142726Z +DTSTAMP:20101218T142726Z +UID:e8f60900-19f6-4495-91ab-09ff43abc9a3 +SUMMARY:Poniedziałek Wielkanocny (Śmigus dyngus) +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20090413 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20090414 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:0 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20070317T123421Z +DTSTAMP:20070317T123421Z +UID:ab5d9e3f-15f9-4a30-a472-0ea5eea73886 +SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus) +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20100405 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20100406 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212247Z +DTSTAMP:20091025T212247Z +UID:0c81b2a1-26e9-4a53-969a-018ae7f22a53 +SUMMARY:Wielkanoc +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212305Z +DTSTAMP:20091025T212305Z +UID:ed478c52-76f7-43c1-b721-bdc3f4b6daac +SUMMARY:Wielkanoc +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212325Z +DTSTAMP:20091025T212325Z +UID:fe760937-23a9-4d9e-963e-a7563bb33ef2 +SUMMARY:Wielkanoc +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212342Z +DTSTAMP:20091025T212342Z +UID:357b775f-6264-4e24-b296-68724ad4f663 +SUMMARY:Wielkanoc +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212404Z +DTSTAMP:20091025T212404Z +UID:c15281d9-9db9-4636-949e-4bf347f8fadb +SUMMARY:Wielkanoc +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212420Z +DTSTAMP:20091025T212420Z +UID:900c5f1f-1ad9-41ca-bacb-25ad5844f06c +SUMMARY:Wielkanoc +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212435Z +DTSTAMP:20091025T212435Z +UID:0a42d9d1-d0e5-4460-aaaa-734004a9392f +SUMMARY:Wielkanoc +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212450Z +DTSTAMP:20091025T212450Z +UID:0fc4858b-f58d-4fa9-ab7a-95e71739f352 +SUMMARY:Wielkanoc +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20180401 +DTEND;VALUE=DATE:20180402 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212510Z +DTSTAMP:20091025T212510Z +UID:046a2f44-e53b-48bd-9a04-d61004e139e6 +SUMMARY:Wielkanoc +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20190421 +DTEND;VALUE=DATE:20190422 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212532Z +DTSTAMP:20091025T212532Z +UID:8cf02081-eb57-412a-901f-a9f1db4b3106 +SUMMARY:Wielkanoc +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20200412 +DTEND;VALUE=DATE:20200413 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212734Z +DTSTAMP:20091025T212734Z +UID:26bc3399-93c6-45c5-9572-d8ab99736fed +SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus) +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20110425 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20110426 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212746Z +DTSTAMP:20091025T212746Z +UID:a829e469-75eb-4430-be3a-28f426e1c0f0 +SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus) +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20120409 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20120410 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212801Z +DTSTAMP:20091025T212801Z +UID:b665aabb-f30a-4242-8bf7-9b63e138de82 +SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus) +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20130401 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20130402 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:3 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212827Z +DTSTAMP:20091025T212827Z +UID:1c0d4456-7216-47c1-9b86-da5b9255ff7b +SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus) +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20160328 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20160329 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:5 +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212840Z +DTSTAMP:20091025T212840Z +UID:a6b13708-ff2f-4d79-a507-74280673be16 +SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus) +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20150406 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20150407 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:4 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212855Z +DTSTAMP:20091025T212855Z +UID:7fd8b687-fd85-411c-bee3-1417df627f12 +SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus) +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20170417 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20170418 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:6 +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212918Z +DTSTAMP:20091025T212918Z +UID:1a83a638-a9cc-4512-85e3-12ff321b4a59 +SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus) +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20180402 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20180403 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:7 +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212932Z +DTSTAMP:20091025T212932Z +UID:39c19ab0-32a4-4614-a297-39bac5a39a5f +SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus) +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20190422 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20190423 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:8 +X-MOZ-GENERATION:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212945Z +DTSTAMP:20091025T212945Z +UID:d20e2984-edb7-4dad-99e0-e871eea71c62 +SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus) +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20200413 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20200414 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:9 +X-MOZ-GENERATION:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T212955Z +DTSTAMP:20091025T212955Z +UID:07efaf6a-83af-4944-a127-5017b83d7fa8 +SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus) +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE;TZID=Europe/Warsaw:20140421 +DTEND;VALUE=DATE;TZID=Europe/Warsaw:20140422 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:4 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T223251Z +DTSTAMP:20091025T223251Z +UID:681204c6-ff11-4ad0-9508-fe34f843cb7b +SUMMARY:Boże Ciało +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20110623 +DTEND;VALUE=DATE:20110624 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:3 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T223306Z +DTSTAMP:20091025T223306Z +UID:4f6b503d-955c-49d0-b106-3d939bb7ee15 +SUMMARY:Boże Ciało +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20120607 +DTEND;VALUE=DATE:20120608 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:4 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T223321Z +DTSTAMP:20091025T223321Z +UID:09e7fff5-3a1b-4952-b0c8-aeec471d0440 +SUMMARY:Boże Ciało +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20130530 +DTEND;VALUE=DATE:20130531 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:5 +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T223338Z +DTSTAMP:20091025T223338Z +UID:ec6314e5-e701-4999-a8f6-67cb63af6600 +SUMMARY:Boże Ciało +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20140619 +DTEND;VALUE=DATE:20140620 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:6 +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T223354Z +DTSTAMP:20091025T223354Z +UID:02461d29-b1a8-4f25-b155-3c8ffbae532d +SUMMARY:Boże Ciało +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20150604 +DTEND;VALUE=DATE:20150605 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:7 +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T223412Z +DTSTAMP:20091025T223412Z +UID:a2d30e5d-255c-472c-a2f2-f2d76f8e93c5 +SUMMARY:Boże Ciało +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20160526 +DTEND;VALUE=DATE:20160527 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:8 +X-MOZ-GENERATION:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T223427Z +DTSTAMP:20091025T223427Z +UID:6c617f79-61c2-4afb-aa5d-0eec34d1cb2a +SUMMARY:Boże Ciało +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20170615 +DTEND;VALUE=DATE:20170616 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:9 +X-MOZ-GENERATION:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T223444Z +DTSTAMP:20091025T223444Z +UID:b9b453fd-4e79-4dd4-99bc-ad932dbf0cb7 +SUMMARY:Boże Ciało +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20180531 +DTEND;VALUE=DATE:20180601 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:10 +X-MOZ-GENERATION:10 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T223507Z +DTSTAMP:20091025T223507Z +UID:d8336121-8496-4ab3-b140-42fe4def8613 +SUMMARY:Boże Ciało +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20190620 +DTEND;VALUE=DATE:20190621 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:11 +X-MOZ-GENERATION:11 +END:VEVENT +BEGIN:VEVENT +CREATED:20070317T123421Z +LAST-MODIFIED:20091025T223521Z +DTSTAMP:20091025T223521Z +UID:5fbbd989-059f-4bc0-ac82-c21cbfa52242 +SUMMARY:Boże Ciało +PRIORITY:5 +CATEGORIES:Święto +DTSTART;VALUE=DATE:20200611 +DTEND;VALUE=DATE:20200612 +CLASS:PUBLIC +TRANSP:OPAQUE +SEQUENCE:12 +X-MOZ-GENERATION:12 +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T142616Z +LAST-MODIFIED:20101218T143917Z +DTSTAMP:20101218T143917Z +UID:a0ae6a7f-93ce-47ee-b1cb-991c0ffee5bf +SUMMARY:Objawienie Pańskie (Trzech Króli) +RRULE:FREQ=YEARLY +CATEGORIES:Święto +DTSTART;VALUE=DATE:20110106 +DTEND;VALUE=DATE:20110107 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T144111Z +LAST-MODIFIED:20101218T144151Z +DTSTAMP:20101218T144151Z +UID:1f793466-bd33-426b-9ae1-88d4e58489ff +SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego) +CATEGORIES:Święto +DTSTART;VALUE=DATE:20090531 +DTEND;VALUE=DATE:20090601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T144158Z +LAST-MODIFIED:20101218T144239Z +DTSTAMP:20101218T144239Z +UID:d0632297-c754-4309-afb6-16ea6bf44fd6 +SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego) +CATEGORIES:Święto +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T144250Z +LAST-MODIFIED:20101218T144318Z +DTSTAMP:20101218T144318Z +UID:0085e0a0-c4c1-41c5-be87-6ef04adee831 +SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego) +CATEGORIES:Święto +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T144325Z +LAST-MODIFIED:20101218T144345Z +DTSTAMP:20101218T144345Z +UID:5df4716e-b400-4f3e-ae4e-68cc46039321 +SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego) +CATEGORIES:Święto +DTSTART;VALUE=DATE:20120527 +DTEND;VALUE=DATE:20120528 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T144355Z +LAST-MODIFIED:20101218T144418Z +DTSTAMP:20101218T144418Z +UID:1b5cf7ea-3330-4ab1-83ad-1f828ce31201 +SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego) +CATEGORIES:Święto +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T144428Z +LAST-MODIFIED:20101218T144447Z +DTSTAMP:20101218T144447Z +UID:83bbccc3-9bf1-464c-9b29-40c69b487d2a +SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego) +CATEGORIES:Święto +DTSTART;VALUE=DATE:20140608 +DTEND;VALUE=DATE:20140609 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T144453Z +LAST-MODIFIED:20101218T144512Z +DTSTAMP:20101218T144512Z +UID:ce8c26d6-d5e9-4277-a2bf-9b4c5873994d +SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego) +CATEGORIES:Święto +DTSTART;VALUE=DATE:20150524 +DTEND;VALUE=DATE:20150525 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T144523Z +LAST-MODIFIED:20101218T144547Z +DTSTAMP:20101218T144547Z +UID:1155795d-2567-470e-9e0d-fbc3c646b58c +SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego) +CATEGORIES:Święto +DTSTART;VALUE=DATE:20160515 +DTEND;VALUE=DATE:20160516 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T144558Z +LAST-MODIFIED:20101218T144619Z +DTSTAMP:20101218T144619Z +UID:d85e837e-b0fc-416e-8e3e-38cdef142ef8 +SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego) +CATEGORIES:Święto +DTSTART;VALUE=DATE:20170604 +DTEND;VALUE=DATE:20170605 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T144624Z +LAST-MODIFIED:20101218T144645Z +DTSTAMP:20101218T144645Z +UID:2ed33158-f0b8-44e2-92e1-481168a7d50e +SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego) +CATEGORIES:Święto +DTSTART;VALUE=DATE:20180520 +DTEND;VALUE=DATE:20180521 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T144729Z +LAST-MODIFIED:20101218T144751Z +DTSTAMP:20101218T144751Z +UID:e1b97ad6-4c46-473a-b18c-4ee32a7eb010 +SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego) +CATEGORIES:Święto +DTSTART;VALUE=DATE:20200531 +DTEND;VALUE=DATE:20200601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101218T145203Z +LAST-MODIFIED:20101218T145219Z +DTSTAMP:20101218T145219Z +UID:ac13f18f-a849-45e3-9a7d-d356a17699ff +SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego) +CATEGORIES:Święto +DTSTART;VALUE=DATE:20190609 +DTEND;VALUE=DATE:20190610 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/PortugalHolidays.ics b/media/caldata/PortugalHolidays.ics new file mode 100644 index 00000000000..986faefee9d --- /dev/null +++ b/media/caldata/PortugalHolidays.ics @@ -0,0 +1,1314 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20080523T165004Z +LAST-MODIFIED:20080523T165004Z +DTSTAMP:20080523T165004Z +UID:d0c7af02-7a6b-41e3-8421-cfd6895e1223 +SUMMARY:New Year +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20010101 +DTEND;VALUE=DATE:20010102 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165004Z +LAST-MODIFIED:20080523T165004Z +DTSTAMP:20080523T165004Z +UID:8b096e79-da0d-45f3-905d-80cdaddcb07c +SUMMARY:Liberty Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20010425 +DTEND;VALUE=DATE:20010426 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165004Z +LAST-MODIFIED:20080523T165004Z +DTSTAMP:20080523T165004Z +UID:26e3ea80-ba4b-4208-bd73-c07483cb87b5 +SUMMARY:Labour Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20010501 +DTEND;VALUE=DATE:20010502 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165004Z +LAST-MODIFIED:20080523T165004Z +DTSTAMP:20080523T165004Z +UID:0317f4ef-6bb6-49db-a8f7-36957676e05f +SUMMARY:Day of Portugal +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20010610 +DTEND;VALUE=DATE:20010611 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165004Z +LAST-MODIFIED:20080523T165004Z +DTSTAMP:20080523T165004Z +UID:66c355ac-f86b-4b62-9b88-bfab5da28dd9 +SUMMARY:Our Lady Assumption Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20010815 +DTEND;VALUE=DATE:20010816 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165004Z +LAST-MODIFIED:20080523T165004Z +DTSTAMP:20080523T165004Z +UID:0a1bf4e7-50f8-4d3f-b449-e0f792b7fc9c +SUMMARY:Republic Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20011005 +DTEND;VALUE=DATE:20011006 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165004Z +LAST-MODIFIED:20080523T165004Z +DTSTAMP:20080523T165004Z +UID:79b44222-18ac-47a6-9361-0f69c28c1038 +SUMMARY:Day of All Saints +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20011101 +DTEND;VALUE=DATE:20011102 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165004Z +LAST-MODIFIED:20080523T165004Z +DTSTAMP:20080523T165004Z +UID:e5ab7efe-c4ce-4bb1-a8a4-e63e46de2d74 +SUMMARY:Independence Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20011201 +DTEND;VALUE=DATE:20011202 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165004Z +LAST-MODIFIED:20080523T165004Z +DTSTAMP:20080523T165004Z +UID:44cf05dd-d95d-4759-be8e-d177e943189f +SUMMARY:Imaculate Conception Day +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20011208 +DTEND;VALUE=DATE:20011209 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165004Z +LAST-MODIFIED:20080523T165004Z +DTSTAMP:20080523T165004Z +UID:c6312a02-e749-42e4-855b-51af541b5fcd +SUMMARY:Christmas +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20011225 +DTEND;VALUE=DATE:20011226 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:ace257af-ce88-4d4a-871e-f528cd07a038 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20010227 +DTEND;VALUE=DATE:20010228 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:7c41c252-825f-43e5-b79c-5f899a54abb2 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20010413 +DTEND;VALUE=DATE:20010414 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:ec729ad5-ed16-4b2e-9aba-5e2a897676c9 +SUMMARY:Easter +DTSTART;VALUE=DATE:20010415 +DTEND;VALUE=DATE:20010416 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:5e822a6c-e911-46b5-b29a-555c1870133e +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20010614 +DTEND;VALUE=DATE:20010615 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:84e1d563-959a-4e9c-9219-6c541ef0f1b4 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20020212 +DTEND;VALUE=DATE:20020213 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:823d7957-d3c5-4938-bbf4-970f9b312857 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20020329 +DTEND;VALUE=DATE:20020330 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:f2f526a8-65aa-4ed9-80e1-4f70e6427574 +SUMMARY:Easter +DTSTART;VALUE=DATE:20020331 +DTEND;VALUE=DATE:20020401 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:8fdd6938-6a69-4b66-8e11-481e70b9da4d +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20020530 +DTEND;VALUE=DATE:20020531 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:a8875885-b822-47dc-aeeb-1356b96ad64c +SUMMARY:Carnival +DTSTART;VALUE=DATE:20030304 +DTEND;VALUE=DATE:20030305 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:3e9a1238-5dc3-43f4-8114-7a4829d7b3ad +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20030418 +DTEND;VALUE=DATE:20030419 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:62d19b60-4de9-41eb-b554-df1276639614 +SUMMARY:Easter +DTSTART;VALUE=DATE:20030420 +DTEND;VALUE=DATE:20030421 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:d72a8e01-67fe-4276-b7ec-ff9f2bde7aed +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20030619 +DTEND;VALUE=DATE:20030620 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:2dc94901-a56c-44c4-b577-7b40196c45ef +SUMMARY:Carnival +DTSTART;VALUE=DATE:20040224 +DTEND;VALUE=DATE:20040225 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:1a4e1164-0eb5-4f1c-9528-a6c392304f36 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20040409 +DTEND;VALUE=DATE:20040410 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:f6b41918-9d41-4050-aa34-f8491fe860e2 +SUMMARY:Easter +DTSTART;VALUE=DATE:20040411 +DTEND;VALUE=DATE:20040412 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:3725436a-1501-42d9-96bb-430f6bf95ef8 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20040610 +DTEND;VALUE=DATE:20040611 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:d648749d-843c-4c2f-8c76-e71e9180939a +SUMMARY:Carnival +DTSTART;VALUE=DATE:20050208 +DTEND;VALUE=DATE:20050209 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:2e56426e-dbf5-4270-af9d-9ea2a5dcfa01 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20050325 +DTEND;VALUE=DATE:20050326 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:134df438-511f-4830-9fa8-867db1bdf3d5 +SUMMARY:Easter +DTSTART;VALUE=DATE:20050327 +DTEND;VALUE=DATE:20050328 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:e94099aa-41b1-43e8-abda-a1df9138bf99 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20050526 +DTEND;VALUE=DATE:20050527 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:3b7986af-ffd2-4382-a097-8a641574df14 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20060228 +DTEND;VALUE=DATE:20060301 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:c4434c31-58fa-4e4f-9fb3-bf635c85bd65 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20060414 +DTEND;VALUE=DATE:20060415 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:8d436bc7-00d1-4d29-9717-ea2240916485 +SUMMARY:Easter +DTSTART;VALUE=DATE:20060416 +DTEND;VALUE=DATE:20060417 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:08e1dc7c-a7fd-4412-96a5-c9f91fe7ca53 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20060615 +DTEND;VALUE=DATE:20060616 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:9bcf3c2b-acc3-425b-a23d-80a5408da67a +SUMMARY:Carnival +DTSTART;VALUE=DATE:20070220 +DTEND;VALUE=DATE:20070221 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:6be05590-75c9-4d15-9aeb-27c3a9491b55 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20070406 +DTEND;VALUE=DATE:20070407 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:3970e165-fb9f-43c1-b67a-5ecb25c7be6a +SUMMARY:Easter +DTSTART;VALUE=DATE:20070408 +DTEND;VALUE=DATE:20070409 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:8acc68d0-2fa8-4ca3-8d91-3c430507fbc8 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20070607 +DTEND;VALUE=DATE:20070608 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:d5d559fb-c76f-4c53-bc9e-166366ac0a58 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20080205 +DTEND;VALUE=DATE:20080206 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:61af9a67-e006-432d-beba-c62bff1c4393 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20080321 +DTEND;VALUE=DATE:20080322 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:66a2fa12-f2b7-45f4-a93f-9de1207e1ef3 +SUMMARY:Easter +DTSTART;VALUE=DATE:20080323 +DTEND;VALUE=DATE:20080324 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:322aecd2-c178-4a5a-9fc6-42547115a37a +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20080522 +DTEND;VALUE=DATE:20080523 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:43c0b5b9-ce02-40ad-bf13-e01f0945221e +SUMMARY:Carnival +DTSTART;VALUE=DATE:20090224 +DTEND;VALUE=DATE:20090225 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:c39d888e-e2fa-4862-b03b-a9dcd6da026b +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:64bedf59-a063-482e-b5bb-176f9f0c7d05 +SUMMARY:Easter +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:f9419527-3beb-4669-9855-0df7b403ab09 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20090611 +DTEND;VALUE=DATE:20090612 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:dbaf605a-ec98-4f02-91c4-160831a6e3b6 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20100216 +DTEND;VALUE=DATE:20100217 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:8bddd9cd-9306-4b92-a9cf-88ef4f1d9bc3 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:1cac3b85-78f7-484e-9f17-8755eb7f689e +SUMMARY:Easter +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:71e278da-14bb-4cba-b429-710288426aa6 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20100603 +DTEND;VALUE=DATE:20100604 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:63bd86c7-4cbb-4817-b181-93f18c2c4f9f +SUMMARY:Carnival +DTSTART;VALUE=DATE:20110308 +DTEND;VALUE=DATE:20110309 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:538e2027-0cb3-4602-a83e-683fd446fe8e +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:fc5af2de-8c66-45e1-84e0-38c33acfcbb6 +SUMMARY:Easter +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:187aab6f-26c2-43b2-8e50-d13ef9fae9ec +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20110623 +DTEND;VALUE=DATE:20110624 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:68013e06-64a6-4505-81b8-1150b877a3fe +SUMMARY:Carnival +DTSTART;VALUE=DATE:20120221 +DTEND;VALUE=DATE:20120222 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:bf6ab4a5-a4b5-4666-90aa-19ac77c7f41e +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:1cd779a8-5f7c-43dd-980e-8067c6950b55 +SUMMARY:Easter +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:6e9afe2c-e30f-4771-ac0a-32737c8f4a38 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20120607 +DTEND;VALUE=DATE:20120608 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:a9402d5f-e58d-4ca6-9bd0-a46cb3bf5823 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20130212 +DTEND;VALUE=DATE:20130213 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:12a4b208-98ed-49cc-8baf-cebfe291057f +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:eb257ad2-aa43-4691-bc9e-b4709a126a73 +SUMMARY:Easter +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:6c14ae1d-8f8d-4c5e-acae-94510a4200f8 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20130530 +DTEND;VALUE=DATE:20130531 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:27940d21-14f0-4c64-a680-c980d584666e +SUMMARY:Carnival +DTSTART;VALUE=DATE:20140304 +DTEND;VALUE=DATE:20140305 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:f6d79878-fa91-4e95-bbdd-f4bd765b7b6a +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:efa4934b-52f3-4561-9ce1-21a0cce810d7 +SUMMARY:Easter +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:1702354b-b57c-44c6-aaac-da5ef89d5592 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20140619 +DTEND;VALUE=DATE:20140620 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:4436db84-57d3-49aa-b14a-d061f0adb6a2 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20150217 +DTEND;VALUE=DATE:20150218 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:749daddd-ed89-4ae6-9e87-078fbf594fd7 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:9cd5ff29-ed07-424b-8310-ca74230f7c0a +SUMMARY:Easter +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:4cca42e7-520e-43a6-bf32-450d5cd8c6c9 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20150604 +DTEND;VALUE=DATE:20150605 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:439fa13d-911b-4116-8de3-041f76609e72 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20160209 +DTEND;VALUE=DATE:20160210 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:b31a77ad-3e01-44b6-a5c3-f86796065d2c +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20160325 +DTEND;VALUE=DATE:20160326 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:437c5235-777e-46df-81eb-c6210677df75 +SUMMARY:Easter +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:3c659c17-5bc9-4bb9-96f6-72e727907dbf +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20160526 +DTEND;VALUE=DATE:20160527 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:3fc6506c-e32c-4bfb-9125-ac1c359fca23 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20170228 +DTEND;VALUE=DATE:20170301 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:a1527ee4-90ef-4862-b2e0-1ae4c69bad97 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20170414 +DTEND;VALUE=DATE:20170415 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:abf34703-001a-4739-8d65-9fe58b35e4ff +SUMMARY:Easter +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:8ea296fc-d77c-4daa-bb35-7ef0f31bbd35 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20170615 +DTEND;VALUE=DATE:20170616 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:efec0135-5fb2-4fc3-b7df-9ee7253150b6 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20180213 +DTEND;VALUE=DATE:20180214 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:5ac77215-3c32-4ea6-94d8-c17e39d123cb +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20180330 +DTEND;VALUE=DATE:20180331 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:4ef32d8f-eb43-4225-a035-4cc727056a5e +SUMMARY:Easter +DTSTART;VALUE=DATE:20180401 +DTEND;VALUE=DATE:20180402 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:b6eb9c00-5d32-46ad-af25-1e4ceb7e24d4 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20180531 +DTEND;VALUE=DATE:20180601 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:ebd07183-101a-4e8a-b630-084010395c75 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20190305 +DTEND;VALUE=DATE:20190306 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:9319a404-2caa-4860-ab8e-7250c4b26c70 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20190419 +DTEND;VALUE=DATE:20190420 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:c8abc003-8656-4c03-b463-281757c9d6c7 +SUMMARY:Easter +DTSTART;VALUE=DATE:20190421 +DTEND;VALUE=DATE:20190422 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:5adec9d3-8289-4590-a7d7-15d3beb199e7 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20190620 +DTEND;VALUE=DATE:20190621 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:9134149e-787b-4841-802e-6a1b68914bff +SUMMARY:Carnival +DTSTART;VALUE=DATE:20200225 +DTEND;VALUE=DATE:20200226 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:07d98915-7fa6-4591-9257-311a35109bf9 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20200410 +DTEND;VALUE=DATE:20200411 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:4bf48b56-7499-4d00-9ee7-6047a2ca8e36 +SUMMARY:Easter +DTSTART;VALUE=DATE:20200412 +DTEND;VALUE=DATE:20200413 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:f8e5c7e1-8355-4681-ade1-d403e0b6ca23 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20200611 +DTEND;VALUE=DATE:20200612 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:c1bcf217-b07e-471b-bf98-a8eaa253b4fb +SUMMARY:Carnival +DTSTART;VALUE=DATE:20210216 +DTEND;VALUE=DATE:20210217 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:baa729bb-7145-4cbc-bbd7-00e752ee5b5f +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20210402 +DTEND;VALUE=DATE:20210403 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:0ef18ed2-0318-4619-a08f-9bace518ea6b +SUMMARY:Easter +DTSTART;VALUE=DATE:20210404 +DTEND;VALUE=DATE:20210405 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:b71bfbee-dba7-4c79-bf07-a2fc4643885e +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20210603 +DTEND;VALUE=DATE:20210604 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:34393672-a43f-4d16-85ec-e2783be1a05c +SUMMARY:Carnival +DTSTART;VALUE=DATE:20220301 +DTEND;VALUE=DATE:20220302 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:aea2a84a-da17-4f91-b160-15a89afa52cc +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20220415 +DTEND;VALUE=DATE:20220416 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:e435c5bd-f5a2-487a-ac4e-b56745b89d14 +SUMMARY:Easter +DTSTART;VALUE=DATE:20220417 +DTEND;VALUE=DATE:20220418 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:023a861a-d37e-45f9-b595-6ee750333b3e +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20220616 +DTEND;VALUE=DATE:20220617 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:6ae751a9-75b9-4c40-a6a2-d7dcff275d90 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20230221 +DTEND;VALUE=DATE:20230222 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:a97015e0-4479-48fa-9720-d2d64b5121fa +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20230407 +DTEND;VALUE=DATE:20230408 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:2c78c1b0-9167-4aa3-b9ab-6a904c3968ee +SUMMARY:Easter +DTSTART;VALUE=DATE:20230409 +DTEND;VALUE=DATE:20230410 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:fd053ba5-e0fa-431a-ac48-86bea8657167 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20230608 +DTEND;VALUE=DATE:20230609 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:4d992236-76a1-4764-b551-25059527350c +SUMMARY:Carnival +DTSTART;VALUE=DATE:20240213 +DTEND;VALUE=DATE:20240214 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:cbd961b8-ce49-4e59-9d1c-998e1c6fd3ee +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20240329 +DTEND;VALUE=DATE:20240330 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:d4b53628-acd0-4fb9-a081-7452f0693bd6 +SUMMARY:Easter +DTSTART;VALUE=DATE:20240331 +DTEND;VALUE=DATE:20240401 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:1824da6f-f0a0-4faa-a028-8ac59914439b +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20240530 +DTEND;VALUE=DATE:20240531 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:0839a8fe-67ef-49b3-8ca9-985a31792d4d +SUMMARY:Carnival +DTSTART;VALUE=DATE:20250304 +DTEND;VALUE=DATE:20250305 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:2fb6f244-6722-4d55-b7f7-eb03d8bac186 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20250418 +DTEND;VALUE=DATE:20250419 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:1c93fa44-78ad-48b6-8c9a-f78b14997c8e +SUMMARY:Easter +DTSTART;VALUE=DATE:20250420 +DTEND;VALUE=DATE:20250421 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:58b16e20-1093-40ab-87d6-063ef28a9cbf +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20250619 +DTEND;VALUE=DATE:20250620 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:138c5a65-4df9-4d17-9410-5b53e9ff8b0a +SUMMARY:Carnival +DTSTART;VALUE=DATE:20260217 +DTEND;VALUE=DATE:20260218 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:4e96f4cf-185a-411d-bee6-21eb5eb56b06 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20260403 +DTEND;VALUE=DATE:20260404 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:2ddbd9f0-02aa-4b55-a30d-8b1a14ccedb3 +SUMMARY:Easter +DTSTART;VALUE=DATE:20260405 +DTEND;VALUE=DATE:20260406 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:04e53c14-c9a6-4ae1-9169-47c81231e4f5 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20260604 +DTEND;VALUE=DATE:20260605 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:2617081c-c96d-4cf9-88fd-72688fb4910b +SUMMARY:Carnival +DTSTART;VALUE=DATE:20270209 +DTEND;VALUE=DATE:20270210 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:aba7a9f2-a8bc-4b31-b6ec-86b0a92f11c0 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20270326 +DTEND;VALUE=DATE:20270327 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:9b9d94f7-b8d9-4c6c-b029-105487606915 +SUMMARY:Easter +DTSTART;VALUE=DATE:20270328 +DTEND;VALUE=DATE:20270329 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:7f9c3fe9-06f5-45b0-ba55-2c8da8055b38 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20270527 +DTEND;VALUE=DATE:20270528 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:918f486a-f745-4bb7-ab1b-3e4ae771845f +SUMMARY:Carnival +DTSTART;VALUE=DATE:20280229 +DTEND;VALUE=DATE:20280301 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:516e9453-13ba-46f0-bd0a-e0996cf85dd7 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20280414 +DTEND;VALUE=DATE:20280415 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:bf203169-cc8c-4329-9559-c89dc96c6695 +SUMMARY:Easter +DTSTART;VALUE=DATE:20280416 +DTEND;VALUE=DATE:20280417 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:329fd131-869e-4855-805a-94b58c66241e +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20280615 +DTEND;VALUE=DATE:20280616 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:bd294fef-c437-4351-ad44-986917cc79dd +SUMMARY:Carnival +DTSTART;VALUE=DATE:20290213 +DTEND;VALUE=DATE:20290214 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:06104d63-a31c-419a-95b4-a03d4bb40cb1 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20290330 +DTEND;VALUE=DATE:20290331 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:ae8f5a91-1d01-49b7-b22b-4ca562a25a02 +SUMMARY:Easter +DTSTART;VALUE=DATE:20290401 +DTEND;VALUE=DATE:20290402 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:f33509dc-e9fc-4fb0-9c93-e3671e498f12 +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20290531 +DTEND;VALUE=DATE:20290601 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:faa77196-c452-4f05-a146-01048d362c23 +SUMMARY:Carnival +DTSTART;VALUE=DATE:20300305 +DTEND;VALUE=DATE:20300306 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:23bb3359-d3a8-4b1d-b45e-625c6aa9d7ab +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20300419 +DTEND;VALUE=DATE:20300420 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:c38cda82-92dc-49ce-b49f-a581213fef38 +SUMMARY:Easter +DTSTART;VALUE=DATE:20300421 +DTEND;VALUE=DATE:20300422 +CATEGORIES:PTHolidays +END:VEVENT +BEGIN:VEVENT +CREATED:20080523T165427Z +LAST-MODIFIED:20080523T165427Z +DTSTAMP:20080523T165427Z +UID:a3a2a74a-7c19-4ffb-9f19-519743bffd1d +SUMMARY:Corpus Christi +DTSTART;VALUE=DATE:20300620 +DTEND;VALUE=DATE:20300621 +CATEGORIES:PTHolidays +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/PuertoRicoHolidays.ics b/media/caldata/PuertoRicoHolidays.ics new file mode 100644 index 00000000000..0442b89ee42 --- /dev/null +++ b/media/caldata/PuertoRicoHolidays.ics @@ -0,0 +1,473 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20100114T133554Z +LAST-MODIFIED:20100114T133622Z +DTSTAMP:20100115T135923Z +UID:88a6ed91-fb3d-4bd8-8ff0-e55f077c7941 +SUMMARY:Año Nuevo +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T133701Z +LAST-MODIFIED:20100114T133810Z +DTSTAMP:20100115T135923Z +UID:33cf59de-3071-4764-a824-70bfd1aaf2b3 +SUMMARY:Conmemoración del Natilicio de Eugenio María de Hostos +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100111 +DTEND;VALUE=DATE:20100112 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T133844Z +LAST-MODIFIED:20100114T133914Z +DTSTAMP:20100115T135923Z +UID:8389282a-476d-44ff-ac8a-87f33cb50450 +SUMMARY:Conmemoración del Natilicio de Martin Luther King +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100118 +DTEND;VALUE=DATE:20100119 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T133941Z +LAST-MODIFIED:20100114T134021Z +DTSTAMP:20100115T135923Z +UID:57ee4b1f-82c2-413b-ad03-2bfb76999fa7 +SUMMARY:Día de San Valentín +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100214 +DTEND;VALUE=DATE:20100215 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T133639Z +LAST-MODIFIED:20100114T134038Z +DTSTAMP:20100115T135923Z +UID:073a9066-acc2-40cf-97a3-50b2c664d414 +SUMMARY:Día de los Reyes Magos +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100106 +DTEND;VALUE=DATE:20100107 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134041Z +LAST-MODIFIED:20100114T134111Z +DTSTAMP:20100115T135923Z +UID:439e6198-dba5-48da-81a6-feab96b91d6b +SUMMARY:Día de los Presidentes +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100215 +DTEND;VALUE=DATE:20100216 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134115Z +LAST-MODIFIED:20100114T134140Z +DTSTAMP:20100115T135923Z +UID:ed45470a-7df3-4e38-911e-aabbb614acd1 +SUMMARY:Miércoles de Ceniza +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100217 +DTEND;VALUE=DATE:20100218 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134149Z +LAST-MODIFIED:20100114T134206Z +DTSTAMP:20100115T135923Z +UID:56ba52d8-d55a-42e0-bd8c-9752ee9954ae +SUMMARY:Natilicio de Washington +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100222 +DTEND;VALUE=DATE:20100223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134417Z +LAST-MODIFIED:20100114T134511Z +DTSTAMP:20100115T135923Z +UID:67d4283c-ca73-4b91-8627-5a2bb18e1a6a +SUMMARY:Día de la Abolición de la Esclavitud +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100322 +DTEND;VALUE=DATE:20100323 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134517Z +LAST-MODIFIED:20100114T134530Z +DTSTAMP:20100115T135923Z +UID:a358f5f7-e37a-4023-aafe-ed58d86bebcf +SUMMARY:Domingo de Ramos +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100328 +DTEND;VALUE=DATE:20100329 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134549Z +LAST-MODIFIED:20100114T134611Z +DTSTAMP:20100115T135923Z +UID:f6022fb7-f0c9-4442-b85c-b45c6e4314bb +SUMMARY:Dia de lois Inocentes +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100401 +DTEND;VALUE=DATE:20100402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134613Z +LAST-MODIFIED:20100114T134629Z +DTSTAMP:20100115T135923Z +UID:83ac1cf1-ae8f-4ecf-bb3e-5edc10cf8a30 +SUMMARY:Viernes Santo +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134632Z +LAST-MODIFIED:20100114T134652Z +DTSTAMP:20100115T135923Z +UID:211ce7ea-d357-4657-b269-a099b32fc440 +SUMMARY:Sábado de Gloria +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100403 +DTEND;VALUE=DATE:20100404 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134658Z +LAST-MODIFIED:20100114T134717Z +DTSTAMP:20100115T135923Z +UID:f9d69eaa-4c41-4a47-952f-a5e29b272e87 +SUMMARY:Domingo de Pascua +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134726Z +LAST-MODIFIED:20100114T134802Z +DTSTAMP:20100115T135923Z +UID:930f7c35-1771-4705-bf3c-b5066e3c4128 +SUMMARY:Conmemoración del Natilicio de José De Diego +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100419 +DTEND;VALUE=DATE:20100420 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134822Z +LAST-MODIFIED:20100114T134836Z +DTSTAMP:20100115T135923Z +UID:ee6eede9-7f6d-4f30-bc2e-d0651949e3a7 +SUMMARY:Día de las Madres +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100509 +DTEND;VALUE=DATE:20100510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134855Z +LAST-MODIFIED:20100114T134929Z +DTSTAMP:20100115T135923Z +UID:7dea1738-3ebf-48e1-ac99-daaa6b6b2a51 +SUMMARY:Conmemoración del Día de la Recordación +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100531 +DTEND;VALUE=DATE:20100601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T134944Z +LAST-MODIFIED:20100114T134959Z +DTSTAMP:20100115T135923Z +UID:846f9467-e617-463c-8588-442ba09ef905 +SUMMARY:Día de los Padres +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100620 +DTEND;VALUE=DATE:20100621 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135017Z +LAST-MODIFIED:20100114T135053Z +DTSTAMP:20100115T135923Z +UID:4ad4935f-c602-4639-85d8-efdfc8c806d3 +SUMMARY:Día de la Independencia (Estados Unidos) +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100704 +DTEND;VALUE=DATE:20100705 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135059Z +LAST-MODIFIED:20100114T135140Z +DTSTAMP:20100115T135923Z +UID:463bb700-07c0-40c1-8a94-3e5e4752e16d +SUMMARY:Conmemoración Natilicio de Luis Muñoz Rivera +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100719 +DTEND;VALUE=DATE:20100720 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135151Z +LAST-MODIFIED:20100114T135217Z +DTSTAMP:20100115T135923Z +UID:4bbe8be2-4965-4444-bf62-3f95433112f9 +SUMMARY:Día de la Constitución E.L.A. +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100725 +DTEND;VALUE=DATE:20100726 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135221Z +LAST-MODIFIED:20100114T135251Z +DTSTAMP:20100115T135923Z +UID:12cd5c02-0f9f-4dd6-bd3a-b154cba3dc67 +SUMMARY:Natilicio de José Celso Barbosa +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100727 +DTEND;VALUE=DATE:20100728 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135312Z +LAST-MODIFIED:20100114T135337Z +DTSTAMP:20100115T135923Z +UID:00977082-f043-49e7-96b8-a6ce29b680bd +SUMMARY:Día del Trabajo +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100906 +DTEND;VALUE=DATE:20100907 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135340Z +LAST-MODIFIED:20100114T135352Z +DTSTAMP:20100115T135923Z +UID:0d0e96c7-e43f-4299-aac1-48afc2c0008f +SUMMARY:Día de los Abuelos +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100912 +DTEND;VALUE=DATE:20100913 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135357Z +LAST-MODIFIED:20100114T135409Z +DTSTAMP:20100115T135923Z +UID:2bcf7357-18ce-42cf-aca1-bc60733c6458 +SUMMARY:Grito de Lares +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100923 +DTEND;VALUE=DATE:20100924 +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135520Z +LAST-MODIFIED:20100114T135548Z +DTSTAMP:20100115T135923Z +UID:b2dee8d1-1d32-4b45-b255-a34dcafc0ecc +SUMMARY:Conmemoración del Día de la Raza +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101011 +DTEND;VALUE=DATE:20101012 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135552Z +LAST-MODIFIED:20100114T135611Z +DTSTAMP:20100115T135923Z +UID:ce4deac1-7463-4461-888a-0ae4fc0af4f0 +SUMMARY:Día de la Raza +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101012 +DTEND;VALUE=DATE:20101013 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135619Z +LAST-MODIFIED:20100114T135633Z +DTSTAMP:20100115T135923Z +UID:20ca0a70-ae53-4463-9d57-7e969ece780e +SUMMARY:Día de Halloween +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101031 +DTEND;VALUE=DATE:20101101 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135650Z +LAST-MODIFIED:20100114T135706Z +DTSTAMP:20100115T135923Z +UID:1fb14ff8-c71f-4ad9-9710-cca34d17d007 +SUMMARY:Día de todos los Santos +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101101 +DTEND;VALUE=DATE:20101102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135709Z +LAST-MODIFIED:20100114T135729Z +DTSTAMP:20100115T135923Z +UID:b2a12092-5f52-42db-9fe8-e16ca01eab49 +SUMMARY:Día de los Fieles Difuntos +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101102 +DTEND;VALUE=DATE:20101103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135746Z +LAST-MODIFIED:20100114T135759Z +DTSTAMP:20100115T135923Z +UID:d686d375-f9f3-4efd-b4f9-12116a65ca65 +SUMMARY:Día del Veterano +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101111 +DTEND;VALUE=DATE:20101112 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135803Z +LAST-MODIFIED:20100114T135825Z +DTSTAMP:20100115T135923Z +UID:c2e2ab4c-51ab-4a9d-aa59-c36d9058abd6 +SUMMARY:Descubrimiento de Puerto Rico +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101119 +DTEND;VALUE=DATE:20101120 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135845Z +LAST-MODIFIED:20100114T135908Z +DTSTAMP:20100115T135923Z +UID:c70a771c-6104-487f-aa4a-f71c89c89c1c +SUMMARY:Día de Acción de Gracias +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101125 +DTEND;VALUE=DATE:20101126 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135947Z +LAST-MODIFIED:20100114T135957Z +DTSTAMP:20100115T135923Z +UID:8e0034db-3bdc-4742-8865-345797a7749b +SUMMARY:Noche Buena +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101224 +DTEND;VALUE=DATE:20101225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T135959Z +LAST-MODIFIED:20100114T140011Z +DTSTAMP:20100115T135923Z +UID:dce6ae4c-85d2-4770-a94b-750ca7558e3c +SUMMARY:Día de Navidad +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T140017Z +LAST-MODIFIED:20100114T140036Z +DTSTAMP:20100115T135923Z +UID:4cdac2ee-0829-43ff-865a-f3fc0936a371 +SUMMARY:Despedida de Año +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101231 +DTEND;VALUE=DATE:20110101 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T141118Z +LAST-MODIFIED:20100114T141142Z +DTSTAMP:20100115T135923Z +UID:17c1f393-98fb-4201-8bed-c32c4feafdb2 +SUMMARY:Cumpleaños de Millie +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Birthday +DTSTART;VALUE=DATE:20091219 +DTEND;VALUE=DATE:20091220 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T141146Z +LAST-MODIFIED:20100114T141200Z +DTSTAMP:20100115T135923Z +UID:81e27b96-bc70-49f0-992e-86dedb71f597 +SUMMARY:Cumpleaños de Selenia +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Birthday +DTSTART;VALUE=DATE:20091127 +DTEND;VALUE=DATE:20091128 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100114T141208Z +LAST-MODIFIED:20100114T141224Z +DTSTAMP:20100115T135923Z +UID:a25ee8e9-4ef5-41a5-9933-dd21096d8b2f +SUMMARY:Cumpleaños de Daniel +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Birthday +DTSTART;VALUE=DATE:20100224 +DTEND;VALUE=DATE:20100225 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/QueenslandHolidays.ics b/media/caldata/QueenslandHolidays.ics new file mode 100644 index 00000000000..ae05c1c9d59 --- /dev/null +++ b/media/caldata/QueenslandHolidays.ics @@ -0,0 +1,474 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20111013T052821Z +LAST-MODIFIED:20111013T052949Z +DTSTAMP:20111013T052949Z +UID:82a87247-e251-42fd-ac79-53c9257332e6 +SUMMARY:Royal Queensland Show (BCC only) +DTSTART;VALUE=DATE:20110817 +DTEND;VALUE=DATE:20110818 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053011Z +LAST-MODIFIED:20111013T053016Z +DTSTAMP:20111013T053016Z +UID:5506e216-a329-4123-9697-a32c5b7dcbf4 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20120102 +DTEND;VALUE=DATE:20120103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053024Z +LAST-MODIFIED:20111013T053028Z +DTSTAMP:20111013T053028Z +UID:3cf81617-c522-4a7a-8279-afef3c741dc0 +SUMMARY:Australia Day +DTSTART;VALUE=DATE:20120126 +DTEND;VALUE=DATE:20120127 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053041Z +LAST-MODIFIED:20111013T053045Z +DTSTAMP:20111013T053045Z +UID:ded62be0-3329-4f75-b625-d19498efb800 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053051Z +LAST-MODIFIED:20111013T053055Z +DTSTAMP:20111013T053055Z +UID:f33baa7b-99f5-4e88-9b3c-0540e5bed433 +SUMMARY:Easter Saturday +DTSTART;VALUE=DATE:20120407 +DTEND;VALUE=DATE:20120408 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053101Z +LAST-MODIFIED:20111013T053105Z +DTSTAMP:20111013T053105Z +UID:815e6122-5e5e-448c-9c70-03c050ea739a +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053116Z +LAST-MODIFIED:20111013T053123Z +DTSTAMP:20111013T053123Z +UID:b798386e-52d9-44e3-ad62-508a3a536a7d +SUMMARY:Anzac Day +DTSTART;VALUE=DATE:20120425 +DTEND;VALUE=DATE:20120426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053216Z +LAST-MODIFIED:20111013T053237Z +DTSTAMP:20111013T053237Z +UID:1d6b1eef-cac7-4015-9ad4-339cdc8941a1 +SUMMARY:Royal Queensland Show (BCC only) +DTSTART;VALUE=DATE:20120815 +DTEND;VALUE=DATE:20120816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053144Z +LAST-MODIFIED:20111013T053148Z +DTSTAMP:20111013T053148Z +UID:901b16c3-1ac4-46f9-ba82-4d4e46675644 +SUMMARY:Labour Day +DTSTART;VALUE=DATE:20120507 +DTEND;VALUE=DATE:20120508 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053251Z +LAST-MODIFIED:20111013T053257Z +DTSTAMP:20111013T053257Z +UID:637fa767-025f-4139-a5ee-e611848a21df +SUMMARY:Christmas Day +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053303Z +LAST-MODIFIED:20111013T053310Z +DTSTAMP:20111013T053310Z +UID:2924bb1e-2461-4e6d-8ce7-7b80077aa40f +SUMMARY:Boxing Day +DTSTART;VALUE=DATE:20121226 +DTEND;VALUE=DATE:20121227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053323Z +LAST-MODIFIED:20111013T053328Z +DTSTAMP:20111013T053328Z +UID:74a8c109-cd88-426f-adf5-cad07b76ca11 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20130101 +DTEND;VALUE=DATE:20130102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053338Z +LAST-MODIFIED:20111013T053342Z +DTSTAMP:20111013T053342Z +UID:6828204e-8f97-4dd5-aad8-ef3396ec8c4b +SUMMARY:Australia Day +DTSTART;VALUE=DATE:20130128 +DTEND;VALUE=DATE:20130129 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053431Z +LAST-MODIFIED:20111013T053435Z +DTSTAMP:20111013T053435Z +UID:e7c2f126-a2d2-42c7-afc9-f1387e396c28 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T052512Z +LAST-MODIFIED:20111013T052528Z +DTSTAMP:20111013T052528Z +UID:89050772-5cea-449e-a5f3-0ce98027c053 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:20110102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T052532Z +LAST-MODIFIED:20111013T052539Z +DTSTAMP:20111013T052539Z +UID:52ddef75-52d2-48f0-bebb-a9ff6851e458 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20110103 +DTEND;VALUE=DATE:20110104 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T052546Z +LAST-MODIFIED:20111013T052551Z +DTSTAMP:20111013T052551Z +UID:877d1597-3e49-4e73-8e9e-26faf0dfc80a +SUMMARY:Australia Day +DTSTART;VALUE=DATE:20110126 +DTEND;VALUE=DATE:20110127 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T052603Z +LAST-MODIFIED:20111013T052619Z +DTSTAMP:20111013T052619Z +UID:115aed8f-3ebf-43fe-8f92-44228f154ae2 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T052623Z +LAST-MODIFIED:20111013T052629Z +DTSTAMP:20111013T052629Z +UID:4899c724-55d7-4a51-8682-9d13b0451e85 +SUMMARY:Easter Saturday +DTSTART;VALUE=DATE:20110423 +DTEND;VALUE=DATE:20110424 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T052643Z +LAST-MODIFIED:20111013T052649Z +DTSTAMP:20111013T052649Z +UID:b79f5b73-7ee6-4267-8eab-b8327fdffbe0 +SUMMARY:Anzac Day +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T052651Z +LAST-MODIFIED:20111013T052700Z +DTSTAMP:20111013T052700Z +UID:6beb9602-fe7c-438c-ac30-8c554286e7b9 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20110426 +DTEND;VALUE=DATE:20110427 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T052723Z +LAST-MODIFIED:20111013T052728Z +DTSTAMP:20111013T052728Z +UID:b1e9e4e1-9f76-4a20-b6d0-3b99e48d5261 +SUMMARY:Labour Day +DTSTART;VALUE=DATE:20110502 +DTEND;VALUE=DATE:20110503 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T052738Z +LAST-MODIFIED:20111013T052744Z +DTSTAMP:20111013T052744Z +UID:82074a2e-f0d2-4132-a0a3-2150e8681999 +SUMMARY:Queen's Birthday +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T052859Z +LAST-MODIFIED:20111013T052923Z +DTSTAMP:20111013T052923Z +UID:9da657b7-9cad-4c26-9756-64c5bf070b1c +SUMMARY:Christmas Day +DTSTART;VALUE=DATE:20111226 +DTEND;VALUE=DATE:20111227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T052933Z +LAST-MODIFIED:20111013T052937Z +DTSTAMP:20111013T052937Z +UID:4c8d5e9d-916b-4181-a505-5428d1ba28ee +SUMMARY:Boxing Day +DTSTART;VALUE=DATE:20111227 +DTEND;VALUE=DATE:20111228 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053440Z +LAST-MODIFIED:20111013T053445Z +DTSTAMP:20111013T053445Z +UID:64f26960-420f-4194-ab89-cb024da63745 +SUMMARY:Easter Saturday +DTSTART;VALUE=DATE:20130330 +DTEND;VALUE=DATE:20130331 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053452Z +LAST-MODIFIED:20111013T053456Z +DTSTAMP:20111013T053456Z +UID:ca1c18ba-f851-4b64-b962-4d9bcf9a2df3 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053505Z +LAST-MODIFIED:20111013T053509Z +DTSTAMP:20111013T053509Z +UID:894c8ace-f976-4f2a-9fce-80a370c87332 +SUMMARY:Anzac Day +DTSTART;VALUE=DATE:20130425 +DTEND;VALUE=DATE:20130426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053519Z +LAST-MODIFIED:20111013T053522Z +DTSTAMP:20111013T053522Z +UID:5b51fd81-3e9d-4001-a251-f09843205d24 +SUMMARY:Labour Day +DTSTART;VALUE=DATE:20130506 +DTEND;VALUE=DATE:20130507 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053530Z +LAST-MODIFIED:20120425T040637Z +DTSTAMP:20120425T040637Z +UID:dccc6153-177d-4ae7-98b4-455ef1f881b3 +SUMMARY:Queen's Birthday +DTSTART;VALUE=DATE:20131007 +DTEND;VALUE=DATE:20131008 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053547Z +LAST-MODIFIED:20111013T053555Z +DTSTAMP:20111013T053555Z +UID:519eb747-8c77-4dfb-afee-fe8c115452be +SUMMARY:Royal Queensland Show (BCC only) +DTSTART;VALUE=DATE:20130814 +DTEND;VALUE=DATE:20130815 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053612Z +LAST-MODIFIED:20111013T053616Z +DTSTAMP:20111013T053616Z +UID:f291d586-bc45-4f15-a4ce-3fa1cda5ecdd +SUMMARY:Christmas Day +DTSTART;VALUE=DATE:20131225 +DTEND;VALUE=DATE:20131226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053617Z +LAST-MODIFIED:20111013T053621Z +DTSTAMP:20111013T053621Z +UID:44fdf8b7-b576-4892-896d-018d715e25e8 +SUMMARY:Boxing Day +DTSTART;VALUE=DATE:20131226 +DTEND;VALUE=DATE:20131227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053635Z +LAST-MODIFIED:20111013T053642Z +DTSTAMP:20111013T053642Z +UID:5b23ff68-fea3-4ba5-a0d0-88615d4c5755 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20140101 +DTEND;VALUE=DATE:20140102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053649Z +LAST-MODIFIED:20111013T053655Z +DTSTAMP:20111013T053655Z +UID:8929cc00-478c-4f39-98eb-4f25e94c2a50 +SUMMARY:Australia Day +DTSTART;VALUE=DATE:20140127 +DTEND;VALUE=DATE:20140128 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053743Z +LAST-MODIFIED:20111013T053749Z +DTSTAMP:20111013T053749Z +UID:2b843a8f-09ea-45da-b142-3adf6d3d67ad +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053754Z +LAST-MODIFIED:20111013T053758Z +DTSTAMP:20111013T053758Z +UID:8bf4a4d2-aa54-49ff-a6c0-7b7fb93d61e9 +SUMMARY:Easter Saturday +DTSTART;VALUE=DATE:20140419 +DTEND;VALUE=DATE:20140420 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053804Z +LAST-MODIFIED:20111013T053808Z +DTSTAMP:20111013T053808Z +UID:4ce4e46a-1a38-4fe9-8ea1-b61a312e31f5 +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053813Z +LAST-MODIFIED:20111013T053817Z +DTSTAMP:20111013T053817Z +UID:a78aba11-b179-438c-a04c-611076a3cb15 +SUMMARY:Anzac Day +DTSTART;VALUE=DATE:20140425 +DTEND;VALUE=DATE:20140426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053824Z +LAST-MODIFIED:20111013T053831Z +DTSTAMP:20111013T053831Z +UID:f0ad0507-97de-487f-ba09-afbb78ae017a +SUMMARY:Labour Day +DTSTART;VALUE=DATE:20140505 +DTEND;VALUE=DATE:20140506 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053845Z +LAST-MODIFIED:20120425T040755Z +DTSTAMP:20120425T040755Z +UID:cfc3b266-fb89-454a-b993-0dd501e2e65f +SUMMARY:Queen's Birthday +DTSTART;VALUE=DATE:20141006 +DTEND;VALUE=DATE:20141007 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053859Z +LAST-MODIFIED:20111013T053907Z +DTSTAMP:20111013T053907Z +UID:50c198f1-0cb6-4507-8638-a650d7c3c4cf +SUMMARY:Royal Queenland Show (BCC only) +DTSTART;VALUE=DATE:20140813 +DTEND;VALUE=DATE:20140814 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053917Z +LAST-MODIFIED:20111013T053920Z +DTSTAMP:20111013T053920Z +UID:03c5e024-f765-42c7-b103-3818f417fd03 +SUMMARY:Christmas Day +DTSTART;VALUE=DATE:20141225 +DTEND;VALUE=DATE:20141226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053924Z +LAST-MODIFIED:20111013T053927Z +DTSTAMP:20111013T053927Z +UID:9821232f-465b-4957-87d7-4fc120872e45 +SUMMARY:Boxing Day +DTSTART;VALUE=DATE:20141226 +DTEND;VALUE=DATE:20141227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111013T053154Z +LAST-MODIFIED:20120425T034607Z +DTSTAMP:20120425T034607Z +UID:b35be6c7-9f1f-44e5-b1bf-c2768c9c77ef +SUMMARY:Queen's Diamond Jubilee +DTSTART;VALUE=DATE:20120611 +DTEND;VALUE=DATE:20120612 +DESCRIPTION:u +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20120425T034619Z +LAST-MODIFIED:20120425T034627Z +DTSTAMP:20120425T034627Z +UID:715d8dd8-e066-4857-a52b-cc53c5e14299 +SUMMARY:Queen's Birthday +DTSTART;VALUE=DATE:20121001 +DTEND;VALUE=DATE:20121002 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/RomaniaHolidays.ics b/media/caldata/RomaniaHolidays.ics new file mode 100644 index 00000000000..247969df1fb --- /dev/null +++ b/media/caldata/RomaniaHolidays.ics @@ -0,0 +1,138 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20121222T134144Z +LAST-MODIFIED:20121222T134320Z +DTSTAMP:20121222T134320Z +UID:45b9c0a9-238d-4dd9-8290-11c6f4a5f4d0 +SUMMARY:Anul Nou +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130101 +DTEND;VALUE=DATE:20130102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20121222T134230Z +LAST-MODIFIED:20121222T134337Z +DTSTAMP:20121222T134337Z +UID:e9938c8d-25fa-4682-9886-c058d77e44b0 +SUMMARY:Anul Nou +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130102 +DTEND;VALUE=DATE:20130103 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20121222T134438Z +LAST-MODIFIED:20121222T134552Z +DTSTAMP:20121222T134552Z +UID:132525f6-5170-4b7d-b4f6-894f5dbc56cf +SUMMARY:Ziua Internaţională a Muncii +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130501 +DTEND;VALUE=DATE:20130502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121222T135011Z +LAST-MODIFIED:20121222T135030Z +DTSTAMP:20121222T135030Z +UID:ce8d79fc-f12e-4aaa-85a8-8f92e9ae9a89 +SUMMARY:Paştele +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130505 +DTEND;VALUE=DATE:20130506 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121222T135038Z +LAST-MODIFIED:20121222T135055Z +DTSTAMP:20121222T135055Z +UID:3a1610bd-1f8d-49a9-91ce-8b1509e084c0 +SUMMARY:Paştele +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130506 +DTEND;VALUE=DATE:20130507 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121222T135140Z +LAST-MODIFIED:20121222T135158Z +DTSTAMP:20121222T135158Z +UID:5dc23277-447a-453c-b613-0445eca9ba80 +SUMMARY:Rusaliile +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130623 +DTEND;VALUE=DATE:20130624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121222T135208Z +LAST-MODIFIED:20121222T135223Z +DTSTAMP:20121222T135223Z +UID:0099903d-9ea3-486a-a7e4-8450055d7da2 +SUMMARY:Rusaliile +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130624 +DTEND;VALUE=DATE:20130625 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121222T135240Z +LAST-MODIFIED:20121222T135307Z +DTSTAMP:20121222T135307Z +UID:170c752a-5c5d-4893-b345-a9c50281ec6c +SUMMARY:Adormirea Maicii Domnului +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130815 +DTEND;VALUE=DATE:20130816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121222T135346Z +LAST-MODIFIED:20121222T135406Z +DTSTAMP:20121222T135406Z +UID:d3f69d95-3934-40f8-adc2-b033dee86787 +SUMMARY:Sfântul Andrei +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131130 +DTEND;VALUE=DATE:20131201 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121222T135417Z +LAST-MODIFIED:20121222T135507Z +DTSTAMP:20121222T135507Z +UID:4f9400da-5775-4d25-947c-32da1a034f2e +SUMMARY:Ziua Naţională a României +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131201 +DTEND;VALUE=DATE:20131202 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121222T135536Z +LAST-MODIFIED:20121222T135556Z +DTSTAMP:20121222T135556Z +UID:1bf2978b-7e7d-410b-bb56-db0ad577aaa3 +SUMMARY:Crăciunul +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131225 +DTEND;VALUE=DATE:20131226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20121222T135601Z +LAST-MODIFIED:20121222T135620Z +DTSTAMP:20121222T135620Z +UID:7aa4513f-1387-410d-9fb0-2c03655c8df4 +SUMMARY:Crăciunul +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131226 +DTEND;VALUE=DATE:20131227 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/RussiaHolidays.ics b/media/caldata/RussiaHolidays.ics new file mode 100644 index 00000000000..68d0614e7d8 --- /dev/null +++ b/media/caldata/RussiaHolidays.ics @@ -0,0 +1,111 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20070606T164109Z +LAST-MODIFIED:20100101T201701Z +DTSTAMP:20070606T164109Z +UID:8147ef1b-8301-4ea8-b712-90a394f647a3 +SUMMARY:Новый год +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20100101T200818Z +LAST-MODIFIED:20100101T201704Z +DTSTAMP:20100101T200818Z +UID:b3408b45-b00a-4e23-b40a-57760a2e6bd1 +SUMMARY:Новогодние каникулы +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20100102 +DTEND;VALUE=DATE:20100106 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T164109Z +LAST-MODIFIED:20100101T201707Z +DTSTAMP:20070606T164109Z +UID:49660752-db14-42f7-bfa4-bd264111e513 +SUMMARY:Рождество Христово +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20100107 +DTEND;VALUE=DATE:20100108 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T164109Z +LAST-MODIFIED:20100101T201710Z +DTSTAMP:20070606T164109Z +UID:14cd5330-c5d4-4580-a2d5-05986920c48e +SUMMARY:День защитника Отечества +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20100223 +DTEND;VALUE=DATE:20100224 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T164109Z +LAST-MODIFIED:20100101T201712Z +DTSTAMP:20070606T164109Z +UID:4c8df85c-86ac-46cf-b271-877c02166e9e +SUMMARY:Международный женский день +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20100308 +DTEND;VALUE=DATE:20100309 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T164109Z +LAST-MODIFIED:20100101T201715Z +DTSTAMP:20070606T164109Z +UID:71c1345a-04fe-480f-a134-f5b9bed0f807 +SUMMARY:Праздник весны и труда +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:20100502 +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T164109Z +LAST-MODIFIED:20100101T201717Z +DTSTAMP:20070606T164109Z +UID:593ebbe1-cce3-4b01-9979-3578b3b3b7ec +SUMMARY:День Победы +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20100509 +DTEND;VALUE=DATE:20100510 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T164109Z +LAST-MODIFIED:20100101T201719Z +DTSTAMP:20070606T164109Z +UID:fc0d48b2-41d8-4993-83eb-6e9fdbd4741a +SUMMARY:День России +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20100612 +DTEND;VALUE=DATE:20100613 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20070606T164109Z +LAST-MODIFIED:20100101T201722Z +DTSTAMP:20070606T164109Z +UID:8fb6d2cc-728c-4e99-99fc-83757d05f359 +SUMMARY:День народного единства +RRULE:FREQ=YEARLY;INTERVAL=1 +DTSTART;VALUE=DATE:20101104 +DTEND;VALUE=DATE:20101105 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:5 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/SingaporeHolidays.ics b/media/caldata/SingaporeHolidays.ics new file mode 100644 index 00000000000..66565500fef --- /dev/null +++ b/media/caldata/SingaporeHolidays.ics @@ -0,0 +1,122 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20110404T073745Z +LAST-MODIFIED:20110404T073824Z +DTSTAMP:20110404T073824Z +UID:a2786182-a575-4833-953f-f1999209118e +SUMMARY:Chinese New Year +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120123 +DTEND;VALUE=DATE:20120125 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110404T073840Z +LAST-MODIFIED:20110404T073908Z +DTSTAMP:20110404T073908Z +UID:fd191079-fba3-4af3-84c2-914d72680716 +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110404T073917Z +LAST-MODIFIED:20110404T073944Z +DTSTAMP:20110404T073944Z +UID:fb28dc90-ddb5-4e39-9fb3-f58685fdedc2 +SUMMARY:Labour Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120501 +DTEND;VALUE=DATE:20120502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110404T073949Z +LAST-MODIFIED:20110404T074020Z +DTSTAMP:20110404T074020Z +UID:0231b556-d1d2-4222-9c2c-1021a625e3a3 +SUMMARY:Vesak Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120505 +DTEND;VALUE=DATE:20120506 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110404T074026Z +LAST-MODIFIED:20110404T074059Z +DTSTAMP:20110404T074059Z +UID:e4caeb4b-1e2d-4678-a780-4c7a736a9d37 +SUMMARY:National Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120809 +DTEND;VALUE=DATE:20120810 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110404T073320Z +LAST-MODIFIED:20110404T074220Z +DTSTAMP:20110404T074220Z +UID:23e17836-6d97-4651-8e21-f48847590934 +SUMMARY:New Year's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120101 +DTEND;VALUE=DATE:20120102 +TRANSP:TRANSPARENT +DESCRIPTION:The following Monday will be a public holiday +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110404T074106Z +LAST-MODIFIED:20110404T074239Z +DTSTAMP:20110404T074239Z +UID:aabdfef8-d2ad-465b-9137-497bf087eb9a +SUMMARY:Hari Raya Puasa +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120819 +DTEND;VALUE=DATE:20120820 +TRANSP:TRANSPARENT +DESCRIPTION:The following Monday will be a public holiday +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110404T074246Z +LAST-MODIFIED:20110404T074325Z +DTSTAMP:20110404T074325Z +UID:c1df01f7-bd8f-487f-89d4-8b37de4c5f01 +SUMMARY:Hari Raya Haji +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20121026 +DTEND;VALUE=DATE:20121027 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110404T074333Z +LAST-MODIFIED:20110404T074400Z +DTSTAMP:20110404T074400Z +UID:f83afc5e-9c3f-4170-9cd1-2481eff17f51 +SUMMARY:Deepavali +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20121113 +DTEND;VALUE=DATE:20121114 +DESCRIPTION:The date\, 13 November 2012\, for Deepavali needs to be checke + d against the Indian Almanac when it is available. Should there be a chang + e in date\, the Ministry of Manpower will issue a media release to announc + e the change. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110404T074408Z +LAST-MODIFIED:20110404T074501Z +DTSTAMP:20110404T074501Z +UID:76cf5f2d-aaba-42bc-832b-91fbf173b0e5 +SUMMARY:Christmas Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/SlovakHolidays.ics b/media/caldata/SlovakHolidays.ics new file mode 100644 index 00000000000..17a461ce57c --- /dev/null +++ b/media/caldata/SlovakHolidays.ics @@ -0,0 +1,375 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20090120T113459Z +LAST-MODIFIED:20090120T113550Z +DTSTAMP:20090120T113459Z +UID:52d364ea-8118-4c88-b8d3-3eed76faef62 +SUMMARY:Veľký piatok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +DESCRIPTION:Veľký piatok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T113613Z +LAST-MODIFIED:20090120T113659Z +DTSTAMP:20090120T113613Z +UID:c21b6b83-6f15-48da-9cca-758d773bbc66 +SUMMARY:Veľkonočný pondelok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +DESCRIPTION:Veľkonočný pondelok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T113737Z +LAST-MODIFIED:20090120T113758Z +DTSTAMP:20090120T113737Z +UID:4256ab15-a422-4989-8410-2e99d1082184 +SUMMARY:Veľký piatok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +DESCRIPTION:Veľký piatok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T113801Z +LAST-MODIFIED:20090120T113835Z +DTSTAMP:20090120T113801Z +UID:c7f6f013-a5cc-4a70-bd89-28aac11c8ebe +SUMMARY:Veľkonočný pondelok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +DESCRIPTION:Veľkonočný pondelok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T113904Z +LAST-MODIFIED:20090120T113925Z +DTSTAMP:20090120T113904Z +UID:51effd4a-c3dd-457f-a20a-d7d369b62810 +SUMMARY:Veľký piatok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +DESCRIPTION:Veľký piatok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T113929Z +LAST-MODIFIED:20090120T113956Z +DTSTAMP:20090120T113929Z +UID:913c553c-a4fc-420d-a602-a60b13a1595c +SUMMARY:Veľkonočný pondelok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +DESCRIPTION:Veľkonočný pondelok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T114018Z +LAST-MODIFIED:20090120T114040Z +DTSTAMP:20090120T114018Z +UID:a0ee78d6-fd5f-4a59-9e71-8882a9654c34 +SUMMARY:Veľký piatok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +DESCRIPTION:Veľký piatok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T114043Z +LAST-MODIFIED:20090120T114110Z +DTSTAMP:20090120T114043Z +UID:c6668bf2-6a14-46fe-aeef-0437f915396f +SUMMARY:Veľkonočný pondelok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +DESCRIPTION:Veľkonočný pondelok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T114205Z +LAST-MODIFIED:20090120T114222Z +DTSTAMP:20090120T114205Z +UID:c01c7dc9-5277-49da-9c02-df96937738a2 +SUMMARY:Veľký piatok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +DESCRIPTION:Veľký piatok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T114226Z +LAST-MODIFIED:20090120T114251Z +DTSTAMP:20090120T114226Z +UID:97d4b094-d2f5-4f6e-a195-7592e5514deb +SUMMARY:Veľkonočný pondelok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +DESCRIPTION:Veľkonočný pondelok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T114309Z +LAST-MODIFIED:20090120T114328Z +DTSTAMP:20090120T114309Z +UID:4d77c69b-399f-437d-bb54-1ad5202436b2 +SUMMARY:Veľký piatok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +DESCRIPTION:Veľký piatok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T114331Z +LAST-MODIFIED:20090120T114357Z +DTSTAMP:20090120T114331Z +UID:e7098ff6-58b8-42ab-bb85-1d1b34929541 +SUMMARY:Veľkonočný pondelok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +DESCRIPTION:Veľkonočný pondelok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T114415Z +LAST-MODIFIED:20090120T114432Z +DTSTAMP:20090120T114415Z +UID:9c8f69b2-bdb0-4e44-8422-1c50c7c47289 +SUMMARY:Veľký piatok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +DESCRIPTION:Veľký piatok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T114434Z +LAST-MODIFIED:20090120T114506Z +DTSTAMP:20090120T114434Z +UID:a83455ed-c7eb-415d-9318-67f802ea42e7 +SUMMARY:Veľkonočný pondelok +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +DESCRIPTION:Veľkonočný pondelok\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T111043Z +LAST-MODIFIED:20090120T111853Z +DTSTAMP:20090120T111043Z +UID:9911fd75-1e7d-4706-bd0e-93331c730845 +SUMMARY:Deň vzniku Slovenskej republiky +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +DESCRIPTION:Deň vzniku Slovenskej republiky\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T111754Z +LAST-MODIFIED:20090120T111911Z +DTSTAMP:20090120T111754Z +UID:fe978744-bdbb-4909-8c56-c5cc9328fcbc +SUMMARY:Sviatok práce +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +DESCRIPTION:Sviatok práce\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T111931Z +LAST-MODIFIED:20090120T112020Z +DTSTAMP:20090120T111931Z +UID:55a06b57-4fa1-4806-948d-9f2680629887 +SUMMARY:Deň víťazstva nad fašizmom +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20090508 +DTEND;VALUE=DATE:20090509 +DESCRIPTION:Deň víťazstva nad fašizmom\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T112051Z +LAST-MODIFIED:20090120T112145Z +DTSTAMP:20090120T112051Z +UID:68968cc8-6a5d-48f2-a4c4-a67e9a2ace6c +SUMMARY:Sviatok svätého Cyrila a Metoda +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20090705 +DTEND;VALUE=DATE:20090706 +DESCRIPTION:Sviatok svätého Cyrila a Metoda\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T112204Z +LAST-MODIFIED:20090120T112259Z +DTSTAMP:20090120T112204Z +UID:8efce7ee-c908-4936-b56a-d27c2fe832f1 +SUMMARY:Výročie Slovenského národného povstania +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20090829 +DTEND;VALUE=DATE:20090830 +DESCRIPTION:Výročie Slovenského národného povstania\n[ Dni + pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T112314Z +LAST-MODIFIED:20090120T112354Z +DTSTAMP:20090120T112314Z +UID:7699b865-1281-4317-afc1-3f3de2bb86a8 +SUMMARY:Deň ústavy Slovenskej republiky +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20090901 +DTEND;VALUE=DATE:20090902 +DESCRIPTION:Deň ústavy Slovenskej republiky\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T112406Z +LAST-MODIFIED:20090120T112522Z +DTSTAMP:20090120T112406Z +UID:3f64a00a-b019-4d0d-8b60-d149b1d94541 +SUMMARY:Sedembolestná Panna Mária +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20090915 +DTEND;VALUE=DATE:20090916 +DESCRIPTION:Sedembolestná Panna Mária\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T112551Z +LAST-MODIFIED:20090120T112627Z +DTSTAMP:20090120T112551Z +UID:218c5295-4c5b-4bbf-9140-6a97dac18b27 +SUMMARY:Sviatok všetkých svätých +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20091101 +DTEND;VALUE=DATE:20091102 +DESCRIPTION:Sviatok všetkých svätých\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T111440Z +LAST-MODIFIED:20090120T112704Z +DTSTAMP:20090120T111440Z +UID:e0b6a4ac-7cdf-4066-a38f-2ddefc2cb575 +SUMMARY:Zjavenie Pána (Traja králi a vianočný sviatok pravoslávnych + kresťanov) +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20090106 +DTEND;VALUE=DATE:20090107 +DESCRIPTION:Zjavenie Pána (Traja králi a vianočný sviatok + pravoslávnych kresťanov)\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T112638Z +LAST-MODIFIED:20090120T112735Z +DTSTAMP:20090120T112638Z +UID:1d2f04cf-4e56-40c9-b0ef-41f6950a7949 +SUMMARY:Deň boja za slobodu a demokraciu +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20091117 +DTEND;VALUE=DATE:20091118 +DESCRIPTION:Deň boja za slobodu a demokraciu\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T112755Z +LAST-MODIFIED:20090120T112825Z +DTSTAMP:20090120T112755Z +UID:db65a619-2aec-4d51-9ab4-df1038d0fe38 +SUMMARY:Štedrý deň +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20091224 +DTEND;VALUE=DATE:20091225 +DESCRIPTION:Štedrý deň\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T112833Z +LAST-MODIFIED:20090120T112907Z +DTSTAMP:20090120T112833Z +UID:8efbe13f-9b14-4134-86da-bdfd65cf9142 +SUMMARY:Prvý sviatok vianočný +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +DESCRIPTION:Prvý sviatok vianočný\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090120T112909Z +LAST-MODIFIED:20090120T112943Z +DTSTAMP:20090120T112909Z +UID:f5ec85a9-a3f5-4a98-ad09-1e7909e020a0 +SUMMARY:Druhý sviatok vianočný +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Sviatok +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +DESCRIPTION:Druhý sviatok vianočný\n[ Dni pracovného voľna + ]\n-----------------------------------------------------\nwww.mozilla.sk +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/SlovenianHolidays.ics b/media/caldata/SlovenianHolidays.ics new file mode 100644 index 00000000000..de59cb859ae --- /dev/null +++ b/media/caldata/SlovenianHolidays.ics @@ -0,0 +1,781 @@ +BEGIN:VCALENDAR +PRODID:-//Google Inc//Google Calendar 70.9054//EN +VERSION:2.0 +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:Slovenski prazniki +X-WR-TIMEZONE:Europe/Belgrade +X-WR-CALDESC:Dela prosti dnevi v Republiki Sloveniji +BEGIN:VTIMEZONE +TZID:Europe/Belgrade +X-LIC-LOCATION:Europe/Belgrade +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100608 +DTEND;VALUE=DATE:20100609 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:tq563529cuss0ppovm3v2ostpo@google.com +CREATED:20121024T210854Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Dan_Primo%C5%BEa_Trubarja +LAST-MODIFIED:20121024T211702Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Dan Primoža Trubarja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20121123 +DTEND;VALUE=DATE:20121124 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:3eugbag23jpapnku28r8snalu8@google.com +CREATED:20121024T211323Z +DESCRIPTION:http://www.vlada.si/si/o_sloveniji/politicni_sistem/prazniki/ +LAST-MODIFIED:20121024T211636Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Dan Rudolfa Maistra +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120915 +DTEND;VALUE=DATE:20120916 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:gflm21jqavr1dp2301spm85mn4@google.com +CREATED:20121024T211022Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Dan_vrnitve_Primorske_k_mati%C4%8D + ni_domovini +LAST-MODIFIED:20121024T211602Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Dan vrnitve primorske k matični domovini +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20120817 +DTEND;VALUE=DATE:20120818 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:9inhlge248fv3h1n995q17l70k@google.com +CREATED:20121024T211358Z +DESCRIPTION:http://www.vlada.si/si/o_sloveniji/politicni_sistem/prazniki/ +LAST-MODIFIED:20121024T211532Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Združitev prekmurskih Slovencev z matičnim narodom +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100102 +DTEND;VALUE=DATE:20100103 +RRULE:FREQ=YEARLY;UNTIL=20110102 +DTSTAMP:20121024T214503Z +UID:5d740r6lvcjshl86ctt0mi08h0@google.com +CREATED:20121024T210249Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Novo_leto +LAST-MODIFIED:20121024T210651Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Novo leto +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +DTSTAMP:20121024T214503Z +UID:h8bugducjfvbsc86okv104rfm4@google.com +CREATED:20121024T210634Z +DESCRIPTION:sl.wikipedia.org/wiki/Binkošti +LAST-MODIFIED:20121024T210634Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Binkoštna nedelja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +DTSTAMP:20121024T214503Z +UID:4ob8pf801nslcotqb7j6uegg50@google.com +CREATED:20121024T210545Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T210601Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velikonočni ponedeljek +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +DTSTAMP:20121024T214503Z +UID:nenmkrf0m5o84nvbhr9o6ctrp8@google.com +CREATED:20121024T210526Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T210526Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velika noč +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +DTSTAMP:20121024T214503Z +UID:eqs6t3nghoajukvaips5cnlvug@google.com +CREATED:20121024T210429Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Binko%C5%A1ti +LAST-MODIFIED:20121024T210430Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Binkoštna nedelja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +DTSTAMP:20121024T214503Z +UID:a06h94028oglru58rup3k2in7s@google.com +CREATED:20121024T210346Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T210347Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velikonočni ponedeljek +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +DTSTAMP:20121024T214503Z +UID:s6elj988ljuvbsdhdamfs81u8k@google.com +CREATED:20121024T210324Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T210325Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velika noč +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101226 +DTEND;VALUE=DATE:20101227 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:jlfnv6umgcv6am66hrmr60i72o@google.com +CREATED:20121024T201302Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Dan_samostojnosti_in_enotnosti +LAST-MODIFIED:20121024T210105Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Dan samostojnosti in enotnosti +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:65m84vf53e6ufnnv9enrh1i0f8@google.com +CREATED:20121024T201230Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Bo%C5%BEi%C4%8D +LAST-MODIFIED:20121024T210054Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Božič +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101101 +DTEND;VALUE=DATE:20101102 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:s4u3d3ar3dui39i4ed932nkmgo@google.com +CREATED:20121024T201138Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Dan_spomina_na_mrtve +LAST-MODIFIED:20121024T210039Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Dan spomina na mrtve +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20101031 +DTEND;VALUE=DATE:20101101 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:e30lkb4539u2srjdr6bon4let8@google.com +CREATED:20121024T201107Z +DESCRIPTION:http://www.vlada.si/si/o_sloveniji/politicni_sistem/prazniki/ +LAST-MODIFIED:20121024T210027Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Dan reformacije +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100815 +DTEND;VALUE=DATE:20100816 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:8kl8k39cf3i9eu03440d1rh0uk@google.com +CREATED:20121024T200941Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Marijino_vnebovzetje +LAST-MODIFIED:20121024T210013Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Marijino vnebovzetje +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100625 +DTEND;VALUE=DATE:20100626 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:lbtu1lctcn3gnfn9ev9b8bm024@google.com +CREATED:20121024T200610Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Dan_dr%C5%BEavnosti +LAST-MODIFIED:20121024T205934Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Dan državnosti +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100502 +DTEND;VALUE=DATE:20100503 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:gnkff09qh3pmqnacomnl4707qg@google.com +CREATED:20121024T200343Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Praznik_dela +LAST-MODIFIED:20121024T205913Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Praznik dela +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:20100502 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:0qfh4huviff4fsjfl0igdoe09c@google.com +CREATED:20121024T200317Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Praznik_dela +LAST-MODIFIED:20121024T205844Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Praznik dela +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100427 +DTEND;VALUE=DATE:20100428 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:3fb9ohmo2i9vnd3p0d9lvr00pg@google.com +CREATED:20121024T201622Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Dan_upora_proti_okupatorju +LAST-MODIFIED:20121024T205829Z +LOCATION: +SEQUENCE:2 +STATUS:CONFIRMED +SUMMARY:Dan upora proti okupatorju +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100208 +DTEND;VALUE=DATE:20100209 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:p5uc4dan8aoqpm3gvh93si61t4@google.com +CREATED:20121024T195815Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Pre%C5%A1ernov_dan +LAST-MODIFIED:20121024T205805Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Prešernov dan\, slovenski kulturni praznik +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +RRULE:FREQ=YEARLY +DTSTAMP:20121024T214503Z +UID:ldi7t0tg5hqvltafhjjti4e8hk@google.com +ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;CN=Sloven + ski prazniki;X-NUM-GUESTS=0:mailto:6knjtcrlhjdtlf00949uqkcoag@group.calenda + r.google.com +CREATED:20121024T195408Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Novo_leto +LAST-MODIFIED:20121024T205725Z +LOCATION: +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Novo leto +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20220605 +DTEND;VALUE=DATE:20220606 +DTSTAMP:20121024T214503Z +UID:o7nn4ijg1tpbg7t35ppgqhfub4@google.com +CREATED:20121024T204802Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Binko%C5%A1ti +LAST-MODIFIED:20121024T204802Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Binkoštna nedelja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20220418 +DTEND;VALUE=DATE:20220419 +DTSTAMP:20121024T214503Z +UID:5qig9mkhb1915fakmc78hoqqmg@google.com +CREATED:20121024T204735Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204736Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velikonočni ponedeljek +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20220417 +DTEND;VALUE=DATE:20220418 +DTSTAMP:20121024T214503Z +UID:32uj31i8c7dv8r6dr3kpb0lusg@google.com +CREATED:20121024T204710Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204710Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velika noč +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20210523 +DTEND;VALUE=DATE:20210524 +DTSTAMP:20121024T214503Z +UID:1piq40b6o4e2rl31vrkck7220k@google.com +CREATED:20121024T204644Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204644Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Binkoštna nedelja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20210405 +DTEND;VALUE=DATE:20210406 +DTSTAMP:20121024T214503Z +UID:c0ecteedj3oa0akemjdgoqh56o@google.com +CREATED:20121024T204623Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204623Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velikonočni ponedeljek +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20210404 +DTEND;VALUE=DATE:20210405 +DTSTAMP:20121024T214503Z +UID:p7ihuamcjitl82s1nuljgbctvg@google.com +CREATED:20121024T204603Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204604Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velika noč +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200531 +DTEND;VALUE=DATE:20200601 +DTSTAMP:20121024T214503Z +UID:m7snnbbooedsd1t4uv9l5hg7qk@google.com +CREATED:20121024T204530Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Binko%C5%A1ti +LAST-MODIFIED:20121024T204530Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Binkoštna nedelja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200413 +DTEND;VALUE=DATE:20200414 +DTSTAMP:20121024T214503Z +UID:o9hni0if1p6glqt98vp04cbjq0@google.com +ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;CN=Sloven + ski prazniki;X-NUM-GUESTS=0:mailto:6knjtcrlhjdtlf00949uqkcoag@group.calenda + r.google.com +CREATED:20121024T204502Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204509Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velikonočni ponedeljek +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20200412 +DTEND;VALUE=DATE:20200413 +DTSTAMP:20121024T214503Z +UID:l3nvpcp9ltdsvv5a6l7im9t418@google.com +CREATED:20121024T204443Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204443Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velika noč +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190609 +DTEND;VALUE=DATE:20190610 +DTSTAMP:20121024T214503Z +UID:586i4921c7l17krge67edhei7o@google.com +CREATED:20121024T204413Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Binko%C5%A1ti +LAST-MODIFIED:20121024T204413Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Binkoštna nedelja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190422 +DTEND;VALUE=DATE:20190423 +DTSTAMP:20121024T214503Z +UID:uvn903phpr9a78mubfbvkotqoc@google.com +CREATED:20121024T204341Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204341Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velikonočni ponedeljek +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20190421 +DTEND;VALUE=DATE:20190422 +DTSTAMP:20121024T214503Z +UID:g036oqatsh2qge7pp1tqk39kt4@google.com +CREATED:20121024T204316Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204316Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velika noč +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180513 +DTEND;VALUE=DATE:20180514 +DTSTAMP:20121024T214503Z +UID:jma36q86cej5kvlr6reh9chd3c@google.com +CREATED:20121024T204230Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Binko%C5%A1ti +LAST-MODIFIED:20121024T204230Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Binkoštna nedelja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180402 +DTEND;VALUE=DATE:20180403 +DTSTAMP:20121024T214503Z +UID:dcovu496cqm18pmlb3vpblchd4@google.com +CREATED:20121024T204207Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204207Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velikonočni ponedeljek +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20180401 +DTEND;VALUE=DATE:20180402 +DTSTAMP:20121024T214503Z +UID:rdg4p44inratsnpdsnudttt64k@google.com +CREATED:20121024T204142Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204142Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velika noč +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170604 +DTEND;VALUE=DATE:20170605 +DTSTAMP:20121024T214503Z +UID:3j0fv9k09cfs3ci62jquq5ef18@google.com +CREATED:20121024T204111Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Binko%C5%A1ti +LAST-MODIFIED:20121024T204111Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Binkoštna nedelja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170417 +DTEND;VALUE=DATE:20170418 +DTSTAMP:20121024T214503Z +UID:228q3ntico572pdiik4m8cvmr8@google.com +CREATED:20121024T204034Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204034Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velikonočni ponedeljek +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +DTSTAMP:20121024T214503Z +UID:5dte3ifgl6kfb92esvvk0e7lp0@google.com +CREATED:20121024T204006Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T204006Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velika noč +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160515 +DTEND;VALUE=DATE:20160516 +DTSTAMP:20121024T214503Z +UID:7pkn3a46q34jlel15d5o4a1hfg@google.com +CREATED:20121024T203909Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Binko%C5%A1ti +LAST-MODIFIED:20121024T203911Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Binkoštna nedelja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160328 +DTEND;VALUE=DATE:20160329 +DTSTAMP:20121024T214503Z +UID:79fu1t9ug07mbqav0vfu6o4na8@google.com +CREATED:20121024T203815Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T203816Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velikonočni ponedeljek +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +DTSTAMP:20121024T214503Z +UID:vmboa9kb3nivnjrkc7b1av7u28@google.com +CREATED:20121024T203752Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T203752Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velika noč +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150524 +DTEND;VALUE=DATE:20150525 +DTSTAMP:20121024T214503Z +UID:4p9r730ui641ncnj45j351i2pc@google.com +CREATED:20121024T202119Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Binko%C5%A1ti +LAST-MODIFIED:20121024T202119Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Binkoštna nedelja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +DTSTAMP:20121024T214503Z +UID:0aigeqkdc4pssvds2bltcje4hs@google.com +CREATED:20121024T201917Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T201917Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velikonočni ponedeljek +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +DTSTAMP:20121024T214503Z +UID:brn85s0d2ja4t5kn9agu9phu68@google.com +CREATED:20121024T201852Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T201852Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velika noč +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140608 +DTEND;VALUE=DATE:20140609 +DTSTAMP:20121024T214503Z +UID:pciee2su0gvdhsrqkn1p5u7hs8@google.com +ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;CN=Sloven + ski prazniki;X-NUM-GUESTS=0:mailto:6knjtcrlhjdtlf00949uqkcoag@group.calenda + r.google.com +CREATED:20121024T201726Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Binko%C5%A1ti +LAST-MODIFIED:20121024T201734Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Binkoštna nedelja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +DTSTAMP:20121024T214503Z +UID:9g6itd3f5fca5qanrvubrdekds@google.com +CREATED:20121024T201513Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T201513Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velika noč +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +DTSTAMP:20121024T214503Z +UID:j7jvvmsh4isnl7dfuuj8l0cmoc@google.com +CREATED:20121024T201446Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T201446Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velikonočni ponedeljek +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +DTSTAMP:20121024T214503Z +UID:mhbi808el0pmemmo17thq14djk@google.com +CREATED:20121024T200833Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Binko%C5%A1ti +LAST-MODIFIED:20121024T200833Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Binkoštna nedelja +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +DTSTAMP:20121024T214503Z +UID:7qrqb15ukqkhfe21rfgkgcnq7c@google.com +CREATED:20121024T200527Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T200527Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velika noč +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +DTSTAMP:20121024T214503Z +UID:4140oanmqqc6vvtmm4rqd8fub0@google.com +CREATED:20121024T200106Z +DESCRIPTION:http://sl.wikipedia.org/wiki/Velika_no%C4%8D +LAST-MODIFIED:20121024T200106Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Velikonočni ponedeljek +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/SlovenianHolidays2003-2011.ics b/media/caldata/SlovenianHolidays2003-2011.ics new file mode 100644 index 00000000000..84326b9b03b --- /dev/null +++ b/media/caldata/SlovenianHolidays2003-2011.ics @@ -0,0 +1,1150 @@ +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :ce4bde80-c1e1-11d7-8fce-c59f17d0c093 +SUMMARY + :Novo leto +DESCRIPTION + :New Year +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=1 +DTSTART + ;VALUE=DATE + :20020101 +DTEND + ;VALUE=DATE + :20020103 +DTSTAMP + :20030729T162825Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :c2f310e0-c1e5-11d7-a4e2-ec608add027f +SUMMARY + :Praznik dela +DESCRIPTION + :Labour Day +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=5 +DTSTART + ;VALUE=DATE + :20020501 +DTEND + ;VALUE=DATE + :20020503 +DTSTAMP + :20030729T165655Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :4172cb40-c1e6-11d7-9a31-c1014e154f35 +SUMMARY + :Dan reformacije +DESCRIPTION + :Reformation Day +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=10 +DTSTART + ;VALUE=DATE + :20021031 +DTEND + ;VALUE=DATE + :20021101 +DTSTAMP + :20030729T170034Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :76069260-c1e6-11d7-a52f-f12fd47812f8 +SUMMARY + :Božič +DESCRIPTION + :Christmas +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=12 +DTSTART + ;VALUE=DATE + :20021225 +DTEND + ;VALUE=DATE + :20021226 +DTSTAMP + :20030729T170155Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :04a85ae0-c1e6-11d7-90cd-e452e1a3f831 +SUMMARY + :Dan samostojnosti +DESCRIPTION + :Independence Day +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=12 +DTSTART + ;VALUE=DATE + :20021226 +DTEND + ;VALUE=DATE + :20021227 +DTSTAMP + :20030729T165851Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :0f470040-c1e2-11d7-bac8-bf56d7f08335 +SUMMARY + :Prešernov dan +DESCRIPTION + :Prešeren Day\, Slovenian Cultural Holiday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=2 +DTSTART + ;VALUE=DATE + :20020208 +DTEND + ;VALUE=DATE + :20020209 +DTSTAMP + :20030729T162940Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e69752a0-c1e4-11d7-a02e-e1ab5dcd2a6c +SUMMARY + :Dan upora proti okupatorju +DESCRIPTION + :Day of Uprising Against Occupation +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=4 +DTSTART + ;VALUE=DATE + :20020427 +DTEND + ;VALUE=DATE + :20020428 +DTSTAMP + :20030729T165034Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :65389ec0-c1e5-11d7-bb85-eafe557e5211 +SUMMARY + :Dan državnosti +DESCRIPTION + :Statehood Day +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=6 +DTSTART + ;VALUE=DATE + :20020625 +DTEND + ;VALUE=DATE + :20020626 +DTSTAMP + :20030729T165431Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :23b93c60-c1e6-11d7-b028-deb99a732fac +SUMMARY + :Marijino vnebovzetje +DESCRIPTION + :Assumption Day +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=8 +DTSTART + ;VALUE=DATE + :20020815 +DTEND + ;VALUE=DATE + :20020816 +DTSTAMP + :20030729T165951Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :987cb460-c1e5-11d7-88ed-80ad77fef631 +SUMMARY + :Dan spomina na mrtve +DESCRIPTION + :All Souls' Day +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +X-MOZILLA-RECUR-DEFAULT-UNITS + :years +RRULE + :FREQ=YEARLY;INTERVAL=1;BYMONTH=11 +DTSTART + ;VALUE=DATE + :20021101 +DTEND + ;VALUE=DATE + :20021102 +DTSTAMP + :20030729T165554Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e3729960-c1ec-11d7-9779-8dc1a2d76836 +SUMMARY + :Binkošti +DESCRIPTION + :Whit Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20030608 +DTEND + ;VALUE=DATE + :20030609 +DTSTAMP + :20030729T174803Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :d1c6e560-c1ea-11d7-ae08-c12c0c3b89e2 +SUMMARY + :Velikonočni ponedeljek +DESCRIPTION + :Easter Monday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20030421 +DTEND + ;VALUE=DATE + :20030422 +DTSTAMP + :20030729T173320Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :fa781240-c1ea-11d7-8a72-f55cb0a9e06c +SUMMARY + :Velikonočna nedelja +DESCRIPTION + :Easter Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20030420 +DTEND + ;VALUE=DATE + :20030421 +DTSTAMP + :20030729T173422Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :5f99a8a0-c1eb-11d7-8da2-ebe230e87e5a +SUMMARY + :Velikonočni ponedeljek +DESCRIPTION + :Easter Monday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20040412 +DTEND + ;VALUE=DATE + :20040413 +DTSTAMP + :20030729T173719Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :773bc4c0-c1eb-11d7-a63c-b9034972bae0 +SUMMARY + :Velikonočna nedelja +DESCRIPTION + :Easter Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20040411 +DTEND + ;VALUE=DATE + :20040412 +DTSTAMP + :20030729T173759Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :451a9960-c1ed-11d7-b9d7-ed849f405417 +SUMMARY + :Binkošti +DESCRIPTION + :Whit Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20040530 +DTEND + ;VALUE=DATE + :20040531 +DTSTAMP + :20030729T175053Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :9dfe8f20-c1eb-11d7-8d28-f654450ea931 +SUMMARY + :Velikonočni ponedeljek +DESCRIPTION + :Easter Monday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20050328 +DTEND + ;VALUE=DATE + :20050329 +DTSTAMP + :20030729T173926Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :d2046e20-c1eb-11d7-bf17-d820d086ca6f +SUMMARY + :Velikonočna nedelja +DESCRIPTION + :Easter Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20050327 +DTEND + ;VALUE=DATE + :20050328 +DTSTAMP + :20030729T174014Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :a1c0dc60-c1ed-11d7-80cc-fb6a19bb386e +SUMMARY + :Binkošti +DESCRIPTION + :Whit Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20050515 +DTEND + ;VALUE=DATE + :20050516 +DTSTAMP + :20030729T175330Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :cc606bc0-c1ed-11d7-80bc-d4667013b3b2 +SUMMARY + :Velikonočna nedelja +DESCRIPTION + :Easter Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20060416 +DTEND + ;VALUE=DATE + :20060417 +DTSTAMP + :20030729T175439Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e3084960-c1ed-11d7-863a-9b7ba7b3c681 +SUMMARY + :Velikonočni ponedeljek +DESCRIPTION + :Easter Monday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20060417 +DTEND + ;VALUE=DATE + :20060418 +DTSTAMP + :20030729T175517Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :fedc9d80-c1ed-11d7-85ed-81b52cc71682 +SUMMARY + :Binkošti +DESCRIPTION + :Whit Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20060604 +DTEND + ;VALUE=DATE + :20060605 +DTSTAMP + :20030729T175606Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :2d050580-c1ee-11d7-a597-b23b98fe4959 +SUMMARY + :Velikonočna nedelja +DESCRIPTION + :Easter Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20070408 +DTEND + ;VALUE=DATE + :20070409 +DTSTAMP + :20030729T175714Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :4383b040-c1ee-11d7-b464-a63598678e15 +SUMMARY + :Velikonočni ponedeljek +DESCRIPTION + :Easter Monday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20070409 +DTEND + ;VALUE=DATE + :20070410 +DTSTAMP + :20030729T175800Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :5dd5f840-c1ee-11d7-ab31-9425bbb0061c +SUMMARY + :Binkošti +DESCRIPTION + :Whit Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20070527 +DTEND + ;VALUE=DATE + :20070528 +DTSTAMP + :20030729T175847Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :8f1ae280-c1ee-11d7-a2b2-868b5e0b4b7c +SUMMARY + :Velikonočna nedelja +DESCRIPTION + :Easter Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20080323 +DTEND + ;VALUE=DATE + :20080324 +DTSTAMP + :20030729T180007Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :a3f5ef60-c1ee-11d7-ab12-99353f83d106 +SUMMARY + :Velikonočni ponedeljek +DESCRIPTION + :Easter Monday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20080324 +DTEND + ;VALUE=DATE + :20080325 +DTSTAMP + :20030729T180043Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :c068f480-c1ee-11d7-ba2e-e8e11ed60286 +SUMMARY + :Binkošti +DESCRIPTION + :Whit Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20080511 +DTEND + ;VALUE=DATE + :20080512 +DTSTAMP + :20030729T180126Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :e9f454c0-c1ee-11d7-9204-f07af1005a91 +SUMMARY + :Velikonočna nedelja +DESCRIPTION + :Easter Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20090412 +DTEND + ;VALUE=DATE + :20090413 +DTSTAMP + :20030729T180239Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :02c490a0-c1ef-11d7-8fa8-e2deb4c6b8a0 +SUMMARY + :Velikonočni ponedeljek +DESCRIPTION + :Easter Monday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20090413 +DTEND + ;VALUE=DATE + :20090414 +DTSTAMP + :20030729T180316Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :1f0e62e0-c1ef-11d7-bc7b-f58b2b84b22d +SUMMARY + :Binkošti +DESCRIPTION + :Whit Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20090531 +DTEND + ;VALUE=DATE + :20090601 +DTSTAMP + :20030729T180412Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :4b40c740-c1ef-11d7-b1f8-88895674139b +SUMMARY + :Velikonočna nedelja +DESCRIPTION + :Easter Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20100404 +DTEND + ;VALUE=DATE + :20100405 +DTSTAMP + :20030729T180514Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :64c07d00-c1ef-11d7-94fb-9d960da024b9 +SUMMARY + :Velikonočni ponedeljek +DESCRIPTION + :Easter Monday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20100405 +DTEND + ;VALUE=DATE + :20100406 +DTSTAMP + :20030729T180601Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :7f80a200-c1ef-11d7-b1dd-961736674f0a +SUMMARY + :Binkošti +DESCRIPTION + :Whit Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20100523 +DTEND + ;VALUE=DATE + :20100524 +DTSTAMP + :20030729T180650Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :a1a664a0-c1ef-11d7-8935-e5a0840b3e92 +SUMMARY + :Velikonočna nedelja +DESCRIPTION + :Easter Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20110424 +DTEND + ;VALUE=DATE + :20110425 +DTSTAMP + :20030729T180751Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :b855e360-c1ef-11d7-bf97-801edaa4909e +SUMMARY + :Velikonočni ponedeljek +DESCRIPTION + :Easter Monday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20110425 +DTEND + ;VALUE=DATE + :20110426 +DTSTAMP + :20030729T180825Z +END:VEVENT +END:VCALENDAR +BEGIN:VCALENDAR +VERSION + :2.0 +PRODID + :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID + :d0f3c4a0-c1ef-11d7-8ab1-e51b79c5e0a9 +SUMMARY + :Binkošti +DESCRIPTION + :Whit Sunday +LOCATION + :Slovenija +CATEGORIES + :Public Holiday +STATUS + :CONFIRMED +CLASS + :PUBLIC +DTSTART + ;VALUE=DATE + :20110612 +DTEND + ;VALUE=DATE + :20110613 +DTSTAMP + :20030729T180912Z +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/SouthAfricaHolidays.ics b/media/caldata/SouthAfricaHolidays.ics new file mode 100644 index 00000000000..604af0a2d74 --- /dev/null +++ b/media/caldata/SouthAfricaHolidays.ics @@ -0,0 +1,300 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20120219T115113Z +LAST-MODIFIED:20120219T115119Z +DTSTAMP:20120219T115119Z +UID:2ad48cfe-e8ae-459f-b2bd-463f46bda0e7 +SUMMARY:Public Holiday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120102 +DTEND;VALUE=DATE:20120103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115113Z +LAST-MODIFIED:20120219T115131Z +DTSTAMP:20120219T115131Z +UID:b845a2c4-4695-4492-a4e7-bb42e515663d +SUMMARY:Public Holiday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121217 +DTEND;VALUE=DATE:20121218 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115113Z +LAST-MODIFIED:20120219T115139Z +DTSTAMP:20120219T115139Z +UID:4d7a4826-be83-4f8e-a432-56483402a4db +SUMMARY:Public Holiday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130617 +DTEND;VALUE=DATE:20130618 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115113Z +LAST-MODIFIED:20120219T115152Z +DTSTAMP:20120219T115152Z +UID:535ce599-0eea-4294-98cb-f0932b040c28 +SUMMARY:Public Holiday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140428 +DTEND;VALUE=DATE:20140429 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115113Z +LAST-MODIFIED:20120219T115505Z +DTSTAMP:20120219T115505Z +UID:1cdcda29-02a4-4e67-b989-1da428a22847 +SUMMARY:Public Holiday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150810 +DTEND;VALUE=DATE:20150811 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115525Z +LAST-MODIFIED:20120219T115529Z +DTSTAMP:20120219T115529Z +UID:8a71529f-daa1-4d3b-b7ef-498b903b584b +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115537Z +LAST-MODIFIED:20120219T115541Z +DTSTAMP:20120219T115541Z +UID:1c250400-344c-4b7f-87c7-c523337b1e30 +SUMMARY:Family Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115525Z +LAST-MODIFIED:20120219T115554Z +DTSTAMP:20120219T115554Z +UID:e8e530eb-ac1e-456b-bee1-edef69142395 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115537Z +LAST-MODIFIED:20120219T115554Z +DTSTAMP:20120219T115554Z +UID:08102ed3-d207-42b3-b43f-98d830fc2761 +SUMMARY:Family Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115525Z +LAST-MODIFIED:20120219T120208Z +DTSTAMP:20120219T120208Z +UID:07c4d2cc-5af9-4b2e-b716-bfa0806fa8d7 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115537Z +LAST-MODIFIED:20120219T120208Z +DTSTAMP:20120219T120208Z +UID:f402360c-87d5-4cec-8125-9261f065470b +SUMMARY:Family Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115525Z +LAST-MODIFIED:20120219T120336Z +DTSTAMP:20120219T120336Z +UID:5eb35b58-7606-496a-9b90-bc770591e69a +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115537Z +LAST-MODIFIED:20120219T120336Z +DTSTAMP:20120219T120336Z +UID:c8fb803e-bdac-4dee-8457-da35d500dd31 +SUMMARY:Family Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T114627Z +LAST-MODIFIED:20120219T114647Z +DTSTAMP:20120219T114647Z +UID:5499611e-bde3-4bcc-b87b-b61800650864 +RDATE;VALUE=DATE:20120321 +EXDATE;VALUE=DATE:20120321 +DTSTART;VALUE=DATE:20120321 +DTEND;VALUE=DATE:20120610 +X-MOZ-FAKED-MASTER:1 +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T114520Z +LAST-MODIFIED:20120219T115226Z +DTSTAMP:20120219T115226Z +UID:9e7e0681-0d75-426e-8cf7-ddb3900d6303 +SUMMARY:New Year's Day +RRULE:FREQ=YEARLY;UNTIL=20150101;BYMONTHDAY=1;BYMONTH=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120101 +DTEND;VALUE=DATE:20120102 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T114652Z +LAST-MODIFIED:20120219T115240Z +DTSTAMP:20120219T115240Z +UID:9da1af6c-1a84-4993-8a3b-da35ff0f8dab +SUMMARY:Human Rights Day +RRULE:FREQ=YEARLY;UNTIL=20150321;BYMONTHDAY=21;BYMONTH=3 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120321 +DTEND;VALUE=DATE:20120322 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T114727Z +LAST-MODIFIED:20120219T115248Z +DTSTAMP:20120219T115248Z +UID:85b0b6d1-9035-4b21-9648-689f62afb6b2 +SUMMARY:Freedom Day +RRULE:FREQ=YEARLY;UNTIL=20150427;BYMONTHDAY=27;BYMONTH=4 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120427 +DTEND;VALUE=DATE:20120428 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T114809Z +LAST-MODIFIED:20120219T115257Z +DTSTAMP:20120219T115257Z +UID:970fe8bc-6b0a-47c5-98e3-359b25bff059 +SUMMARY:Workers' Day +RRULE:FREQ=YEARLY;UNTIL=20150501;BYMONTHDAY=1;BYMONTH=5 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120501 +DTEND;VALUE=DATE:20120502 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T114831Z +LAST-MODIFIED:20120219T115312Z +DTSTAMP:20120219T115312Z +UID:f980b292-e8e1-4a3a-b6fa-5cf1e07ba403 +SUMMARY:Youth Day +RRULE:FREQ=YEARLY;UNTIL=20150616;BYMONTHDAY=16;BYMONTH=6 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120616 +DTEND;VALUE=DATE:20120617 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T114854Z +LAST-MODIFIED:20120219T115320Z +DTSTAMP:20120219T115320Z +UID:1543194f-8b80-4cb6-875d-a8fb36c65f16 +SUMMARY:National Women's Day +RRULE:FREQ=YEARLY;UNTIL=20150809;BYMONTHDAY=9;BYMONTH=8 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120809 +DTEND;VALUE=DATE:20120810 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T114922Z +LAST-MODIFIED:20120219T115328Z +DTSTAMP:20120219T115328Z +UID:d73822cb-16be-4fa9-a482-90b3699a2afd +SUMMARY:Heritage Day +RRULE:FREQ=YEARLY;UNTIL=20150924;BYMONTHDAY=24;BYMONTH=9 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120924 +DTEND;VALUE=DATE:20120925 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T114946Z +LAST-MODIFIED:20120219T115339Z +DTSTAMP:20120219T115339Z +UID:1aed49da-f2ff-4ffb-8199-4b960a12777a +SUMMARY:Day of Reconciliation +RRULE:FREQ=YEARLY;UNTIL=20151216;BYMONTHDAY=16;BYMONTH=12 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121216 +DTEND;VALUE=DATE:20121217 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115005Z +LAST-MODIFIED:20120219T115345Z +DTSTAMP:20120219T115345Z +UID:c6612438-76b7-420d-bbb8-8df1bfda42a9 +SUMMARY:Christmas Day +RRULE:FREQ=YEARLY;UNTIL=20151225;BYMONTHDAY=25;BYMONTH=12 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120219T115021Z +LAST-MODIFIED:20120219T115352Z +DTSTAMP:20120219T115352Z +UID:ee5699a2-884a-45a1-8586-1c42e0106419 +SUMMARY:Day of Goodwill +RRULE:FREQ=YEARLY;UNTIL=20151226;BYMONTHDAY=26;BYMONTH=12 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121226 +DTEND;VALUE=DATE:20121227 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/SouthKoreaHolidays.ics b/media/caldata/SouthKoreaHolidays.ics new file mode 100644 index 00000000000..11c896bba89 --- /dev/null +++ b/media/caldata/SouthKoreaHolidays.ics @@ -0,0 +1,603 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20080828T170752Z +LAST-MODIFIED:20090611T212123Z +UID:5bea1089-6089-401b-82b1-43b5fac1683f +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000205 +DTEND;VALUE=DATE:20000206 +DESCRIPTION:용띠\nYear of the Dragon +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T170912Z +LAST-MODIFIED:20090611T212123Z +UID:7d481252-f450-4817-ab6d-a62ef4287491 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20010124 +DTEND;VALUE=DATE:20010125 +DESCRIPTION:뱀띠\nYear of the Snake +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T170947Z +LAST-MODIFIED:20090611T212123Z +UID:7ff20ec5-e47f-4a4e-a4c3-8114d2094a5e +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20020212 +DTEND;VALUE=DATE:20020213 +DESCRIPTION:말띠\nYear of the horse. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171029Z +LAST-MODIFIED:20090611T212123Z +UID:42c0a3d7-2d69-4501-86f9-bcb6cddf55c2 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20030201 +DTEND;VALUE=DATE:20030202 +DESCRIPTION:염소띠\nYear of the sheep. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171057Z +LAST-MODIFIED:20090611T212123Z +UID:4a6cdb26-9e37-4e32-84a0-3c8dd5220fed +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20040122 +DTEND;VALUE=DATE:20040123 +DESCRIPTION:원숭이띠\nYear of the monkey. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171140Z +LAST-MODIFIED:20090611T212123Z +UID:60c5c4f2-080b-4e38-883d-7d58566c75df +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20050208 +DTEND;VALUE=DATE:20050209 +DESCRIPTION:닥띠\nYear of the chicken. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171208Z +LAST-MODIFIED:20090611T212123Z +UID:19ea962f-b59f-4fe1-b774-0e646cda725f +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20060129 +DTEND;VALUE=DATE:20060130 +DESCRIPTION:개띠\nYear of the dog. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171238Z +LAST-MODIFIED:20090611T212123Z +UID:492eb5e3-253b-44f7-b6ef-da5f00b12ec1 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20070218 +DTEND;VALUE=DATE:20070219 +DESCRIPTION:돼지띠\nYear of the pig. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171318Z +LAST-MODIFIED:20090611T212123Z +UID:4acf96db-49ab-4192-a12a-a32dc3426079 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20080207 +DTEND;VALUE=DATE:20080208 +DESCRIPTION: 쥐띠\nYear of the rat. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171356Z +LAST-MODIFIED:20090611T212123Z +UID:2726a403-e475-461d-9c91-428850ad1485 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090126 +DTEND;VALUE=DATE:20090127 +DESCRIPTION:소띠\nYear of the ox. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171423Z +LAST-MODIFIED:20090611T212123Z +UID:2ebbe105-9060-4e8f-b1bc-ffc48602d501 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100214 +DTEND;VALUE=DATE:20100215 +DESCRIPTION:호랑이띠\nYear of the tiger. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171456Z +LAST-MODIFIED:20090611T212123Z +UID:25f05aa5-cd3e-4f32-9fd7-955cee366b2d +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110203 +DTEND;VALUE=DATE:20110204 +DESCRIPTION:토끼띠\nYear of the rabbit. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171524Z +LAST-MODIFIED:20090611T212123Z +UID:cf35e9ce-3c5e-4098-af70-2bfdb8f307b1 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120123 +DTEND;VALUE=DATE:20120124 +DESCRIPTION:용띠\nYear of the dragon. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171557Z +LAST-MODIFIED:20090611T212123Z +UID:cf068987-4999-44ff-9f5c-8ab68db5b058 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130210 +DTEND;VALUE=DATE:20130211 +DESCRIPTION:뱀띠\nYear of the snake. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171625Z +LAST-MODIFIED:20090611T212123Z +UID:f032dab8-2b10-4e54-9096-9c358c937776 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140131 +DTEND;VALUE=DATE:20140201 +DESCRIPTION:말띠\nYear of the horse. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171655Z +LAST-MODIFIED:20090611T212123Z +UID:37b5e005-81dd-423c-a8c2-afe50606e241 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150219 +DTEND;VALUE=DATE:20150220 +DESCRIPTION:염소띠\nYear of the sheep. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171722Z +LAST-MODIFIED:20090611T212123Z +UID:1dd6b2ce-9c8e-4db0-a1cd-2931a16a76d8 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160208 +DTEND;VALUE=DATE:20160209 +DESCRIPTION:원숭이띠\nYear of the monkey. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171749Z +LAST-MODIFIED:20090611T212123Z +UID:fd2a665a-3300-4bf3-aeff-eb3c716bf434 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170128 +DTEND;VALUE=DATE:20170129 +DESCRIPTION:닥띠\nYear of the chicken. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171827Z +LAST-MODIFIED:20090611T212123Z +UID:61054408-a699-4c02-a716-175e846ce4a6 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180216 +DTEND;VALUE=DATE:20180217 +DESCRIPTION:개띠\nYear of the dog. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171912Z +LAST-MODIFIED:20090611T212123Z +UID:3d064a26-70f2-431a-985a-ffd27be9e210 +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190205 +DTEND;VALUE=DATE:20190206 +DESCRIPTION:돼지띠\nYear of the pig. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T171953Z +LAST-MODIFIED:20090611T212123Z +UID:45772bb7-5f27-40a4-9b40-e2c17858705c +SUMMARY:설날 Lunar New Year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200125 +DTEND;VALUE=DATE:20200126 +DESCRIPTION:쥐띠\nYear of the rat. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T065501Z +LAST-MODIFIED:20090611T212123Z +UID:486cff71-91f0-4074-8f73-38ad69f12697 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000912 +DTEND;VALUE=DATE:20000913 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T065959Z +LAST-MODIFIED:20090611T212124Z +UID:152cf19c-8ea0-40b3-9a33-78e1b9156a1b +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20011001 +DTEND;VALUE=DATE:20011002 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070037Z +LAST-MODIFIED:20090611T212124Z +UID:577cd07b-931e-44f5-bfec-4126f9d91f03 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20020921 +DTEND;VALUE=DATE:20020922 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070050Z +LAST-MODIFIED:20090611T212124Z +UID:74003c1e-21bb-4c43-8e83-dab7593540c9 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20030911 +DTEND;VALUE=DATE:20030912 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070104Z +LAST-MODIFIED:20090611T212124Z +UID:65dcebe2-3c00-4e9c-9800-bac8043d3491 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20040928 +DTEND;VALUE=DATE:20040929 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070119Z +LAST-MODIFIED:20090611T212124Z +UID:bba426b0-2fdd-43d8-98ae-bd8b901000f8 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20050918 +DTEND;VALUE=DATE:20050919 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070131Z +LAST-MODIFIED:20090611T212124Z +UID:aa8d03af-8852-4e72-9a54-e62ef83eac9f +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20061006 +DTEND;VALUE=DATE:20061007 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070147Z +LAST-MODIFIED:20090611T212124Z +UID:8e92ddd2-3fb1-459f-b6c3-cb4d1e98d13f +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20070925 +DTEND;VALUE=DATE:20070926 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070159Z +LAST-MODIFIED:20090611T212124Z +UID:31cc4b51-0362-4e10-8b25-dcfbb58ed17b +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20080914 +DTEND;VALUE=DATE:20080915 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070214Z +LAST-MODIFIED:20090611T212124Z +UID:48ce803e-28db-4f7a-ab5f-1ca99d7c73c9 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20091003 +DTEND;VALUE=DATE:20091004 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070227Z +LAST-MODIFIED:20090611T212124Z +UID:9df5942a-be66-4b2b-80e4-40188f9bf5b2 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100922 +DTEND;VALUE=DATE:20100923 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070237Z +LAST-MODIFIED:20090611T212124Z +UID:cf6ed891-5233-4b28-aa7b-f8e3d6d5ed60 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110912 +DTEND;VALUE=DATE:20110913 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070256Z +LAST-MODIFIED:20090611T212124Z +UID:dbaf9ecf-3a73-4361-894e-b49b773af494 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120930 +DTEND;VALUE=DATE:20121001 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070306Z +LAST-MODIFIED:20090611T212124Z +UID:aa1b50de-8195-403c-88ea-b233194a0f2f +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130919 +DTEND;VALUE=DATE:20130920 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070320Z +LAST-MODIFIED:20090611T212124Z +UID:def99dbb-76f5-419c-a763-06ab0d8e8922 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140908 +DTEND;VALUE=DATE:20140909 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070334Z +LAST-MODIFIED:20090611T212124Z +UID:0432c55b-eade-4154-a48f-a6848ab631a3 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150927 +DTEND;VALUE=DATE:20150928 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070346Z +LAST-MODIFIED:20090611T212124Z +UID:83c6ec6c-43ec-44ed-80ff-a1bd6da0a8eb +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160915 +DTEND;VALUE=DATE:20160916 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070359Z +LAST-MODIFIED:20090611T212124Z +UID:aa7b098a-6a8f-4fd2-88bc-14e7b5c84c39 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20171004 +DTEND;VALUE=DATE:20171005 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070412Z +LAST-MODIFIED:20090611T212124Z +UID:fc550182-bfdb-49b9-afb8-9c4ec7fb17fd +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180924 +DTEND;VALUE=DATE:20180925 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070548Z +LAST-MODIFIED:20090611T212124Z +UID:d7e82f23-c621-4c91-aef5-db5bbc2a8967 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190913 +DTEND;VALUE=DATE:20190914 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080905T070634Z +LAST-MODIFIED:20090611T212124Z +UID:14bd697c-a319-47fd-9abc-fdff74be58e5 +SUMMARY:추석(한가위) Harvest Festival +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20201001 +DTEND;VALUE=DATE:20201002 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T214533Z +LAST-MODIFIED:20090611T212124Z +UID:2705d177-c4a1-4a09-a5eb-9637b65bb512 +SUMMARY:삼일절 Independence Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000301 +DTEND;VALUE=DATE:20000302 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T214709Z +LAST-MODIFIED:20090611T212124Z +UID:5ae39a0f-5ef9-44d9-9dd5-e90049578e07 +SUMMARY:식목일 Arbor Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000405 +DTEND;VALUE=DATE:20000406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T215011Z +LAST-MODIFIED:20090611T212124Z +UID:5a0c39c0-da3b-407d-824b-890c6b82bd95 +SUMMARY:어린이 날 Children's Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000505 +DTEND;VALUE=DATE:20000506 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T215644Z +LAST-MODIFIED:20090611T212124Z +UID:c5907e9d-4314-423f-9441-d7309d39db45 +SUMMARY:6-25 사변일 6/25 War Memorial +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000625 +DTEND;VALUE=DATE:20000626 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T215157Z +LAST-MODIFIED:20090611T212124Z +UID:741d7127-995f-43e0-a014-04280dcbb661 +SUMMARY:어버이 날 Paren't Day +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=5 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000510 +DTEND;VALUE=DATE:20000511 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T215305Z +LAST-MODIFIED:20090611T212124Z +UID:5309e45c-acca-4b4f-b7c4-fe7b3ddd545f +SUMMARY:스승의 날 Teacher's Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000515 +DTEND;VALUE=DATE:20000516 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T220143Z +LAST-MODIFIED:20090611T212124Z +UID:4f97c701-816b-4c23-a71e-13d2d2419c8f +SUMMARY:제헌절 Constitution Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000717 +DTEND;VALUE=DATE:20000718 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T220237Z +LAST-MODIFIED:20090611T212124Z +UID:1aba5d05-a8a7-4253-a6d2-66665bd2490d +SUMMARY:광복절 Liberation Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000815 +DTEND;VALUE=DATE:20000816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T220412Z +LAST-MODIFIED:20090611T212124Z +UID:220f5ee6-10a6-4227-87ca-197628adb976 +SUMMARY:개천절 Foundation Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001003 +DTEND;VALUE=DATE:20001004 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T220447Z +LAST-MODIFIED:20090611T212124Z +UID:a73ddfb4-c27f-4861-a92f-040e18a9c29c +SUMMARY:한글날 Korean Language Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001009 +DTEND;VALUE=DATE:20001010 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T170540Z +LAST-MODIFIED:20090611T212124Z +UID:63cdd0c5-dc38-4875-bd97-5ddcb72b6c7b +SUMMARY:신정 New Year's Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000101 +DTEND;VALUE=DATE:20000102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T172428Z +LAST-MODIFIED:20090611T212124Z +UID:99c12465-6366-4c9e-99c8-8635969cc7ee +SUMMARY:국군의 날 Armed Forces Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001001 +DTEND;VALUE=DATE:20001002 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T172624Z +LAST-MODIFIED:20090611T212124Z +UID:e72416e0-706d-493f-b134-a35ad2700de4 +SUMMARY:기독탄신일(성탄절) Christmas Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001225 +DTEND;VALUE=DATE:20001226 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T215545Z +LAST-MODIFIED:20090616T140121Z +UID:c67d164c-c91c-4b46-a0fa-bff756119cde +SUMMARY:현충일 Memorial Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000606 +DTEND;VALUE=DATE:20000607 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/SpanishHolidays.ics b/media/caldata/SpanishHolidays.ics new file mode 100644 index 00000000000..b8afbffc1bb --- /dev/null +++ b/media/caldata/SpanishHolidays.ics @@ -0,0 +1,1892 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +X-WR-CALNAME:SpanishHolidays +X-WR-TIMEZONE:Europe/Madrid +BEGIN:VTIMEZONE +TZID:Europe/Madrid +X-LIC-LOCATION:Europe/Madrid +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20071120T230947Z +LAST-MODIFIED:20091106T235011Z +DTSTAMP:20091129T210350Z +UID:e16cf5c6-e944-45a2-bb52-16192b20f949 +SUMMARY:Día siguiente a la Epifanía del Señor (excepto Baleares\, Canta + bria\, Cataluña\, Valencia\, Galicia\, Murcia\, Navarra\, País Vasco y L + a Rioja) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080107 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080108 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T231217Z +LAST-MODIFIED:20091106T235011Z +DTSTAMP:20091129T210350Z +UID:f2f11a53-6615-452a-abf6-ef6c442c7f55 +SUMMARY:Día de Andalucía +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080228 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080229 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T231456Z +LAST-MODIFIED:20091106T235011Z +DTSTAMP:20091129T210350Z +UID:8be44065-01ba-4ea6-afe2-abc740c60ea0 +SUMMARY:Día de San José (Castilla La Mancha\, Valencia\, Galicia\, Murci + a\, Navarra\, País Vasco y Melilla) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080319 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080320 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T231619Z +LAST-MODIFIED:20091106T235011Z +DTSTAMP:20091129T210350Z +UID:a591a394-f306-462c-9f3b-f2c087b2ba6c +SUMMARY:Jueves Santo (excepto Cataluña) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080320 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080321 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T231712Z +LAST-MODIFIED:20091106T235011Z +DTSTAMP:20091129T210350Z +UID:322d2073-ec36-4bb3-a884-a34e39daea0a +SUMMARY:Lunes de Pascua (Baleares\, Cataluña\, Valencia\, Navarra\, País + Vasco y La Rioja) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080324 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T231825Z +LAST-MODIFIED:20091106T235011Z +DTSTAMP:20091129T210350Z +UID:ad2ad91c-17fa-4a3c-a2d0-6453319e6675 +SUMMARY:San Jorge (Día de Aragón) / Día de la Comunidad (Castilla León + ) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080423 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080424 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T231957Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:f8b8278b-6e14-44a2-9cae-06dd0e5819c0 +SUMMARY:Fiesta de la Comunidad de Madrid +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080502 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080503 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232031Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:99688402-d17f-45b8-afa4-78854786aec6 +SUMMARY:Día de las Letras Gallegas +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080517 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232126Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:49874964-170a-4d5f-9a1c-2ff7ed829ca7 +SUMMARY:Día de Canarias +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080530 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232206Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:51806ce2-23cc-4df0-a041-2adb6dfb1ade +SUMMARY:Día de la Región de Castila La Mancha +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080531 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232250Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:4fe46de8-9b68-4d2f-a0d9-bb049192769d +SUMMARY:Día de la Región de Murcia / Día de La Rioja +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080609 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080610 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232324Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:79c18cb7-5b00-40ec-97e6-29a252bc5f7d +SUMMARY:San Juan (Cataluña) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080624 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080625 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232423Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:099dc283-2149-43f7-a870-c334f072c349 +SUMMARY:Santiago Apostol / Día Nacional de Galicia (Galicia\, Madrid\, Na + varra\, País Vasco y La Rioja) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080725 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080726 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232521Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:734256ed-6135-4953-a9e4-eaaae3f89543 +SUMMARY:Día de las Instituciones (Cantabria) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080728 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080729 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232649Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:e309e0c4-f675-4a6b-bc7a-2218644a5320 +SUMMARY:Día de la Comunidad Autónoma de Ceuta +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080902 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080903 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232710Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:28bc5d14-5d2b-4b04-b67f-e738a34d7568 +SUMMARY:Día de Asturias / Día de Extremadura +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080908 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080909 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232802Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:b738aca0-31aa-4091-a6a4-e72e37926a34 +SUMMARY:Fiesta Nacional de Cataluña +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080911 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080912 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232848Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:d7786d0c-a33e-48eb-8d9d-1d1f7b26d222 +SUMMARY:La Bien Aparecida (Cantabria) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080915 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080916 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232928Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:873b1bd1-4a93-49f9-9bbd-c48825b16974 +SUMMARY:Día de la Comunitat Valenciana +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20081009 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20081010 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T232955Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:f640ffdf-a4cc-43fc-b8d9-799cb3912d21 +SUMMARY:Lunes siguiente a la Fiesta Nacional de España (excepto Canarias\ + , Castilla La Mancha\, Cataluña\, Valencia\, Galicia\, Madrid\, Navarra\, + País Vasco y La Rioja) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20081013 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20081014 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T233402Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:5ccd607f-7794-4520-8273-8223557a2a07 +SUMMARY:San Esteban\, segunda fiesta de Navidad (Baleares y Cataluña) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20081226 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20081227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T224241Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:cac11750-fe97-4b10-852d-623d50027343 +SUMMARY:Día de Andalucía +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090228 +DTEND;VALUE=DATE:20090301 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T224446Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:a16af95d-3419-4a0d-b76d-8430ce7b715d +SUMMARY:San José (Castilla La Mancha\, Castilla León\, Galicia\, Madrid\ + , Melilla\, Murcia\, Navarra\, País Vasco\, La Rioja y Valencia) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090319 +DTEND;VALUE=DATE:20090320 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T224650Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:2ba9d6b0-dc75-45fe-9fbd-c02198f90ccd +SUMMARY:Jueves Santo (excepto Cataluña) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090409 +DTEND;VALUE=DATE:20090410 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T224803Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:20bc34e6-e53e-40d9-b0de-2b2939f110df +SUMMARY:Lunes de Pascua (Baleares\, Cataluña\, Navarra\, País Vasco y Va + lencia) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T224851Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:1fa31c6f-cd26-4fff-ae49-ddd3fd51f638 +SUMMARY:Fiesta de la comunidad autónoma (Castilla León) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090423 +DTEND;VALUE=DATE:20090424 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T224917Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:6ddd2f28-996e-4757-8c27-bfcbb64b6d54 +SUMMARY:San Jorge (Día de Aragón) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090424 +DTEND;VALUE=DATE:20090425 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225010Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:645ae10a-e17a-4e55-94cc-48b71a62795a +SUMMARY:Fiesta de la Comunidad de Madrid +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090502 +DTEND;VALUE=DATE:20090503 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225032Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:2480fc43-d443-42be-8b99-2a95f08b8bd8 +SUMMARY:Día de Canarias +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090530 +DTEND;VALUE=DATE:20090531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225054Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:34bf92f3-0c88-47fd-99b2-75cbcdb2a1ed +SUMMARY:Día de la Región Castilla La Mancha +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090601 +DTEND;VALUE=DATE:20090602 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225112Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:c050ba8a-6145-4c21-b187-42aa72bb2cee +SUMMARY:Día de la Región de Murcia / Día de La Rioja +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090609 +DTEND;VALUE=DATE:20090610 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225222Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:fd8f5675-7d75-44af-b496-f28084b82721 +SUMMARY:Corpus Christi (Madrid) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090611 +DTEND;VALUE=DATE:20090612 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225253Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:f9144185-b70e-461e-9e34-d608900138a3 +SUMMARY:San Juan (Cataluña) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090624 +DTEND;VALUE=DATE:20090625 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225314Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:152a2655-4c43-4d9c-bd74-ecc84919552c +SUMMARY:Santiago Apostol (Galicia\, Navarra y País Vasco) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090725 +DTEND;VALUE=DATE:20090726 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225348Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:9e8f6b17-7f3f-4241-81b3-f80c122c488a +SUMMARY:Día de las Instituciones (Cantabria) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090728 +DTEND;VALUE=DATE:20090729 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225446Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:bd1b45ac-a717-4e65-b5d5-70f1de716b42 +SUMMARY:Día de la Ciudad Autónoma de Ceuta +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090902 +DTEND;VALUE=DATE:20090903 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225515Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:8a0fc810-86b7-45ff-8175-b6055f2878dd +SUMMARY:Día de Asturias / Día de Extremadura +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090908 +DTEND;VALUE=DATE:20090909 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225539Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:70e034b7-87f0-4f68-b3b6-ca61e5a68dc7 +SUMMARY:Fiesta Nacional de Cataluña +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090911 +DTEND;VALUE=DATE:20090912 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225609Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:9d4ed294-6ddb-4837-b3fc-91c253a6cf1d +SUMMARY:La Bien Aparecida (Cantabria) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090915 +DTEND;VALUE=DATE:20090916 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225730Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:e7ae79c3-1e78-4aba-affb-5122e30ae10d +SUMMARY:Día de la Comunidad Valenciana +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20091009 +DTEND;VALUE=DATE:20091010 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225809Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210349Z +UID:bad22cdf-d5a7-497f-8ed4-a62f8cd36821 +SUMMARY:Lunes siguiente a Todos los Santos (Andalucía\, Aragón\, Asturia + s\, Castilla León\, Ceuta\, Extremadura y Melilla) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20091102 +DTEND;VALUE=DATE:20091103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T225942Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:6b6e2bad-3b00-47db-952c-353c40a76a67 +SUMMARY:Lunes siguiente al Día de la Constitución Española (excepto Cas + tilla León\, Cataluña\, Madrid\, Navarra\, País Vasco y Valencia) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20091207 +DTEND;VALUE=DATE:20091208 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081116T230205Z +LAST-MODIFIED:20091106T235012Z +DTSTAMP:20091129T210350Z +UID:222d5777-b2b3-4b81-a277-2d6a86077c12 +SUMMARY:San Esteban. Segunda fiesta de Navidad (Baleares y Cataluña) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235041Z +DTSTAMP:20091129T210350Z +UID:7d1d74e0-6004-4c74-b075-ecb6a53fb0e5 +SUMMARY:(Valencia) Día de la Comunidad Valenciana +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20071009 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20071010 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235041Z +DTSTAMP:20091129T210350Z +UID:e1702874-5407-40d6-a8c0-748530992aa5 +SUMMARY:(Cantabria) Nuestra Señora de la Bien Aparecida +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070915 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070916 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:722ad886-8d9e-4eea-933d-98a09e80ea2a +SUMMARY:(Cataluña) Día Nacional de Cataluña +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070911 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070912 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:c7f0ec65-84e1-468d-827b-e13992ad4314 +SUMMARY:(Asturias\, Extremadura) Día de Asturias\, Día de Extremadura +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070908 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070909 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:e38244b0-dcde-4ef3-bbaf-dc65fc3fcc56 +SUMMARY:(Ceuta) Día de Ceuta +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070902 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070903 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:52b9b334-6c2e-4a2d-b784-768030757704 +SUMMARY:(Galicia) Día Nacional de Galicia +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070725 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070726 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:32b3aa4f-0892-45b4-b70d-01e07ef8916f +SUMMARY:(Murcia\, Rioja) Día de Murcia\, día de La Rioja +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070609 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070610 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:1a6c822c-6872-4bd6-b225-1685b072c589 +SUMMARY:(Castilla-La Mancha) Día de Castilla-La Mancha +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070531 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070601 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:ca039d5d-548c-4b20-8ee5-554852537ccb +SUMMARY:(Canarias) Día de Canarias +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070530 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070531 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:0e023996-ce80-4935-b89d-c31dd0c29d48 +SUMMARY:(Galicia) Día de las Letras Gallegas +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070517 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070518 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:f4f828f8-5a4e-4c1d-8f90-7c9e372773c5 +SUMMARY:(Madrid) Día de la Comunidad de Madrid +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070502 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070503 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:abcf6851-f967-49d8-9ba9-482cfd3fa190 +SUMMARY:(Castilla y León y Aragón) Día de Castilla y León\, día de Ar + agón +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070423 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070424 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:f7545065-c5d5-4894-a72b-03a332f787a3 +SUMMARY:(Cataluña\, Valencia\, Navarra y País Vasco) Lunes de Pascua +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070409 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070410 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:cc94265b-4611-4f03-864f-9ecdc445be10 +SUMMARY:(Excepto Canarias\, Cataluña y Valencia) Jueves Santo +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070405 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070406 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20091106T235042Z +DTSTAMP:20091129T210350Z +UID:4c4d6d16-103c-4322-befd-a8c3741d7704 +SUMMARY:(Valencia\, Murcia\, Melilla) San José +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070319 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070320 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20130101T121108Z +DTSTAMP:20130101T121108Z +UID:7b533510-68f9-432f-a219-797d3b09dd72 +SUMMARY:Epifanía del Señor +RRULE:FREQ=YEARLY +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070106 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070107 +X-MOZ-GENERATION:5 +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T204958Z +LAST-MODIFIED:20091129T212010Z +DTSTAMP:20091129T210350Z +UID:26b2c97f-fa33-4bef-9572-89d9c66319c9 +SUMMARY:Día de Andalucía (trasladado) / Día de las Illes Balears +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100301 +DTEND;VALUE=DATE:20100302 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T212024Z +LAST-MODIFIED:20091129T212124Z +DTSTAMP:20091129T212024Z +UID:9675ccba-1ce8-4d58-a1b1-2a27bcd789c3 +SUMMARY:Jueves Santo (excepto Cataluña y Comunidad Valenciana) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100401 +DTEND;VALUE=DATE:20100402 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T212133Z +LAST-MODIFIED:20091129T213832Z +DTSTAMP:20091129T212133Z +UID:770d6991-ffa4-4559-b7e9-962e28cf2616 +SUMMARY:San José (excepto Andalucía\, Aragón\, Asturias\, Baleares\, Ca + narias\, Cantabria\, Cataluña y Ceuta) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100319 +DTEND;VALUE=DATE:20100320 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T214001Z +LAST-MODIFIED:20091129T214229Z +DTSTAMP:20091129T214001Z +UID:4f42461c-ac13-496e-9ca9-570355ec2c10 +SUMMARY:Lunes de Pascua (Baleares\, Cataluña\, Comunidad Valenciana\, Nav + arra y País Vasco) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T214243Z +LAST-MODIFIED:20091129T214520Z +DTSTAMP:20091129T214243Z +UID:71eb385e-6f32-4c5f-aacc-51071a8a72b4 +SUMMARY:Fiesta de la Comunidad Autónoma (Castilla y León) / San Jorge (D + ía de Aragón) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100423 +DTEND;VALUE=DATE:20100424 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T214652Z +LAST-MODIFIED:20091129T214727Z +DTSTAMP:20091129T214652Z +UID:20091ff0-eb4f-47b7-9716-3bd05c869cfb +SUMMARY:Día de las Letras Gallegas +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100517 +DTEND;VALUE=DATE:20100518 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T215019Z +LAST-MODIFIED:20091129T215114Z +DTSTAMP:20091129T215019Z +UID:4d09e055-a5a6-4b1c-a70d-48a163e17578 +SUMMARY:Día de Castilla-La Mancha / Día de Canarias +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100531 +DTEND;VALUE=DATE:20100601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T215131Z +LAST-MODIFIED:20091129T215153Z +DTSTAMP:20091129T215131Z +UID:b89dc408-7fc1-47c5-a924-8f85c5092128 +SUMMARY:Fiesta del Corpus Christi (Madrid) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100603 +DTEND;VALUE=DATE:20100604 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T215312Z +LAST-MODIFIED:20091129T215340Z +DTSTAMP:20091129T215312Z +UID:ce09e09d-becd-4ae1-9f62-d833f25c44a6 +SUMMARY:Día de la Región de Murcia / Día de La Rioja +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100609 +DTEND;VALUE=DATE:20100610 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T215351Z +LAST-MODIFIED:20091129T215416Z +DTSTAMP:20091129T215351Z +UID:8fd3b18b-4e3d-4274-bf6c-4cf3f2158267 +SUMMARY:San Juan (Cataluña) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100624 +DTEND;VALUE=DATE:20100625 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T220402Z +LAST-MODIFIED:20091129T220427Z +DTSTAMP:20091129T220402Z +UID:7d33f112-55c7-4cf6-9287-6333e91349e8 +SUMMARY:Día de las Instituciones (Cantabria) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100728 +DTEND;VALUE=DATE:20100729 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T220522Z +LAST-MODIFIED:20091129T220558Z +DTSTAMP:20091129T220522Z +UID:fb7732ee-7d04-4a65-a9e4-3f098268b04e +SUMMARY:Lunes siguiente a la Asunción de la Virgen (Andalucía\, Aragón + y Asturias) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100816 +DTEND;VALUE=DATE:20100817 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T220610Z +LAST-MODIFIED:20091129T220629Z +DTSTAMP:20091129T220610Z +UID:701d62cd-279b-434a-b032-4d8755db30cc +SUMMARY:Día de la Ciudad Autónoma de Ceuta +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100902 +DTEND;VALUE=DATE:20100903 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T220636Z +LAST-MODIFIED:20091129T220703Z +DTSTAMP:20091129T220636Z +UID:223a4b81-4e3e-473d-88cb-4e6a548bd592 +SUMMARY:Día de Asturias / Día de Extremadura +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100908 +DTEND;VALUE=DATE:20100909 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T220711Z +LAST-MODIFIED:20091129T220726Z +DTSTAMP:20091129T220711Z +UID:d54aba97-0fd6-40b4-87d4-c152a0257a08 +SUMMARY:Fiesta Nacional de Cataluña +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100911 +DTEND;VALUE=DATE:20100912 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T221039Z +LAST-MODIFIED:20091129T221054Z +DTSTAMP:20091129T221039Z +UID:388ba466-c4e0-42de-ac1a-c5120ca2177e +SUMMARY:La Bien Aparecida (Cantabria) +DTSTART;VALUE=DATE:20100915 +DTEND;VALUE=DATE:20100916 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T221112Z +LAST-MODIFIED:20091129T221127Z +DTSTAMP:20091129T221112Z +UID:736f7123-a346-48b6-ab01-f4db8d0bb6c3 +SUMMARY:Día de la Comunidad Valenciana +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20101009 +DTEND;VALUE=DATE:20101010 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091129T221255Z +LAST-MODIFIED:20091129T221335Z +DTSTAMP:20091129T221255Z +UID:60b43df2-6382-4756-8766-37f68f43fbbd +SUMMARY:Pascua del Sacrificio (Aid El Kebir) (Ceuta y Melilla) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20101117 +DTEND;VALUE=DATE:20101118 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T111837Z +LAST-MODIFIED:20101205T112020Z +DTSTAMP:20101205T112020Z +UID:8a093692-60ba-4867-b18f-51cd59d9376f +SUMMARY:Día de Andalucía +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110228 +DTEND;VALUE=DATE:20110301 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20101205T112128Z +DTSTAMP:20101205T112128Z +UID:4f1a3591-5191-44bc-92d5-59dd0054cbb7 +SUMMARY:Día de Andalucía +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070228 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070301 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20101205T112207Z +DTSTAMP:20101205T112207Z +UID:dc45212f-e40d-428d-93f0-7e82c96b1560 +SUMMARY:Día de las Islas Baleares +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070301 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070302 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20101205T112220Z +DTSTAMP:20101205T112220Z +UID:57863600-4d02-4839-a949-ab8e59d3f64e +SUMMARY:San Esteban. Segunda Fiesta de Natividad (Baleares) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20071226 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20071227 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071120T231410Z +LAST-MODIFIED:20101205T112255Z +DTSTAMP:20101205T112255Z +UID:f4130d91-6556-4b7d-a3b4-0b0dfaaceeb2 +SUMMARY:Fiesta del Estatuto de Autonomía / Día de las Illes Balears +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20080301 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20080302 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T112449Z +LAST-MODIFIED:20101205T112508Z +DTSTAMP:20101205T112508Z +UID:80a43931-fa54-4e8b-a3fe-5e8a4871cfc7 +SUMMARY:Día de las Illes Balears +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110301 +DTEND;VALUE=DATE:20110302 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T112636Z +LAST-MODIFIED:20101205T112656Z +DTSTAMP:20101205T112656Z +UID:40271441-1b2a-485f-a8e8-6a7eca72081d +SUMMARY:Jueves Santo (excepto Cataluña) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110421 +DTEND;VALUE=DATE:20110422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20101205T112926Z +DTSTAMP:20101205T112926Z +UID:062231ec-9626-4108-af1e-c102c858d1e2 +SUMMARY:Viernes Santo +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070406 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070407 +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T113110Z +LAST-MODIFIED:20101205T113120Z +DTSTAMP:20101205T113120Z +UID:2692bbca-679f-41e1-a924-e38350167215 +SUMMARY:Viernes Santo +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20080321 +DTEND;VALUE=DATE:20080322 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T113151Z +LAST-MODIFIED:20101205T113157Z +DTSTAMP:20101205T113157Z +UID:00d647d9-4795-45d1-be42-15f570bc7fe8 +SUMMARY:Viernes Santo +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T113212Z +LAST-MODIFIED:20101205T113217Z +DTSTAMP:20101205T113217Z +UID:69150327-21ae-4117-b66e-93adcd1e2939 +SUMMARY:Viernes Santo +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T113228Z +LAST-MODIFIED:20101205T113235Z +DTSTAMP:20101205T113235Z +UID:fad0bd21-195e-4e84-801e-3930ae7a3a4b +SUMMARY:Viernes Santo +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T113309Z +LAST-MODIFIED:20101205T113400Z +DTSTAMP:20101205T113400Z +UID:1b1abe0a-bef1-4863-998e-fc5a392aef11 +SUMMARY:San Jorge (Día de Aragón) / Fiesta de la Comunidad Autónoma (Ca + stilla y León) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110423 +DTEND;VALUE=DATE:20110424 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T113413Z +LAST-MODIFIED:20101205T113517Z +DTSTAMP:20101205T113517Z +UID:67de973a-db14-4e07-9a86-a23146a1f4e9 +SUMMARY:Lunes de Pascua (Baleares\, Cataluña\, Com. Valenciana\, Navarra\ + , País Vasco y La Rioja) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T113549Z +LAST-MODIFIED:20101205T113737Z +DTSTAMP:20101205T113737Z +UID:4068cd93-c99f-468f-a3d1-e45e0a81dbba +SUMMARY:Día de la Comunidad de Madrid / Lunes siguiente a la Fiesta del t + rabajo (Andalucía\, Aragón\, Asturias\, Cantabria\, Com. Valenciana\, Ex + tremadura\, Madrid\, Murcia y Ceuta) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110502 +DTEND;VALUE=DATE:20110503 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T113752Z +LAST-MODIFIED:20101205T113808Z +DTSTAMP:20101205T113808Z +UID:1fd3d159-95cf-4738-bbb5-edf7f062790f +SUMMARY:Día de las Letras Gallegas +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110517 +DTEND;VALUE=DATE:20110518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T113819Z +LAST-MODIFIED:20101205T113825Z +DTSTAMP:20101205T113825Z +UID:c7020925-e121-4772-a447-a1f88748f73d +SUMMARY:Día de Canarias +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110530 +DTEND;VALUE=DATE:20110531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T113834Z +LAST-MODIFIED:20101205T113858Z +DTSTAMP:20101205T113858Z +UID:17981687-7e70-4a92-a3aa-0aafc1273f3b +SUMMARY:Día de Castilla-La Mancha +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110531 +DTEND;VALUE=DATE:20110601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T112518Z +LAST-MODIFIED:20101205T113925Z +DTSTAMP:20101205T113925Z +UID:a34554c2-fba2-4511-a0d0-598a8492d4de +SUMMARY:Día de San José (Castilla-La Mancha\, Com. Valenciana\, Galicia + y Murcia) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110319 +DTEND;VALUE=DATE:20110320 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T114002Z +LAST-MODIFIED:20101205T114017Z +DTSTAMP:20101205T114017Z +UID:1b52688c-dd81-45ea-b21e-a375c58b8cab +SUMMARY:Día de La Rioja / Día de la Región de Murcia +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110609 +DTEND;VALUE=DATE:20110610 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T114039Z +LAST-MODIFIED:20101205T114054Z +DTSTAMP:20101205T114054Z +UID:bd42b178-64c2-4d17-b27c-51938f6c0df4 +SUMMARY:Lunes de Pascua Granada (Cataluña) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110613 +DTEND;VALUE=DATE:20110614 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T114101Z +LAST-MODIFIED:20101205T114133Z +DTSTAMP:20101205T114133Z +UID:e02611ad-b84c-4fd6-bef5-459ab276f7d9 +SUMMARY:Corpus Christi (Castilla-La Mancha y Madrid) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110623 +DTEND;VALUE=DATE:20110624 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T114142Z +LAST-MODIFIED:20101205T114158Z +DTSTAMP:20101205T114158Z +UID:4632b4c0-46f3-4d1b-9fd0-c7c08b9b13f8 +SUMMARY:San Juan (Cataluña) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110624 +DTEND;VALUE=DATE:20110625 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T114210Z +LAST-MODIFIED:20101205T114246Z +DTSTAMP:20101205T114246Z +UID:8c433b68-003b-4a84-ba22-7c764ef73e32 +SUMMARY:Santiago Apostol (Castilla y León\, Galicia\, Madrid\, Navarra\, + País Vasco y La Rioja) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110725 +DTEND;VALUE=DATE:20110726 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T114254Z +LAST-MODIFIED:20101205T114303Z +DTSTAMP:20101205T114303Z +UID:d5291dfd-8c25-4e6f-a55e-1d4e096ad114 +SUMMARY:Día de las Instituciones (Cantabria) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110728 +DTEND;VALUE=DATE:20110729 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T114343Z +LAST-MODIFIED:20101205T114402Z +DTSTAMP:20101205T114402Z +UID:0a227c18-cb39-4a6d-81e1-91290c54a148 +SUMMARY:Día de Asturias / Día de Extremadura +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110908 +DTEND;VALUE=DATE:20110909 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T114451Z +LAST-MODIFIED:20101205T114508Z +DTSTAMP:20101205T114508Z +UID:3febe4a4-e478-4a48-b911-9fed200a0e54 +SUMMARY:La Bien Aparecida (Cantabria) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20110915 +DTEND;VALUE=DATE:20110916 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T114745Z +LAST-MODIFIED:20101205T114806Z +DTSTAMP:20101205T114806Z +UID:c7245c9f-0bbd-4315-9be7-d6ddd85cf935 +SUMMARY:Día del País Vasco +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20111025 +DTEND;VALUE=DATE:20111026 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T115047Z +LAST-MODIFIED:20101205T115231Z +DTSTAMP:20101205T115231Z +UID:80da1f50-6161-442d-8e03-97ecfed7bcc9 +SUMMARY:Pascua del Sacrificio (Ceuta) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20111106 +DTEND;VALUE=DATE:20111107 +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T115128Z +LAST-MODIFIED:20101205T115245Z +DTSTAMP:20101205T115245Z +UID:ec82e58d-44df-46aa-bf76-6f6a25e2884c +SUMMARY:Fiesta del Sacrificio (Melilla) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20111107 +DTEND;VALUE=DATE:20111108 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20101205T115547Z +LAST-MODIFIED:20101205T115651Z +DTSTAMP:20101205T115651Z +UID:00042702-69cc-4f40-85dd-99a5cd30ad75 +SUMMARY:Lunes siguiente a la Natividad del Señor (excepto Cantabria\, Cas + tilla-La Mancha\, Com. Valenciana\, Galicia\, Madrid\, Murcia\, País Vasc + o y La Rioja) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20111226 +DTEND;VALUE=DATE:20111227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20101205T111554Z +DTSTAMP:20101205T111554Z +UID:414d6a02-bc49-4b9a-b091-7a81c58f2678 +SUMMARY:Año Nuevo +RRULE:FREQ=YEARLY +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070101 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070102 +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20101205T114659Z +DTSTAMP:20101205T114659Z +UID:541e9a67-0f90-4d5c-acf3-bd2a13e86cb2 +SUMMARY:Fiesta Nacional de España +RRULE:FREQ=YEARLY +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20071012 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20071013 +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20101205T115030Z +DTSTAMP:20101205T115030Z +UID:a95ca284-04fd-4234-8dda-4f419fabf4b0 +SUMMARY:Todos los Santos +RRULE:FREQ=YEARLY +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20071101 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20071102 +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20101205T115349Z +DTSTAMP:20101205T115349Z +UID:a19435c4-581d-45a1-afea-0097df54856f +SUMMARY:Día de la Constitución Española +RRULE:FREQ=YEARLY +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20071206 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20071207 +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20130101T121409Z +DTSTAMP:20130101T121409Z +UID:ebd6d0e2-3612-4b8d-ac96-ed09ca0680cc +SUMMARY:La Inmaculada Concepción +RRULE:FREQ=YEARLY +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20071208 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20071209 +X-MOZ-GENERATION:4 +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20101205T115527Z +DTSTAMP:20101205T115527Z +UID:be1f3759-4273-43f8-8afd-fb7af952ae1a +SUMMARY:Natividad del Señor +RRULE:FREQ=YEARLY +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20071225 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20071226 +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20101205T115824Z +DTSTAMP:20101205T115824Z +UID:083e8117-7787-45e8-a73d-4e1d3bc08398 +SUMMARY:Fiesta del Trabajo +RRULE:FREQ=YEARLY +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070501 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070502 +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070530T120326Z +LAST-MODIFIED:20101205T120203Z +DTSTAMP:20101205T120203Z +UID:0c035021-76c7-481f-a658-b04af1c6ada4 +SUMMARY:Asunción de la Virgen +RRULE:FREQ=YEARLY +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE;TZID=Europe/Madrid:20070815 +DTEND;VALUE=DATE;TZID=Europe/Madrid:20070816 +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T131852Z +LAST-MODIFIED:20111120T131956Z +DTSTAMP:20111120T131956Z +UID:36b46697-2525-48dc-9456-e39fd47747e8 +SUMMARY:Lunes siguiente al Año Nuevo (Andalucía\, Aragón\, Asturias\, E + xtremadura y Ceuta) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120102 +DTEND;VALUE=DATE:20120103 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T132136Z +LAST-MODIFIED:20111120T132148Z +DTSTAMP:20111120T132148Z +UID:b53a6e80-a685-4723-9667-485243843d24 +SUMMARY:Día de Andalucía +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120228 +DTEND;VALUE=DATE:20120229 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T132217Z +LAST-MODIFIED:20111120T132247Z +DTSTAMP:20111120T132247Z +UID:3f964605-6777-41d9-9e69-1ea30e31afdd +SUMMARY:Día de las Islas Baleares +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120301 +DTEND;VALUE=DATE:20120302 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T132254Z +LAST-MODIFIED:20111120T132354Z +DTSTAMP:20111120T132354Z +UID:f3a34b8e-762b-486e-8e28-3e25dadb9b9c +SUMMARY:San José (Castilla y León\, Valencia\, Madrid\, Murcia\, Navarra + \, La Rioja y Melilla) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120319 +DTEND;VALUE=DATE:20120320 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T132529Z +LAST-MODIFIED:20111120T132551Z +DTSTAMP:20111120T132551Z +UID:e5f78796-cf5c-4fb9-923e-d071cc56276c +SUMMARY:Jueves Santo (excepto Cataluña y Valencia) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120405 +DTEND;VALUE=DATE:20120406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T132558Z +LAST-MODIFIED:20111120T132617Z +DTSTAMP:20111120T132617Z +UID:f016ae23-2cf1-4bb5-a725-d9b3f89cf112 +SUMMARY:Viernes Santo +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T132624Z +LAST-MODIFIED:20111120T132655Z +DTSTAMP:20111120T132655Z +UID:a12767fb-b590-420c-866d-f0d4f0f413dc +SUMMARY:Lunes de Pascua (Baleares\, Cataluña\, Valencia\, Navarra y País + Vasco) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T132733Z +LAST-MODIFIED:20111120T133035Z +DTSTAMP:20111120T133035Z +UID:a0dcd2e5-f279-4cb7-ac3c-ec1732f618ad +SUMMARY:San Jorge (Día de Aragón) / Fiesta de la Comunidad Autónoma (Ca + stilla y León) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120423 +DTEND;VALUE=DATE:20120424 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T133412Z +LAST-MODIFIED:20111120T133422Z +DTSTAMP:20111120T133422Z +UID:38492084-80f4-43b7-8a5c-ac369aae69a6 +SUMMARY:Fiesta de la Comunidad de Madrid +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120502 +DTEND;VALUE=DATE:20120503 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T133430Z +LAST-MODIFIED:20111120T133445Z +DTSTAMP:20111120T133445Z +UID:6df40c3e-9449-483b-a084-2b953c363dd2 +SUMMARY:Día de las Letras Galllegas +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T133454Z +LAST-MODIFIED:20111120T133459Z +DTSTAMP:20111120T133459Z +UID:6502e0ff-fe45-4588-842b-2cfd4208f487 +SUMMARY:Día de Canarias +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120530 +DTEND;VALUE=DATE:20120531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T133502Z +LAST-MODIFIED:20111120T133526Z +DTSTAMP:20111120T133526Z +UID:6679d5da-6b3e-4fd6-bbac-61bed5707f08 +SUMMARY:Día de la Región de Castilla-La Mancha +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120531 +DTEND;VALUE=DATE:20120601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T133543Z +LAST-MODIFIED:20111120T133556Z +DTSTAMP:20111120T133556Z +UID:b01b96cb-99b2-45a7-8608-161bf65ca33f +SUMMARY:Fiesta del Corpus Christi (Castilla-La Mancha) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120607 +DTEND;VALUE=DATE:20120608 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T133625Z +LAST-MODIFIED:20111120T133631Z +DTSTAMP:20111120T133631Z +UID:ec9dbb18-8698-445e-b466-48bb5a4c8c91 +SUMMARY:Día de La Rioja / Día de la Región de Murcia +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120609 +DTEND;VALUE=DATE:20120610 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T133643Z +LAST-MODIFIED:20111120T133712Z +DTSTAMP:20111120T133712Z +UID:58169bd7-990c-49b1-97a4-8916f58b9b9d +SUMMARY:Santiago Apostol (Cantabria) / Día Nacional de Galicia +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120725 +DTEND;VALUE=DATE:20120726 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T133802Z +LAST-MODIFIED:20111120T133806Z +DTSTAMP:20111120T133806Z +UID:0ab768cb-4321-4af5-8426-16c65245e3a3 +SUMMARY:Día de Asturias / Día de Extremadura +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120908 +DTEND;VALUE=DATE:20120909 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T133825Z +LAST-MODIFIED:20111120T133831Z +DTSTAMP:20111120T133831Z +UID:a9f060db-4e4c-43de-8534-e9b391d0eb0a +SUMMARY:Fiesta Nacional de Cataluña +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120911 +DTEND;VALUE=DATE:20120912 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T133850Z +LAST-MODIFIED:20111120T133858Z +DTSTAMP:20111120T133858Z +UID:83531e3d-551c-46d5-a74a-3039133cbb21 +SUMMARY:La Bien Aparecida (Cantabria) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20120915 +DTEND;VALUE=DATE:20120916 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T133914Z +LAST-MODIFIED:20111120T133921Z +DTSTAMP:20111120T133921Z +UID:6eaf1e2d-db97-457f-8bfa-cb9cecc468c8 +SUMMARY:Día de la Comunidad Valenciana +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20121009 +DTEND;VALUE=DATE:20121010 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T134019Z +LAST-MODIFIED:20111120T134031Z +DTSTAMP:20111120T134031Z +UID:031cd355-de90-4766-ad59-16ef8e7d40a0 +SUMMARY:Día del País Vasco +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20121025 +DTEND;VALUE=DATE:20121026 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T134043Z +LAST-MODIFIED:20111120T134053Z +DTSTAMP:20111120T134053Z +UID:b4567d7a-e77c-404a-b50f-e8e6ce4118a1 +SUMMARY:Fiesta del Sacrificio (Melilla) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20121026 +DTEND;VALUE=DATE:20121027 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T134105Z +LAST-MODIFIED:20111120T134121Z +DTSTAMP:20111120T134121Z +UID:c392328f-0047-4afe-83e4-22cbcde19150 +SUMMARY:Festividad de la Pascual del Sacrificio (Ceuta) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20121027 +DTEND;VALUE=DATE:20121028 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20111120T134148Z +LAST-MODIFIED:20111120T134157Z +DTSTAMP:20111120T134157Z +UID:a5627e73-d8c8-4bf4-8711-9baa9a0b7df9 +SUMMARY:San Esteban (Cataluña) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20121226 +DTEND;VALUE=DATE:20121227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T114528Z +LAST-MODIFIED:20130101T115119Z +DTSTAMP:20130101T115119Z +UID:c446b42e-5bcf-4850-bef6-f4af2b9e2577 +SUMMARY:Lunes siguiente a la Epifanía del Señor (excepto Baleares\, Cata + luña\, Valencia\, Galicia\, País Vasco y La Rioja) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130107 +DTEND;VALUE=DATE:20130108 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T114657Z +LAST-MODIFIED:20130101T115127Z +DTSTAMP:20130101T115127Z +UID:bacfe223-c953-44e2-af94-b607ec5de252 +SUMMARY:Día de Andalucía +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130228 +DTEND;VALUE=DATE:20130301 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T114722Z +LAST-MODIFIED:20130101T115133Z +DTSTAMP:20130101T115133Z +UID:7612feac-99fc-4257-ac7c-35d7d0204df3 +SUMMARY:Día de las Islas Baleares +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130301 +DTEND;VALUE=DATE:20130302 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T114746Z +LAST-MODIFIED:20130101T115142Z +DTSTAMP:20130101T115142Z +UID:d2625ac9-7e13-455c-b3e6-e2203437cdf2 +SUMMARY:Traslado de San José (Madrid) / Lunes de Fallas (Valencia) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130318 +DTEND;VALUE=DATE:20130319 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T114829Z +LAST-MODIFIED:20130101T115146Z +DTSTAMP:20130101T115146Z +UID:c25df47f-f43d-4c39-9adb-d991a820156d +SUMMARY:San José (Valencia\, Murcia y Melilla) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130319 +DTEND;VALUE=DATE:20130320 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T114916Z +LAST-MODIFIED:20130101T115151Z +DTSTAMP:20130101T115151Z +UID:82486248-1c6e-4120-aebb-d97c25e12e0c +SUMMARY:Jueves Santo (excepto Cataluña y Valencia) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130328 +DTEND;VALUE=DATE:20130329 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T114942Z +LAST-MODIFIED:20130101T115156Z +DTSTAMP:20130101T115156Z +UID:c61538ed-d703-453c-8b1a-6f47b2d83368 +SUMMARY:Viernes Santo +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115011Z +LAST-MODIFIED:20130101T115203Z +DTSTAMP:20130101T115203Z +UID:85ca868e-d35c-4264-911b-13ec649dc904 +SUMMARY:Lunes de Pascua (Baleares\, Cantabria\, Cataluña\, Valencia\, Nav + arra\, País Vasco y La Rioja) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115217Z +LAST-MODIFIED:20130101T115248Z +DTSTAMP:20130101T115248Z +UID:dbb30f1e-3cec-4e0e-af0b-436a410d69b2 +SUMMARY:Fiesta de la Comunidad Autónoma (Castilla y León) / San Jorge (A + ragón) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130423 +DTEND;VALUE=DATE:20130424 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115258Z +LAST-MODIFIED:20130101T115307Z +DTSTAMP:20130101T115307Z +UID:bd9a6359-4365-435c-b567-b1c9c8a8ad9e +SUMMARY:Fiesta de la Comunidad de Madrid +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130502 +DTEND;VALUE=DATE:20130503 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115322Z +LAST-MODIFIED:20130101T115342Z +DTSTAMP:20130101T115342Z +UID:fb01eb26-0f8f-4d2a-8a29-036f19731f82 +SUMMARY:Día de las Letras Gallegas +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130517 +DTEND;VALUE=DATE:20130518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115349Z +LAST-MODIFIED:20130101T115503Z +DTSTAMP:20130101T115503Z +UID:ae7105ec-b9e8-4995-a72f-87f025a68f84 +SUMMARY:Corpus Christi (Castilla-La Mancha) / Día de Canarias +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130530 +DTEND;VALUE=DATE:20130531 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115430Z +LAST-MODIFIED:20130101T115510Z +DTSTAMP:20130101T115510Z +UID:4eedbdff-cc7a-4bc1-9c14-a36bbf153096 +SUMMARY:Día de la Región de Castilla-La Mancha +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130531 +DTEND;VALUE=DATE:20130601 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115521Z +LAST-MODIFIED:20130101T115528Z +DTSTAMP:20130101T115528Z +UID:64b56a80-357c-4323-ad88-04366b10a83f +SUMMARY:Día de La Rioja +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130610 +DTEND;VALUE=DATE:20130611 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115541Z +LAST-MODIFIED:20130101T115549Z +DTSTAMP:20130101T115549Z +UID:7cc45492-8a60-490f-b257-2ac74821fa03 +SUMMARY:San Juan (Cataluña y Galicia) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130624 +DTEND;VALUE=DATE:20130625 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115602Z +LAST-MODIFIED:20130101T115651Z +DTSTAMP:20130101T115651Z +UID:8f73e9ab-dff4-4678-a488-4b11e45ce731 +SUMMARY:Santiago Apostol (Cantabria\, Navarra y País Vasco) / Día Nacion + al de Galicia +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130725 +DTEND;VALUE=DATE:20130726 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115714Z +LAST-MODIFIED:20130101T115740Z +DTSTAMP:20130101T115740Z +UID:f819bb10-b9c3-4a85-a388-113e800fcb69 +SUMMARY:Lunes siguiente al Día de Asturias y al Día de Extremadura +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130909 +DTEND;VALUE=DATE:20130910 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115745Z +LAST-MODIFIED:20130101T115755Z +DTSTAMP:20130101T115755Z +UID:b1648aa4-43c3-4846-a09b-343c76a664dd +SUMMARY:Día Nacional de Cataluña +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20130911 +DTEND;VALUE=DATE:20130912 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115813Z +LAST-MODIFIED:20130101T115823Z +DTSTAMP:20130101T115823Z +UID:76bf1947-f655-4fdb-a1e7-ae6a4649b228 +SUMMARY:Día de la Comunidad Valenciana +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20131009 +DTEND;VALUE=DATE:20131010 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115850Z +LAST-MODIFIED:20130101T115931Z +DTSTAMP:20130101T115931Z +UID:093b6207-6ef3-4768-bae2-11ddf0a1d9ae +SUMMARY:Fiesta del Sacrificio (Ceuta y Melilla) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20131015 +DTEND;VALUE=DATE:20131016 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T115937Z +LAST-MODIFIED:20130101T115949Z +DTSTAMP:20130101T115949Z +UID:08665f65-4a3e-40fb-b7a0-1c0800df1466 +SUMMARY:Día del País Vasco +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20131025 +DTEND;VALUE=DATE:20131026 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T120053Z +LAST-MODIFIED:20130101T120233Z +DTSTAMP:20130101T120233Z +UID:a3da16b2-4630-460c-b7d5-f7a7b540cfcd +SUMMARY:Lunes siguiente a la Inmaculada Concepción (Andalucía\, Aragón\ + , Asturias\, Castilla y León\, Extremadura\, Murcia\, La Rioja y Ceuta) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20131209 +DTEND;VALUE=DATE:20131210 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20130101T120241Z +LAST-MODIFIED:20130101T120258Z +DTSTAMP:20130101T120258Z +UID:c2d0bfae-fb8f-46e9-baba-a5489787a39e +SUMMARY:San Esteban (Baleares y Cataluña) +CATEGORIES:Fiestas oficiales +DTSTART;VALUE=DATE:20131226 +DTEND;VALUE=DATE:20131227 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/SriLankaHolidays.ics b/media/caldata/SriLankaHolidays.ics new file mode 100644 index 00000000000..d3b9b3a47f7 --- /dev/null +++ b/media/caldata/SriLankaHolidays.ics @@ -0,0 +1,2525 @@ +BEGIN:VCALENDAR +PRODID:-//Microsoft Corporation//Outlook 14.0 MIMEDIR//EN +VERSION:2.0 +METHOD:PUBLISH +X-CALSTART:19700101T000000Z +X-CALEND:20121228T000000 +X-WR-RELCALID:{00000018-0D6D-58C3-7030-574D8CBD0611} +X-WR-CALNAME:SriLankaHolidays.ics +BEGIN:VTIMEZONE +TZID:/freeassociation.sourceforge.net/Tzfile/Asia/Colombo +BEGIN:STANDARD +DTSTART:16010101T000000 +TZOFFSETFROM:+0530 +TZOFFSETTO:+0530 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20110303 +DTSTAMP:20101220T043111Z +DTSTART;VALUE=DATE:20110302 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:මහා ශිව රාත්‍රී දිනය +TRANSP:TRANSPARENT +UID:20101220T043111Z-2761-500-1-12@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20110415 +DTSTAMP:20101220T044152Z +DTSTART;VALUE=DATE:20110414 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:3 +SUMMARY:සිංහල හා හින්දු අලුත් අවු + රුදු දිනය +TRANSP:TRANSPARENT +UID:20101220T044152Z-2761-500-1-16@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ලෝක මිහිකත දිනය +DTEND;VALUE=DATE:20110423 +DTSTAMP:20101220T053727Z +DTSTART;VALUE=DATE:20110422 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:ලෝක මිහිකත දිනය +TRANSP:TRANSPARENT +UID:20101220T053727Z-2761-500-1-49@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ \, බැංකු සහ වෙළඳ නිව + ාඩු +DTEND;VALUE=DATE:20110116 +DTSTAMP:20101220T025148Z +DTSTART;VALUE=DATE:20110115 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:4 +SUMMARY:තෛපෝන්ගල් දිනය +TRANSP:TRANSPARENT +UID:20101220T025303Z-18579-500-1-22@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090502 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090501 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:මැයි දිනය +TRANSP:TRANSPARENT +UID:a84a835a-8864-4c35-86d3-69e982b00fdb +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:http://www.worlddiabetesday.org/ +DTEND;VALUE=DATE:20111115 +DTSTAMP:20101220T053607Z +DTSTART;VALUE=DATE:20111114 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:ලෝක දියවැඩියා දිනය +TRANSP:TRANSPARENT +UID:20101220T053607Z-2761-500-1-48@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20100529 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100528 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:වෙසක් පුර පසළොස්වක පෝය දි + නට පසු දිනය +TRANSP:OPAQUE +UID:KOrganizer-396016387.286 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20100330 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100329 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:බක් පුරපසලොස්වක පෝය දිනය +TRANSP:OPAQUE +UID:KOrganizer-1437200738.871 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20101106 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20101105 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:0 +SUMMARY:දීපවාලී උත්සව දිනය +TRANSP:OPAQUE +UID:KOrganizer-506088977.817 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ජාත්‍යන්තර කාන්තා දිනය +DTEND;VALUE=DATE:20110309 +DTSTAMP:20101220T051405Z +DTSTART;VALUE=DATE:20110308 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:ජාත්‍යන්තර කාන්තා දිනය +TRANSP:TRANSPARENT +UID:20101220T051405Z-2761-500-1-33@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20091129 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20091128 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:හජ්ජි උත්සව දිනය +TRANSP:TRANSPARENT +UID:960f58d4-6e6e-4550-b063-949b1c0e0943 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:Software Freedom Day 2011. +DTEND;VALUE=DATE:20111120 +DTSTAMP:20101220T041359Z +DTSTART;VALUE=DATE:20111119 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:ලෝක නිදහස් මෘදුකාංග දිනය + 2011 +TRANSP:TRANSPARENT +UID:20101220T041359Z-2761-500-1-5@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20100528 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100527 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:වෙසක් පුර පසළොස්වක පෝය දි + නය +TRANSP:OPAQUE +UID:KOrganizer-609597374.181 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20110320 +DTSTAMP:20101220T043317Z +DTSTART;VALUE=DATE:20110319 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:මැදින් පුර පසළොස්වක පෝය ද + ිනය +TRANSP:TRANSPARENT +UID:20101220T043317Z-2761-500-1-13@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20100726 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100725 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:ඇසළ පුර පසළොස්වක පෝය දිනය +TRANSP:OPAQUE +UID:KOrganizer-319124126.624 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20091202 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20091201 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:උඳුවප් පුර පසළොස්වක පෝය ද + ිනය +TRANSP:TRANSPARENT +UID:f17e037a-1866-40da-86cb-28ee54fbb3f6 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ගුරු දිනය +DTEND;VALUE=DATE:20110906 +DTSTAMP:20101220T053241Z +DTSTART;VALUE=DATE:20110905 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:ගුරු දිනය +TRANSP:TRANSPARENT +UID:20101220T053241Z-2761-500-1-46@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20100414 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100413 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:සිංහල හා හින්දු අලුත් අවු + රුදු දිනට පෙර දිනය +TRANSP:OPAQUE +UID:KOrganizer-79001215.864 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ජාත්‍යන්තර තරුණ දිනය +DTEND;VALUE=DATE:20110813 +DTSTAMP:20101220T053142Z +DTSTART;VALUE=DATE:20110812 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:ජාත්‍යන්තර තරුණ දිනය +TRANSP:TRANSPARENT +UID:20101220T053142Z-2761-500-1-45@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ජාත්‍යන්තර මව්වරුන්ගේ + දිනය +DTEND;VALUE=DATE:20110512 +DTSTAMP:20101220T052226Z +DTSTART;VALUE=DATE:20110511 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:මව්වරුන්ගේ දිනය +TRANSP:TRANSPARENT +UID:20101220T052226Z-2761-500-1-37@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ \, බැංකු සහ වෙළඳ නිව + ාඩු +DTEND;VALUE=DATE:20100130 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100129 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:නවම් පුර පසළොස්වක පෝය දින + ය +TRANSP:OPAQUE +UID:KOrganizer-1439059090.1052 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090707 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090706 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:ඇසළ පුර පසළොස්වක පෝය දිනය +TRANSP:TRANSPARENT +UID:b842352b-5587-40d1-838b-bdc9518f58d3 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20111226 +DTSTAMP:20101220T050715Z +DTSTART;VALUE=DATE:20111225 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:නත්තල් දිනය +TRANSP:TRANSPARENT +UID:20101220T050715Z-2761-500-1-32@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090415 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090414 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:සිංහල හා හින්දු අලුත් අවු + රුදු දිනය +TRANSP:TRANSPARENT +UID:eb458a02-ab18-4679-9eda-4b87a5da424a +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20110414 +DTSTAMP:20101220T043848Z +DTSTART;VALUE=DATE:20110413 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:3 +SUMMARY:සිංහල හා හින්දු අලුත් අවු + රුදු දිනට පෙර දිනය +TRANSP:TRANSPARENT +UID:20101220T043848Z-2761-500-1-14@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Asia/Colombo:19700102T00 + 0000 +DTSTAMP:20100109T162750Z +DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Asia/Colombo:19700101T + 000000 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:දුරුතු පුර පසළොස්වක පෝය ද + ිනය +TRANSP:TRANSPARENT +UID:20101220T025336Z-18579-500-1-23@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20100825 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100824 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:නිකිණි පුර පසළොස්වක පෝය ද + ිනය +TRANSP:OPAQUE +UID:KOrganizer-1803250988.790 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ජාත්‍යන්තර දුරකතන සංනි + වේදණ දිනය +DTEND;VALUE=DATE:20110518 +DTSTAMP:20101220T052330Z +DTSTART;VALUE=DATE:20110517 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:3 +SUMMARY:ජාත්‍යන්තර දුරකතන සංනිව + ේදණ දිනය +TRANSP:TRANSPARENT +UID:20101220T052330Z-2761-500-1-38@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20100228 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100227 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:මහා ශිව රාත්‍රී දිනය +TRANSP:OPAQUE +UID:KOrganizer-1729982081.736 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20110120 +DTSTAMP:20101220T041021Z +DTSTART;VALUE=DATE:20110119 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:3 +SUMMARY:දුරුතු පුර පසළොස්වක පෝය ද + ිනය +TRANSP:TRANSPARENT +UID:20101220T041021Z-2761-500-1-4@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20100403 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100402 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:මහා සිකුරාදා දිනය +TRANSP:OPAQUE +UID:KOrganizer-321324070.558 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20111027 +DTSTAMP:20101220T050054Z +DTSTART;VALUE=DATE:20111026 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:දීපාවලි උත්සව දින +TRANSP:TRANSPARENT +UID:20101220T050054Z-2761-500-1-28@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ \, බැංකු සහ වෙළඳ නිව + ාඩු +DTEND;VALUE=DATE:20090111 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090110 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:දුරුතු පුර පසළොස්වක පෝය ද + ිනය +TRANSP:TRANSPARENT +UID:ba948397-b710-46b6-bad8-39bc31f4200e +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20111111 +DTSTAMP:20101220T050445Z +DTSTART;VALUE=DATE:20111110 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:3 +SUMMARY:ඉල් පුර පසළොස්වක පෝය දිනය +TRANSP:TRANSPARENT +UID:20101220T050445Z-2761-500-1-30@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20110518 +DTSTAMP:20101220T044534Z +DTSTART;VALUE=DATE:20110517 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:වෙසක් පුර පසළොස්වක පෝය දි + නය +TRANSP:TRANSPARENT +UID:20101220T044534Z-2761-500-1-20@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20111107 +DTSTAMP:20101220T050307Z +DTSTART;VALUE=DATE:20111106 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:හජ්ජි උත්සව දිනය +TRANSP:TRANSPARENT +UID:20101220T050307Z-2761-500-1-29@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090905 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090904 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:බිනර පුර පසළොස්වක පෝය දින + ය +TRANSP:TRANSPARENT +UID:14b8dbb1-c94c-4c59-993c-74dff216b161 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090509 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090508 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:වෙසක් පුර පසළොස්වක පෝය දි + නය +TRANSP:TRANSPARENT +UID:dc04bd1e-5a33-4b83-9153-29cbb09d4305 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20110502 +DTSTAMP:20101220T044446Z +DTSTART;VALUE=DATE:20110501 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:මැයි දිනය +TRANSP:TRANSPARENT +UID:20101220T044446Z-2761-500-1-19@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Asia/Colombo:19700102T00 + 0000 +DTSTAMP:20100109T162750Z +DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Asia/Colombo:19700101T + 000000 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:දුරුතු පුර පසළොස්වක පෝය ද + ිනය +TRANSP:TRANSPARENT +UID:20101220T025418Z-18579-500-1-26@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20110423 +DTSTAMP:20101220T044329Z +DTSTART;VALUE=DATE:20110422 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:මහ සිකුරාදා +TRANSP:TRANSPARENT +UID:20101220T044329Z-2761-500-1-18@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20110715 +DTSTAMP:20101220T045023Z +DTSTART;VALUE=DATE:20110714 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:ඇසල පුර පසළොස්වක පෝය දිනය +TRANSP:TRANSPARENT +UID:20101220T045023Z-2761-500-1-23@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20091103 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20091102 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:ඉල් පුර පසළොස්වක පෝය දිනය +TRANSP:TRANSPARENT +UID:394671a3-8db6-4b8e-8c86-9f9af3fc2717 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20111012 +DTSTAMP:20101220T045935Z +DTSTART;VALUE=DATE:20111011 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:වප් පුර පසළොස්වක පෝය දිනය +TRANSP:TRANSPARENT +UID:20101220T045935Z-2761-500-1-27@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090311 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090310 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:මැදින් පුරපසලොස්වක පෝය ද + ිනය +TRANSP:TRANSPARENT +UID:900b3f3d-b879-4dab-9575-a26d0c88ce9e +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090224 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090223 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:මහා ශිව රාත්‍රී දිනය +TRANSP:TRANSPARENT +UID:81a88b9d-afb2-4337-a27b-0e16f3ed0f2a +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20091018 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20091017 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:දීපවාලී උත්සව දිනය +TRANSP:TRANSPARENT +UID:403782b0-1782-4de2-94ba-469a8933564e +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20100429 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100428 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:අධි වෙසක් පුර පසළොස්වක පෝ + ය දිනය +TRANSP:OPAQUE +UID:KOrganizer-247482794.697 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20110218 +DTSTAMP:20101220T042304Z +DTSTART;VALUE=DATE:20110217 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:5 +SUMMARY:නවම් පුර පසළොස්වක පෝය දින + ය +TRANSP:TRANSPARENT +UID:20101220T042304Z-2761-500-1-8@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20100911 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100910 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:0 +SUMMARY:රාමසාන් උත්සව දිනය +TRANSP:OPAQUE +UID:KOrganizer-616994016.124 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ලෝක ජල දිනය +DTEND;VALUE=DATE:20110323 +DTSTAMP:20101220T052032Z +DTSTART;VALUE=DATE:20110322 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:ලෝක ජල දිනය +TRANSP:TRANSPARENT +UID:20101220T052032Z-2761-500-1-36@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090205 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090204 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:ජාතික දිනය +TRANSP:TRANSPARENT +UID:b4e58492-2532-40e4-b47d-8556e3ad872a +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090311 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090310 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:නබි නායකතුමාගේ උපන් දිනය +TRANSP:TRANSPARENT +UID:4993bd9f-d9c7-452f-9e4a-8b69be69473b +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ \, බැංකු සහ වෙළඳ නිව + ාඩු +DTEND;VALUE=DATE:20100301 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100228 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:මැදින් පුරපසලොස්වක පෝය ද + ිනය +TRANSP:OPAQUE +UID:KOrganizer-1134432525.962 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090806 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090805 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:නිකිණි පුර පසළොස්වක පෝය ද + ිනය +TRANSP:TRANSPARENT +UID:7c64ca0c-9ac4-488b-a6de-cae7078264dd +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20090411 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090410 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:මහා සිකුරාදා දිනය +TRANSP:TRANSPARENT +UID:905a3952-93f9-45a0-a9d7-bda0a7758148 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20110418 +DTSTAMP:20101220T044246Z +DTSTART;VALUE=DATE:20110417 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:බක් පුර පසළොස්වක පෝය දිනය +TRANSP:TRANSPARENT +UID:20101220T044246Z-2761-500-1-17@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20101226 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20101225 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:0 +SUMMARY:නත්තල් දිනය +TRANSP:OPAQUE +UID:KOrganizer-1767244512.375 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20101221 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20101220 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:උඳුවප් පුර පසළොස්වක පෝය ද + ිනය +TRANSP:OPAQUE +UID:KOrganizer-293549102.386 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20090922 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090921 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:රාමසාන් උත්සව දිනය +TRANSP:TRANSPARENT +UID:a35e9c19-69f2-4a75-8773-8878df664967 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ලෝක AIDS දිනය +DTEND;VALUE=DATE:20111202 +DTSTAMP:20101220T052829Z +DTSTART;VALUE=DATE:20111201 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:ලෝක AIDS දිනය +TRANSP:TRANSPARENT +UID:20101220T052829Z-2761-500-1-40@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20110814 +DTSTAMP:20101220T045246Z +DTSTART;VALUE=DATE:20110813 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:3 +SUMMARY:නිකිණි පුර පසළොස්වක පෝය ද + ිනය +TRANSP:TRANSPARENT +UID:20101220T045246Z-2761-500-1-24@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:පියවරුන්ගේ දිනය +DTEND;VALUE=DATE:20110609 +DTSTAMP:20101220T051833Z +DTSTART;VALUE=DATE:20110608 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:3 +SUMMARY:පියවරුන්ගේ දිනය +TRANSP:TRANSPARENT +UID:20101220T051833Z-2761-500-1-35@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holiday +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ \, බැංකු සහ වෙළඳ නිව + ාඩු +DTEND;VALUE=DATE:20100115 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100114 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:0 +SUMMARY:තෛපෝන්ගල් දිනය +TRANSP:OPAQUE +UID:KOrganizer-1037790432.697 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090414 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090413 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:සිංහල හා හින්දු අලුත් අවු + රුදු දිනට පෙර දිනය +TRANSP:TRANSPARENT +UID:fa2eac1a-dbae-41d8-81ba-c197d16c7c7f +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20101023 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20101022 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:වප් පුර පසළොස්වක පෝය දිනය +TRANSP:OPAQUE +UID:KOrganizer-244364268.323 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20111211 +DTSTAMP:20101220T050611Z +DTSTART;VALUE=DATE:20111210 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:උඳුවප් පුර පසළොස්වක පෝය ද + ිනය +TRANSP:TRANSPARENT +UID:20101220T050611Z-2761-500-1-31@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20091004 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20091003 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:වප් පුර පසළොස්වක පෝය දිනය +TRANSP:TRANSPARENT +UID:f9f6f6d4-a802-440a-a249-b13e6c8b20e9 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20110901 +DTSTAMP:20101220T045539Z +DTSTART;VALUE=DATE:20110831 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:රාමසාන් උත්සව දිනය +TRANSP:TRANSPARENT +UID:20101220T045539Z-2761-500-1-25@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ \, බැංකු සහ වෙළඳ නිව + ාඩු +DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Asia/Colombo:19700102T00 + 0000 +DTSTAMP:20100109T162750Z +DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Asia/Colombo:19700101T + 000000 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:නවම් පුර පසළොස්වක පෝය දින + ය +TRANSP:OPAQUE +UID:20101220T025526Z-18579-500-1-27@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ \, බැංකු සහ වෙළඳ නිව + ාඩු +DTEND;VALUE=DATE:20090115 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090114 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:තෛපෝන්ගල් දිනය +TRANSP:TRANSPARENT +UID:d251236d-decb-40eb-b12f-7b62460fd411 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ඕසොන් දිනය +DTEND;VALUE=DATE:20110917 +DTSTAMP:20101220T053054Z +DTSTART;VALUE=DATE:20110916 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්ත +SEQUENCE:2 +SUMMARY:ඕසොන් දිනය +TRANSP:TRANSPARENT +UID:20101220T053054Z-2761-500-1-44@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ලෝක හදවත් දිනය +DTEND;VALUE=DATE:20110929 +DTSTAMP:20101220T053004Z +DTSTART;VALUE=DATE:20110928 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:ලෝක හදවත් දිනය +TRANSP:TRANSPARENT +UID:20101220T053004Z-2761-500-1-43@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20101118 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20101117 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:0 +SUMMARY:හජ්ජි උත්සව දිනය +TRANSP:OPAQUE +UID:KOrganizer-1223586933.734 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ලෝක ජනග්‍රහණ දිනය +DTEND;VALUE=DATE:20110712 +DTSTAMP:20101220T053347Z +DTSTART;VALUE=DATE:20110711 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:ලෝක ජනග්‍රහණ දිනය +TRANSP:TRANSPARENT +UID:20101220T053347Z-2761-500-1-47@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20110616 +DTSTAMP:20101220T044809Z +DTSTART;VALUE=DATE:20110615 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:පොසොන් පුර පසළොස්වක පෝය ද + ිනය +TRANSP:TRANSPARENT +UID:20101220T044809Z-2761-500-1-22@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20100502 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100501 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:මැයි දිනය +TRANSP:OPAQUE +UID:KOrganizer-985409183.392 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20110912 +DTSTAMP:20101220T045834Z +DTSTART;VALUE=DATE:20110911 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:බිනර පුර පසළොස්වක පෝය දින + ය +TRANSP:TRANSPARENT +UID:20101220T045834Z-2761-500-1-26@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20100314 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100313 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:නබි නායකතුමාගේ උපන් දිනය +TRANSP:OPAQUE +UID:KOrganizer-1786783040.549 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20100415 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100414 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:0 +SUMMARY:සිංහල හා හින්දු අලුත් අවු + රුදු දිනය +TRANSP:OPAQUE +UID:KOrganizer-1670675413.385 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ලෝක ළමා දිනය +DTEND;VALUE=DATE:20111121 +DTSTAMP:20101220T051725Z +DTSTART;VALUE=DATE:20111120 +LAST-MODIFIED:20120218T072044Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:ලෝක ළමා දිනය +TRANSP:TRANSPARENT +UID:20101220T051725Z-2761-500-1-34@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20100626 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100625 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:පොසොන් පුර පසළොස්වක පෝය ද + ින +TRANSP:OPAQUE +UID:KOrganizer-1513549951.675 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ \, බැංකු සහ වෙළඳ නිව + ාඩු +DTEND;VALUE=DATE:20090210 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090209 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:නවම් පුර පසළොස්වක පෝය දින +TRANSP:TRANSPARENT +UID:75ebfa8e-6d32-42de-ad72-3b60f2b7c3c2 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090608 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090607 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:2 +SUMMARY:පොසොන් පුර පසළොස්වක පෝය ද + ින +TRANSP:TRANSPARENT +UID:500777b7-e7f4-4860-8799-070301104e81 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:ජයේ\, බැංකු සහ වෙළඳ නිවාඩ + ු +DTEND;VALUE=DATE:20110205 +DTSTAMP:20101220T041630Z +DTSTART;VALUE=DATE:20110204 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:4 +SUMMARY:ජාතික දිනය +TRANSP:TRANSPARENT +UID:20101220T041630Z-2761-500-1-6@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20091226 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20091225 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:නත්තල් දිනය +TRANSP:TRANSPARENT +UID:ce864b0e-31fe-45e7-a8e8-db8c9927203b +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20100923 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100922 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:බිනර පුර පසළොස්වක පෝය දින + ය +TRANSP:OPAQUE +UID:KOrganizer-1979116936.295 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු +DTEND;VALUE=DATE:20110217 +DTSTAMP:20101220T041958Z +DTSTART;VALUE=DATE:20110216 +LAST-MODIFIED:20120218T072044Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:4 +SUMMARY:නබි නායකතුමාගේ උපන් දිනය +TRANSP:TRANSPARENT +UID:20101220T041958Z-2761-500-1-7@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072044Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20101122 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20101121 +LAST-MODIFIED:20120218T072044Z +SEQUENCE:1 +SUMMARY:ඉල් පුර පසළොස්වක පෝය දිනය +TRANSP:OPAQUE +UID:KOrganizer-610833003.802 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072045Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090510 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090509 +LAST-MODIFIED:20120218T072045Z +SEQUENCE:2 +SUMMARY:වෙසක් පුර පසළොස්වක පෝය දි + නට පසු දිනය +TRANSP:TRANSPARENT +UID:ced4702e-485a-4fe2-bbb1-1b6621841392 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidayනිවාඩු +CLASS:PUBLIC +CREATED:20120218T072045Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20110519 +DTSTAMP:20101220T044700Z +DTSTART;VALUE=DATE:20110518 +LAST-MODIFIED:20120218T072045Z +LOCATION:ශ්‍රී ලංකාව +SEQUENCE:2 +SUMMARY:වෙසක් පුර පසළොස්වක පෝය දි + නට පසු දිනය +TRANSP:TRANSPARENT +UID:20101220T044700Z-2761-500-1-21@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072045Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20100205 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20100204 +LAST-MODIFIED:20120218T072045Z +SEQUENCE:0 +SUMMARY:ජාතික දිනය +TRANSP:OPAQUE +UID:KOrganizer-265772009.913 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072045Z +DESCRIPTION:ලෝක පරිසර දිනය +DTEND;VALUE=DATE:20110606 +DTSTAMP:20101220T052437Z +DTSTART;VALUE=DATE:20110605 +LAST-MODIFIED:20120218T072045Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:ලෝක පරිසර දිනය +TRANSP:TRANSPARENT +UID:20101220T052437Z-2761-500-1-39@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:International +CLASS:PUBLIC +CREATED:20120218T072045Z +DESCRIPTION:ලෝක මානව හිමිකම් දිනය +DTEND;VALUE=DATE:20111211 +DTSTAMP:20101220T052905Z +DTSTART;VALUE=DATE:20111210 +LAST-MODIFIED:20120218T072045Z +LOCATION:ජාත්‍යන්තර +SEQUENCE:2 +SUMMARY:ලෝක මානව හිමිකම් දිනය +TRANSP:TRANSPARENT +UID:20101220T052905Z-2761-500-1-41@localhost.localdomain +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CATEGORIES:Holidays +CLASS:PUBLIC +CREATED:20120218T072045Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු +DTEND;VALUE=DATE:20090410 +DTSTAMP:20100109T162750Z +DTSTART;VALUE=DATE:20090409 +LAST-MODIFIED:20120218T072045Z +SEQUENCE:2 +SUMMARY:බක් පුර පසළොස්වක පෝය දිනය +TRANSP:TRANSPARENT +UID:5d4f46e8-db27-4484-8617-7ceda7b24443 +X-MICROSOFT-CDO-BUSYSTATUS:FREE +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T074044Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120109 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120108 +LAST-MODIFIED:20120218T074341Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:දුරුතු පුර පසළොස්ව + ක පෝය දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000202A6D1F3FEECC01000000000000000 + 010000000211828049470844DADFAB13F893FCF16 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T074526Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු \n +DTEND;VALUE=DATE:20120116 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120115 +LAST-MODIFIED:20120218T074823Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:තෛපෝන්ගල් දිනය*†‡ +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E008000000001099E56F3FEECC01000000000000000 + 0100000006A9B0C3C1D333F4FB01338296BD300B9 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ< + /FONT>\, බැංකු සහ වෙළඳ නිවාඩු& + nbsp\; \; \; \;

\n + \n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T074614Z +DESCRIPTION:බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120117 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120116 +LAST-MODIFIED:20120218T074716Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:අතිරේක බැංකු නිවාඩ + ු දිනය† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E0080000000070379DA03FEECC01000000000000000 + 0100000005E132174CFD51F429C42DD40F5D3A926 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

බැංක + ු නිවාඩු

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T074944Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු \n +DTEND;VALUE=DATE:20120205 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120204 +LAST-MODIFIED:20120218T075033Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:ජාතික දිනය*†‡ +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E0080000000000EB200640EECC01000000000000000 + 01000000015397EB193760845B1C2E68355DAE4CC +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ< + /FONT>\, බැංකු සහ වෙළඳ නිවාඩු& + nbsp\; \;

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T075120Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු\n +DTEND;VALUE=DATE:20120206 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120205 +LAST-MODIFIED:20120218T075144Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:නබි නායකතුමාගේ උපන + ් දිනය*†‡ +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E0080000000090C2A64040EECC01000000000000000 + 0100000007CDDBD06E8CF274B8CA2AF9D747688FA +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ< + /FONT>\, බැංකු සහ වෙළඳ නිවාඩු< + /FONT>

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T075155Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120208 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120207 +LAST-MODIFIED:20120218T075225Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:නවම් පුර පසළොස්වක ප + ෝය දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E008000000006097DA5840EECC01000000000000000 + 010000000712241FDD92B8D4692AAD79DACFDF0DD +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T075314Z +DESCRIPTION:බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120211 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120210 +LAST-MODIFIED:20120218T075331Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:අතිරේක බැංකු නිවාඩ + ු දිනය† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000005E888040EECC01000000000000000 + 01000000098CD12EC76B8B942A6456CBDA0A44004 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

බැංක + ු නිවාඩු

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T075415Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120221 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120220 +LAST-MODIFIED:20120218T075415Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:මහා ශිව රාත්‍රී දින + ය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000A0CD6AAC40EECC01000000000000000 + 010000000D1BD45AAB9C15949959E1A1735B70424 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T075627Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120308 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120307 +LAST-MODIFIED:20120218T075627Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:මැදින් පුර පසළොස්ව + ක පෝය දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000001641F640EECC01000000000000000 + 010000000D5B257B57A1EDB4FB403352139E36FBC +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T075738Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120407 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120406 +LAST-MODIFIED:20120218T075738Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:බක් පුර පසළොස්වක පෝ + ය දිනය*†\, මහ සිකුරාදා*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E0080000000080DF0C3641EECC01000000000000000 + 010000000CCE2F5FBE97C5D4693752503D48A61C9 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T075947Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු\n +DTEND;VALUE=DATE:20120413 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120412 +LAST-MODIFIED:20120218T075947Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:සිංහල හා හින්දු අලු + ත් අවුරුදු දිනට පෙර දිනය*†‡ +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E0080000000000433AA741EECC01000000000000000 + 01000000056E010E724D98845ADE64F144060AC14 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ< + /FONT>\, බැංකු සහ වෙළඳ නිවාඩු< + /FONT>

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T080028Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු\n +DTEND;VALUE=DATE:20120414 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120413 +LAST-MODIFIED:20120218T080028Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:සිංහල හා හින්දු අලු + ත් අවුරුදු දිනය*†‡ +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000103BB6A541EECC01000000000000000 + 0100000002AD9B1723A3C5145A6D27276E6581AE9 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ< + /FONT>\, බැංකු සහ වෙළඳ නිවාඩු< + /FONT>

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T080222Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු\n +DTEND;VALUE=DATE:20120502 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120501 +LAST-MODIFIED:20120218T080222Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:මැයි දිනය*†‡ +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000303E0BCE41EECC01000000000000000 + 010000000FE10327B959E3C49A396A88D42744E60 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ< + /FONT>\, බැංකු සහ වෙළඳ නිවාඩු< + /FONT>

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T080327Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120506 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120505 +LAST-MODIFIED:20120218T080327Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:වෙසක් පුර පසළොස්වක + පෝය දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E0080000000090EFBCFB41EECC01000000000000000 + 0100000009EF69AF0ADE6664BA2B9AA255A30332E +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T080421Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු\n +DTEND;VALUE=DATE:20120507 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120506 +LAST-MODIFIED:20120218T080421Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:වෙසක් පුර පසළොස්වක + පෝය දිනට පසු දිනය*†‡ +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E0080000000020D6D91242EECC01000000000000000 + 01000000041916F6C94BF164195A0C4B2C9F6E699 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ< + /FONT>\, බැංකු සහ වෙළඳ නිවාඩු< + /FONT>

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T080602Z +DESCRIPTION:බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120508 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120507 +LAST-MODIFIED:20120218T080602Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:අතිරේක බැංකු නිවාඩ + ු දිනය† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000B0E8E57742EECC01000000000000000 + 010000000691B0BB17388E94F9AB94936E191CE69 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

බැංක + ු නිවාඩු

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T081157Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120605 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120604 +LAST-MODIFIED:20120218T081157Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:පොසොන් පුර පසළොස්ව + ක පෝය දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E0080000000090DE9C2143EECC01000000000000000 + 010000000E615FEBFEBB55840A69C12A99E02AFC0 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T081247Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120704 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120703 +LAST-MODIFIED:20120218T081247Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:ඇසල පුර පසළොස්වක පෝ + ය දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000709EBC3E43EECC01000000000000000 + 010000000B8264EBCC8C98945B3FC74C083A8136F +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T081325Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120802 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120801 +LAST-MODIFIED:20120218T081325Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:නිකිණි පුර පසළොස්ව + ක පෝය දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E008000000003032B95243EECC01000000000000000 + 0100000008AF0141B45E0FF469CCDF5A2B341C773 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T081409Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120820 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120819 +LAST-MODIFIED:20120218T081409Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:රාමසාන් උත්සව දිනය* + † +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E008000000001096236D43EECC01000000000000000 + 010000000F9D3CC2BCFBA8F49B1E40C2D272220A1 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T081518Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120901 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120831 +LAST-MODIFIED:20120218T081518Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:අධි බිනර පුර පසළොස් + වක පෝය දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000E050DDA043EECC01000000000000000 + 010000000BE94CC7E53DB4A4B9D87B0759F0AA509 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T081618Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20120930 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20120929 +LAST-MODIFIED:20120218T081618Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:බිනර පුර පසළොස්වක ප + ෝය දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000802113B943EECC01000000000000000 + 010000000F08B486B89867243B7EBB1BB4D43CE0A +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T081745Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20121027 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20121026 +LAST-MODIFIED:20120218T081745Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:හජ්ජි උත්සව දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000107458F043EECC01000000000000000 + 010000000D3461F9B13ADB54790559ED55EB17C5A +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T081825Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20121030 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20121029 +LAST-MODIFIED:20120218T081825Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:වප් පුර පසළොස්වක පෝ + ය දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E0080000000090D5DD0644EECC01000000000000000 + 010000000A5D87540C6D96F4A849A211C5129D25F +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T081914Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20121114 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20121113 +LAST-MODIFIED:20120218T081914Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:දීපාවලි උත්සව දිනය* + † +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000A0F3CE2844EECC01000000000000000 + 0100000009CE63162D1839848ACAE5FBC6FB3A692 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T082026Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20121128 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20121127 +LAST-MODIFIED:20120218T082026Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:ඉල් පුර පසළොස්වක පෝ + ය දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E0080000000010C5434F44EECC01000000000000000 + 010000000934ED58AFE3E444A9300A7BEE78B8B2D +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T082118Z +DESCRIPTION:රජයේ\, බැංකු සහ වෙළඳ නිවා + ඩු \n +DTEND;VALUE=DATE:20121226 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20121225 +LAST-MODIFIED:20120218T082118Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:නත්තල් දිනය*†‡ +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000C0A63B6B44EECC01000000000000000 + 010000000F3A7B75B9E65914B8808C891AE7896EC +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ< + /FONT>\, බැංකු සහ වෙළඳ නිවාඩු& + nbsp\; \; \; \; \; \; +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +BEGIN:VEVENT +CLASS:PUBLIC +CREATED:20120218T082146Z +DESCRIPTION:රජයේ සහ බැංකු නිවාඩු\n +DTEND;VALUE=DATE:20121228 +DTSTAMP:20120218T082210Z +DTSTART;VALUE=DATE:20121227 +LAST-MODIFIED:20120218T082146Z +LOCATION:ශ්‍රී ලංකාව +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=si-lk:උඳුවප් පුර පසළොස්ව + ක පෝය දිනය*† +TRANSP:TRANSPARENT +UID:040000008200E00074C5B7101A82E00800000000E014A17C44EECC01000000000000000 + 01000000043F595F929CA0E4286C17BDBA0E96C07 +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

රජයේ + සහ බැංකු නිවාඩු +

\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-AUTOFILLLOCATION:FALSE +X-MS-OLK-CONFTYPE:0 +BEGIN:VALARM +TRIGGER:-PT1080M +ACTION:DISPLAY +DESCRIPTION:Reminder +END:VALARM +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/SwedishHolidays.ics b/media/caldata/SwedishHolidays.ics new file mode 100644 index 00000000000..9d856d52705 --- /dev/null +++ b/media/caldata/SwedishHolidays.ics @@ -0,0 +1,3783 @@ +BEGIN:VCALENDAR +VERSION:2.0 +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223375 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20000101 +DTEND;VALUE=DATE:20000102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223376 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20000105 +DTEND;VALUE=DATE:20000106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223377 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20000106 +DTEND;VALUE=DATE:20000107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223378 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20000326 +DTEND;VALUE=DATE:20000327 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223379 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20000420 +DTEND;VALUE=DATE:20000421 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223380 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20000421 +DTEND;VALUE=DATE:20000422 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223381 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20000423 +DTEND;VALUE=DATE:20000424 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223382 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20000424 +DTEND;VALUE=DATE:20000425 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223383 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20000430 +DTEND;VALUE=DATE:20000501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223384 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20000501 +DTEND;VALUE=DATE:20000502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223385 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20000601 +DTEND;VALUE=DATE:20000602 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223386 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20000606 +DTEND;VALUE=DATE:20000607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223387 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20000610 +DTEND;VALUE=DATE:20000611 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223388 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20000611 +DTEND;VALUE=DATE:20000612 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223389 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20000624 +DTEND;VALUE=DATE:20000625 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223390 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20001029 +DTEND;VALUE=DATE:20001030 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223391 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20001104 +DTEND;VALUE=DATE:20001105 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223392 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20001224 +DTEND;VALUE=DATE:20001225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223393 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20001225 +DTEND;VALUE=DATE:20001226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223394 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20001226 +DTEND;VALUE=DATE:20001227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223395 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20001231 +DTEND;VALUE=DATE:20010101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223396 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20010101 +DTEND;VALUE=DATE:20010102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223397 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20010105 +DTEND;VALUE=DATE:20010106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223398 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20010106 +DTEND;VALUE=DATE:20010107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223399 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20010325 +DTEND;VALUE=DATE:20010326 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223400 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20010412 +DTEND;VALUE=DATE:20010413 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223401 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20010413 +DTEND;VALUE=DATE:20010414 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223402 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20010415 +DTEND;VALUE=DATE:20010416 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223403 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20010416 +DTEND;VALUE=DATE:20010417 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223404 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20010430 +DTEND;VALUE=DATE:20010501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223405 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20010501 +DTEND;VALUE=DATE:20010502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223406 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20010524 +DTEND;VALUE=DATE:20010525 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223407 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20010602 +DTEND;VALUE=DATE:20010603 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223408 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20010603 +DTEND;VALUE=DATE:20010604 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223409 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20010606 +DTEND;VALUE=DATE:20010607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223410 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20010623 +DTEND;VALUE=DATE:20010624 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223411 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20011028 +DTEND;VALUE=DATE:20011029 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223412 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20011103 +DTEND;VALUE=DATE:20011104 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223413 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20011224 +DTEND;VALUE=DATE:20011225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223414 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20011225 +DTEND;VALUE=DATE:20011226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223415 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20011226 +DTEND;VALUE=DATE:20011227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223416 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20011231 +DTEND;VALUE=DATE:20020101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223417 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20020101 +DTEND;VALUE=DATE:20020102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223418 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20020105 +DTEND;VALUE=DATE:20020106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223419 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20020106 +DTEND;VALUE=DATE:20020107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223420 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20020328 +DTEND;VALUE=DATE:20020329 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223421 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20020329 +DTEND;VALUE=DATE:20020330 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223422 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20020331 +DTEND;VALUE=DATE:20020401 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223423 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20020331 +DTEND;VALUE=DATE:20020401 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223424 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20020401 +DTEND;VALUE=DATE:20020402 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223425 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20020430 +DTEND;VALUE=DATE:20020501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223426 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20020501 +DTEND;VALUE=DATE:20020502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223427 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20020509 +DTEND;VALUE=DATE:20020510 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223428 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20020518 +DTEND;VALUE=DATE:20020519 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223429 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20020519 +DTEND;VALUE=DATE:20020520 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223430 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20020606 +DTEND;VALUE=DATE:20020607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223431 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20020622 +DTEND;VALUE=DATE:20020623 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223432 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20021027 +DTEND;VALUE=DATE:20021028 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223433 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20021102 +DTEND;VALUE=DATE:20021103 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223434 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20021224 +DTEND;VALUE=DATE:20021225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223435 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20021225 +DTEND;VALUE=DATE:20021226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223436 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20021226 +DTEND;VALUE=DATE:20021227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223437 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20021231 +DTEND;VALUE=DATE:20030101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223438 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20030101 +DTEND;VALUE=DATE:20030102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223439 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20030105 +DTEND;VALUE=DATE:20030106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223440 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20030106 +DTEND;VALUE=DATE:20030107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223441 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20030330 +DTEND;VALUE=DATE:20030331 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223442 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20030417 +DTEND;VALUE=DATE:20030418 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223443 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20030418 +DTEND;VALUE=DATE:20030419 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223444 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20030420 +DTEND;VALUE=DATE:20030421 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223445 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20030421 +DTEND;VALUE=DATE:20030422 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223446 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20030430 +DTEND;VALUE=DATE:20030501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223447 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20030501 +DTEND;VALUE=DATE:20030502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223448 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20030529 +DTEND;VALUE=DATE:20030530 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223449 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20030606 +DTEND;VALUE=DATE:20030607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223450 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20030607 +DTEND;VALUE=DATE:20030608 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223451 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20030608 +DTEND;VALUE=DATE:20030609 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223452 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20030621 +DTEND;VALUE=DATE:20030622 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223453 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20031026 +DTEND;VALUE=DATE:20031027 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223454 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20031101 +DTEND;VALUE=DATE:20031102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223455 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20031224 +DTEND;VALUE=DATE:20031225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223456 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20031225 +DTEND;VALUE=DATE:20031226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223457 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20031226 +DTEND;VALUE=DATE:20031227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223458 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20031231 +DTEND;VALUE=DATE:20040101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223459 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20040101 +DTEND;VALUE=DATE:20040102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223460 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20040105 +DTEND;VALUE=DATE:20040106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223461 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20040106 +DTEND;VALUE=DATE:20040107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223462 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20040328 +DTEND;VALUE=DATE:20040329 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223463 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20040408 +DTEND;VALUE=DATE:20040409 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223464 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20040409 +DTEND;VALUE=DATE:20040410 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223465 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20040411 +DTEND;VALUE=DATE:20040412 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223466 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20040412 +DTEND;VALUE=DATE:20040413 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223467 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20040430 +DTEND;VALUE=DATE:20040501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223468 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20040501 +DTEND;VALUE=DATE:20040502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223469 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20040520 +DTEND;VALUE=DATE:20040521 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223470 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20040529 +DTEND;VALUE=DATE:20040530 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223471 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20040530 +DTEND;VALUE=DATE:20040531 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223472 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20040606 +DTEND;VALUE=DATE:20040607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223473 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20040626 +DTEND;VALUE=DATE:20040627 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223474 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20041031 +DTEND;VALUE=DATE:20041101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223475 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20041106 +DTEND;VALUE=DATE:20041107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223476 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20041224 +DTEND;VALUE=DATE:20041225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223477 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20041225 +DTEND;VALUE=DATE:20041226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223478 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20041226 +DTEND;VALUE=DATE:20041227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223479 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20041231 +DTEND;VALUE=DATE:20050101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223480 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20050101 +DTEND;VALUE=DATE:20050102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223481 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20050105 +DTEND;VALUE=DATE:20050106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223482 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20050106 +DTEND;VALUE=DATE:20050107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223483 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20050324 +DTEND;VALUE=DATE:20050325 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223484 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20050325 +DTEND;VALUE=DATE:20050326 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223485 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20050327 +DTEND;VALUE=DATE:20050328 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223486 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20050327 +DTEND;VALUE=DATE:20050328 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223487 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20050328 +DTEND;VALUE=DATE:20050329 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223488 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20050430 +DTEND;VALUE=DATE:20050501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223489 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20050501 +DTEND;VALUE=DATE:20050502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223490 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20050505 +DTEND;VALUE=DATE:20050506 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223491 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20050514 +DTEND;VALUE=DATE:20050515 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223492 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20050515 +DTEND;VALUE=DATE:20050516 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223493 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20050606 +DTEND;VALUE=DATE:20050607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223494 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20050625 +DTEND;VALUE=DATE:20050626 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223495 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20051030 +DTEND;VALUE=DATE:20051031 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223496 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20051105 +DTEND;VALUE=DATE:20051106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223497 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20051224 +DTEND;VALUE=DATE:20051225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223498 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20051225 +DTEND;VALUE=DATE:20051226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223499 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20051226 +DTEND;VALUE=DATE:20051227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223500 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20051231 +DTEND;VALUE=DATE:20060101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223501 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20060101 +DTEND;VALUE=DATE:20060102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223502 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20060105 +DTEND;VALUE=DATE:20060106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223503 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20060106 +DTEND;VALUE=DATE:20060107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223504 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20060326 +DTEND;VALUE=DATE:20060327 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223505 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20060413 +DTEND;VALUE=DATE:20060414 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223506 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20060414 +DTEND;VALUE=DATE:20060415 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223507 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20060416 +DTEND;VALUE=DATE:20060417 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223508 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20060417 +DTEND;VALUE=DATE:20060418 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223509 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20060430 +DTEND;VALUE=DATE:20060501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223510 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20060501 +DTEND;VALUE=DATE:20060502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223511 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20060525 +DTEND;VALUE=DATE:20060526 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223512 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20060603 +DTEND;VALUE=DATE:20060604 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223513 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20060604 +DTEND;VALUE=DATE:20060605 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223514 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20060606 +DTEND;VALUE=DATE:20060607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223515 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20060624 +DTEND;VALUE=DATE:20060625 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223516 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20061029 +DTEND;VALUE=DATE:20061030 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223517 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20061104 +DTEND;VALUE=DATE:20061105 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223518 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20061224 +DTEND;VALUE=DATE:20061225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223519 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20061225 +DTEND;VALUE=DATE:20061226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223520 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20061226 +DTEND;VALUE=DATE:20061227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223521 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20061231 +DTEND;VALUE=DATE:20070101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223522 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20070101 +DTEND;VALUE=DATE:20070102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223523 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20070105 +DTEND;VALUE=DATE:20070106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223524 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20070106 +DTEND;VALUE=DATE:20070107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223525 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20070325 +DTEND;VALUE=DATE:20070326 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223526 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20070405 +DTEND;VALUE=DATE:20070406 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223527 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20070406 +DTEND;VALUE=DATE:20070407 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223528 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20070408 +DTEND;VALUE=DATE:20070409 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223529 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20070409 +DTEND;VALUE=DATE:20070410 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223530 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20070430 +DTEND;VALUE=DATE:20070501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223531 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20070501 +DTEND;VALUE=DATE:20070502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223532 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20070517 +DTEND;VALUE=DATE:20070518 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223533 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20070526 +DTEND;VALUE=DATE:20070527 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223534 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20070527 +DTEND;VALUE=DATE:20070528 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223535 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20070606 +DTEND;VALUE=DATE:20070607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223536 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20070623 +DTEND;VALUE=DATE:20070624 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223537 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20071028 +DTEND;VALUE=DATE:20071029 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223538 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20071103 +DTEND;VALUE=DATE:20071104 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223539 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20071224 +DTEND;VALUE=DATE:20071225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223540 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20071225 +DTEND;VALUE=DATE:20071226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223541 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20071226 +DTEND;VALUE=DATE:20071227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223542 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20071231 +DTEND;VALUE=DATE:20080101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223543 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20080101 +DTEND;VALUE=DATE:20080102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223544 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20080105 +DTEND;VALUE=DATE:20080106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223545 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20080106 +DTEND;VALUE=DATE:20080107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223546 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20080320 +DTEND;VALUE=DATE:20080321 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223547 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20080321 +DTEND;VALUE=DATE:20080322 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223548 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20080323 +DTEND;VALUE=DATE:20080324 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223549 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20080324 +DTEND;VALUE=DATE:20080325 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223550 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20080330 +DTEND;VALUE=DATE:20080331 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223551 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20080430 +DTEND;VALUE=DATE:20080501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223552 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20080501 +DTEND;VALUE=DATE:20080502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223553 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20080501 +DTEND;VALUE=DATE:20080502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223554 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20080510 +DTEND;VALUE=DATE:20080511 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223555 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20080511 +DTEND;VALUE=DATE:20080512 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223556 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20080606 +DTEND;VALUE=DATE:20080607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223557 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20080621 +DTEND;VALUE=DATE:20080622 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223558 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20081026 +DTEND;VALUE=DATE:20081027 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223559 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20081101 +DTEND;VALUE=DATE:20081102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223560 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20081224 +DTEND;VALUE=DATE:20081225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223561 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20081225 +DTEND;VALUE=DATE:20081226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223562 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20081226 +DTEND;VALUE=DATE:20081227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223563 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20081231 +DTEND;VALUE=DATE:20090101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223564 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223565 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20090105 +DTEND;VALUE=DATE:20090106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223566 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20090106 +DTEND;VALUE=DATE:20090107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223567 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20090329 +DTEND;VALUE=DATE:20090330 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223568 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20090409 +DTEND;VALUE=DATE:20090410 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223569 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223570 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223571 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223572 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20090430 +DTEND;VALUE=DATE:20090501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223573 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223574 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20090521 +DTEND;VALUE=DATE:20090522 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223575 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20090530 +DTEND;VALUE=DATE:20090531 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223576 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20090531 +DTEND;VALUE=DATE:20090601 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223577 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20090606 +DTEND;VALUE=DATE:20090607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223578 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20090620 +DTEND;VALUE=DATE:20090621 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223579 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20091025 +DTEND;VALUE=DATE:20091026 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223580 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20091031 +DTEND;VALUE=DATE:20091101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223581 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20091224 +DTEND;VALUE=DATE:20091225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223582 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223583 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223584 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20091231 +DTEND;VALUE=DATE:20100101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223585 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223586 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20100105 +DTEND;VALUE=DATE:20100106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223587 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20100106 +DTEND;VALUE=DATE:20100107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223588 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20100328 +DTEND;VALUE=DATE:20100329 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223589 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20100401 +DTEND;VALUE=DATE:20100402 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223590 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223591 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223592 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223593 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20100430 +DTEND;VALUE=DATE:20100501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223594 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20100501 +DTEND;VALUE=DATE:20100502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223595 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223596 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20100522 +DTEND;VALUE=DATE:20100523 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223597 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223598 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20100606 +DTEND;VALUE=DATE:20100607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223599 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20100626 +DTEND;VALUE=DATE:20100627 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223600 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20101031 +DTEND;VALUE=DATE:20101101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223601 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20101106 +DTEND;VALUE=DATE:20101107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223602 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20101224 +DTEND;VALUE=DATE:20101225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223603 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223604 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20101226 +DTEND;VALUE=DATE:20101227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223605 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20101231 +DTEND;VALUE=DATE:20110101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223606 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:20110102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223607 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20110105 +DTEND;VALUE=DATE:20110106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223608 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20110106 +DTEND;VALUE=DATE:20110107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223609 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20110327 +DTEND;VALUE=DATE:20110328 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223610 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20110421 +DTEND;VALUE=DATE:20110422 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223611 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223612 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223613 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223614 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20110430 +DTEND;VALUE=DATE:20110501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223615 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20110501 +DTEND;VALUE=DATE:20110502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223616 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223617 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20110606 +DTEND;VALUE=DATE:20110607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223618 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20110611 +DTEND;VALUE=DATE:20110612 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223619 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223620 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20110625 +DTEND;VALUE=DATE:20110626 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223621 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20111030 +DTEND;VALUE=DATE:20111031 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223622 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20111105 +DTEND;VALUE=DATE:20111106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223623 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20111224 +DTEND;VALUE=DATE:20111225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223624 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223625 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20111226 +DTEND;VALUE=DATE:20111227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223626 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20111231 +DTEND;VALUE=DATE:20120101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223627 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20120101 +DTEND;VALUE=DATE:20120102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223628 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20120105 +DTEND;VALUE=DATE:20120106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223629 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20120106 +DTEND;VALUE=DATE:20120107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223630 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20120325 +DTEND;VALUE=DATE:20120326 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223631 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20120405 +DTEND;VALUE=DATE:20120406 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223632 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223633 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223634 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223635 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20120430 +DTEND;VALUE=DATE:20120501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223636 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20120501 +DTEND;VALUE=DATE:20120502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223637 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223638 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20120526 +DTEND;VALUE=DATE:20120527 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223639 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20120527 +DTEND;VALUE=DATE:20120528 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223640 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20120606 +DTEND;VALUE=DATE:20120607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223641 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20120623 +DTEND;VALUE=DATE:20120624 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223642 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20121028 +DTEND;VALUE=DATE:20121029 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223643 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20121103 +DTEND;VALUE=DATE:20121104 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223644 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20121224 +DTEND;VALUE=DATE:20121225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223645 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223646 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20121226 +DTEND;VALUE=DATE:20121227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223647 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20121231 +DTEND;VALUE=DATE:20130101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223648 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20130101 +DTEND;VALUE=DATE:20130102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223649 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20130105 +DTEND;VALUE=DATE:20130106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223650 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20130106 +DTEND;VALUE=DATE:20130107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223651 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20130328 +DTEND;VALUE=DATE:20130329 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223652 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223653 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223654 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223655 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223656 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20130430 +DTEND;VALUE=DATE:20130501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223657 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20130501 +DTEND;VALUE=DATE:20130502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223658 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223659 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20130518 +DTEND;VALUE=DATE:20130519 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223660 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223661 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20130606 +DTEND;VALUE=DATE:20130607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223662 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20130622 +DTEND;VALUE=DATE:20130623 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223663 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20131027 +DTEND;VALUE=DATE:20131028 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223664 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20131102 +DTEND;VALUE=DATE:20131103 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223665 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20131224 +DTEND;VALUE=DATE:20131225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223666 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20131225 +DTEND;VALUE=DATE:20131226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223667 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20131226 +DTEND;VALUE=DATE:20131227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223668 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20131231 +DTEND;VALUE=DATE:20140101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223669 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20140101 +DTEND;VALUE=DATE:20140102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223670 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20140105 +DTEND;VALUE=DATE:20140106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223671 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20140106 +DTEND;VALUE=DATE:20140107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223672 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20140330 +DTEND;VALUE=DATE:20140331 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223673 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20140417 +DTEND;VALUE=DATE:20140418 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223674 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223675 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223676 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223677 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20140430 +DTEND;VALUE=DATE:20140501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223678 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20140501 +DTEND;VALUE=DATE:20140502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223679 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20140529 +DTEND;VALUE=DATE:20140530 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223680 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20140606 +DTEND;VALUE=DATE:20140607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223681 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20140607 +DTEND;VALUE=DATE:20140608 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223682 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20140608 +DTEND;VALUE=DATE:20140609 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223683 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20140621 +DTEND;VALUE=DATE:20140622 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223684 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20141026 +DTEND;VALUE=DATE:20141027 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223685 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20141101 +DTEND;VALUE=DATE:20141102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223686 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20141224 +DTEND;VALUE=DATE:20141225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223687 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20141225 +DTEND;VALUE=DATE:20141226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223688 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20141226 +DTEND;VALUE=DATE:20141227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223689 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20141231 +DTEND;VALUE=DATE:20150101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223690 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20150101 +DTEND;VALUE=DATE:20150102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223691 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20150105 +DTEND;VALUE=DATE:20150106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223692 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20150106 +DTEND;VALUE=DATE:20150107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223693 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20150329 +DTEND;VALUE=DATE:20150330 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223694 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20150402 +DTEND;VALUE=DATE:20150403 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223695 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223696 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223697 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223698 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20150430 +DTEND;VALUE=DATE:20150501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223699 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20150501 +DTEND;VALUE=DATE:20150502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223700 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20150514 +DTEND;VALUE=DATE:20150515 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223701 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20150523 +DTEND;VALUE=DATE:20150524 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223702 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20150524 +DTEND;VALUE=DATE:20150525 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223703 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20150606 +DTEND;VALUE=DATE:20150607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223704 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20150620 +DTEND;VALUE=DATE:20150621 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223705 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20151025 +DTEND;VALUE=DATE:20151026 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223706 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20151031 +DTEND;VALUE=DATE:20151101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223707 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20151224 +DTEND;VALUE=DATE:20151225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223708 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20151225 +DTEND;VALUE=DATE:20151226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223709 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20151226 +DTEND;VALUE=DATE:20151227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223710 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20151231 +DTEND;VALUE=DATE:20160101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223711 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20160101 +DTEND;VALUE=DATE:20160102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223712 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20160105 +DTEND;VALUE=DATE:20160106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223713 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20160106 +DTEND;VALUE=DATE:20160107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223714 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20160324 +DTEND;VALUE=DATE:20160325 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223715 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20160325 +DTEND;VALUE=DATE:20160326 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223716 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223717 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223718 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20160328 +DTEND;VALUE=DATE:20160329 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223719 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20160430 +DTEND;VALUE=DATE:20160501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223720 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20160501 +DTEND;VALUE=DATE:20160502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223721 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20160505 +DTEND;VALUE=DATE:20160506 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223722 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20160514 +DTEND;VALUE=DATE:20160515 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223723 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20160515 +DTEND;VALUE=DATE:20160516 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223724 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20160606 +DTEND;VALUE=DATE:20160607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223725 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20160625 +DTEND;VALUE=DATE:20160626 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223726 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20161030 +DTEND;VALUE=DATE:20161031 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223727 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20161105 +DTEND;VALUE=DATE:20161106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223728 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20161224 +DTEND;VALUE=DATE:20161225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223729 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20161225 +DTEND;VALUE=DATE:20161226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223730 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20161226 +DTEND;VALUE=DATE:20161227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223731 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20161231 +DTEND;VALUE=DATE:20170101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223732 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20170101 +DTEND;VALUE=DATE:20170102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223733 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20170105 +DTEND;VALUE=DATE:20170106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223734 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20170106 +DTEND;VALUE=DATE:20170107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223735 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20170326 +DTEND;VALUE=DATE:20170327 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223736 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20170413 +DTEND;VALUE=DATE:20170414 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223737 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20170414 +DTEND;VALUE=DATE:20170415 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223738 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223739 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20170417 +DTEND;VALUE=DATE:20170418 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223740 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20170430 +DTEND;VALUE=DATE:20170501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223741 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20170501 +DTEND;VALUE=DATE:20170502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223742 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20170525 +DTEND;VALUE=DATE:20170526 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223743 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20170603 +DTEND;VALUE=DATE:20170604 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223744 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20170604 +DTEND;VALUE=DATE:20170605 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223745 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20170606 +DTEND;VALUE=DATE:20170607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223746 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20170624 +DTEND;VALUE=DATE:20170625 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223747 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20171029 +DTEND;VALUE=DATE:20171030 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223748 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20171104 +DTEND;VALUE=DATE:20171105 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223749 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20171224 +DTEND;VALUE=DATE:20171225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223750 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20171225 +DTEND;VALUE=DATE:20171226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223751 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20171226 +DTEND;VALUE=DATE:20171227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223752 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20171231 +DTEND;VALUE=DATE:20180101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223753 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20180101 +DTEND;VALUE=DATE:20180102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223754 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20180105 +DTEND;VALUE=DATE:20180106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223755 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20180106 +DTEND;VALUE=DATE:20180107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223756 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20180325 +DTEND;VALUE=DATE:20180326 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223757 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20180329 +DTEND;VALUE=DATE:20180330 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223758 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20180330 +DTEND;VALUE=DATE:20180331 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223759 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20180401 +DTEND;VALUE=DATE:20180402 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223760 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20180402 +DTEND;VALUE=DATE:20180403 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223761 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20180430 +DTEND;VALUE=DATE:20180501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223762 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20180501 +DTEND;VALUE=DATE:20180502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223763 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20180510 +DTEND;VALUE=DATE:20180511 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223764 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20180519 +DTEND;VALUE=DATE:20180520 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223765 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20180520 +DTEND;VALUE=DATE:20180521 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223766 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20180606 +DTEND;VALUE=DATE:20180607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223767 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20180623 +DTEND;VALUE=DATE:20180624 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223768 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20181028 +DTEND;VALUE=DATE:20181029 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223769 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20181103 +DTEND;VALUE=DATE:20181104 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223770 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20181224 +DTEND;VALUE=DATE:20181225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223771 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20181225 +DTEND;VALUE=DATE:20181226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223772 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20181226 +DTEND;VALUE=DATE:20181227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223773 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20181231 +DTEND;VALUE=DATE:20190101 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223774 +SUMMARY:Nyårsdagen +DTSTART;VALUE=DATE:20190101 +DTEND;VALUE=DATE:20190102 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223775 +SUMMARY:Trettondagsafton +DTSTART;VALUE=DATE:20190105 +DTEND;VALUE=DATE:20190106 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223776 +SUMMARY:Trettondag jul +DTSTART;VALUE=DATE:20190106 +DTEND;VALUE=DATE:20190107 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223777 +SUMMARY:Övergång till sommartid +DTSTART;VALUE=DATE:20190331 +DTEND;VALUE=DATE:20190401 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223778 +SUMMARY:Skärtorsdag +DTSTART;VALUE=DATE:20190418 +DTEND;VALUE=DATE:20190419 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223779 +SUMMARY:Långfredag +DTSTART;VALUE=DATE:20190419 +DTEND;VALUE=DATE:20190420 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223780 +SUMMARY:Påskdagen +DTSTART;VALUE=DATE:20190421 +DTEND;VALUE=DATE:20190422 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223781 +SUMMARY:Annandag påsk +DTSTART;VALUE=DATE:20190422 +DTEND;VALUE=DATE:20190423 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223782 +SUMMARY:Valborgsmässoafton +DTSTART;VALUE=DATE:20190430 +DTEND;VALUE=DATE:20190501 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223783 +SUMMARY:Första maj +DTSTART;VALUE=DATE:20190501 +DTEND;VALUE=DATE:20190502 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223784 +SUMMARY:Kristi himmelfärdsdag +DTSTART;VALUE=DATE:20190530 +DTEND;VALUE=DATE:20190531 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223785 +SUMMARY:Nationaldagen +DTSTART;VALUE=DATE:20190606 +DTEND;VALUE=DATE:20190607 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223786 +SUMMARY:Pingstafton +DTSTART;VALUE=DATE:20190608 +DTEND;VALUE=DATE:20190609 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223787 +SUMMARY:Pingstdagen +DTSTART;VALUE=DATE:20190609 +DTEND;VALUE=DATE:20190610 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223788 +SUMMARY:Midsommardagen +DTSTART;VALUE=DATE:20190622 +DTEND;VALUE=DATE:20190623 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223789 +SUMMARY:Övergång till vintertid +DTSTART;VALUE=DATE:20191027 +DTEND;VALUE=DATE:20191028 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223790 +SUMMARY:Alla helgons dag +DTSTART;VALUE=DATE:20191102 +DTEND;VALUE=DATE:20191103 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223791 +SUMMARY:Julafton +DTSTART;VALUE=DATE:20191224 +DTEND;VALUE=DATE:20191225 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223792 +SUMMARY:Juldagen +DTSTART;VALUE=DATE:20191225 +DTEND;VALUE=DATE:20191226 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223793 +SUMMARY:Annandag jul +DTSTART;VALUE=DATE:20191226 +DTEND;VALUE=DATE:20191227 +END:VEVENT +BEGIN:VEVENT +CREATED:20080514T055749Z +LAST-MODIFIED:20080517T164105Z +DTSTAMP:20080514T055749Z +UID:uuid1211149223794 +SUMMARY:Nyårsafton +DTSTART;VALUE=DATE:20191231 +DTEND;VALUE=DATE:20200101 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/SwissHolidays.ics b/media/caldata/SwissHolidays.ics new file mode 100644 index 00000000000..55482452ddd --- /dev/null +++ b/media/caldata/SwissHolidays.ics @@ -0,0 +1,2777 @@ +BEGIN:VCALENDAR +METHOD:PUBLISH +VERSION:2.0 +X-WR-CALNAME:SwissHolidays +PRODID:-//Apple Inc.//Mac OS X 10.8//EN +X-APPLE-CALENDAR-COLOR:#E6C800 +X-WR-TIMEZONE:Europe/Berlin +CALSCALE:GREGORIAN +BEGIN:VEVENT +CREATED:20110917T031916Z +UID:d73f6d78-398a-4b31-92f1-48ad9c2af059 +DTEND;VALUE=DATE:20120802 +TRANSP:TRANSPARENT +SUMMARY:Bundesfeier/Fête nationale/Festa nazionale Svizzera +LAST-MODIFIED:20110917T031926Z +DTSTAMP:20110917T031926Z +DTSTART;VALUE=DATE:20120801 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:D354E537-0E9B-49B0-8556-C84ED968CC51 +UID:D354E537-0E9B-49B0-8556-C84ED968CC51 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T234054Z +UID:8afe0bf4-30bc-496e-94f0-2f6e3dca79ec +DTEND;VALUE=DATE:20110302 +TRANSP:TRANSPARENT +SUMMARY:Instauration de la République (NE) +LAST-MODIFIED:20110125T234122Z +DTSTAMP:20110125T234054Z +DTSTART;VALUE=DATE:20110301 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:D66C0451-428D-4B07-A25A-1B55DA8A6E67 +UID:D66C0451-428D-4B07-A25A-1B55DA8A6E67 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T234239Z +UID:3b7faeac-7277-47c2-8795-9ca57875ffeb +DTEND;VALUE=DATE:20110408 +TRANSP:TRANSPARENT +SUMMARY:Fahrstsfest (GL) +LAST-MODIFIED:20110125T234342Z +DTSTAMP:20110125T234239Z +DTSTART;VALUE=DATE:20110407 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:7EF13930-65B6-4CA2-B3BF-61DBB621A870 +UID:7EF13930-65B6-4CA2-B3BF-61DBB621A870 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031725Z +UID:98493abf-43eb-4ac5-a51d-e495792289bb +DTEND;VALUE=DATE:20120528 +TRANSP:TRANSPARENT +SUMMARY:Pfingsten/Pentecôte/Pentecoste +LAST-MODIFIED:20110917T031736Z +DTSTAMP:20110917T031736Z +DTSTART;VALUE=DATE:20120527 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:7671F053-4A25-4748-80DA-9278CE793F37 +UID:7671F053-4A25-4748-80DA-9278CE793F37 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T032133Z +UID:2c3c1678-3f32-44ab-aaf7-230df3bee61e +DTEND;VALUE=DATE:20121226 +TRANSP:TRANSPARENT +SUMMARY:Weihnachtstag/Noël/Natale +LAST-MODIFIED:20110917T032146Z +DTSTAMP:20110917T032146Z +DTSTART;VALUE=DATE:20121225 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:61CF7B1E-281E-4C6A-AF37-146079105099 +UID:61CF7B1E-281E-4C6A-AF37-146079105099 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T235511Z +UID:2a124efb-aca9-4a31-a869-7d27f28977c4 +DTEND;VALUE=DATE:20110624 +TRANSP:TRANSPARENT +SUMMARY:Commemoration du plébiscite jurassien (JU) +LAST-MODIFIED:20110125T235555Z +DTSTAMP:20110125T235511Z +DTSTART;VALUE=DATE:20110623 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:EEA9F942-D97C-4267-AE11-33D21715B671 +UID:EEA9F942-D97C-4267-AE11-33D21715B671 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110126T000543Z +UID:02e0bd43-92ed-4a8c-913a-2dbcf5edded8 +DTEND;VALUE=DATE:20111226 +TRANSP:TRANSPARENT +SUMMARY:Weihnachtstag/Noël/Natale +LAST-MODIFIED:20110126T000606Z +DTSTAMP:20110126T000543Z +DTSTART;VALUE=DATE:20111225 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:2F7ADC52-5D83-41F6-93FE-B7F84EDEDECC +UID:2F7ADC52-5D83-41F6-93FE-B7F84EDEDECC +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031854Z +UID:270ed465-2a3d-4563-867e-e44fd775537e +DTEND;VALUE=DATE:20120630 +TRANSP:TRANSPARENT +SUMMARY:Peter und Paul/Sts-Pierre et Paul/San Pietro e Paolo (TI) +LAST-MODIFIED:20110917T031858Z +DTSTAMP:20110917T031858Z +DTSTART;VALUE=DATE:20120629 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:16286233-94D0-4BD0-8D94-BEFFC558E5DF +UID:16286233-94D0-4BD0-8D94-BEFFC558E5DF +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031657Z +UID:7623e947-1b27-4353-b3c6-7bb854f11cd1 +DTEND;VALUE=DATE:20120518 +TRANSP:TRANSPARENT +SUMMARY:Auffahrt/Ascension/Ascensione +LAST-MODIFIED:20110917T031714Z +DTSTAMP:20110917T031714Z +DTSTART;VALUE=DATE:20120517 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:A4C68F78-AACE-4B16-B5E2-EC1186C607D1 +UID:A4C68F78-AACE-4B16-B5E2-EC1186C607D1 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T032037Z +UID:73bf4d25-df05-420b-b73c-5dfc7ef16845 +DTEND;VALUE=DATE:20120926 +TRANSP:TRANSPARENT +SUMMARY:Bruderklausenfest/Fête de St-Nicolas-de-Flüe/San Nicolao della F + lüe (OW) +LAST-MODIFIED:20110917T032041Z +DTSTAMP:20110917T032041Z +DTSTART;VALUE=DATE:20120925 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:F714C580-D54C-4C80-ACAD-7BDCDF318FAF +UID:F714C580-D54C-4C80-ACAD-7BDCDF318FAF +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T235603Z +UID:07e19406-cd42-40ce-9478-e9a4034c97a3 +DTEND;VALUE=DATE:20110630 +TRANSP:TRANSPARENT +SUMMARY:San Pietro e Paolo (TI) +LAST-MODIFIED:20110125T235658Z +DTSTAMP:20110125T235603Z +DTSTART;VALUE=DATE:20110629 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:0B277EC5-E2A2-4B1B-AC26-3ADB2D0B65CB +UID:0B277EC5-E2A2-4B1B-AC26-3ADB2D0B65CB +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T032054Z +UID:e721c2f6-6ffd-4b8c-85d7-cf2cb04f3234 +DTEND;VALUE=DATE:20121102 +TRANSP:TRANSPARENT +SUMMARY:Allerheiligen/Toussaint/Ognissanti (AG/AI/BE/FR/GL/JU/LU/NW/OW/S + G/SO/SZ/TI/UR/VS/ZG) +LAST-MODIFIED:20110917T032101Z +DTSTAMP:20110917T032101Z +DTSTART;VALUE=DATE:20121101 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:020140CF-3F78-4BCD-9AFB-CEB293452F96 +UID:020140CF-3F78-4BCD-9AFB-CEB293452F96 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110126T000204Z +UID:ddaa0c95-1d2b-4e2b-925c-a2a19e07cd5a +DTEND;VALUE=DATE:20111102 +TRANSP:TRANSPARENT +SUMMARY:Allerheiligen/Toussaint/Ognissanti (AG/AI/FR/GL/JU/LU/NW/OW/SG/S + O/SZ/TI/UR/VS/ZG) +LAST-MODIFIED:20110126T000343Z +DTSTAMP:20110126T000204Z +DTSTART;VALUE=DATE:20111101 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:8CDB7D35-5636-4513-8D8A-207F137D29B7 +UID:8CDB7D35-5636-4513-8D8A-207F137D29B7 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T030856Z +UID:27f56891-9781-497f-a5ef-08f4d4b30da8 +DTEND;VALUE=DATE:20120102 +TRANSP:TRANSPARENT +SUMMARY:Neujahrstag/Nouvel An/Capodanno +LAST-MODIFIED:20110917T031016Z +DTSTAMP:20110917T031016Z +DTSTART;VALUE=DATE:20120101 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:1B30646D-5A42-46AD-95A4-0764D01B5F44 +UID:1B30646D-5A42-46AD-95A4-0764D01B5F44 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110126T000011Z +UID:22eb1635-1eca-4c08-bdca-9861c11d73c8 +DTEND;VALUE=DATE:20110920 +TRANSP:TRANSPARENT +SUMMARY:Lundi du Jeûne fédéral (NE/VD) +LAST-MODIFIED:20110126T000116Z +DTSTAMP:20110126T000011Z +DTSTART;VALUE=DATE:20110919 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:F48F6FDF-2CE2-4CDB-8EBD-A0557800872E +UID:F48F6FDF-2CE2-4CDB-8EBD-A0557800872E +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031822Z +UID:a5ef065c-314f-4dd9-95f0-9ed8ec936d58 +DTEND;VALUE=DATE:20120608 +TRANSP:TRANSPARENT +SUMMARY:Fronleichnam/Fête-Dieu/Corpus Domini (AG/AI/BE/FR/JU/LU/NW/OW/SO + /SZ/TI/UR/VS/ZG) +LAST-MODIFIED:20110917T031826Z +DTSTAMP:20110917T031826Z +DTSTART;VALUE=DATE:20120607 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:0A90E201-5130-424A-9A75-7C07F5AD5B9F +UID:0A90E201-5130-424A-9A75-7C07F5AD5B9F +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T234603Z +UID:e68c44d8-a2be-4840-9927-e553b569444d +DTEND;VALUE=DATE:20110426 +TRANSP:TRANSPARENT +SUMMARY:Ostermontag/Lundi de Pâques/Lunedì di Pasqua (AG/AI/AR/BE/BL/BS/ + FR/GE/GL/GR/JU/LU/NE/NW/OW/SG/SH/SO/SZ/TG/TI/UR/VD/ZG/ZH) +LAST-MODIFIED:20110125T234816Z +DTSTAMP:20110125T234603Z +DTSTART;VALUE=DATE:20110425 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:3438564D-5649-4104-B47E-F4E486552492 +UID:3438564D-5649-4104-B47E-F4E486552492 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T233725Z +UID:925f4d9b-6864-4467-be74-0ebebe08ceb5 +DTEND;VALUE=DATE:20110103 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +SUMMARY:Berchtoldstag (AG/BE/FR/GL/JU/LU/NE/OW/SH/SO/TG/VD/ZG/ZH) +LAST-MODIFIED:20110125T233935Z +DTSTAMP:20110125T233725Z +DTSTART;VALUE=DATE:20110102 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:8C491007-310A-4D98-9558-D6B621701E42 +UID:8C491007-310A-4D98-9558-D6B621701E42 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T235931Z +UID:eecc6805-9ac0-4e16-aa06-d1bef4690ca3 +DTEND;VALUE=DATE:20110909 +TRANSP:TRANSPARENT +SUMMARY:Jeûne genevois (GE) +LAST-MODIFIED:20110126T000002Z +DTSTAMP:20110125T235931Z +DTSTART;VALUE=DATE:20110908 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:31C3AE36-249D-475D-9B6D-9998017EA00F +UID:31C3AE36-249D-475D-9B6D-9998017EA00F +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031429Z +UID:3c9dacb2-4294-4945-8fde-e3c663279a0c +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +SUMMARY:Karfreitag/Vendredi Saint/Venerdi Santo (AG/AI/AR/BE/BL/BS/FR/GE + /GL/GR/JU/LU/NE/NW/OW/SG/SH/SO/SZ/TG/UR/VD/VS/ZG/ZH) +LAST-MODIFIED:20110917T031433Z +DTSTAMP:20110917T031433Z +DTSTART;VALUE=DATE:20120406 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:A63E2A90-01A4-42A2-BFE0-61F86940C088 +UID:A63E2A90-01A4-42A2-BFE0-61F86940C088 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T234827Z +UID:4dd0ade7-463c-4bdb-9565-6340d155b12b +DTEND;VALUE=DATE:20110502 +TRANSP:TRANSPARENT +SUMMARY:Tag der Arbeit/Fête du travail/Festa del lavoro (BL/BS/FR/JU/NE/ + SH/SO/TG/TI/ZH) +LAST-MODIFIED:20110125T234933Z +DTSTAMP:20110125T234827Z +DTSTART;VALUE=DATE:20110501 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:38845E7F-BC60-468E-8C4D-CCA625FC9492 +UID:38845E7F-BC60-468E-8C4D-CCA625FC9492 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031937Z +UID:df63e6d5-5861-4d05-81b2-fb416af95621 +DTEND;VALUE=DATE:20120816 +TRANSP:TRANSPARENT +SUMMARY:Mariä Himmelfahrt/Assomption/Assunzione +LAST-MODIFIED:20110917T031950Z +DTSTAMP:20110917T031950Z +DTSTART;VALUE=DATE:20120815 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:EC73485C-2ABD-47B6-B652-60472928F1A8 +UID:EC73485C-2ABD-47B6-B652-60472928F1A8 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T032114Z +UID:68144ebc-f491-431d-ae64-52fc5629c004 +DTEND;VALUE=DATE:20121209 +TRANSP:TRANSPARENT +SUMMARY:Maria Empfängnis/Immaculée Conception/Immacolata (AI/FR/LU/NW/OW + /SZ/TI/UR/VS/ZG) +LAST-MODIFIED:20110917T032119Z +DTSTAMP:20110917T032119Z +DTSTART;VALUE=DATE:20121208 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:2A0E23DA-98BC-44CB-9538-A8F2AA7F96E2 +UID:2A0E23DA-98BC-44CB-9538-A8F2AA7F96E2 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T234351Z +UID:ab5d16a7-0695-48a6-8eb4-0b9b6bf237d2 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +SUMMARY:Karfreitag/Vendredi Saint (AG/AI/AR/BE/BL/BS/FR/GE/GL/GR/JU/LU/N + E/NW/OW/SG/SH/SO/SZ/TG/UR/VD/ZG/ZH) +LAST-MODIFIED:20110125T234551Z +DTSTAMP:20110125T234351Z +DTSTART;VALUE=DATE:20110422 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:1D53EDBC-9498-438C-9DF5-02530BBAF408 +UID:1D53EDBC-9498-438C-9DF5-02530BBAF408 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T032210Z +UID:c8b4abb3-8353-4bab-b8cc-07154a55c055 +DTEND;VALUE=DATE:20130101 +TRANSP:TRANSPARENT +SUMMARY:Wiederherstellung der Republik Genf/Restauration de la Républiqu + e/Restaurazione della Repubblica ginevrina (GE) +LAST-MODIFIED:20110917T032215Z +DTSTAMP:20110917T032215Z +DTSTART;VALUE=DATE:20121231 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:BBFBDC86-8E73-4768-8DD5-0AED9B24E6C7 +UID:BBFBDC86-8E73-4768-8DD5-0AED9B24E6C7 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031239Z +UID:8a1db6fd-4d30-4b97-9e28-4f0cdcf8051e +DTEND;VALUE=DATE:20120221 +TRANSP:TRANSPARENT +SUMMARY:Fasnachtsmontag/Lundi de Carnaval/Lunedì grasso (GL/LU) +LAST-MODIFIED:20110917T031244Z +DTSTAMP:20110917T031244Z +DTSTART;VALUE=DATE:20120220 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:A9C96576-9138-42DE-B486-9DC65D913C46 +UID:A9C96576-9138-42DE-B486-9DC65D913C46 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031543Z +UID:350e5a31-096b-4b09-b0db-336d19d8258c +DTEND;VALUE=DATE:20120413 +TRANSP:TRANSPARENT +SUMMARY:Näfelser-Fahrt/Bataille de Näfels/Battaglia di Näfels (GL) +LAST-MODIFIED:20110917T031556Z +DTSTAMP:20110917T031556Z +DTSTART;VALUE=DATE:20120412 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:2179BDF2-BF7B-450E-9E5D-72F356842924 +UID:2179BDF2-BF7B-450E-9E5D-72F356842924 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031617Z +UID:38ba4c1e-cc50-4261-8e20-7d2b4aaf5149 +DTEND;VALUE=DATE:20120502 +TRANSP:TRANSPARENT +SUMMARY:Tag der Arbeit/Fête du travail/Festa del lavoro (BL/BS/JU/NE/SH/ + TG/TI/ZH) +LAST-MODIFIED:20110917T031622Z +DTSTAMP:20110917T031622Z +DTSTART;VALUE=DATE:20120501 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:B5217732-0DAA-44DC-8EDE-32D6EA35F0A4 +UID:B5217732-0DAA-44DC-8EDE-32D6EA35F0A4 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T235751Z +UID:3033d6bc-4ce7-4571-bfc9-f8582ebf878b +DTEND;VALUE=DATE:20110816 +TRANSP:TRANSPARENT +SUMMARY:Maria Himmelfahrt/Assomption/Assunzione (AG/AI/FR/JU/LU/NW/OW/SO + /SZ/TI/UR/VS/ZG) +LAST-MODIFIED:20110125T235917Z +DTSTAMP:20110125T235751Z +DTSTART;VALUE=DATE:20110815 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:3A4DB0EE-9200-4AA3-9CF0-CF9F0359B573 +UID:3A4DB0EE-9200-4AA3-9CF0-CF9F0359B573 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T233544Z +UID:a70072c1-f720-419d-888e-35e3bdaad07e +DTEND;VALUE=DATE:20110102 +TRANSP:TRANSPARENT +SUMMARY:Neujahrstag/Nouvel An/Capodanno +LAST-MODIFIED:20110125T233710Z +DTSTAMP:20110125T233544Z +DTSTART;VALUE=DATE:20110101 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:9A112516-A4BD-4EA5-8F47-90E3D4C37DC9 +UID:9A112516-A4BD-4EA5-8F47-90E3D4C37DC9 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110126T000835Z +UID:0bec2759-b523-4429-966c-bd61ecc5ac42 +DTEND;VALUE=DATE:20120101 +TRANSP:TRANSPARENT +SUMMARY:Restauration de la République (GE) +LAST-MODIFIED:20110126T000901Z +DTSTAMP:20110126T000835Z +DTSTART;VALUE=DATE:20111231 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:B3419C1E-7319-4CDF-B3EF-51F07127283E +UID:B3419C1E-7319-4CDF-B3EF-51F07127283E +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T235019Z +UID:9ed84d54-c332-468b-b1c9-e35e2ea21be0 +DTEND;VALUE=DATE:20110614 +TRANSP:TRANSPARENT +SUMMARY:Pfingstmontag/Lundi de Pentecôte/Lunedì di Pentecoste (AG/AI/AR/ + BE/BL/BS/FR/GE/GL/GR/JU/LU/NE/NW/OW/SG/SH/SO/SZ/TG/TI/UR/VD/ZG/ZH) +LAST-MODIFIED:20110125T235315Z +DTSTAMP:20110125T235019Z +DTSTART;VALUE=DATE:20110613 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:D9F3A0D6-F513-40A5-AE94-D9869844C74F +UID:D9F3A0D6-F513-40A5-AE94-D9869844C74F +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T032022Z +UID:3ec05d77-eaa1-45f7-8230-1611fc8abbee +DTEND;VALUE=DATE:20120918 +TRANSP:TRANSPARENT +SUMMARY:Bettagsmontag/Lundi du Jeûne fédéral/Digiuno Federale Svizzero ( + NE/VD/VS) +LAST-MODIFIED:20110917T032027Z +DTSTAMP:20110917T032027Z +DTSTART;VALUE=DATE:20120917 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:4DC0E6B4-D5AD-43C2-8A5D-E0ACC39C8834 +UID:4DC0E6B4-D5AD-43C2-8A5D-E0ACC39C8834 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110126T000618Z +UID:b369b870-f938-4a07-91f4-f5b1fa104acd +DTEND;VALUE=DATE:20111227 +TRANSP:TRANSPARENT +SUMMARY:Stephanstag/Saint-Etienne/Santo Stefano (AG/AI/AR/BE/BL/BS/FR/GL + /GR/LU/NE/NW/OW/SG/SH/SO/SZ/TG/TI/UR/ZG/ZH) +LAST-MODIFIED:20110126T000827Z +DTSTAMP:20110126T000618Z +DTSTART;VALUE=DATE:20111226 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:C671DF5C-68EE-4407-BDE7-8C49D1B5B585 +UID:C671DF5C-68EE-4407-BDE7-8C49D1B5B585 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031216Z +UID:f273459b-5a26-4c5a-92c8-d5cb0c0fa1ce +DTEND;VALUE=DATE:20120107 +TRANSP:TRANSPARENT +SUMMARY:Dreikönigstag/Epiphanie/Epifania (GR/SZ/TI/UR) +LAST-MODIFIED:20110917T031221Z +DTSTAMP:20110917T031221Z +DTSTART;VALUE=DATE:20120106 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:DAB3DEBD-C2EE-4774-ACE9-9A359E876E38 +UID:DAB3DEBD-C2EE-4774-ACE9-9A359E876E38 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031838Z +UID:6c361e35-fd75-411d-b7e2-ae06d3e9008d +DTEND;VALUE=DATE:20120624 +TRANSP:TRANSPARENT +SUMMARY:Gedenktag an die Volksbefragung im Jura/Commémoration du plébisc + ite jurassien/Indipendenza del Giura (JU) +LAST-MODIFIED:20110917T031843Z +DTSTAMP:20110917T031843Z +DTSTART;VALUE=DATE:20120623 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:E9483EB7-01B4-443F-9F84-9DA01D6820C6 +UID:E9483EB7-01B4-443F-9F84-9DA01D6820C6 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031751Z +UID:6b86f5e9-2753-40ce-b024-0cc6243b2823 +DTEND;VALUE=DATE:20120529 +TRANSP:TRANSPARENT +SUMMARY:Pfingstmontag/Lundi de Pentecôte/Lunedì di Pentecoste +LAST-MODIFIED:20110917T031802Z +DTSTAMP:20110917T031802Z +DTSTART;VALUE=DATE:20120528 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:4038E0BA-237D-482D-8730-9822D064C1BD +UID:4038E0BA-237D-482D-8730-9822D064C1BD +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031519Z +UID:7d561750-1dde-49d3-aec4-647141521617 +DTEND;VALUE=DATE:20120410 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +SUMMARY:Ostermontag/Lundi de Pâques/Lunedì di Pasqua +LAST-MODIFIED:20110917T032308Z +DTSTAMP:20110917T032308Z +DTSTART;VALUE=DATE:20120409 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:E64ED6E4-E49A-48ED-855E-8A53B31A4906 +UID:E64ED6E4-E49A-48ED-855E-8A53B31A4906 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031353Z +UID:3587ccf8-ec5b-41f3-a00c-f283d2f0608a +DTEND;VALUE=DATE:20120302 +TRANSP:TRANSPARENT +SUMMARY:Jahrestag Ausrufung Republik Neuenburg/'Instauration de la Répub + lique/Festa della Repubblica (NE) +LAST-MODIFIED:20110917T031358Z +DTSTAMP:20110917T031358Z +DTSTART;VALUE=DATE:20120301 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:B3528276-3BD8-4150-A83B-86019EBBA9D4 +UID:B3528276-3BD8-4150-A83B-86019EBBA9D4 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031331Z +UID:a89de063-a2a0-4855-9721-598e661ec168 +DTEND;VALUE=DATE:20120222 +TRANSP:TRANSPARENT +SUMMARY:Güdisdienstag (NW/OW) +LAST-MODIFIED:20110917T031337Z +DTSTAMP:20110917T031337Z +DTSTART;VALUE=DATE:20120221 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:55FE9AA9-17D6-4A97-A178-8407942BC671 +UID:55FE9AA9-17D6-4A97-A178-8407942BC671 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031445Z +UID:18f277a4-6b03-4228-958d-01c09baeb725 +DTEND;VALUE=DATE:20120409 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +SUMMARY:Ostern/Pâques/Pasqua +LAST-MODIFIED:20110917T032245Z +DTSTAMP:20110917T032245Z +DTSTART;VALUE=DATE:20120408 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:47A21CA4-7F1B-4F7A-9C00-EC167F362712 +UID:47A21CA4-7F1B-4F7A-9C00-EC167F362712 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110126T000355Z +UID:0da163cd-28d6-45e8-b5c4-bd16195f7ddb +DTEND;VALUE=DATE:20111209 +TRANSP:TRANSPARENT +SUMMARY:Maria Empfängnis/Immaculée Conception/Immacolata (AG/AI/FR/LU/NW + /OW/SZ/TI/UR/VS/ZG) +LAST-MODIFIED:20110126T000533Z +DTSTAMP:20110126T000355Z +DTSTART;VALUE=DATE:20111208 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:05295E94-C906-47B0-99F8-992B48CA6D58 +UID:05295E94-C906-47B0-99F8-992B48CA6D58 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031639Z +UID:da765140-099a-48a7-ace5-2ad2a7ebcb84 +DTEND;VALUE=DATE:20120508 +TRANSP:TRANSPARENT +SUMMARY:Landsgemeindemontag/Lundi de Landsgemeinde/Lunedì della Landsgem + einde (GL) +LAST-MODIFIED:20110917T031643Z +DTSTAMP:20110917T031643Z +DTSTART;VALUE=DATE:20120507 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:92BA8E59-75C5-46A2-B2CB-9E0952A061B9 +UID:92BA8E59-75C5-46A2-B2CB-9E0952A061B9 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T234134Z +UID:a78af9c7-faf3-4faa-9455-0fbab819d93d +DTEND;VALUE=DATE:20110320 +TRANSP:TRANSPARENT +SUMMARY:Josephstag/Saint-Joseph/San Giuseppe (LU/NW/SZ/TI/UR/VS) +LAST-MODIFIED:20110125T234227Z +DTSTAMP:20110125T234134Z +DTSTART;VALUE=DATE:20110319 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:139DF6E7-EBFA-4A91-B852-2CDD688EB72C +UID:139DF6E7-EBFA-4A91-B852-2CDD688EB72C +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T032155Z +UID:3dbf19f0-d7bd-4335-8117-339d6450da2a +DTEND;VALUE=DATE:20121227 +TRANSP:TRANSPARENT +SUMMARY:Stephanstag/Saint-Etienne/Santo Stefano (AI/AR/BE/BL/BS/FR/GE/GL + /GR/JU/LU/NE/NW/OW/SG/SH/SO/SZ/TG/TI/UR/VS/ZG/ZH) +LAST-MODIFIED:20110917T032159Z +DTSTAMP:20110917T032159Z +DTSTART;VALUE=DATE:20121226 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:F1988BDA-990F-4652-9B62-BBBA7779DBF0 +UID:F1988BDA-990F-4652-9B62-BBBA7779DBF0 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110126T000128Z +UID:23438fc8-58bd-46ed-a36b-c37a3262ba0f +DTEND;VALUE=DATE:20110926 +TRANSP:TRANSPARENT +SUMMARY:Bruderklausenfest (OW) +LAST-MODIFIED:20110126T000153Z +DTSTAMP:20110126T000128Z +DTSTART;VALUE=DATE:20110925 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:7D628432-71D9-4292-B8B8-C5EC28E7A82B +UID:7D628432-71D9-4292-B8B8-C5EC28E7A82B +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031412Z +UID:f4255329-f24d-4d1e-b3bc-d6c9d6386a36 +DTEND;VALUE=DATE:20120320 +TRANSP:TRANSPARENT +SUMMARY:Josephstag/Saint-Joseph/San Giuseppe (NW/SZ/TI/UR/VS) +LAST-MODIFIED:20110917T031417Z +DTSTAMP:20110917T031417Z +DTSTART;VALUE=DATE:20120319 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:A0BFCE2C-23CF-4502-B3E5-14D1603F150D +UID:A0BFCE2C-23CF-4502-B3E5-14D1603F150D +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T032005Z +UID:3ef7968a-e926-4404-93e3-7261ebb84bef +DTEND;VALUE=DATE:20120907 +TRANSP:TRANSPARENT +SUMMARY:Genfer Bettag/Jeûne genevois/Digiuno ginevrino (GE) +LAST-MODIFIED:20110917T032010Z +DTSTAMP:20110917T032010Z +DTSTART;VALUE=DATE:20120906 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:676C451F-E250-4E78-A942-41AF7A89BBF0 +UID:676C451F-E250-4E78-A942-41AF7A89BBF0 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T233943Z +UID:3b1e8944-8b37-4a04-94f4-c579181011e6 +DTEND;VALUE=DATE:20110107 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +SUMMARY:Dreikönigstag/Epiphanie/Epifania (SZ/TI/UR) +LAST-MODIFIED:20110125T234042Z +DTSTAMP:20110125T233943Z +DTSTART;VALUE=DATE:20110106 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:ECF530C9-8402-401B-AE34-8C9602840491 +UID:ECF530C9-8402-401B-AE34-8C9602840491 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T234941Z +UID:dda3a4cd-e623-4554-bbbe-21577f04539f +DTEND;VALUE=DATE:20110603 +TRANSP:TRANSPARENT +SUMMARY:Auffahrt/Ascension/Ascensione +LAST-MODIFIED:20110125T235008Z +DTSTAMP:20110125T234941Z +DTSTART;VALUE=DATE:20110602 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:D0778400-7627-4F47-9BC7-A5A02CB29EA7 +UID:D0778400-7627-4F47-9BC7-A5A02CB29EA7 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T235707Z +UID:199eb4c0-a768-43a8-9423-8bcffd0c5d18 +DTEND;VALUE=DATE:20110802 +TRANSP:TRANSPARENT +SUMMARY:Bundesfeier/Fête nationale/Festa nazionale Svizzera +LAST-MODIFIED:20110125T235742Z +DTSTAMP:20110125T235707Z +DTSTART;VALUE=DATE:20110801 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:1B6FD41A-4283-49F0-A11B-0BBB69CF32E5 +UID:1B6FD41A-4283-49F0-A11B-0BBB69CF32E5 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031254Z +UID:c2e71676-8510-47c9-880d-4fdac5529c02 +DTEND;VALUE=DATE:20120222 +TRANSP:TRANSPARENT +SUMMARY:Fasnachtsdienstag/Mardi de Carnaval/Martedì grasso (TI) +LAST-MODIFIED:20110917T031303Z +DTSTAMP:20110917T031303Z +DTSTART;VALUE=DATE:20120221 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:90E4BF97-1E32-43A3-9D7B-ABB6D505A6D9 +UID:90E4BF97-1E32-43A3-9D7B-ABB6D505A6D9 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110917T031035Z +UID:4946515e-2fa3-4224-a704-3ef8cd06093d +DTEND;VALUE=DATE:20120103 +TRANSP:TRANSPARENT +SUMMARY:Berchtoldstag/Saint Berchtold/San Bertoldo (AG/AI/AR/BE/BL/BS/FR + /GE/GL/GR/JU/LU/NE/NW/OW/SH/SO/TG/UR/VD/ZG/ZH) +LAST-MODIFIED:20110917T031048Z +DTSTAMP:20110917T031048Z +DTSTART;VALUE=DATE:20120102 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:331B5301-20FF-45F9-A8D6-E4B1AF931EEF +UID:331B5301-20FF-45F9-A8D6-E4B1AF931EEF +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20110125T235326Z +UID:fbba8114-5ca9-4754-8288-ba159d0a4768 +DTEND;VALUE=DATE:20110624 +TRANSP:TRANSPARENT +SUMMARY:Fronleichnam/Fête-Dieu/Corpus Domini (AG/AI/FR/JU/LU/NW/OW/SO/SZ + /TI/UR/VS/ZG) +LAST-MODIFIED:20110125T235505Z +DTSTAMP:20110125T235326Z +DTSTART;VALUE=DATE:20110623 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:1D1A8EEA-5131-4916-8D4D-D13E5F677B79 +UID:1D1A8EEA-5131-4916-8D4D-D13E5F677B79 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010648Z +UID:0cbcc38e-028b-4b38-9ad8-0432065600c7 +DTEND;VALUE=DATE:20131227 +RRULE:FREQ=YEARLY +TRANSP:TRANSPARENT +SUMMARY:Stephanstag/Saint-Etienne/Santo Stefano (AG/AI/AR/BE/BL/BS/FR/GE + /GL/GR/JU/LU/NE/NW/OW/SG/SH/SO/SZ/TG/TI/UR/VS/ZG/ZH) +LAST-MODIFIED:20120829T010658Z +DTSTAMP:20120829T010658Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131226 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:6ED6B593-D2D4-4E5B-980E-BFA9A7431DB1 +UID:6ED6B593-D2D4-4E5B-980E-BFA9A7431DB1 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010225Z +UID:7f413fdb-37ae-47d4-92e3-401d4d2fdd62 +DTEND;VALUE=DATE:20131003 +TRANSP:TRANSPARENT +SUMMARY:St. Leodegar/Saint Léodegar/San Leodegar (LU) +LAST-MODIFIED:20120829T010232Z +DTSTAMP:20120829T010232Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131002 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:22DCFC9F-E6F8-489B-A1F6-83AA9D514149 +UID:22DCFC9F-E6F8-489B-A1F6-83AA9D514149 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004049Z +UID:4efdc892-de84-47d1-a6f9-8b1dae34ebf4 +DTEND;VALUE=DATE:20130214 +TRANSP:TRANSPARENT +SUMMARY:Aeschli Nachmittag (ZH) +LAST-MODIFIED:20120829T004057Z +DTSTAMP:20120829T004057Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130213 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:46E8D3AD-7B89-496C-818A-4244B953872F +UID:46E8D3AD-7B89-496C-818A-4244B953872F +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005847Z +UID:5c9e971f-abb6-4058-ba07-0c91c74ee208 +DTEND;VALUE=DATE:20130906 +TRANSP:TRANSPARENT +SUMMARY:Genfer Bettag/Jeûne genevois/Digiuno ginevrino (GE) +LAST-MODIFIED:20120829T005855Z +DTSTAMP:20120829T005855Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130905 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:476A743C-A673-46C3-9106-A0B6D1089D61 +UID:476A743C-A673-46C3-9106-A0B6D1089D61 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010310Z +UID:372f27c0-b7fd-4099-b431-776e266d322b +DTEND;VALUE=DATE:20131012 +TRANSP:TRANSPARENT +SUMMARY:Jahrmarkt/Marché annuel/Mercato annuale (AR) +LAST-MODIFIED:20120829T010318Z +DTSTAMP:20120829T010318Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131011 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:7A45552E-5640-463B-91B7-677701FEAEF8 +UID:7A45552E-5640-463B-91B7-677701FEAEF8 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003917Z +UID:cab7c797-0a45-4a33-a763-df80c0a09fe2 +DTEND;VALUE=DATE:20130208 +TRANSP:TRANSPARENT +SUMMARY:Schmutziger Donnerstag/Jeudi de Carnaval/Giovedì Grasso (GR/LU/N + W/SG/UR) +LAST-MODIFIED:20120829T003926Z +DTSTAMP:20120829T003926Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130207 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:4B3178F9-441E-47A9-8263-743FA030F6C7 +UID:4B3178F9-441E-47A9-8263-743FA030F6C7 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005000Z +UID:1f7f7519-0bc8-48c8-af97-0268b96b3e5f +DTEND;VALUE=DATE:20130521 +TRANSP:TRANSPARENT +SUMMARY:Pfingstmontag/Lundi de Pentecôte/Lunedì di Pentecoste (AG/AI/AR/ + BE/BL/BS/FR/GE/GL/GR/JU/LU/NE/NW/OW/SG/SH/SO/SZ/TG/TI/UR/VD/VS/ZG/ZH) +LAST-MODIFIED:20120829T005008Z +DTSTAMP:20120829T005008Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130520 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:18C39DF4-2594-4046-B78D-009AA08232EB +UID:18C39DF4-2594-4046-B78D-009AA08232EB +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010013Z +UID:f1fca475-5cde-48de-8a1d-1058fe453874 +DTEND;VALUE=DATE:20130923 +TRANSP:TRANSPARENT +SUMMARY:St. Mauritius/Saint Maurice/San Maurizio (AI/LU/SO) +LAST-MODIFIED:20120829T010020Z +DTSTAMP:20120829T010020Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130922 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:3F14A1F3-5D50-4ECE-BE47-ACF8B55F9618 +UID:3F14A1F3-5D50-4ECE-BE47-ACF8B55F9618 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010239Z +UID:6c60d9e5-27d3-41cd-aa3c-bb47e733579f +DTEND;VALUE=DATE:20131008 +TRANSP:TRANSPARENT +SUMMARY:Jahrmarkt/Marché annuel/Mercato annuale (AR) +LAST-MODIFIED:20120829T010246Z +DTSTAMP:20120829T010246Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131007 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:BBDF9532-562F-4951-AA11-FA55D12A001C +UID:BBDF9532-562F-4951-AA11-FA55D12A001C +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010357Z +UID:5ba0fa9b-d48d-4c30-8b93-4c0bb436c128 +DTEND;VALUE=DATE:20131022 +TRANSP:TRANSPARENT +SUMMARY:Chilbimontag (SG) +LAST-MODIFIED:20120829T010405Z +DTSTAMP:20120829T010405Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131021 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:62BC3370-960D-4CB7-8B41-2ED8C7B9854C +UID:62BC3370-960D-4CB7-8B41-2ED8C7B9854C +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004813Z +UID:32e04a6b-d138-441b-9fb3-535a70491c2a +DTEND;VALUE=DATE:20130507 +TRANSP:TRANSPARENT +SUMMARY:Landsgemeindemontag/Lundi de Landsgemeinde/Lunedì della Landsgem + einde (GL) +LAST-MODIFIED:20120829T004821Z +DTSTAMP:20120829T004821Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130506 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:71FF9F8B-F466-4856-8302-A5D2405DC46A +UID:71FF9F8B-F466-4856-8302-A5D2405DC46A +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004939Z +UID:37e6c0d0-5d12-4337-984c-ee43de384ed9 +DTEND;VALUE=DATE:20130520 +TRANSP:TRANSPARENT +SUMMARY:Pfingsten/Pentecôte/Pentecoste (AG/AI/AR/BE/BL/BS/FR/GE/GL/GR/JU + /LU/NE/NW/OW/SG/SH/SO/SZ/TG/TI/UR/VD/VS/ZG/ZH) +LAST-MODIFIED:20120829T004950Z +DTSTAMP:20120829T004950Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130519 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:34E0EF2D-B3B3-41AF-8518-0600B549FA4B +UID:34E0EF2D-B3B3-41AF-8518-0600B549FA4B +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005338Z +UID:09edd942-4f67-4dd4-bb79-814b3b58b1e3 +DTEND;VALUE=DATE:20130802 +RRULE:FREQ=YEARLY +TRANSP:TRANSPARENT +SUMMARY:Bundesfeier/Fête nationale/Festa nazionale Svizzera (AG/AI/AR/BE + /BL/BS/FR/GE/GL/GR/JU/LU/NE/NW/OW/SG/SH/SO/SZ/TG/TI/UR/VD/VS/ZG/ZH) +LAST-MODIFIED:20120829T005350Z +DTSTAMP:20120829T005350Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130801 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:41CEAFC3-53FB-4CDD-A793-84E4AF6C3573 +UID:41CEAFC3-53FB-4CDD-A793-84E4AF6C3573 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010206Z +UID:8e3d30de-9148-43d0-a63a-b7a7c5746968 +DTEND;VALUE=DATE:20131001 +TRANSP:TRANSPARENT +SUMMARY:Chilbimontag (ZH) +LAST-MODIFIED:20120829T010215Z +DTSTAMP:20120829T010215Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130930 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:F67C1795-7923-4395-82D4-4D9D941A5EE6 +UID:F67C1795-7923-4395-82D4-4D9D941A5EE6 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003836Z +UID:3d4aca07-89d7-424f-993c-b6ff221e4ad0 +DTEND;VALUE=DATE:20130204 +TRANSP:TRANSPARENT +SUMMARY:St. Blasius/Saint Blasius/San Biagio (LU) +LAST-MODIFIED:20120829T003845Z +DTSTAMP:20120829T003845Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130203 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:9F16ABFE-B24F-418D-AE38-05C9032ED965 +UID:9F16ABFE-B24F-418D-AE38-05C9032ED965 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010436Z +UID:d50ffb02-8258-4885-bff8-bdcb322cc8df +DTEND;VALUE=DATE:20131102 +RRULE:FREQ=YEARLY +TRANSP:TRANSPARENT +SUMMARY:Allerheiligen/Toussaint/Ognissanti (AG/AI/BE/BL/FR/GL/GR/JU/LU/N + W/OW/SG/SO/SZ/TI/UR/VS/ZG) +LAST-MODIFIED:20120829T010448Z +DTSTAMP:20120829T010448Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131101 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:0741E3EB-7577-4776-B2A2-C406A4168617 +UID:0741E3EB-7577-4776-B2A2-C406A4168617 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004754Z +UID:097e99e8-c130-465c-8968-f3211ad72d70 +DTEND;VALUE=DATE:20130502 +TRANSP:TRANSPARENT +SUMMARY:St. Johannes/Saint Jean/San Giovanni (LU) +LAST-MODIFIED:20120829T004802Z +DTSTAMP:20120829T004802Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130501 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:397B9495-A037-45D4-A804-976F5291FD53 +UID:397B9495-A037-45D4-A804-976F5291FD53 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005200Z +UID:c416eecb-6b33-4a8d-b8a3-fc306bb4df13 +DTEND;VALUE=DATE:20130705 +TRANSP:TRANSPARENT +SUMMARY:Rutenzug (AG) +LAST-MODIFIED:20120829T005208Z +DTSTAMP:20120829T005208Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130704 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:25E5C3F3-78FD-4373-AB3C-A7AE5D8C0943 +UID:25E5C3F3-78FD-4373-AB3C-A7AE5D8C0943 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004342Z +UID:d73f390b-30f0-4d7b-9bb2-73a833887496 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +SUMMARY:Karfreitag/Vendredi Saint/Venerdi Santo (AG/AI/AR/BE/BL/BS/FR/GE + /GL/GR/JU/LU/NE/NW/OW/SG/SH/SO/SZ/TG/UR/VD/ZG/ZH) +LAST-MODIFIED:20120829T004350Z +DTSTAMP:20120829T004350Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130329 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:657FDF7D-2E0F-49AB-AB90-FDC59C73582B +UID:657FDF7D-2E0F-49AB-AB90-FDC59C73582B +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005034Z +UID:40bb6709-7ed7-448a-ba00-c3ca709f19b6 +DTEND;VALUE=DATE:20130531 +TRANSP:TRANSPARENT +SUMMARY:Fronleichnam/Fête-Dieu/Corpus Domini (AG/AI/BE/FR/JU/LU/NW/OW/SO + /SZ/TI/UR/VS/ZG) +LAST-MODIFIED:20120829T005042Z +DTSTAMP:20120829T005042Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130530 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:8714108A-AE00-404F-851A-C0CC448D437A +UID:8714108A-AE00-404F-851A-C0CC448D437A +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003709Z +UID:b2760dde-1144-48df-9f8e-20758e2ca781 +DTEND;VALUE=DATE:20130118 +TRANSP:TRANSPARENT +SUMMARY:St. Antoniustag/Saint Antoine/Stantantonio (SO/SZ) +LAST-MODIFIED:20120829T003719Z +DTSTAMP:20120829T003719Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130117 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:8D233E92-76E7-43F3-8071-249FF2D20B07 +UID:8D233E92-76E7-43F3-8071-249FF2D20B07 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010530Z +UID:d8b19753-e48c-4df6-9615-adb69501cd82 +DTEND;VALUE=DATE:20131201 +TRANSP:TRANSPARENT +SUMMARY:St. Andreas/Saint Andreas/San Andrea (LU) +LAST-MODIFIED:20120829T010537Z +DTSTAMP:20120829T010537Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131130 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:EB3F4076-ABAF-4E43-9AA9-A4D709FA45F6 +UID:EB3F4076-ABAF-4E43-9AA9-A4D709FA45F6 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004415Z +UID:f46e1218-9846-4a1a-9709-87acd0e68c57 +DTEND;VALUE=DATE:20130402 +TRANSP:TRANSPARENT +SUMMARY:Ostermontag/Lundi de Pâques/Lunedì di Pasqua (AG/AI/AR/BE/BL/BS/ + FR/GE/GL/GR/JU/LU/NE/NW/OW/SG/SH/SO/SZ/TG/TI/UR/VD/VS/ZG/ZH) +LAST-MODIFIED:20120829T004424Z +DTSTAMP:20120829T004424Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130401 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:1D7E8725-81F4-415F-8685-8BB7F1CCC734 +UID:1D7E8725-81F4-415F-8685-8BB7F1CCC734 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003814Z +UID:5f12d46a-4495-4467-8d9b-5e0d6793143b +DTEND;VALUE=DATE:20130203 +TRANSP:TRANSPARENT +SUMMARY:Mariä Lichtmess/La Chandeleur/La Candelora (SZ) +LAST-MODIFIED:20120829T003823Z +DTSTAMP:20120829T003823Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130202 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:D5822054-BC94-4FF5-B6D3-A6037257F5ED +UID:D5822054-BC94-4FF5-B6D3-A6037257F5ED +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004434Z +UID:b1546889-6a36-4359-95fe-ad195f0e7166 +DTEND;VALUE=DATE:20130405 +TRANSP:TRANSPARENT +SUMMARY:Näfelser-Fahrt/Bataille de Näfels/Battaglia di Näfels (GL) +LAST-MODIFIED:20120829T004442Z +DTSTAMP:20120829T004442Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130404 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:90B4AA14-B63C-4897-865F-601E16FB5B11 +UID:90B4AA14-B63C-4897-865F-601E16FB5B11 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005417Z +UID:279119b1-8b20-4e83-8e0f-72da1982ef17 +DTEND;VALUE=DATE:20130813 +TRANSP:TRANSPARENT +SUMMARY:Lendemain du Marché-Concours (JU) +LAST-MODIFIED:20120829T005425Z +DTSTAMP:20120829T005425Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130812 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:D5699A92-6B75-4964-ABEC-9D8A5176D82D +UID:D5699A92-6B75-4964-ABEC-9D8A5176D82D +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005920Z +UID:38cd66bf-1364-44f4-96d9-a7d1cbdc43a3 +DTEND;VALUE=DATE:20130915 +TRANSP:TRANSPARENT +SUMMARY:Heiligkreuztag (SG) +LAST-MODIFIED:20120829T005929Z +DTSTAMP:20120829T005929Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130914 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:CD84B8C4-10DA-4EB4-8C96-980033645F9E +UID:CD84B8C4-10DA-4EB4-8C96-980033645F9E +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010611Z +UID:b116c274-aa71-4218-ae26-3fd4d73fad14 +DTEND;VALUE=DATE:20131225 +RRULE:FREQ=YEARLY +TRANSP:TRANSPARENT +SUMMARY:Heiliger Abend/Veille de Noël/Vigilia di Natale (AG/AI/AR/BL/BS/ + GR/NW/SH/SO/SZ/UR/VS/ZG) +LAST-MODIFIED:20120829T010621Z +DTSTAMP:20120829T010621Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131224 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:E72B618E-C01E-487C-A6C1-AB8EE04D5D20 +UID:E72B618E-C01E-487C-A6C1-AB8EE04D5D20 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010109Z +UID:4af19ffd-ce11-4c32-8cb4-eee7642eca2b +DTEND;VALUE=DATE:20130926 +TRANSP:TRANSPARENT +SUMMARY:Bruderklausenfest/Fête de St-Nicolas-de-Flüe/San Nicolao della F + lüe (OW) +LAST-MODIFIED:20120829T010118Z +DTSTAMP:20120829T010118Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130925 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:4F56668D-F7A5-4CD1-AA88-82E5ED3DE980 +UID:4F56668D-F7A5-4CD1-AA88-82E5ED3DE980 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010456Z +UID:3b04fe81-9651-4f6a-bbf2-7742ebf86e4b +DTEND;VALUE=DATE:20131112 +TRANSP:TRANSPARENT +SUMMARY:St. Martin/Saint Martin/San Martino (JU/LU/SO/SZ) +LAST-MODIFIED:20120829T010504Z +DTSTAMP:20120829T010504Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131111 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:11D58DD0-338A-485E-909A-55B5AE5EF37C +UID:11D58DD0-338A-485E-909A-55B5AE5EF37C +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005903Z +UID:6d2db1b4-dcff-4481-bf53-8a938e7bf4fa +DTEND;VALUE=DATE:20130910 +TRANSP:TRANSPARENT +SUMMARY:Knabenschiessen (ZH) +LAST-MODIFIED:20120829T005911Z +DTSTAMP:20120829T005911Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130909 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:EFEE44D0-8768-4E35-991A-A49892C3CDB8 +UID:EFEE44D0-8768-4E35-991A-A49892C3CDB8 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005110Z +UID:23f9a28c-672f-4bcf-a4ac-743c82499f53 +DTEND;VALUE=DATE:20130625 +TRANSP:TRANSPARENT +SUMMARY:Chilbimontag (ZH) +LAST-MODIFIED:20120829T005117Z +DTSTAMP:20120829T005117Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130624 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:B7EFB437-E917-4792-91D1-FE1005BC493A +UID:B7EFB437-E917-4792-91D1-FE1005BC493A +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005809Z +UID:ac44786c-d0c4-4739-9d2d-2a2c7bff1146 +DTEND;VALUE=DATE:20130903 +TRANSP:TRANSPARENT +SUMMARY:Chilbimontag (ZH) +LAST-MODIFIED:20120829T005817Z +DTSTAMP:20120829T005817Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130902 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:CBF8D453-69B9-4F67-9734-C6FD0CCA331E +UID:CBF8D453-69B9-4F67-9734-C6FD0CCA331E +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010553Z +UID:09e1050e-789a-4b0e-b9af-bacbbd9f449f +DTEND;VALUE=DATE:20131209 +TRANSP:TRANSPARENT +SUMMARY:Maria Empfängnis/Immaculée Conception/Immacolata (AG/AI/FR/GR/LU + /NW/OW/SO/SZ/TI/UR/VS/ZG) +LAST-MODIFIED:20120829T010601Z +DTSTAMP:20120829T010601Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131208 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:C4DCD14F-775D-4DF8-BD24-87975A889E5E +UID:C4DCD14F-775D-4DF8-BD24-87975A889E5E +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005322Z +UID:46fbd542-52bf-44d8-a745-c38bdab267ba +DTEND;VALUE=DATE:20130726 +TRANSP:TRANSPARENT +SUMMARY:Jakobitag/Saint Jacques/San Giacomo (GR) +LAST-MODIFIED:20120829T005329Z +DTSTAMP:20120829T005329Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130725 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:70D86C3C-038D-4B26-96FE-75999D6FF46E +UID:70D86C3C-038D-4B26-96FE-75999D6FF46E +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004737Z +UID:d2734b7f-e9f6-412f-81c6-b43a092e90d3 +DTEND;VALUE=DATE:20130502 +TRANSP:TRANSPARENT +SUMMARY:Kirchweihfest/Fête Kermesse/Sagra Hildisreiden (LU) +LAST-MODIFIED:20120829T004745Z +DTSTAMP:20120829T004745Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130501 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:315072D1-190D-4B76-953C-F2ED0C4A6F5C +UID:315072D1-190D-4B76-953C-F2ED0C4A6F5C +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004323Z +UID:bce00f4c-b6be-40fd-8f80-27ec58ed243b +DTEND;VALUE=DATE:20130322 +TRANSP:TRANSPARENT +SUMMARY:St. Benediktstag/Saint Benoît/San Benedetto (OW) +LAST-MODIFIED:20120829T004332Z +DTSTAMP:20120829T004332Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130321 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:467C0212-740E-4517-AC9E-188B6D7D779E +UID:467C0212-740E-4517-AC9E-188B6D7D779E +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004359Z +UID:01bfcf5a-f638-4e1e-ac5d-9c5bd754f5c1 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +SUMMARY:Ostern/Pâques/Pasqua (AG/AI/AR/BE/BL/BS/FR/GE/GL/GR/JU/LU/NE/NW/ + OW/SG/SH/SO/SZ/TG/TI/UR/VD/VS/ZG/ZH) +LAST-MODIFIED:20120829T004407Z +DTSTAMP:20120829T004407Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130331 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:1910A555-3747-4824-8E72-146AC16EF8FE +UID:1910A555-3747-4824-8E72-146AC16EF8FE +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005956Z +UID:a72772bc-5df0-4679-ba00-595cd493b07e +DTEND;VALUE=DATE:20130917 +TRANSP:TRANSPARENT +SUMMARY:Bettagsmontag/Lundi du Jeûne fédéral/Digiuno Federale Svizzero ( + BE/NE/VD/VS) +LAST-MODIFIED:20120829T010003Z +DTSTAMP:20120829T010003Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130916 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:A9F23AC7-D3AC-47B0-B3B1-722244278E48 +UID:A9F23AC7-D3AC-47B0-B3B1-722244278E48 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010129Z +UID:d492fe3f-78a1-4701-abae-b1ef07723a4d +DTEND;VALUE=DATE:20130930 +TRANSP:TRANSPARENT +SUMMARY:St. Michael/Saint Michel/San Michele (LU) +LAST-MODIFIED:20120829T010136Z +DTSTAMP:20120829T010136Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130929 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:D6CA477C-8177-4AB8-8084-A3697141BB3E +UID:D6CA477C-8177-4AB8-8084-A3697141BB3E +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004107Z +UID:cabb353a-aff5-46de-9e1f-ebda8a3cda89 +DTEND;VALUE=DATE:20130214 +TRANSP:TRANSPARENT +SUMMARY:Gidio Hosenstoss (AR) +LAST-MODIFIED:20120829T004116Z +DTSTAMP:20120829T004116Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130213 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:D4F43DDC-6767-4E9B-A400-3B37B5E493B4 +UID:D4F43DDC-6767-4E9B-A400-3B37B5E493B4 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005830Z +UID:42e67180-5635-47db-b33e-1837f59d60d4 +DTEND;VALUE=DATE:20130903 +TRANSP:TRANSPARENT +SUMMARY:Foire de Chaindon (BE) +LAST-MODIFIED:20120829T005837Z +DTSTAMP:20120829T005837Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130902 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:2F1FF48A-35D3-4B75-BB36-B2D9BC183B97 +UID:2F1FF48A-35D3-4B75-BB36-B2D9BC183B97 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010145Z +UID:f0e7f573-0ad8-41df-930c-318af99ba158 +DTEND;VALUE=DATE:20131001 +TRANSP:TRANSPARENT +SUMMARY:St. Urs und Viktor/Saints Urs et Victor/SS. Urs e Vittorio (SO) +LAST-MODIFIED:20120829T010153Z +DTSTAMP:20120829T010153Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130930 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:9946275B-6EDB-4005-9061-1FBD579C3847 +UID:9946275B-6EDB-4005-9061-1FBD579C3847 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005053Z +UID:50bec121-6a55-48e4-89f3-f2b0f97e9d6b +DTEND;VALUE=DATE:20130624 +TRANSP:TRANSPARENT +SUMMARY:Gedenktag an die Volksbefragung im Jura/Commémoration du plébisc + ite jurassien/Indipendenza del Giura (JU) +LAST-MODIFIED:20120829T005102Z +DTSTAMP:20120829T005102Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130623 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:CF09CFA5-1616-43E1-920F-222D129011AF +UID:CF09CFA5-1616-43E1-920F-222D129011AF +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005016Z +UID:a994e02a-971f-4eed-bc9c-e8e4e4ee425a +DTEND;VALUE=DATE:20130523 +TRANSP:TRANSPARENT +SUMMARY:Gedächtnisfeier Schlacht bei Murten/Fête de la Solennite/Battagl + ia di Morat (FR) +LAST-MODIFIED:20120829T005024Z +DTSTAMP:20120829T005024Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130522 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:7A71999B-0650-43D9-BFD5-232CFA397D3B +UID:7A71999B-0650-43D9-BFD5-232CFA397D3B +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003647Z +UID:39dad53f-9700-41bb-8ee9-7a19aa30aa77 +DTEND;VALUE=DATE:20130115 +TRANSP:TRANSPARENT +SUMMARY:Meitlimontag (AG) +LAST-MODIFIED:20120829T003656Z +DTSTAMP:20120829T003656Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130114 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:6768A370-71CF-4C42-BB85-0855729BA918 +UID:6768A370-71CF-4C42-BB85-0855729BA918 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004451Z +UID:6b43703b-c390-4baa-b700-d4cec934e5cb +DTEND;VALUE=DATE:20130416 +TRANSP:TRANSPARENT +SUMMARY:Sechseläuten (ZH) +LAST-MODIFIED:20120829T004458Z +DTSTAMP:20120829T004458Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130415 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:025A6E30-C101-434A-AEB8-B66B26CFB21A +UID:025A6E30-C101-434A-AEB8-B66B26CFB21A +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130925 +UID:d2450537-728b-4d5f-8f28-03abf724a133 +DTSTAMP:20120829T010059Z +X-MOZ-GENERATION:1 +SEQUENCE:1 +CATEGORIES:Holidays +SUMMARY:Siebner Jahrmarkt/Marché annuel de Siebnen/Mercato di Siebnen (S + Z) +LAST-MODIFIED:20120829T010059Z +DTSTART;VALUE=DATE:20130923 +CREATED:20120829T010027Z +BEGIN:VALARM +X-WR-ALARMUID:914A5199-097F-4BA5-A2D1-41C35B89B18E +UID:914A5199-097F-4BA5-A2D1-41C35B89B18E +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004206Z +UID:76d4eba0-cfce-4aab-bda0-f5b3c34ee125 +DTEND;VALUE=DATE:20130221 +TRANSP:TRANSPARENT +SUMMARY:Fasnacht/Carnaval/Carnevale (BL/BS) +LAST-MODIFIED:20120829T004214Z +DTSTAMP:20120829T004214Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130220 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:AE47475B-E841-484E-AF43-B0DD076DA65C +UID:AE47475B-E841-484E-AF43-B0DD076DA65C +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004128Z +UID:1cc04dbd-e75c-42d9-adac-acdaf72503f3 +DTEND;VALUE=DATE:20130219 +TRANSP:TRANSPARENT +SUMMARY:Fasnacht/Carnaval/Carnevale (BL/BS/ZH) +LAST-MODIFIED:20120829T004136Z +DTSTAMP:20120829T004136Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130218 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:23BFFAAE-985E-47FF-90E4-C297A3549330 +UID:23BFFAAE-985E-47FF-90E4-C297A3549330 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010414Z +UID:dc39d35e-5bcf-4128-8e40-2947bacb7555 +DTEND;VALUE=DATE:20131029 +TRANSP:TRANSPARENT +SUMMARY:Chilbimontag (TG/ZH) +LAST-MODIFIED:20120829T010421Z +DTSTAMP:20120829T010421Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131028 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:C6B5E880-5A19-4389-B190-D5B6F58D679D +UID:C6B5E880-5A19-4389-B190-D5B6F58D679D +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005657Z +UID:45744595-a778-48f0-93be-45694d35d845 +DTEND;VALUE=DATE:20130816 +TRANSP:TRANSPARENT +SUMMARY:Mariä Himmelfahrt/Assomption/Assunzione (AG/AI/BE/FR/GR/JU/LU/NW + /OW/SO/SZ/TI/UR/VS/ZG) +LAST-MODIFIED:20120829T005705Z +DTSTAMP:20120829T005705Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130815 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:9EEE3912-A1C2-4458-BDE5-528F3E365658 +UID:9EEE3912-A1C2-4458-BDE5-528F3E365658 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004223Z +UID:4779eece-7ce8-4770-a008-ba040044b93e +DTEND;VALUE=DATE:20130302 +TRANSP:TRANSPARENT +SUMMARY:Jahrestag Ausrufung Republik Neuenburg/Instauration de la Républ + ique/Festa della Repubblica (NE) +LAST-MODIFIED:20120829T004231Z +DTSTAMP:20120829T004231Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130301 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:45929D31-3F9E-49DB-9608-AD8CF8E701B1 +UID:45929D31-3F9E-49DB-9608-AD8CF8E701B1 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005733Z +UID:b15b00fb-6837-43a2-9176-68111b1c57ec +DTEND;VALUE=DATE:20130827 +TRANSP:TRANSPARENT +SUMMARY:Chilbimontag (ZH) +LAST-MODIFIED:20120829T005741Z +DTSTAMP:20120829T005741Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130826 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:7A4413F4-7382-4A77-8BF0-0CA9550FD7E8 +UID:7A4413F4-7382-4A77-8BF0-0CA9550FD7E8 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003955Z +UID:152cb50a-5e1e-41ed-980b-1d8c6e87db01 +DTEND;VALUE=DATE:20130213 +TRANSP:TRANSPARENT +SUMMARY:Fasnachtsdienstag/Mardi de Carnaval/Martedì grasso (AG/BL/LU/SG/ + SO/TI/UR) +LAST-MODIFIED:20120829T004003Z +DTSTAMP:20120829T004003Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130212 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:384FD7A6-7C93-4346-8265-758A22EB885B +UID:384FD7A6-7C93-4346-8265-758A22EB885B +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004718Z +UID:dfaaebec-5b8e-4fbf-81c9-8115764916c3 +DTEND;VALUE=DATE:20130502 +TRANSP:TRANSPARENT +SUMMARY:Hl. Sigismund/Saint Sigismond/San Sigismondo (SZ) +LAST-MODIFIED:20120829T004727Z +DTSTAMP:20120829T004727Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130501 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:D16AAD64-4212-483B-B315-8B652B4886E6 +UID:D16AAD64-4212-483B-B315-8B652B4886E6 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003557Z +UID:94d4b3ea-16fa-4388-86ed-a14f282945c6 +DTEND;VALUE=DATE:20130107 +TRANSP:TRANSPARENT +SUMMARY:Dreikönigstag/Epiphanie/Epifania (GR/SZ/TI/UR) +LAST-MODIFIED:20120829T003608Z +DTSTAMP:20120829T003608Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130106 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:6AA6EAF7-DB17-4779-9863-A4A6963FFC39 +UID:6AA6EAF7-DB17-4779-9863-A4A6963FFC39 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004846Z +UID:8f605d7a-7274-42f7-84bc-3fb0c239d91b +DTEND;VALUE=DATE:20130511 +TRANSP:TRANSPARENT +SUMMARY:Bankputztag (GR) +LAST-MODIFIED:20120829T004854Z +DTSTAMP:20120829T004854Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130510 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:31AE95F3-A02D-4132-AD45-B7948DB60C58 +UID:31AE95F3-A02D-4132-AD45-B7948DB60C58 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010342Z +UID:64e7f4fc-ae4f-4072-adb9-f4384db7bcce +DTEND;VALUE=DATE:20131021 +TRANSP:TRANSPARENT +SUMMARY:Wendelinstag (LU/SO) +LAST-MODIFIED:20120829T010349Z +DTSTAMP:20120829T010349Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131020 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:BF2FCAC4-ED18-4241-BA99-AC3B5BE96FF9 +UID:BF2FCAC4-ED18-4241-BA99-AC3B5BE96FF9 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005250Z +UID:b39441b4-2b74-4c0c-b1ee-84238af6204c +DTEND;VALUE=DATE:20130713 +TRANSP:TRANSPARENT +SUMMARY:Chilbi (ZH) +LAST-MODIFIED:20120829T005258Z +DTSTAMP:20120829T005258Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130712 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:E01747D1-ED98-48AF-A144-46B98A0FFC40 +UID:E01747D1-ED98-48AF-A144-46B98A0FFC40 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003531Z +UID:4d5156b5-86eb-4b2b-a005-a15a5f0a4786 +DTEND;VALUE=DATE:20130103 +TRANSP:TRANSPARENT +SUMMARY:Berchtoldstag/Saint Berchtold/San Bertoldo (AG/AI/AR/BE/BL/BS/FR + /GE/GL/GR/JU/LU/NE/NW/OW/SH/SO/TG/UR/VD/ZG/ZH) +LAST-MODIFIED:20120829T003540Z +DTSTAMP:20120829T003540Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130102 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:02C91AA8-4BC6-4016-86C3-42CF4A6AC619 +UID:02C91AA8-4BC6-4016-86C3-42CF4A6AC619 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010630Z +UID:e3e726d9-70c1-47a6-a459-0972d55c95e6 +DTEND;VALUE=DATE:20131226 +RRULE:FREQ=YEARLY +TRANSP:TRANSPARENT +SUMMARY:Weihnachtstag/Noël/Natale (AG/AI/AR/BE/BL/BS/FR/GE/GL/GR/JU/LU/N + E/NW/OW/SG/SH/SO/SZ/TG/TI/UR/VD/VS/ZG/ZH) +LAST-MODIFIED:20120829T010641Z +DTSTAMP:20120829T010641Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131225 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:D9AAB774-571C-4494-80BC-DC953A5D5F57 +UID:D9AAB774-571C-4494-80BC-DC953A5D5F57 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010705Z +UID:e7c39d44-8246-468e-a6d3-91484f1e69ef +DTEND;VALUE=DATE:20140101 +RRULE:FREQ=YEARLY +TRANSP:TRANSPARENT +SUMMARY:Wiederherstellung der Republik Genf/Restauration de la Républiqu + e/Restaurazione della Repubblica ginevrina (GE) +LAST-MODIFIED:20120829T010716Z +DTSTAMP:20120829T010716Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131231 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:8153EE47-7D9A-40DC-9EBA-043651B4B760 +UID:8153EE47-7D9A-40DC-9EBA-043651B4B760 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004904Z +UID:647d0fdb-f916-4905-9eb6-7165f5cd9772 +DTEND;VALUE=DATE:20130513 +TRANSP:TRANSPARENT +SUMMARY:St. Pankratius/Saint Pancrace/San Pancrazio (LU) +LAST-MODIFIED:20120829T004911Z +DTSTAMP:20120829T004911Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130512 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:E354DA25-1FCD-4ED4-A735-435F3F8A13B8 +UID:E354DA25-1FCD-4ED4-A735-435F3F8A13B8 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004244Z +UID:c65cd411-c01b-44f9-8033-9b34760ca586 +DTEND;VALUE=DATE:20130307 +TRANSP:TRANSPARENT +SUMMARY:Fridolinstag/Saint Fridolin/San Fridolino (SO) +LAST-MODIFIED:20120829T004252Z +DTSTAMP:20120829T004252Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130306 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:FA3F5C2D-83D5-4291-8EE9-F52A24F5D001 +UID:FA3F5C2D-83D5-4291-8EE9-F52A24F5D001 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005752Z +UID:c6db54d0-ccec-41a6-a7d5-5a82ab17355d +DTEND;VALUE=DATE:20130903 +TRANSP:TRANSPARENT +SUMMARY:St. Justus/Saint Juste/San Giusto (LU) +LAST-MODIFIED:20120829T005759Z +DTSTAMP:20120829T005759Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130902 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:BCD6B24E-553E-445A-9FB7-6D8592D6885A +UID:BCD6B24E-553E-445A-9FB7-6D8592D6885A +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003753Z +UID:e18fbb5c-534d-496b-8e05-a35e8c446f6b +DTEND;VALUE=DATE:20130122 +TRANSP:TRANSPARENT +SUMMARY:St.Meinradstag (SZ) +LAST-MODIFIED:20120829T003801Z +DTSTAMP:20120829T003801Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130121 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:716A4285-993D-49C2-8023-18B16F7C9515 +UID:716A4285-993D-49C2-8023-18B16F7C9515 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003935Z +UID:726084c7-af86-44f4-8087-557ea85534d1 +DTEND;VALUE=DATE:20130212 +TRANSP:TRANSPARENT +SUMMARY:Fasnachtsmontag/Lundi de Carnaval/Lunedì grasso (AG/GL/LU/SG/UR/ + ZG/ZH) +LAST-MODIFIED:20120829T003946Z +DTSTAMP:20120829T003946Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130211 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:74DEC5D9-454E-49E5-A6CD-9EDDD0EB4694 +UID:74DEC5D9-454E-49E5-A6CD-9EDDD0EB4694 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005140Z +UID:c1ec9dec-13a0-4c57-b693-2e4769bece07 +DTEND;VALUE=DATE:20130630 +TRANSP:TRANSPARENT +SUMMARY:Peter und Paul/Sts-Pierre et Paul/San Pietro e Paolo (GR/LU/TI) +LAST-MODIFIED:20120829T005148Z +DTSTAMP:20120829T005148Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130629 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:F2634395-77B3-4A28-BC3F-2DC3BF6F1779 +UID:F2634395-77B3-4A28-BC3F-2DC3BF6F1779 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004144Z +UID:ad76d861-e197-42a3-8d98-091a107dbb00 +DTEND;VALUE=DATE:20130220 +TRANSP:TRANSPARENT +SUMMARY:Fasnacht/Carnaval/Carnevale (FR) +LAST-MODIFIED:20120829T004156Z +DTSTAMP:20120829T004156Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130219 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:619BEBFE-F77E-418E-BF4E-F96FD7DEE5AD +UID:619BEBFE-F77E-418E-BF4E-F96FD7DEE5AD +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010326Z +UID:b61641dc-cd4b-4ddc-b2a0-0b7c02485826 +DTEND;VALUE=DATE:20131017 +TRANSP:TRANSPARENT +SUMMARY:St. Gallus/Saint Gallus/San Gallo (LU) +LAST-MODIFIED:20120829T010333Z +DTSTAMP:20120829T010333Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131016 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:0704AA3D-7170-4B2C-8C1C-1E4198D55C51 +UID:0704AA3D-7170-4B2C-8C1C-1E4198D55C51 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003626Z +UID:49c0750c-ab0c-41ad-ac6b-21d95309ee88 +DTEND;VALUE=DATE:20130113 +TRANSP:TRANSPARENT +SUMMARY:Alter Silvester (AR) +LAST-MODIFIED:20120829T003633Z +DTSTAMP:20120829T003633Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130112 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:BAE02E29-4E40-4451-9D26-5DFEDB14E09F +UID:BAE02E29-4E40-4451-9D26-5DFEDB14E09F +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005630Z +UID:d8ede842-0da2-4855-af91-ee3c814464b1 +DTEND;VALUE=DATE:20130813 +TRANSP:TRANSPARENT +SUMMARY:Chilbimontag (AR/VD/ZH) +LAST-MODIFIED:20120829T005638Z +DTSTAMP:20120829T005638Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130812 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:37EF8B9D-C344-43F7-8142-4F8BF01CFAB2 +UID:37EF8B9D-C344-43F7-8142-4F8BF01CFAB2 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003733Z +UID:2418567a-6b03-444a-879e-aac692c2c18f +DTEND;VALUE=DATE:20130121 +TRANSP:TRANSPARENT +SUMMARY:St. Sebastian/Saint Sébastien/San Sebastiano (GR/LU/SO) +LAST-MODIFIED:20120829T003742Z +DTSTAMP:20120829T003742Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130120 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:AA3069EA-D1BA-4B10-A6BF-7BC59B1CBEFB +UID:AA3069EA-D1BA-4B10-A6BF-7BC59B1CBEFB +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005306Z +UID:91be5e5f-a896-4254-8108-132fb3a3d2f2 +DTEND;VALUE=DATE:20130713 +TRANSP:TRANSPARENT +SUMMARY:Jugendfest/Fête de la Jeunesse/Festa della gioventù (ZH) +LAST-MODIFIED:20120829T005313Z +DTSTAMP:20120829T005313Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130712 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:0BD3C5D6-2B70-4404-AB5E-CC9D76BA333A +UID:0BD3C5D6-2B70-4404-AB5E-CC9D76BA333A +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010722Z +UID:2896c932-49c3-4607-8d50-c0d21c22baa1 +DTEND;VALUE=DATE:20140101 +RRULE:FREQ=YEARLY +TRANSP:TRANSPARENT +SUMMARY:Wiederherstellung der Republik Genf/Restauration de la Républiqu + e/Restaurazione della Repubblica ginevrina (GE) +LAST-MODIFIED:20120829T010732Z +DTSTAMP:20120829T010732Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131231 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:162017CD-71A7-48EA-8346-944D5F385227 +UID:162017CD-71A7-48EA-8346-944D5F385227 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010254Z +UID:12a4d4d4-1a2c-483e-87d2-8da56930e599 +DTEND;VALUE=DATE:20131011 +TRANSP:TRANSPARENT +SUMMARY:Jahrmarkt Kaltbrunn (SG) +LAST-MODIFIED:20120829T010302Z +DTSTAMP:20120829T010302Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131010 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:90266198-E2EC-4360-A75E-C68567D6E7C8 +UID:90266198-E2EC-4360-A75E-C68567D6E7C8 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004030Z +UID:7cee0389-55dc-4d58-aa54-3c60a1a1b19f +DTEND;VALUE=DATE:20130214 +TRANSP:TRANSPARENT +SUMMARY:Aschermittwoch/Mercredi des Cendres/Mercoledì delle Ceneri (JU/T + I) +LAST-MODIFIED:20120829T004039Z +DTSTAMP:20120829T004039Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130213 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:DD10050B-E0D4-4799-8AA2-A9110C2185E2 +UID:DD10050B-E0D4-4799-8AA2-A9110C2185E2 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005235Z +UID:8621fea3-c235-4630-93e3-3753b7c1f2c2 +DTEND;VALUE=DATE:20130706 +TRANSP:TRANSPARENT +SUMMARY:Kinderfest/Fête des enfants/Festa dei bambini (AG) +LAST-MODIFIED:20120829T005242Z +DTSTAMP:20120829T005242Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130705 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:5DC5B532-7E48-47A6-9185-21B6B5D2E96C +UID:5DC5B532-7E48-47A6-9185-21B6B5D2E96C +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004830Z +UID:de1831f2-b3e5-4344-8954-36e7e81e747d +DTEND;VALUE=DATE:20130510 +TRANSP:TRANSPARENT +SUMMARY:Auffahrt/Ascension/Ascensione (AG/AI/AR/BE/BL/BS/FR/GE/GL/GR/JU/ + LU/NE/NW/OW/SG/SH/SO/SZ/TG/TI/UR/VD/VS/ZG/ZH) +LAST-MODIFIED:20120829T004838Z +DTSTAMP:20120829T004838Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130509 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:FFB7C4B7-2253-4ACC-9CBA-43CAA89FEA7A +UID:FFB7C4B7-2253-4ACC-9CBA-43CAA89FEA7A +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005938Z +UID:cf9321b9-9c74-42b6-bdbe-ae03617c6b87 +DTEND;VALUE=DATE:20130915 +TRANSP:TRANSPARENT +SUMMARY:Engelweihe (SZ) +LAST-MODIFIED:20120829T005945Z +DTSTAMP:20120829T005945Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130914 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:5E2B40DE-5ED9-4567-B74E-0238097A07AC +UID:5E2B40DE-5ED9-4567-B74E-0238097A07AC +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004919Z +UID:e0bc6e02-8cb4-4cc1-80a5-2c68ad750854 +DTEND;VALUE=DATE:20130514 +TRANSP:TRANSPARENT +SUMMARY:St. Burkardstag (AG) +LAST-MODIFIED:20120829T004928Z +DTSTAMP:20120829T004928Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130513 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:17412660-B179-45E5-895B-8DBFAB6BB859 +UID:17412660-B179-45E5-895B-8DBFAB6BB859 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T010512Z +UID:e293d536-d007-41f3-bab6-7750a0e87b4c +DTEND;VALUE=DATE:20131114 +TRANSP:TRANSPARENT +SUMMARY:Jahrmarkt/Marché annuel/Mercato annuale (ZH) +LAST-MODIFIED:20120829T010520Z +DTSTAMP:20120829T010520Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131113 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:AFB772E0-6777-4DD2-81AC-2312F7A50D59 +UID:AFB772E0-6777-4DD2-81AC-2312F7A50D59 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005220Z +UID:ab8ce7ab-e912-47f9-9ad8-c4d86e14eb65 +DTEND;VALUE=DATE:20130706 +TRANSP:TRANSPARENT +SUMMARY:Maienzug (AG) +LAST-MODIFIED:20120829T005227Z +DTSTAMP:20120829T005227Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130705 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:FEA4A1AA-9798-48E1-B66A-F5A0C64EE23A +UID:FEA4A1AA-9798-48E1-B66A-F5A0C64EE23A +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130320 +UID:fe391642-c2f9-49dc-8d98-ef1cdb7220da +DTSTAMP:20120829T004651Z +X-MOZ-GENERATION:1 +SEQUENCE:1 +CATEGORIES:Holidays +SUMMARY:Josephstag/Saint-Joseph/San Giuseppe (GR/LU/NW/SZ/TI/UR/VS) +LAST-MODIFIED:20120829T004651Z +DTSTART;VALUE=DATE:20130319 +CREATED:20120829T004304Z +RRULE:FREQ=YEARLY +BEGIN:VALARM +X-WR-ALARMUID:60D6C232-4EDB-4CA6-BE64-9F02D78FA30F +UID:60D6C232-4EDB-4CA6-BE64-9F02D78FA30F +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003425Z +UID:0d694908-b504-4f08-b19c-c8a639d30a31 +DTEND;VALUE=DATE:20130102 +TRANSP:TRANSPARENT +SUMMARY:Neujahr/Nouvel An/Capodanno (AG/AI/AR/BE/BL/BS/FR/GE/GL/GR/JU/LU + /NE/NW/OW/SG/SH/SO/SZ/TG/TI/UR/VD/VS/ZG/ZH) +LAST-MODIFIED:20120829T003514Z +DTSTAMP:20120829T003514Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130101 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:F4FD0338-55EC-419E-901F-DDB199C62FF3 +UID:F4FD0338-55EC-419E-901F-DDB199C62FF3 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005125Z +UID:cdcd8746-0f40-4b77-a7d6-ae50e28a7bd1 +DTEND;VALUE=DATE:20130625 +TRANSP:TRANSPARENT +SUMMARY:Solennität/Fête de la Solennité/Festa della Solennità (BE) +LAST-MODIFIED:20120829T005132Z +DTSTAMP:20120829T005132Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130624 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:D34E7FF6-C6CE-4B7C-9B23-620A4B5CCDA1 +UID:D34E7FF6-C6CE-4B7C-9B23-620A4B5CCDA1 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004506Z +UID:438f97d2-9729-473d-bd60-e8a4e93b7fc6 +DTEND;VALUE=DATE:20130502 +RRULE:FREQ=YEARLY +TRANSP:TRANSPARENT +SUMMARY:Tag der Arbeit/Fête du travail/Festa del lavoro (AG/BL/BS/GR/JU/ + NE/SH/SO/TG/TI/ZH) +LAST-MODIFIED:20120829T004540Z +DTSTAMP:20120829T004540Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130501 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:EF42AFE2-39AC-41BB-8F27-6AC0478E310F +UID:EF42AFE2-39AC-41BB-8F27-6AC0478E310F +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T003854Z +UID:46928ed2-f3c1-4c74-887a-869345497b40 +DTEND;VALUE=DATE:20130206 +TRANSP:TRANSPARENT +SUMMARY:St. Agatha/Sainte Agathe/Sant'Agata (LU/SO/SZ/UR) +LAST-MODIFIED:20120829T003903Z +DTSTAMP:20120829T003903Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130205 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:283B0716-B170-4FE1-B729-DA3C01CBB38F +UID:283B0716-B170-4FE1-B729-DA3C01CBB38F +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T005716Z +UID:76909fca-2a15-46ae-a348-cc3f094eecf7 +DTEND;VALUE=DATE:20130820 +TRANSP:TRANSPARENT +SUMMARY:Chilbimontag (ZH) +LAST-MODIFIED:20120829T005723Z +DTSTAMP:20120829T005723Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130819 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:7A96858E-1713-431F-8C84-5F721E27D3A9 +UID:7A96858E-1713-431F-8C84-5F721E27D3A9 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120829T004014Z +UID:450769b3-101a-499f-9b2e-52b56ee7615d +DTEND;VALUE=DATE:20130213 +TRANSP:TRANSPARENT +SUMMARY:Güdisdienstag (NW/OW) +LAST-MODIFIED:20120829T004021Z +DTSTAMP:20120829T004021Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130212 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:3CA34A3F-3701-4590-95EE-5421412FAE82 +UID:3CA34A3F-3701-4590-95EE-5421412FAE82 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +X-APPLE-DEFAULT-ALARM:TRUE +ACTION:NONE +END:VALARM +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/TaiwanHolidays.ics b/media/caldata/TaiwanHolidays.ics new file mode 100644 index 00000000000..25ed9b0f544 --- /dev/null +++ b/media/caldata/TaiwanHolidays.ics @@ -0,0 +1,1987 @@ +BEGIN:VCALENDAR +METHOD:PUBLISH +VERSION:2.0 +X-WR-CALNAME:國定假日 +PRODID:-//Apple Inc.//Mac OS X 10.8.2//EN +X-WR-CALDESC:69pavee4kfnlip3cbcd2lprr24@group.calendar.google.com +X-APPLE-CALENDAR-COLOR:#B99AFF +X-WR-TIMEZONE:Asia/Taipei +CALSCALE:GREGORIAN +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130405 +UID:650a1f07-4112-4630-9579-245b815b9bdc +DTSTAMP:20121230T172606Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:兒童節 Children's Day +LAST-MODIFIED:20121230T172606Z +DTSTART;VALUE=DATE:20130404 +CREATED:20121230T123614Z +BEGIN:VALARM +X-WR-ALARMUID:5E757162-2375-4AF2-937B-4D97AB0EC123 +UID:5E757162-2375-4AF2-937B-4D97AB0EC123 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130915 +UID:9857900E-9F20-4FC1-9AE4-CA601AC66A84 +DTSTAMP:20121230T164903Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:補上班 +LAST-MODIFIED:20121230T164903Z +DTSTART;VALUE=DATE:20130914 +CREATED:20121230T164058Z +BEGIN:VALARM +X-WR-ALARMUID:94DA2C89-997F-4877-98B2-6A70008A4AEB +UID:94DA2C89-997F-4877-98B2-6A70008A4AEB +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130224 +UID:5E2F7EE8-6225-4F5B-952A-B5C8AE2B7569 +DTSTAMP:20121230T164903Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:補上班 +LAST-MODIFIED:20121230T164903Z +DTSTART;VALUE=DATE:20130223 +CREATED:20121230T163749Z +BEGIN:VALARM +X-WR-ALARMUID:FFB0EC02-6B10-46CE-93CE-459495C87444 +UID:FFB0EC02-6B10-46CE-93CE-459495C87444 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:OPAQUE +DTEND;VALUE=DATE:20130920 +UID:d6304bae-0968-48a2-bedc-cf2a658e23bd +DTSTAMP:20121230T173038Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:中秋 Mid-Autumn Festival +LAST-MODIFIED:20121230T173038Z +DTSTART;VALUE=DATE:20130919 +CREATED:20121230T123959Z +BEGIN:VALARM +X-WR-ALARMUID:16AAD852-D6DD-4E96-A3E9-4D6FBE998781 +UID:16AAD852-D6DD-4E96-A3E9-4D6FBE998781 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130215 +UID:93AF67DB-1960-4696-A3F8-4B6F37EA12C3 +DTSTAMP:20121230T164903Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:補假 +LAST-MODIFIED:20121230T164903Z +DTSTART;VALUE=DATE:20130214 +CREATED:20121230T163432Z +BEGIN:VALARM +X-WR-ALARMUID:99B6D071-6217-40BC-B28E-6CEC9A7DC8A6 +UID:99B6D071-6217-40BC-B28E-6CEC9A7DC8A6 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:OPAQUE +DTEND;VALUE=DATE:20130213 +UID:cc1908b4-8f3c-4e0b-9fca-b8c5723f2c06 +DTSTAMP:20121230T175342Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:3 +SUMMARY:春節假期 Chinese New Year +LAST-MODIFIED:20121230T175342Z +DTSTART;VALUE=DATE:20130210 +CREATED:20121230T123302Z +BEGIN:VALARM +X-WR-ALARMUID:ED51D262-44C6-460F-A388-14953A23D94E +UID:ED51D262-44C6-460F-A388-14953A23D94E +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:OPAQUE +DTEND;VALUE=DATE:20130613 +UID:9077cbcb-6c1b-4653-83af-cf725ce27969 +DTSTAMP:20121230T172824Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:4 +SUMMARY:端午 Dragon Boat Festival +LAST-MODIFIED:20121230T172824Z +DTSTART;VALUE=DATE:20130612 +CREATED:20121230T123649Z +BEGIN:VALARM +X-WR-ALARMUID:C4F40964-C338-4949-A725-6F824804FC44 +UID:C4F40964-C338-4949-A725-6F824804FC44 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130216 +UID:2B485BC0-CCAF-487B-89F0-597A1C454BCD +DTSTAMP:20121230T164903Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:3 +SUMMARY:調整放假 +LAST-MODIFIED:20121230T164903Z +DTSTART;VALUE=DATE:20130215 +CREATED:20121230T163533Z +BEGIN:VALARM +X-WR-ALARMUID:430C9706-DD6E-48DA-8884-679F4AD7BB3E +UID:430C9706-DD6E-48DA-8884-679F4AD7BB3E +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130214 +UID:C3EAE465-104D-4B92-8669-7A5E3DF8FEE2 +DTSTAMP:20121230T164903Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:補假 +LAST-MODIFIED:20121230T164903Z +DTSTART;VALUE=DATE:20130213 +CREATED:20121230T163517Z +BEGIN:VALARM +X-WR-ALARMUID:838DEF09-C4B6-4706-A8BD-20AB22D7B873 +UID:838DEF09-C4B6-4706-A8BD-20AB22D7B873 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130301 +UID:fd2640c6-aba9-4e52-8fc2-c75028b13ed2 +DTSTAMP:20121230T172329Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:和平紀念日 Peace Memorial Day +LAST-MODIFIED:20121230T172329Z +DTSTART;VALUE=DATE:20130228 +CREATED:20121230T123344Z +BEGIN:VALARM +X-WR-ALARMUID:6F20A304-23DB-4F6C-8BDF-6E36C3D6A62B +UID:6F20A304-23DB-4F6C-8BDF-6E36C3D6A62B +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:OPAQUE +DTEND;VALUE=DATE:20130210 +UID:66ae829c-9cad-46b9-ba15-486dd6388034 +DTSTAMP:20121230T171958Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:農曆除夕 Chinese New Year's Eve +LAST-MODIFIED:20121230T171958Z +DTSTART;VALUE=DATE:20130209 +CREATED:20121230T123234Z +BEGIN:VALARM +X-WR-ALARMUID:D91736EC-8498-41DE-9636-B047DBDF1BE0 +UID:D91736EC-8498-41DE-9636-B047DBDF1BE0 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130921 +UID:441503D2-781F-4728-A668-31694557DEEC +DTSTAMP:20121230T164903Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:調整放假 +LAST-MODIFIED:20121230T164903Z +DTSTART;VALUE=DATE:20130920 +CREATED:20121230T164031Z +BEGIN:VALARM +X-WR-ALARMUID:81C11624-4235-40BA-83A7-8B4609AE4E98 +UID:81C11624-4235-40BA-83A7-8B4609AE4E98 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130102 +UID:eceb6068-f602-4bea-bbe8-24eab25dd8b3 +DTSTAMP:20121230T171945Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:中華民國開國紀念日 New Year +LAST-MODIFIED:20121230T171945Z +DTSTART;VALUE=DATE:20130101 +CREATED:20121230T122929Z +BEGIN:VALARM +X-WR-ALARMUID:3458C99C-F395-4826-A010-B6AFFA9FEB87 +UID:3458C99C-F395-4826-A010-B6AFFA9FEB87 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20111101 +UID:534ab858-3d19-4e4b-abb0-eb1b86253b44 +DTSTAMP:20121230T170647Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:3 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:蔣公誕辰紀念日 Chiang Kai-shek's Birthday +LAST-MODIFIED:20121230T170647Z +DTSTART;VALUE=DATE:20111031 +CREATED:20121230T170647Z +BEGIN:VALARM +X-WR-ALARMUID:EB0983A6-6B24-4DCF-9B0C-259264CC2106 +UID:EB0983A6-6B24-4DCF-9B0C-259264CC2106 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20121113 +UID:9c5efd27-954e-477b-ba9f-851709e08e1a +DTSTAMP:20121230T170644Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:6 +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:中華文化復興節(國父誕辰紀念日) Chinese Cultural Renaissance Festival/Sun Yat-s + en's Birthday +LAST-MODIFIED:20121230T170644Z +DTSTART;VALUE=DATE:20121112 +CREATED:20121230T170644Z +BEGIN:VALARM +X-WR-ALARMUID:7B689CD4-A107-4733-BC3C-B964A78EED58 +UID:7B689CD4-A107-4733-BC3C-B964A78EED58 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20111011 +UID:a4e4ba20-1bbc-484e-984e-b5a6daa34368 +DTSTAMP:20121230T170802Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:3 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:國慶日 Double Ten Day +LAST-MODIFIED:20121230T170802Z +DTSTART;VALUE=DATE:20111010 +CREATED:20121230T170802Z +BEGIN:VALARM +X-WR-ALARMUID:CBEDEBC3-3046-4301-8BE3-571EDEE98F7D +UID:CBEDEBC3-3046-4301-8BE3-571EDEE98F7D +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120315 +UID:dc671f1f-f590-48b5-8ba6-26c04cef3747 +DTSTAMP:20121230T170728Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:6 +STATUS:CONFIRMED +SEQUENCE:3 +SUMMARY:反侵略日 Anti-invasion Day +LAST-MODIFIED:20121230T170728Z +DTSTART;VALUE=DATE:20120314 +CREATED:20121230T170728Z +BEGIN:VALARM +X-WR-ALARMUID:331C3A75-E709-44F6-9A6C-B5539E976C6A +UID:331C3A75-E709-44F6-9A6C-B5539E976C6A +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120809 +UID:9da63c34-8c14-4e5e-9801-dad9d1130a38 +DTSTAMP:20121230T170410Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:7 +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:父親節 Father's Day +LAST-MODIFIED:20121230T170410Z +DTSTART;VALUE=DATE:20120808 +CREATED:20121230T170410Z +BEGIN:VALARM +X-WR-ALARMUID:840D7CE3-E629-4710-9ED6-BAF15EFB345F +UID:840D7CE3-E629-4710-9ED6-BAF15EFB345F +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20111113 +UID:4215161c-bcc9-4bbf-80ed-a2e33f264295 +DTSTAMP:20121230T170801Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:6 +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:中華文化復興節(國父誕辰紀念日) Chinese Cultural Renaissance Festival/Sun Yat-s + en's Birthday +LAST-MODIFIED:20121230T170801Z +DTSTART;VALUE=DATE:20111112 +CREATED:20121230T170801Z +BEGIN:VALARM +X-WR-ALARMUID:363976A2-9718-42B4-A5FA-FAEE593A8886 +UID:363976A2-9718-42B4-A5FA-FAEE593A8886 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110929 +UID:74efcd7e-e841-4b1d-9880-7ab9b168f8e6 +DTSTAMP:20121230T170705Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:教師節(孔子誕辰紀念日) Teachers' Day/Birthday of Confucius +LAST-MODIFIED:20121230T170705Z +DTSTART;VALUE=DATE:20110928 +CREATED:20121230T170705Z +BEGIN:VALARM +X-WR-ALARMUID:9561BF03-025F-4C1F-88BA-2EE0D3B5A345 +UID:9561BF03-025F-4C1F-88BA-2EE0D3B5A345 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120716 +UID:c636a742-fdf7-4372-b8b6-72de3d6e0944 +DTSTAMP:20121230T170750Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:6 +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:解嚴紀念日 Martial Law Abolishment Day +LAST-MODIFIED:20121230T170750Z +DTSTART;VALUE=DATE:20120715 +CREATED:20121230T170750Z +BEGIN:VALARM +X-WR-ALARMUID:54847F78-EB32-4829-A318-DAEF059F8663 +UID:54847F78-EB32-4829-A318-DAEF059F8663 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20121022 +UID:8accb260-399d-4357-b875-6c5af9354066 +DTSTAMP:20121230T170425Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:2 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:華僑節 Overseas Chinese Day +LAST-MODIFIED:20121230T170425Z +DTSTART;VALUE=DATE:20121021 +CREATED:20121230T170425Z +BEGIN:VALARM +X-WR-ALARMUID:7AA6C005-17EC-467B-8223-DD0D447B3761 +UID:7AA6C005-17EC-467B-8223-DD0D447B3761 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20111022 +UID:c0357cf3-d48b-4650-9c1e-6c878f74e85e +DTSTAMP:20121230T170804Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:2 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:華僑節 Overseas Chinese Day +LAST-MODIFIED:20121230T170804Z +DTSTART;VALUE=DATE:20111021 +CREATED:20121230T170804Z +BEGIN:VALARM +X-WR-ALARMUID:60683EB6-003D-4D8A-84CB-23427E602744 +UID:60683EB6-003D-4D8A-84CB-23427E602744 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120207 +UID:0aeac39e-3f90-433d-bbf3-6e66bb958e4c +DTSTAMP:20121230T170724Z +LOCATION: +DESCRIPTION:農曆1月15日 +X-MOZ-GENERATION:5 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:元宵節 Lantern Festival +LAST-MODIFIED:20121230T170724Z +DTSTART;VALUE=DATE:20120206 +CREATED:20121230T170724Z +BEGIN:VALARM +X-WR-ALARMUID:3051CEF2-3A90-4639-ACF3-83DC8ABFE79E +UID:3051CEF2-3A90-4639-ACF3-83DC8ABFE79E +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20121226 +UID:8efc75c6-9ad0-456b-845c-ea19b5ecf02d +DTSTAMP:20121230T170806Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:2 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:行憲紀念日 Constitution Day +LAST-MODIFIED:20121230T170806Z +DTSTART;VALUE=DATE:20121225 +CREATED:20121230T170806Z +BEGIN:VALARM +X-WR-ALARMUID:5EE84938-DA50-4F78-A0DF-1FC5AB8823CD +UID:5EE84938-DA50-4F78-A0DF-1FC5AB8823CD +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120624 +UID:16b9cdab-e2ad-4114-bd2d-1f053702bf3f +DTSTAMP:20121230T170746Z +LOCATION: +DESCRIPTION:農曆5月5日 +X-MOZ-GENERATION:7 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:端午節 Dragon Boat Festival +LAST-MODIFIED:20121230T170746Z +DTSTART;VALUE=DATE:20120623 +CREATED:20121230T170746Z +BEGIN:VALARM +X-WR-ALARMUID:846C71C4-DEEA-4D65-ADDF-F1D200F264F3 +UID:846C71C4-DEEA-4D65-ADDF-F1D200F264F3 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110604 +UID:9357105b-dcef-455c-b959-a9814b581374 +DTSTAMP:20121230T170755Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:6 +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:禁煙節 Opium Suppression Movement Day +LAST-MODIFIED:20121230T170755Z +DTSTART;VALUE=DATE:20110603 +CREATED:20121230T170755Z +BEGIN:VALARM +X-WR-ALARMUID:5BAF6A37-44E6-4820-873C-4575E593A26B +UID:5BAF6A37-44E6-4820-873C-4575E593A26B +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120901 +UID:605dec1f-b094-46de-a470-71daf051089d +DTSTAMP:20121230T170715Z +LOCATION: +DESCRIPTION:農曆7月15日 +X-MOZ-GENERATION:3 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:中元節 Ghost Festival +LAST-MODIFIED:20121230T170715Z +DTSTART;VALUE=DATE:20120831 +CREATED:20121230T170715Z +BEGIN:VALARM +X-WR-ALARMUID:A8275A06-F4A7-469C-95B4-C9DA95967A7B +UID:A8275A06-F4A7-469C-95B4-C9DA95967A7B +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120405 +UID:6ca3428c-9b38-4b6a-a7e2-95e1867e1b0b +DTSTAMP:20121230T170722Z +LOCATION: +DESCRIPTION:每年農曆節氣清明日 +X-MOZ-GENERATION:6 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:民族掃墓節 Tomb Sweeping Day +LAST-MODIFIED:20121230T170722Z +DTSTART;VALUE=DATE:20120404 +CREATED:20121230T170722Z +BEGIN:VALARM +X-WR-ALARMUID:C7DDEDAC-F862-4286-9A0B-5F84A442942A +UID:C7DDEDAC-F862-4286-9A0B-5F84A442942A +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110218 +UID:46a01fbb-cb18-4a27-b43b-5b23d6b28a64 +DTSTAMP:20121230T170711Z +LOCATION: +DESCRIPTION:農曆1月15日 +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:0 +SUMMARY:元宵節 Lantern Festival +LAST-MODIFIED:20121230T170711Z +DTSTART;VALUE=DATE:20110217 +CREATED:20121230T170711Z +BEGIN:VALARM +X-WR-ALARMUID:653879B0-8E00-42E2-AA29-7A781C07642D +UID:653879B0-8E00-42E2-AA29-7A781C07642D +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120313 +UID:949ec479-f1fb-4841-98a4-0afbe0422b1f +DTSTAMP:20121230T170734Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:7 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:植樹節(國父逝世紀念日)Arbor Day +LAST-MODIFIED:20121230T170734Z +DTSTART;VALUE=DATE:20120312 +CREATED:20121230T170734Z +BEGIN:VALARM +X-WR-ALARMUID:069746B6-68C4-4167-A1CD-14922557A430 +UID:069746B6-68C4-4167-A1CD-14922557A430 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120102 +UID:6474a416-c514-4969-8c39-163fc7b30b17 +DTSTAMP:20121230T170423Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:中華民國開國紀念日 New Year +LAST-MODIFIED:20121230T170423Z +DTSTART;VALUE=DATE:20120101 +CREATED:20121230T170423Z +BEGIN:VALARM +X-WR-ALARMUID:B4947D5D-0B5F-4A1C-B8C2-90B3B37A3283 +UID:B4947D5D-0B5F-4A1C-B8C2-90B3B37A3283 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120330 +UID:c9d1c1ae-e198-4aed-930f-dd9ceedeccb4 +DTSTAMP:20121230T170748Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:8 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:青年節(革命先烈紀念日) Youth Day/Revolutionary Martyr's Day +LAST-MODIFIED:20121230T170748Z +DTSTART;VALUE=DATE:20120329 +CREATED:20121230T170748Z +BEGIN:VALARM +X-WR-ALARMUID:673840A0-99E9-4E96-96D3-8EFDF3627E3E +UID:673840A0-99E9-4E96-96D3-8EFDF3627E3E +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20121026 +UID:d7e075e3-535f-4fc7-a30c-543f4e6e0d24 +DTSTAMP:20121230T170417Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:3 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:臺灣光復節 Taiwan Retrocession Day +LAST-MODIFIED:20121230T170417Z +DTSTART;VALUE=DATE:20121025 +CREATED:20121230T170417Z +BEGIN:VALARM +X-WR-ALARMUID:9E60F95F-3B3A-4C7B-B4C9-C304D1A6A6A9 +UID:9E60F95F-3B3A-4C7B-B4C9-C304D1A6A6A9 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120502 +UID:efa7a704-efea-44f7-b8bc-3e514f613057 +DTSTAMP:20121230T170745Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:勞動節 International Workers' Day (May Day) +LAST-MODIFIED:20121230T170745Z +DTSTART;VALUE=DATE:20120501 +CREATED:20121230T170745Z +BEGIN:VALARM +X-WR-ALARMUID:08D36B32-FCDC-46D0-858C-F76D149B9A39 +UID:08D36B32-FCDC-46D0-858C-F76D149B9A39 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20121101 +UID:f69794a7-7519-4596-8d66-be7c0a45aa08 +DTSTAMP:20121230T170412Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:3 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:蔣公誕辰紀念日 Chiang Kai-shek's Birthday +LAST-MODIFIED:20121230T170412Z +DTSTART;VALUE=DATE:20121031 +CREATED:20121230T170412Z +BEGIN:VALARM +X-WR-ALARMUID:F81A2E7C-1AF2-4165-9CA6-2D8C90A5FB0D +UID:F81A2E7C-1AF2-4165-9CA6-2D8C90A5FB0D +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120904 +UID:a03c80b8-2fbe-428a-b329-f8cce49cab63 +DTSTAMP:20121230T170652Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:2 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:軍人節 Armed Forces Day +LAST-MODIFIED:20121230T170652Z +DTSTART;VALUE=DATE:20120903 +CREATED:20121230T170652Z +BEGIN:VALARM +X-WR-ALARMUID:2F8ADC73-6C33-4E32-BC91-176BA6B164A7 +UID:2F8ADC73-6C33-4E32-BC91-176BA6B164A7 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110904 +UID:1eb0efff-5c1f-48b7-ba6d-6efe6ea2e3eb +DTSTAMP:20121230T170654Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:2 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:軍人節 Armed Forces Day +LAST-MODIFIED:20121230T170654Z +DTSTART;VALUE=DATE:20110903 +CREATED:20121230T170654Z +BEGIN:VALARM +X-WR-ALARMUID:B7DFB962-F647-4F4F-A46E-42F23C84C12E +UID:B7DFB962-F647-4F4F-A46E-42F23C84C12E +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120929 +UID:793f497d-88ce-49f6-ab93-cdbdd1e33ae8 +DTSTAMP:20121230T170637Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:教師節(孔子誕辰紀念日) Teachers' Day/Birthday of Confucius +LAST-MODIFIED:20121230T170637Z +DTSTART;VALUE=DATE:20120928 +CREATED:20121230T170637Z +BEGIN:VALARM +X-WR-ALARMUID:7E68D8A7-4AF3-4410-9564-046690769D9A +UID:7E68D8A7-4AF3-4410-9564-046690769D9A +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120123 +UID:44abb63f-1a58-4172-9fbd-c7d64a1a34a9 +DTSTAMP:20121230T170808Z +LOCATION: +DESCRIPTION:農曆12月30日 +X-MOZ-GENERATION:7 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:農曆除夕 Chinese New Year's Eve +LAST-MODIFIED:20121230T170808Z +DTSTART;VALUE=DATE:20120122 +CREATED:20121230T170808Z +BEGIN:VALARM +X-WR-ALARMUID:64225B66-1FC8-4850-A160-20485D494C3D +UID:64225B66-1FC8-4850-A160-20485D494C3D +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110502 +UID:7537e4fd-f53c-4615-80ea-e04523bb7bac +DTSTAMP:20121230T170650Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:勞動節 International Workers' Day (May Day) +LAST-MODIFIED:20121230T170650Z +DTSTART;VALUE=DATE:20110501 +CREATED:20121230T170650Z +BEGIN:VALARM +X-WR-ALARMUID:270ED550-2376-4900-8923-AD378B591708 +UID:270ED550-2376-4900-8923-AD378B591708 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110313 +UID:7d27cd93-48be-4dbf-ab81-b28584686c1e +DTSTAMP:20121230T170648Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:7 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:植樹節(國父逝世紀念日)Arbor Day +LAST-MODIFIED:20121230T170648Z +DTSTART;VALUE=DATE:20110312 +CREATED:20121230T170648Z +BEGIN:VALARM +X-WR-ALARMUID:A8B3D910-2233-4B6B-98D4-C8C48F3E3209 +UID:A8B3D910-2233-4B6B-98D4-C8C48F3E3209 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120404 +UID:02d2b3b6-8d52-4035-b9e6-f6b9e2e93184 +DTSTAMP:20121230T170422Z +LOCATION: +DESCRIPTION:民族掃墓節前一日 +X-MOZ-GENERATION:6 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:婦女節、兒童節 Women's Day/Children's Day +LAST-MODIFIED:20121230T170422Z +DTSTART;VALUE=DATE:20120403 +CREATED:20121230T170422Z +BEGIN:VALARM +X-WR-ALARMUID:3698C7B5-D03E-4ACE-9CE9-9F77027DDB54 +UID:3698C7B5-D03E-4ACE-9CE9-9F77027DDB54 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20111026 +UID:c9c759e8-ee6b-43df-b4cb-36b6197990ae +DTSTAMP:20121230T170726Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:2 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:臺灣光復節 Taiwan Retrocession Day +LAST-MODIFIED:20121230T170726Z +DTSTART;VALUE=DATE:20111025 +CREATED:20121230T170726Z +BEGIN:VALARM +X-WR-ALARMUID:395DABDF-562A-435A-BB63-5526D9E4FB22 +UID:395DABDF-562A-435A-BB63-5526D9E4FB22 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110716 +UID:7f5f3148-4cd3-4ca5-9cc3-e88302b2881e +DTSTAMP:20121230T170732Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:6 +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:解嚴紀念日 Martial Law Abolishment Day +LAST-MODIFIED:20121230T170732Z +DTSTART;VALUE=DATE:20110715 +CREATED:20121230T170732Z +BEGIN:VALARM +X-WR-ALARMUID:42C5BEF8-CB6F-47C2-9817-E6597D799395 +UID:42C5BEF8-CB6F-47C2-9817-E6597D799395 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110315 +UID:cfb46631-5d4a-4c63-9bb1-986c5c107dab +DTSTAMP:20121230T170415Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:5 +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:反侵略日 Anti-invasion Day +LAST-MODIFIED:20121230T170415Z +DTSTART;VALUE=DATE:20110314 +CREATED:20121230T170415Z +BEGIN:VALARM +X-WR-ALARMUID:C604DF3B-96DD-44D8-A770-068644C5F61B +UID:C604DF3B-96DD-44D8-A770-068644C5F61B +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110330 +UID:6a07f042-a8ef-40b6-859d-af88cd0777d8 +DTSTAMP:20121230T170707Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:11 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:青年節(革命先烈紀念日) Youth Day/Revolutionary Martyrs' Day +LAST-MODIFIED:20121230T170707Z +DTSTART;VALUE=DATE:20110329 +CREATED:20121230T170707Z +BEGIN:VALARM +X-WR-ALARMUID:CF57BABB-5A1B-4A59-A29E-36289ECEB5FF +UID:CF57BABB-5A1B-4A59-A29E-36289ECEB5FF +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120126 +UID:4ae0f6f4-9aeb-4d5a-8cb4-dd70f189b219 +DTSTAMP:20121230T170709Z +LOCATION: +DESCRIPTION:農曆1月1日~3日 +X-MOZ-GENERATION:5 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:春節 Chinese New Year +LAST-MODIFIED:20121230T170709Z +DTSTART;VALUE=DATE:20120123 +CREATED:20121230T170709Z +BEGIN:VALARM +X-WR-ALARMUID:E3BB023A-DDE0-4B6D-B822-EB11F89179A8 +UID:E3BB023A-DDE0-4B6D-B822-EB11F89179A8 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120604 +UID:dc9c0123-232c-46ed-b8f5-4498e20176ba +DTSTAMP:20121230T170701Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:6 +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:禁煙節 \\tOpium Suppression Movement Day +LAST-MODIFIED:20121230T170701Z +DTSTART;VALUE=DATE:20120603 +CREATED:20121230T170701Z +BEGIN:VALARM +X-WR-ALARMUID:BC1E943A-A713-4B4C-BBA3-5CE45A178A40 +UID:BC1E943A-A713-4B4C-BBA3-5CE45A178A40 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120215 +UID:2d9833d8-b1fc-4d40-9a84-6c0a8359d8db +DTSTAMP:20121230T170713Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:情人節 Valentine's Day +LAST-MODIFIED:20121230T170713Z +DTSTART;VALUE=DATE:20120214 +CREATED:20121230T170713Z +BEGIN:VALARM +X-WR-ALARMUID:E7DDD237-F31C-4402-99A1-C20030288F55 +UID:E7DDD237-F31C-4402-99A1-C20030288F55 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120514 +UID:f912bed1-1209-48e0-8808-89c10511255b +DTSTAMP:20121230T170759Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:5 +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:母親節 Mother's Day +LAST-MODIFIED:20121230T170759Z +DTSTART;VALUE=DATE:20120513 +CREATED:20121230T170759Z +BEGIN:VALARM +X-WR-ALARMUID:10009BCC-5F90-434C-88DE-AD1FFEE6FFDC +UID:10009BCC-5F90-434C-88DE-AD1FFEE6FFDC +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20111226 +UID:599e11b3-799d-4672-83e7-03b15210b214 +DTSTAMP:20121230T170656Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:3 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:行憲紀念日 Constitution Day +LAST-MODIFIED:20121230T170656Z +DTSTART;VALUE=DATE:20111225 +CREATED:20121230T170656Z +BEGIN:VALARM +X-WR-ALARMUID:5BEEC276-4D04-450B-9CB1-DC200AFE1852 +UID:5BEEC276-4D04-450B-9CB1-DC200AFE1852 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110815 +UID:3d114d61-1836-4c37-bd3c-b0bd5153ba8c +DTSTAMP:20121230T170639Z +LOCATION: +DESCRIPTION:農曆7月15日 +X-MOZ-GENERATION:2 +STATUS:CONFIRMED +SEQUENCE:0 +SUMMARY:中元節 Ghost Festival +LAST-MODIFIED:20121230T170639Z +DTSTART;VALUE=DATE:20110814 +CREATED:20121230T170639Z +BEGIN:VALARM +X-WR-ALARMUID:E8651AC5-D8EF-494A-86D9-27C1DE8FEB6F +UID:E8651AC5-D8EF-494A-86D9-27C1DE8FEB6F +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110509 +UID:f525743d-22ab-4922-965a-fb61b4db272b +DTSTAMP:20121230T170659Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:5 +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:母親節 Mother's Day +LAST-MODIFIED:20121230T170659Z +DTSTART;VALUE=DATE:20110508 +CREATED:20121230T170659Z +BEGIN:VALARM +X-WR-ALARMUID:4DA8A508-C25E-41B9-BFBD-263DF0A38992 +UID:4DA8A508-C25E-41B9-BFBD-263DF0A38992 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110809 +UID:1e56404d-3f50-429d-8628-e03785b994cd +DTSTAMP:20121230T170756Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:5 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:父親節 Father's Day +LAST-MODIFIED:20121230T170756Z +DTSTART;VALUE=DATE:20110808 +CREATED:20121230T170756Z +BEGIN:VALARM +X-WR-ALARMUID:7C2EA8BB-D1B8-4C5E-AC24-69FD8B48722D +UID:7C2EA8BB-D1B8-4C5E-AC24-69FD8B48722D +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20120229 +UID:7e6f278f-3f71-4294-baad-560f261e90a6 +DTSTAMP:20121230T170730Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:和平紀念日 Peace Memorial Day +LAST-MODIFIED:20121230T170730Z +DTSTART;VALUE=DATE:20120228 +CREATED:20121230T170730Z +BEGIN:VALARM +X-WR-ALARMUID:103F5136-E4A7-4F70-A2BC-962D4CD41EFA +UID:103F5136-E4A7-4F70-A2BC-962D4CD41EFA +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20121011 +UID:65c47f11-25fd-4d75-8cba-cb9ae82276c9 +DTSTAMP:20121230T170657Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:3 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:國慶日 Double Ten Day +LAST-MODIFIED:20121230T170657Z +DTSTART;VALUE=DATE:20121010 +CREATED:20121230T170657Z +BEGIN:VALARM +X-WR-ALARMUID:41939198-88C9-4342-A690-1D452E3C291F +UID:41939198-88C9-4342-A690-1D452E3C291F +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20121001 +UID:f83e5991-d1f7-41fd-83ef-c31c6736b76d +DTSTAMP:20121230T170408Z +LOCATION: +DESCRIPTION:農曆8月15日 +X-MOZ-GENERATION:5 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:中秋節 Mid-Autumn Festival +LAST-MODIFIED:20121230T170408Z +DTSTART;VALUE=DATE:20120930 +CREATED:20121230T170408Z +BEGIN:VALARM +X-WR-ALARMUID:85D1B097-60D4-4F25-B236-2072F2060CC5 +UID:85D1B097-60D4-4F25-B236-2072F2060CC5 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110215 +UID:9dd6d06e-3197-424d-9734-0a541621716b +DTSTAMP:20121230T170635Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:情人節 Valentine's Day +LAST-MODIFIED:20121230T170635Z +DTSTART;VALUE=DATE:20110214 +CREATED:20121230T170635Z +BEGIN:VALARM +X-WR-ALARMUID:C3B7A56C-40E3-4848-9435-65CD6D51FEE2 +UID:C3B7A56C-40E3-4848-9435-65CD6D51FEE2 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110102 +UID:2449c1fe-a009-427e-8986-205ee8008207 +DTSTAMP:20121230T170403Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:中華民國開國紀念日 New Year +LAST-MODIFIED:20121230T170403Z +DTSTART;VALUE=DATE:20110101 +CREATED:20121230T170403Z +BEGIN:VALARM +X-WR-ALARMUID:854B88D4-8833-4B52-813C-13AAE9207E9B +UID:854B88D4-8833-4B52-813C-13AAE9207E9B +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110301 +UID:1ba88435-3fc2-44e4-852a-80a8f916b77d +DTSTAMP:20121230T170717Z +LOCATION: +DESCRIPTION: +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:和平紀念日 Peace Memorial Day +LAST-MODIFIED:20121230T170717Z +DTSTART;VALUE=DATE:20110228 +CREATED:20121230T170717Z +BEGIN:VALARM +X-WR-ALARMUID:E498590A-F1D3-4C42-974C-05C6D740E91F +UID:E498590A-F1D3-4C42-974C-05C6D740E91F +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110208 +UID:c0lmb3nl4k0njjtkv71545iavo@google.com +DTSTAMP:20121230T170401Z +LOCATION: +DESCRIPTION:2011/2/5 逢週六,補假一天 +X-MOZ-GENERATION:5 +STATUS:CONFIRMED +SEQUENCE:0 +SUMMARY:春節補假 Compensatory Day Off for Chinese New Year 2011 +LAST-MODIFIED:20121230T170401Z +DTSTART;VALUE=DATE:20110207 +CREATED:20121230T170401Z +BEGIN:VALARM +X-WR-ALARMUID:B9B86858-89E6-4474-8466-2459DDB62304 +UID:B9B86858-89E6-4474-8466-2459DDB62304 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110203 +UID:e3mi3p348bccnohb2ibudne5q0@google.com +DTSTAMP:20121230T170703Z +LOCATION: +DESCRIPTION:農曆12月30日 +X-MOZ-GENERATION:6 +STATUS:CONFIRMED +SEQUENCE:0 +SUMMARY:農曆除夕 Chinese New Year's Eve +LAST-MODIFIED:20121230T170703Z +DTSTART;VALUE=DATE:20110202 +CREATED:20121230T170703Z +BEGIN:VALARM +X-WR-ALARMUID:9F990DD8-DC53-41C0-BAAA-D9A4DEF23BF6 +UID:9F990DD8-DC53-41C0-BAAA-D9A4DEF23BF6 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110913 +UID:l30b5fog5c6miv5s4sd21ujs38@google.com +DTSTAMP:20121230T170633Z +LOCATION: +DESCRIPTION:農曆8月15日 +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:0 +SUMMARY:中秋節 Mid-Autumn Festival +LAST-MODIFIED:20121230T170633Z +DTSTART;VALUE=DATE:20110912 +CREATED:20121230T170633Z +BEGIN:VALARM +X-WR-ALARMUID:BBDD9815-90C9-4580-A09E-C61BCBFDC8FE +UID:BBDD9815-90C9-4580-A09E-C61BCBFDC8FE +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110406 +UID:qljtct9l37auifqsj2ifekkk1s@google.com +DTSTAMP:20121230T170752Z +LOCATION: +DESCRIPTION:每年農曆節氣清明日 +X-MOZ-GENERATION:5 +STATUS:CONFIRMED +SEQUENCE:0 +SUMMARY:民族掃墓節 Tomb Sweeping Day +LAST-MODIFIED:20121230T170752Z +DTSTART;VALUE=DATE:20110405 +CREATED:20121230T170752Z +BEGIN:VALARM +X-WR-ALARMUID:4BC1502C-C5C7-4F45-B624-64327382FD35 +UID:4BC1502C-C5C7-4F45-B624-64327382FD35 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110206 +UID:v4q7fsefrtjf4638cbn3t8verc@google.com +DTSTAMP:20121230T170419Z +LOCATION: +DESCRIPTION:農曆1月1日~3日 +X-MOZ-GENERATION:4 +STATUS:CONFIRMED +SEQUENCE:0 +SUMMARY:春節 Chinese New Year +LAST-MODIFIED:20121230T170419Z +DTSTART;VALUE=DATE:20110203 +CREATED:20121230T170419Z +BEGIN:VALARM +X-WR-ALARMUID:66B19643-439D-426A-A19B-985F709FA15D +UID:66B19643-439D-426A-A19B-985F709FA15D +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20110405 +UID:21abj9d25gh8rfcglce38kkcj4@google.com +DTSTAMP:20121230T170405Z +LOCATION: +DESCRIPTION:民族掃墓節前一日 +X-MOZ-GENERATION:5 +STATUS:CONFIRMED +SEQUENCE:0 +SUMMARY:婦女節、兒童節 Women's Day/Children's Day +LAST-MODIFIED:20121230T170405Z +DTSTART;VALUE=DATE:20110404 +CREATED:20121230T170405Z +BEGIN:VALARM +X-WR-ALARMUID:8E3CDDDE-933C-4AC0-8E2C-936B2873782F +UID:8E3CDDDE-933C-4AC0-8E2C-936B2873782F +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130225 +UID:420E584F-817B-4EA0-BD77-EE6610651C4D +DTSTAMP:20121230T172242Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:元宵節 Lantern Festival +LAST-MODIFIED:20121230T172242Z +DTSTART;VALUE=DATE:20130224 +CREATED:20121230T172228Z +BEGIN:VALARM +X-WR-ALARMUID:515E4B29-FB9D-4870-9A7B-74C64A3C7738 +UID:515E4B29-FB9D-4870-9A7B-74C64A3C7738 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130215 +UID:6B437584-18D6-4FB5-A4A4-309772A3EFA9 +DTSTAMP:20121230T172307Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:情人節 Valentine's Day +LAST-MODIFIED:20121230T172307Z +DTSTART;VALUE=DATE:20130214 +CREATED:20121230T172258Z +BEGIN:VALARM +X-WR-ALARMUID:64C38CD0-B8E4-4480-BA79-658692C554C6 +UID:64C38CD0-B8E4-4480-BA79-658692C554C6 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130313 +UID:5425DF14-6936-4F76-BAB6-E30BFB128323 +DTSTAMP:20121230T172428Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:植樹節(國父逝世紀念日)Arbor Day +LAST-MODIFIED:20121230T172428Z +DTSTART;VALUE=DATE:20130312 +CREATED:20121230T172420Z +BEGIN:VALARM +X-WR-ALARMUID:8EA1EC1C-F61C-4967-9EF9-209429376F64 +UID:8EA1EC1C-F61C-4967-9EF9-209429376F64 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130315 +UID:FFB6C863-3717-4ECE-9978-1F5A0A25CEDB +DTSTAMP:20121230T172453Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:反侵略日 Anti-invasion Day +LAST-MODIFIED:20121230T172453Z +DTSTART;VALUE=DATE:20130314 +CREATED:20121230T172453Z +BEGIN:VALARM +X-WR-ALARMUID:91425053-AEAF-4180-A5D2-5A6F4631BCF2 +UID:91425053-AEAF-4180-A5D2-5A6F4631BCF2 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130330 +UID:04614CE8-313A-43CB-8D63-E49ACBB992CA +DTSTAMP:20121230T172459Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:青年節(革命先烈紀念日) Youth Day/Revolutionary Martyr's Day +LAST-MODIFIED:20121230T172459Z +DTSTART;VALUE=DATE:20130329 +CREATED:20121230T172459Z +BEGIN:VALARM +X-WR-ALARMUID:E5E68266-B6EE-41D4-807D-0608939D9F3D +UID:E5E68266-B6EE-41D4-807D-0608939D9F3D +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130502 +UID:7978AFFE-3FEC-48DD-AC25-7605A94DC46A +DTSTAMP:20121230T172634Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:勞動節 International Workers' Day (May Day) +LAST-MODIFIED:20121230T172634Z +DTSTART;VALUE=DATE:20130501 +CREATED:20121230T172634Z +BEGIN:VALARM +X-WR-ALARMUID:2E3B45DD-8BC7-49BD-8B34-0C94739B5630 +UID:2E3B45DD-8BC7-49BD-8B34-0C94739B5630 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130513 +UID:CA869F5A-0664-48FF-BDED-A936D5F7306B +DTSTAMP:20121230T172703Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:母親節 Mother's Day +LAST-MODIFIED:20121230T172703Z +DTSTART;VALUE=DATE:20130512 +CREATED:20121230T172703Z +BEGIN:VALARM +X-WR-ALARMUID:F505BED6-095B-4D6A-8EC6-769CF10F1C00 +UID:F505BED6-095B-4D6A-8EC6-769CF10F1C00 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130716 +UID:37596B1F-9904-4CF3-9F43-65C96FEEA663 +DTSTAMP:20121230T172836Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:解嚴紀念日 Martial Law Abolishment Day +LAST-MODIFIED:20121230T172836Z +DTSTART;VALUE=DATE:20130715 +CREATED:20121230T172836Z +BEGIN:VALARM +X-WR-ALARMUID:D339F723-5D2F-46BC-A4DF-92A4150B8F70 +UID:D339F723-5D2F-46BC-A4DF-92A4150B8F70 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130809 +UID:3A40B713-8F46-4D9B-A679-75639903F33C +DTSTAMP:20121230T172901Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:父親節 Father's Day +LAST-MODIFIED:20121230T172901Z +DTSTART;VALUE=DATE:20130808 +CREATED:20121230T172901Z +BEGIN:VALARM +X-WR-ALARMUID:4152CE5B-0055-4B97-B60B-F51070E39155 +UID:4152CE5B-0055-4B97-B60B-F51070E39155 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130822 +UID:A50CEC58-C17F-4CF6-89C7-A7346C7E5C91 +DTSTAMP:20121230T172958Z +LOCATION: +DESCRIPTION:農曆7月15日 +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:中元節 Ghost Festival +LAST-MODIFIED:20121230T172958Z +DTSTART;VALUE=DATE:20130821 +CREATED:20121230T172958Z +BEGIN:VALARM +X-WR-ALARMUID:5B43B2AD-0FBC-4108-B9C9-7A31316D9845 +UID:5B43B2AD-0FBC-4108-B9C9-7A31316D9845 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130904 +UID:09D67663-8C20-4E9D-9808-CDBD892637BA +DTSTAMP:20121230T173006Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:軍人節 Armed Forces Day +LAST-MODIFIED:20121230T173006Z +DTSTART;VALUE=DATE:20130903 +CREATED:20121230T173006Z +BEGIN:VALARM +X-WR-ALARMUID:F1EA7D64-5348-4FBF-8CF1-4EB235996D23 +UID:F1EA7D64-5348-4FBF-8CF1-4EB235996D23 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130929 +UID:1CD0C0C3-A498-4DEA-B163-5E0DDB8075F3 +DTSTAMP:20121230T173026Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:教師節(孔子誕辰紀念日) Teachers' Day/Birthday of Confucius +LAST-MODIFIED:20121230T173026Z +DTSTART;VALUE=DATE:20130928 +CREATED:20121230T173026Z +BEGIN:VALARM +X-WR-ALARMUID:107B6400-8328-474B-BFC5-7385676C9F58 +UID:107B6400-8328-474B-BFC5-7385676C9F58 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20131011 +UID:63E6D3F7-CC95-4954-B15E-C3932C059376 +DTSTAMP:20121230T173048Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:國慶日 Double Ten Day +LAST-MODIFIED:20121230T173048Z +DTSTART;VALUE=DATE:20131010 +CREATED:20121230T173048Z +BEGIN:VALARM +X-WR-ALARMUID:56F59D3A-F376-40A1-BCDB-7AB9C27844F4 +UID:56F59D3A-F376-40A1-BCDB-7AB9C27844F4 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20131026 +UID:C36E6687-4758-468C-82E3-DAEE9D275292 +DTSTAMP:20121230T173135Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:臺灣光復節 Taiwan Retrocession Day +LAST-MODIFIED:20121230T173135Z +DTSTART;VALUE=DATE:20131025 +CREATED:20121230T173135Z +BEGIN:VALARM +X-WR-ALARMUID:DF3A033D-FC45-4C9C-A7EE-8C60C231D65C +UID:DF3A033D-FC45-4C9C-A7EE-8C60C231D65C +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20131113 +UID:3F705787-AC11-41E6-A5FE-8976BEBF2FF3 +DTSTAMP:20121230T173151Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:國父誕辰紀念日 Sun Yat-sen's Birthday +LAST-MODIFIED:20121230T173151Z +DTSTART;VALUE=DATE:20131112 +CREATED:20121230T173137Z +BEGIN:VALARM +X-WR-ALARMUID:7DAE47DA-01C0-471C-A114-36FAD87CAA14 +UID:7DAE47DA-01C0-471C-A114-36FAD87CAA14 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20131226 +UID:183E1B93-13D4-4AC6-ADCF-6EA05F21C5CE +DTSTAMP:20121230T173205Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:1 +SUMMARY:行憲紀念日 Constitution Day +LAST-MODIFIED:20121230T173205Z +DTSTART;VALUE=DATE:20131225 +CREATED:20121230T173205Z +BEGIN:VALARM +X-WR-ALARMUID:7D654AC3-98B5-4288-A0F7-EEF1A4BC6C39 +UID:7D654AC3-98B5-4288-A0F7-EEF1A4BC6C39 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130518 +UID:9455BAB4-6F09-4318-BB9A-09136ED6EE99 +DTSTAMP:20121230T173926Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:佛陀誕辰紀念日 Buddha's Birthday +LAST-MODIFIED:20121230T173926Z +DTSTART;VALUE=DATE:20130517 +CREATED:20121230T173844Z +BEGIN:VALARM +X-WR-ALARMUID:16A6507E-B929-4BD3-AA61-DAFBB9E9DA09 +UID:16A6507E-B929-4BD3-AA61-DAFBB9E9DA09 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:TRANSPARENT +DTEND;VALUE=DATE:20130309 +UID:357E9236-8F02-48B5-A5A7-8BE2A7396B6D +DTSTAMP:20121230T174158Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:婦女節 Women's Day +LAST-MODIFIED:20121230T174158Z +DTSTART;VALUE=DATE:20130308 +CREATED:20121230T174104Z +BEGIN:VALARM +X-WR-ALARMUID:A6255BEA-9145-4569-BB6F-CD08878BBA3C +UID:A6255BEA-9145-4569-BB6F-CD08878BBA3C +TRIGGER;VALUE=DATE-TIME:20130307T085000Z +DESCRIPTION:This is an event reminder +ACTION:DISPLAY +END:VALARM +BEGIN:VALARM +X-WR-ALARMUID:F930A324-B026-41AD-B7A7-66A3B251B311 +UID:F930A324-B026-41AD-B7A7-66A3B251B311 +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:OPAQUE +DTEND;VALUE=DATE:20130405 +UID:C113749D-3291-4E70-8E91-A0FE4E47581B +DTSTAMP:20121230T175109Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:2 +SUMMARY:清明日(民族掃墓節 Tomb Sweeping Day) +LAST-MODIFIED:20121230T175109Z +DTSTART;VALUE=DATE:20130404 +CREATED:20121230T174631Z +BEGIN:VALARM +X-WR-ALARMUID:2CF6D427-A229-4038-8BDC-149091EEAC6E +UID:2CF6D427-A229-4038-8BDC-149091EEAC6E +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +TRANSP:OPAQUE +DTEND;VALUE=DATE:20130406 +UID:162E0954-18E7-48A0-8A86-BB88DDBEFA23 +DTSTAMP:20121230T175116Z +LOCATION: +DESCRIPTION: +STATUS:CONFIRMED +SEQUENCE:3 +SUMMARY:調整放假 +LAST-MODIFIED:20121230T175116Z +DTSTART;VALUE=DATE:20130405 +CREATED:20121230T174800Z +BEGIN:VALARM +X-WR-ALARMUID:97B11427-A51D-411A-925A-CE9773085D4A +UID:97B11427-A51D-411A-925A-CE9773085D4A +TRIGGER:-PT15H +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/ThaiHolidays.ics b/media/caldata/ThaiHolidays.ics new file mode 100644 index 00000000000..8a8e06d464d --- /dev/null +++ b/media/caldata/ThaiHolidays.ics @@ -0,0 +1,1396 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Asia/Bangkok +X-LIC-LOCATION:Asia/Bangkok +BEGIN:STANDARD +TZOFFSETFROM:+0700 +TZOFFSETTO:+0700 +TZNAME:ICT +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T131910Z +DTSTAMP:20111219T131910Z +UID:06405551-386c-4d2b-9df2-da22740760ce +SUMMARY:Makha Bucha +DTSTART;VALUE=DATE:20120307 +DTEND;VALUE=DATE:20120308 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nor Magha Puja Day\n\nThai: วันม + าฆบูชา\n\nFairly widely celebrated as a public holiday\n\nDepe + nds on the lunar calendar\, difficult to nail down too far in advance. Ful + l moon of the 3rd lunar month\, called Makha. \n\nThis is in commemoration + of a spontaneous gathering of 1\,250 Sangha followers\, who came to Lord + Buddha's first sermon 9 months after his first enlightenment. They were or + dinated by Lord Buddha and became enlightened themselves. Celebrated with + candlelight processions three times clockwise around the temple\, usually + in the evening. It is also a day when many people give alms like instant o + r canned foods and necessities like robes\, incense and candles to the mon + ks. +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T125419Z +DTSTAMP:20111219T125419Z +UID:0b2501a6-1ce9-48d1-843d-6975a9f06a02 +SUMMARY:Loy Kratong +DTSTART;VALUE=DATE:20121128 +DTEND;VALUE=DATE:20121129 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\n\nDepends on the lunar calendar\, difficu + lt to nail down too far in advance\; full moon in the 11th lunar month\, u + sually in November\, but it's not allowed to be the first 3 days of that m + onth.\n\nThai: วันลอยกระทง\n\nNot an official holida + y - people float small banana-wood or styrofoam \"kratongs\" on the water + with a candle\, joss sticks and a coin to thank the river goddess and wash + away their sins of the past year. Apparently started in the 13th century + in Sukhothai\; Nang Nopamas\, a royal consort of King Ramkhamhaeng (the fo + under of Sukhothai)\, made the first kratong as an offering to Mae Nam. Sh + e then set it afloat on one of the canals of the palace so that it would d + rift past her lover the king. The king was delighted with the creation\, a + nd thus was the origins of the saying that if two lovers set a kratong adr + ift and it stays afloat until out of sight\, their love will last forever. + +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T130225Z +DTSTAMP:20111219T130225Z +UID:f6fbf087-e407-466b-a846-4a6084123d5f +SUMMARY:HM The King's Birthday observed +DTSTART;VALUE=DATE:20151207 +DTEND;VALUE=DATE:20151208 +DESCRIPTION:##@@T`@@@@@@@@@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T133430Z +DTSTAMP:20111219T133430Z +UID:afb64f40-ad3e-4819-bb59-3ea1a6936d12 +SUMMARY:Songkran +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20120413 +DTEND;VALUE=DATE:20120416 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\n\nThai: วันสงกรานต\n\ + nThai New Year\, 13-15 April every year\n\nMost important public holiday\, + substitution days given when any fall on a weekend (and probably an extra + day if they fall Tu-Th!)\n\nThe first day is known as วันมหา + สงกรานต์ (Wan Maha Songkran)\, the second as วันเ + นา (Wan Nao)\, and the third as วันเถลิงศก (Wan Th + aloeng Sok). The 14th is also observed as Family Day. +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T130500Z +DTSTAMP:20111219T130500Z +UID:f982d38e-d656-4695-be2d-8168bb144499 +SUMMARY:Children's Day +EXDATE;VALUE=DATE:20120115 +RRULE:FREQ=YEARLY;BYDAY=2SA;BYMONTH=1 +DTSTART;VALUE=DATE:20120114 +DTEND;VALUE=DATE:20120115 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\n\nThai: วันเด็กแห่ง + ชาติ\n\nNot at all a public holiday. \n\n2nd Saturday of January\, + can be celebrated on the following Monday as well (eg in schools) \n\nFea + sts and events organised by\, for and in celebration of children. +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T123739Z +DTSTAMP:20111219T123739Z +UID:2555af7a-8531-4d72-a12b-871838f8584c +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20120802 +DTEND;VALUE=DATE:20120803 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T123645Z +DTSTAMP:20111219T123645Z +UID:bbc65650-1489-4f1f-8b45-750ce5f20d17 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20120505 +DTEND;VALUE=DATE:20120506 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20091009T182520Z +DTSTAMP:20091009T173300Z +UID:914ec379-e9f3-4d61-8301-07607a552b4a +SUMMARY:Substitution day for Songkran +DTSTART;VALUE=DATE:20120416 +DTEND;VALUE=DATE:20120418 +DESCRIPTION:##@@T`@@@@@@@@@@@@@ +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T130552Z +DTSTAMP:20111219T130552Z +UID:09231bec-e330-468c-9675-b3520036cde8 +SUMMARY:New Year's Eve +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20111231 +DTEND;VALUE=DATE:20120101 +DESCRIPTION:##@@DF@@@@@@@@@@@@@\n\nThai: วันสิ้นปี (Wan + Sin Pi) or ลาทีปี 2552 (2009)\n\nPublic holiday +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20091009T182520Z +DTSTAMP:20091009T173300Z +UID:6c83a6c3-9169-43f7-bb0e-f6dec52fb4cd +SUMMARY:Asanha Bucha +DTSTART;VALUE=DATE:20120802 +DTEND;VALUE=DATE:20120803 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nalso Asalha/Asarnha Puja\, Asalabucha\n\n + Thai: วันอาสาฬหบูชา\n\nThe day before Khao Phans + a\; depends on the moon\, which month depends on the Buddhist Lunar calend + ar - very difficult to nail down too far in advance. The full moon the eig + hth lunar month\, called Asanha (or Asarnha\, Asalha\, Asalaha)\n\nCommemo + rates when the Lord Buddha gave his first sermon\, the Dhammacakkappavatta + na Sutta\, to five disciples\, introducing the middle way\, the noble eigh + t-fold path and the four noble truths. Celebrated with candlelight process + ions. +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T123919Z +DTSTAMP:20111219T123919Z +UID:0be27fa3-5122-4f1d-96b0-d7526328ee09 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20121228 +DTEND;VALUE=DATE:20121229 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T131652Z +DTSTAMP:20111219T131652Z +UID:61843e19-f25f-45be-a9b6-9f32246e599f +SUMMARY:Chinese New Year +DTSTART;VALUE=DATE:20120123 +DTEND;VALUE=DATE:20120126 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\n\nThai: วันตรุษจีน\n\ + nNot widely observed as a public holiday\, but some businesses may be clos + ed\, especially in ethnic Chinese neighborhoods.\n\n2012: Dragon\n2013: Sn + ake\n2014: Horse\n2015: Goat\n\nDepends on the lunar calendar\, hard to na + il down in advance. It is on the second new moon day following Winter sols + tice (which is around December 22 in the nothern hemisphere)\n(Note in Tha + iland - TAT 1672)\n\nChinese people celebrate with a week of house-cleanin + g\, lion dances and fireworks. This is also the time for them to pay respe + ct to their ancestors. +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T133659Z +DTSTAMP:20111219T133659Z +UID:cfbadcdb-8ab1-4b55-aa90-c6cb91707702 +SUMMARY:Substitution for Coronation Day +DTSTART;VALUE=DATE:20120507 +DTEND;VALUE=DATE:20120508 +DESCRIPTION:##F@T`@@@@@@@@@@@@@ +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20091009T182520Z +DTSTAMP:20091009T173300Z +UID:92226e36-735c-49c5-bc09-b114396927e4 +SUMMARY:Visakha Bucha Day +DTSTART;VALUE=DATE:20120604 +DTEND;VALUE=DATE:20120605 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nalso Wisakha Puja\, Wesak/Vesak\n\nDepend + s on the lunar calendar\, difficult to nail down too far in advance\; the + full moon of the sixth lunar month\, called Vesak\, Wesak or Vaisakha.\n\n + Fairly widely observed public holiday\n\nThai: วันวิสาขบ + ูชา\n\nThis day commemorates the birth\, the enlightment and the dea + th (entry into the nirvana) of Buddha. Temples through the country are cro + wded with people listening to sermons about Dharma (Buddha's teaching) and + in the evening there is a candlelit procession around the main building o + f the temple containing the Buddha statues.\n\nAlso observed as National T + ree Day. +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T125139Z +DTSTAMP:20111219T125139Z +UID:ced759c8-0727-4372-9731-56928176c7d1 +SUMMARY:Full Moon - \"Blue Moon\"! +DTSTART;VALUE=DATE:20120831 +DTEND;VALUE=DATE:20120901 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T135333Z +DTSTAMP:20111219T135333Z +UID:830e65cf-18aa-45b4-b7a3-078222607c0c +SUMMARY:Chinese Vegetarian festival +DTSTART;VALUE=DATE:20121015 +DTEND;VALUE=DATE:20121024 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nNote - Difficult to determine dates in ad + vance - usually in October or November. (First nine days of the ninth Chin + ese lunar month?)\n\nThai: เทศกาลกินเจ\n\nNot at all + a public holiday\n\nHeld in the south of Thailand in the first days of th + e ninth Chinese lunar month (usually in late September or early October). + Local residents of Chinese ancestry strictly observe a vegetarian diet for + 9 days and other rules for the purpose of spiritual cleansing and merit m + aking. In Phuket\, there are also daily parades of people with in a tranc + e state exhibiting extreme body piercings\, e.g. car parts\, TV antennas\, + large tools.\n\nhttp://www.phuketvegetarian.com/ +SEQUENCE:3 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134811Z +DTSTAMP:20111219T134811Z +UID:5cb09885-944e-4830-8dc3-ec96b3cc735c +SUMMARY:HM The Queen's Birthday +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20120812 +DTEND;VALUE=DATE:20120813 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\n12 August every year\n\nThai: วัน + แม่แห่งชาติ or \nวันเฉลิมพระ + ชนมพรรษา สมเด็จพระนางเจ้า + สิริกิติ์ พระบนมราชินีนาถ\ + n\nBirthday of the Queen in 1932\, Somdet Phra Nang Chao Sirikit Phra Boro + mmarachininat\; a very important holiday\, most businesses close\, usually + no alcohol sold.\n\nAlso doubles as Mother's Day (วันแม่แ + ห่งชาติ\; Wan Mae Haeng Chat)\, as the Queen is the Mother o + f all Thais. +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T123827Z +DTSTAMP:20111219T123827Z +UID:8384c2d5-30ba-482d-ad8e-1132e9aa0135 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20120930 +DTEND;VALUE=DATE:20121001 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T123622Z +DTSTAMP:20111219T123622Z +UID:b8f5f569-225c-4722-ac1d-d5e318fcb6a5 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T123559Z +DTSTAMP:20111219T123559Z +UID:cc94ac61-9f03-4664-859a-0b5a7a8fdeb0 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20120307 +DTEND;VALUE=DATE:20120308 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T131253Z +DTSTAMP:20111219T131253Z +UID:80a9cf11-4997-4d11-b476-e83e0c281996 +SUMMARY:Thai Army Day +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20120118 +DTEND;VALUE=DATE:20120119 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nin Thai: วันกองทัพไ + ทย\n\nSometimes referred to \"Royal Armed Forces Day\"\, but the Army + is the 800 pound gorilla that sits wherever it likes.\n\n18 January each y + ear - used to be 25th? Not at all a public holiday\; marked by military pa + rades and the King reviewing the army.\n\nCommemorates King Naraesuan the + Great's victory in battle over the Burmese Prince\, Maha Uparaja\, on Janu + ary 18 1592 (or 1593?) during the Ayuthaya period\, and depicted by the 20 + 06 Thai blockbuster \"The Legend of King Naresuan\". +SEQUENCE:3 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T133026Z +DTSTAMP:20111219T133026Z +UID:0f79004e-0d8f-4b03-a5e5-fcafb42d26d6 +SUMMARY:Substitution day for Songkran +DTSTART;VALUE=DATE:20140416 +DTEND;VALUE=DATE:20140417 +DESCRIPTION:##@@T`@@@@@@@@@@@@@ +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134738Z +DTSTAMP:20111219T134738Z +UID:6c30da16-a467-4c81-9aa7-1e4ca1c609ad +SUMMARY:Asanha Bucha (?) +DTSTART;VALUE=DATE:20130722 +DTEND;VALUE=DATE:20130723 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nalso Asalha/Asarnha Puja\, Asalabucha\n\n + Thai: วันอาสาฬหบูชา\n\nThe day before Khao Phans + a\; depends on the moon\, which month depends on the Buddhist Lunar calend + ar - very difficult to nail down too far in advance. The full moon the eig + hth lunar month\, called Asanha (or Asarnha\, Asalha\, Asalaha)\n\nCommemo + rates when the Lord Buddha gave his first sermon\, the Dhammacakkappavatta + na Sutta\, to five disciples\, introducing the middle way\, the noble eigh + t-fold path and the four noble truths. Celebrated with candlelight process + ions. +SEQUENCE:2 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134629Z +DTSTAMP:20111219T134629Z +UID:56e2de98-d2d9-4a33-9091-ff83e76e7d25 +SUMMARY:Khao Phansa (Buddhist Lent) (?) +DTSTART;VALUE=DATE:20150731 +DTEND;VALUE=DATE:20150801 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nThe day after Asanha Bucha\, very difficu + lt to nail down too far in advance.\n\nThai: วันเข้าพร + รษา\n\nThe beginning of the Buddhist Lent\, or \"Khao Phansa\". Budd + hist monks remain within the temple grounds and do not venture out for a p + eriod of three months starting from the first day of the waning moon of th + e eighth lunar month (in July) to the fifteenth day of the waxing moon of + the eleventh lunar month (in October). In former times\, this is done to p + revent monks from trampling upon rice paddies when they venture out to rec + eive offerings from the villagers. This period is translated as \"Lent\" b + ecause many lay people choose to be strict about keeping the precepts and + even refrain from eating meat. +SEQUENCE:2 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124528Z +DTSTAMP:20111219T124528Z +UID:6e84e465-cced-42a0-883d-57d05be19cad +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20130226 +DTEND;VALUE=DATE:20130227 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T135429Z +DTSTAMP:20111219T135429Z +UID:917d6b7d-94cc-4e55-9c08-3f18b7a7954f +SUMMARY:Chulalongkorn Day +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20121023 +DTEND;VALUE=DATE:20121024 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nThai: วันปิยมหารา + ช (Wan Piya Maharat)\n\n23 October every year\, public holiday.\n\nComme + morates the passing of King Chulalongkorn in 1910. Piya Maharat is a nickn + ame for the King\, meaning the beloved great king. +SEQUENCE:3 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T125850Z +DTSTAMP:20111219T125850Z +UID:8a7c3078-4a30-41d0-880a-b749ad23a2ba +SUMMARY:Bang Saen Races +DTSTART;VALUE=DATE:20120201 +DTEND;VALUE=DATE:20120206 +DESCRIPTION:##@@DT@@@@@@@R@@@@@\n\nBang Saen Speed Festival\, Chonburi\nUs + ually in November\nrescheduled because of the 2011 flood\n +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T130419Z +DTSTAMP:20111219T130419Z +UID:af23c670-7e65-4336-9e16-9603ef6e6d17 +SUMMARY:Constitution Day +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20121210 +DTEND;VALUE=DATE:20121211 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\n10 October every year\nThai: วันร + ัฐธรรมนูญ ( Wan Rattha Thammanun)\n\nIn 1932 the monarc + hy was converted from absolute to constitutional\; this was the first step + towards democracy in Thailand. Some would say some further steps are need + ed\, but even when a coup suspends the actual Constitution\, this is is st + ill celebrated\, albeit perhaps a bit quietly\, as a public holiday.\n +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20091009T182520Z +DTSTAMP:20091009T173300Z +UID:173d5881-da2f-404d-948c-c469ff036b6e +SUMMARY:Chinese New Year +DTSTART;VALUE=DATE:20130210 +DTEND;VALUE=DATE:20130213 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\n\nThai: วันตรุษจีน\n\ + n2010: Tiger\n2011: Rabbit\n2012: Dragon\n2013:Snake\n\nNot widely observe + d as a public holiday\, but some businesses may be closed\, especially in + ethnic Chinese neighborhoods.\n\nDepends on the lunar calendar\, hard to n + ail down in advance. It is on the second new moon day following Winter sol + stice (which is around December 22 in the nothern hemisphere)\n\nChinese p + eople celebrate with a week of house-cleaning\, lion dances and fireworks. + This is also the time for them to pay respect to their ancestors. +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T135516Z +DTSTAMP:20111219T135516Z +UID:c702b97a-cde2-451a-9d52-aa89eba18536 +SUMMARY:Substitution for Constitution Day +DTSTART;VALUE=DATE:20161212 +DTEND;VALUE=DATE:20161213 +DESCRIPTION:##F@T`@@@@@@@@@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T123528Z +DTSTAMP:20111219T123528Z +UID:c73a31fe-8b43-459b-99b3-6152d71ff443 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20120207 +DTEND;VALUE=DATE:20120208 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124504Z +DTSTAMP:20111219T124504Z +UID:89ef70a1-b61f-43d3-90e7-a7de3e9524c9 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20130127 +DTEND;VALUE=DATE:20130128 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T130021Z +DTSTAMP:20111219T130021Z +UID:f22fce83-8dde-4bf2-93b9-90e59be96510 +SUMMARY:HM The King's Birthday +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20121205 +DTEND;VALUE=DATE:20121206 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\n5 December every year\nThai: วันเ + ฉลิมพระชนม์พรรษา\, or วันพ่อ + แห่งชาติ \nor even: วันเฉลิมพระช + นมพรรษาพระบาทสมเด็จพระเจ + ้าอยู่หัว (Wan Chaloem Phra Chonmaphansa Phrabat Somdet + Phra Chao Yuhua)\n\nBirthday of King Bhumibol Adulyadej\, or Rama IX in 19 + 27\; a very important holiday\, most businesses close\, usually no alcohol + sold.\nDoes triple duty as Father's Day\, as the King is the father of al + l Thais and also Thailand's National Day.\n\nIf it falls on a weekend\, ma + ny workplaces will close on the following Monday. +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T130509Z +DTSTAMP:20111219T130509Z +UID:63b3fa69-9579-4818-bba0-5d1dd18f113c +SUMMARY:[Children's Day observed] +DTSTART;VALUE=DATE:20120116 +DTEND;VALUE=DATE:20120117 +DESCRIPTION:##@@D@@@@@tbpB@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134742Z +DTSTAMP:20111219T134742Z +UID:09427f91-7589-48f0-8708-0d871493a414 +SUMMARY:Asanha Bucha (?) +DTSTART;VALUE=DATE:20140711 +DTEND;VALUE=DATE:20140712 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nalso Asalha/Asarnha Puja\, Asalabucha\n\n + Thai: วันอาสาฬหบูชา\n\nThe day before Khao Phans + a\; depends on the moon\, which month depends on the Buddhist Lunar calend + ar - very difficult to nail down too far in advance. The full moon the eig + hth lunar month\, called Asanha (or Asarnha\, Asalha\, Asalaha)\n\nCommemo + rates when the Lord Buddha gave his first sermon\, the Dhammacakkappavatta + na Sutta\, to five disciples\, introducing the middle way\, the noble eigh + t-fold path and the four noble truths. Celebrated with candlelight process + ions. +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20091009T182520Z +DTSTAMP:20091009T173300Z +UID:534a146c-4eec-4517-ae97-228d36089814 +SUMMARY:Substitution for Chakri Day +DTSTART;VALUE=DATE:20130408 +DTEND;VALUE=DATE:20130409 +DESCRIPTION:##@@T`@@@@@@@@@@@@@ +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T123900Z +DTSTAMP:20111219T123900Z +UID:8e0fb483-4263-441a-8262-2c8f1ec20876 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20121128 +DTEND;VALUE=DATE:20121129 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134646Z +DTSTAMP:20111219T134646Z +UID:91e8afeb-6779-4e72-93b0-59a616287e2e +SUMMARY:Khao Phansa (Buddhist Lent) (?) +DTSTART;VALUE=DATE:20130723 +DTEND;VALUE=DATE:20130724 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nThe day after Asaha Bucha\, very difficul + t to nail down too far in advance.\n\nThai: วันเข้าพรร + ษา\n\nThe beginning of the Buddhist Lent\, or \"Khao Phansa\". Buddhis + t monks remain within the temple grounds and do not venture out for a peri + od of three months starting from the first day of the waning moon of the e + ighth lunar month (in July) to the fifteenth day of the waxing moon of the + eleventh lunar month (in October). In former times\, this is done to prev + ent monks from trampling upon rice paddies when they venture out to receiv + e offerings from the villagers. This period is translated as \"Lent\" beca + use many lay people choose to be strict about keeping the precepts and eve + n refrain from eating meat. +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T130614Z +DTSTAMP:20111219T130614Z +UID:bdd24743-2986-49ef-9905-6ccd08b9d526 +SUMMARY:New Year's Day +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20120101 +DTEND;VALUE=DATE:20120102 +DESCRIPTION:##@@DF@@@@@@@@@@@@@\n\nThai: วันขึ้นปีใ + หม่ (Wan Khuen Pi Mai)\n\n\"Sawatdee Pee Mai\"\n\nPublic holiday +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134114Z +DTSTAMP:20111219T134114Z +UID:e4f4927c-954c-494b-b2b7-813ba4d25f72 +SUMMARY:Visakha Bucha Day (?) +DTSTART;VALUE=DATE:20140514 +DTEND;VALUE=DATE:20140515 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nalso Wisakha Puja\, Wesak/Vesak\n\nDepend + s on the lunar calendar\, difficult to nail down too far in advance\; the + full moon of the sixth lunar month\, called Vesak\, Wesak or Vaisakha.\n\n + Fairly widely observed public holiday\n\nThai: วันวิสาขบ + ูชา\n\nThis day commemorates the birth\, the enlightment and the dea + th (entry into the nirvana) of Buddha. Temples through the country are cro + wded with people listening to sermons about Dharma (Buddha's teaching) and + in the evening there is a candlelit procession around the main building o + f the temple containing the Buddha statues.\n\nAlso observed as National T + ree Day. +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20091009T182520Z +DTSTAMP:20091009T173300Z +UID:48684d10-d667-45fb-b6ff-57aac7c04637 +SUMMARY:Awk Phansa +DTSTART;VALUE=DATE:20121030 +DTEND;VALUE=DATE:20121031 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nor Ok Paansa\nThai: วันปวาร + ณา ออกพรรษา\n\nEnd of \"Buddhist Lent\"\, which began + with Khao Phansa\; depends on the lunar calendar\, difficult to nail down + far in advance. \n\nThe monks prepare to leave their temples the next day + and travel throughout the countryside by shaving their heads and eyebrows\ + , and donning fresh robes\, offered in ceremonies the following day.\n\nAp + parently the \"Naga fireballs\" can be seen coming out of the Mekong River + about this time\, see Wikipedia or\nhttp://www.thaifolk.com/doc/literate/ + payanak/payanak_e.htm\nfor more information.\n +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T123703Z +DTSTAMP:20111219T123703Z +UID:1aa9e6b7-14ee-41da-a781-1c3fa8678a7f +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20120604 +DTEND;VALUE=DATE:20120605 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T123457Z +DTSTAMP:20111219T123457Z +UID:eab22542-336f-481b-92fa-925b30d287cd +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20120108 +DTEND;VALUE=DATE:20120109 +DESCRIPTION:##@@DM@@@@tvH]@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134854Z +DTSTAMP:20111219T134854Z +UID:7b6d917a-296e-4186-854c-42bbb7747737 +SUMMARY:Awk Phansa (?) +DTSTART;VALUE=DATE:20131019 +DTEND;VALUE=DATE:20131020 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nor Ok Paansa\nThai: วันปวาร + ณา ออกพรรษา\n\nEnd of \"Buddhist Lent\"\, which began + with Khao Phansa\; depends on the lunar calendar\, difficult to nail down + far in advance. \n\nThe monks prepare to leave their temples the next day + and travel throughout the countryside by shaving their heads and eyebrows\ + , and donning fresh robes\, offered in ceremonies the following day.\n\nAp + parently the \"Naga fireballs\" can be seen coming out of the Mekong River + about this time\, see Wikipedia or\nhttp://www.thaifolk.com/doc/literate/ + payanak/payanak_e.htm\nfor more information.\n +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T123722Z +DTSTAMP:20111219T123722Z +UID:cd4bda43-e368-4485-8d0a-6438119ccbe9 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20120703 +DTEND;VALUE=DATE:20120704 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134911Z +DTSTAMP:20111219T134911Z +UID:9f2fac8b-77f3-481a-9024-d802fd8e7a28 +SUMMARY:Awk Phansa (?) +DTSTART;VALUE=DATE:20141008 +DTEND;VALUE=DATE:20141009 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nor Ok Paansa\nThai: วันปวาร + ณา ออกพรรษา\n\nEnd of \"Buddhist Lent\"\, which began + with Khao Phansa\; depends on the lunar calendar\, difficult to nail down + far in advance. \n\nThe monks prepare to leave their temples the next day + and travel throughout the countryside by shaving their heads and eyebrows\ + , and donning fresh robes\, offered in ceremonies the following day.\n\nAp + parently the \"Naga fireballs\" can be seen coming out of the Mekong River + about this time\, see Wikipedia or\nhttp://www.thaifolk.com/doc/literate/ + payanak/payanak_e.htm\nfor more information.\n +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T133827Z +DTSTAMP:20111219T133827Z +UID:6f5944ff-2b76-4d20-a27c-7f101ae2f75d +SUMMARY:Royal Ploughing Ceremony Day +DTSTART;VALUE=DATE:20120509 +DTEND;VALUE=DATE:20120510 +DESCRIPTION:##F@T`@@@@@@@@@@@@@\n\nThe day is selected by Brahmin Priests + according to their astrological calendars\, so VERY difficult to nail down + far in advance. (Note in Thailand TAT 1672)\n\nIn Thai: วันพื + ชมงคล (Wan Phuetcha Mongkhon)\nor วันพระราชพ + ิธีพืชมงคลจรดพระนังคัลแร + กนาขวัญ (Wan Phra Ratcha Phithi Phuetcha Monkhon Lae Charot + Phra Nangkhan Raek Na Khwan\n\nNot widely observed as a public holiday\, e + xcept by government offices. Also observed as Farmer's Day.\n\nThis is an + ancient Brahman ceremony which celebrates the beginning of the rice plant + ing season\, and thus is important for the many rice farmers of Thailand. + HM King Bhumibol presides over ceremonies held in front of Wat Phrakaew a + t Sanam Luang\, in which Brahmin priests bless seeds and make symbolic fur + rows using a plough pulled by buffalos. Once the ceremony is over\, the au + dience runs to the furrows to get the blessed seeds\, which are supposed t + o bring good harvests. +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134032Z +DTSTAMP:20111219T134032Z +UID:37b80bac-b8ad-4be5-985b-164b810cb3f5 +SUMMARY:Visakha Bucha Day (?) +DTSTART;VALUE=DATE:20130525 +DTEND;VALUE=DATE:20130526 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nalso Wisakha Puja\, Wesak/Vesak\n\nDepend + s on the lunar calendar\, difficult to nail down too far in advance\; the + full moon of the sixth lunar month\, called Vesak\, Wesak or Vaisakha.\n\n + Fairly widely observed public holiday\n\nThai: วันวิสาขบ + ูชา\n\nThis day commemorates the birth\, the enlightment and the dea + th (entry into the nirvana) of Buddha. Temples through the country are cro + wded with people listening to sermons about Dharma (Buddha's teaching) and + in the evening there is a candlelit procession around the main building o + f the temple containing the Buddha statues.\n\nAlso observed as National T + ree Day. +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20091009T182520Z +DTSTAMP:20091009T173300Z +UID:7d4076ee-c9bf-4c5f-a6a5-352bff4a28b2 +SUMMARY:Khao Phansa (Buddhist Lent) +DTSTART;VALUE=DATE:20120803 +DTEND;VALUE=DATE:20120804 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nThe day after Asanha Bucha\, very difficu + lt to nail down too far in advance.\n\nThai: วันเข้าพร + รษา\n\nThe beginning of the Buddhist Lent\, or \"Khao Phansa\". Budd + hist monks remain within the temple grounds and do not venture out for a p + eriod of three months starting from the first day of the waning moon of th + e eighth lunar month (in July) to the fifteenth day of the waxing moon of + the eleventh lunar month (in October). In former times\, this is done to p + revent monks from trampling upon rice paddies when they venture out to rec + eive offerings from the villagers. This period is translated as \"Lent\" b + ecause many lay people choose to be strict about keeping the precepts and + even refrain from eating meat. +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T125610Z +DTSTAMP:20111219T125610Z +UID:8219a8bb-8ec3-44f1-aa06-26afca1ad169 +SUMMARY:Loy Kratong (?) +DTSTART;VALUE=DATE:20131117 +DTEND;VALUE=DATE:20131118 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\n\nDepends on the lunar calendar\, difficu + lt to nail down too far in advance\; full moon in the 11th lunar month\, u + sually in November\, but it's not allowed to be the first 3 days of that m + onth.\n\nThai: วันลอยกระทง\n\nNot an official holida + y - people float small banana-wood or styrofoam \"kratongs\" on the water + with a candle\, joss sticks and a coin to thank the river goddess and wash + away their sins of the past year. Apparently started in the 13th century + in Sukhothai\; Nang Nopamas\, a royal consort of King Ramkhamhaeng (the fo + under of Sukhothai)\, made the first kratong as an offering to Mae Nam. Sh + e then set it afloat on one of the canals of the palace so that it would d + rift past her lover the king. The king was delighted with the creation\, a + nd thus was the origins of the saying that if two lovers set a kratong adr + ift and it stays afloat until out of sight\, their love will last forever. + +SEQUENCE:1 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20070926T025219Z +LAST-MODIFIED:20111219T133340Z +DTSTAMP:20111219T133340Z +UID:2abe8793-e14a-4ac6-9e6e-6739a7e03b90 +SUMMARY:Chakri Day +PRIORITY:0 +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Asia/Bangkok:20120406 +DTEND;VALUE=DATE;TZID=Asia/Bangkok:20120407 +CLASS:PUBLIC +DESCRIPTION:##@@\\`@@@@@@@@@@@@@\n\n6 April every year\n\nThai: วัน + จักรี or วันที่ระลึกมหาจักร + ีบรมราชวงศ์\n\nFairly widely observed as a public ho + liday\n\nCommemorates King Rama I\, the founder of the current Chakri dyna + sty\, of which the current King is the ninth. He moved the capital from Th + onburi to Bangkok\, retrieved Buddhist texts that were lost during the occ + upation of the former capital Ayuthaya by the Burmese\, and wrote the law + codex the Book of Three Seals. +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20071004T034052Z +LAST-MODIFIED:20111219T140601Z +DTSTAMP:20111219T140601Z +UID:2d5fbe2e-5b20-4a9f-ae92-376c20a83281 +SUMMARY:Teacher's Day +PRIORITY:0 +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Asia/Bangkok:20120116 +DTEND;VALUE=DATE;TZID=Asia/Bangkok:20120117 +CLASS:PUBLIC +DESCRIPTION:##@@\\`@@@@@@@@@@@@@\nNot at all a public holiday\, but many T + hai public schools close. Events are organised to show respect for teacher + s.\n\nThai: วันครู\n\nJanuary 16th every year +TRANSP:TRANSPARENT +X-MOZ-GENERATION:7 +SEQUENCE:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20070926T025629Z +LAST-MODIFIED:20111219T133510Z +DTSTAMP:20111219T133510Z +UID:2e690675-d92b-4977-b019-9318cc1fd0fa +SUMMARY:Labor Day +PRIORITY:0 +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Asia/Bangkok:20120501 +DTEND;VALUE=DATE;TZID=Asia/Bangkok:20120502 +CLASS:PUBLIC +DESCRIPTION:##@@\\`@@@@@@@@@@@@@\nIn thoery all businesses required to clo + se (except for schools?)\nThai: วันแรงงานแห่งช + าติ +TRANSP:TRANSPARENT +X-MOZ-GENERATION:3 +SEQUENCE:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20070926T025652Z +LAST-MODIFIED:20111219T133545Z +DTSTAMP:20111219T133545Z +UID:540d55b4-3161-425a-98f3-afa21a646b4c +SUMMARY:Coronation Day +PRIORITY:0 +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Asia/Bangkok:20120505 +DTEND;VALUE=DATE;TZID=Asia/Bangkok:20120506 +CLASS:PUBLIC +DESCRIPTION:##@@L@@@@@@@@@@@@@@\nThai: วันฉัตรมงคล \ + n\nKing Bhumibol Adulyadej\, or Rama IX\, was crowned on 5 May 1950. +X-MOZ-GENERATION:3 +TRANSP:TRANSPARENT +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070926T030047Z +LAST-MODIFIED:20111219T134141Z +DTSTAMP:20111219T134141Z +UID:9d790c6f-0dbe-46be-8707-82b8613c47d7 +SUMMARY:Mid Year Bank Holiday +PRIORITY:0 +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE;TZID=Asia/Bangkok:20120701 +DTEND;VALUE=DATE;TZID=Asia/Bangkok:20120702 +CLASS:PUBLIC +DESCRIPTION:##@@\\`@@@@@@@@@@@@@\nOnly affects banks +X-MOZ-GENERATION:3 +TRANSP:TRANSPARENT +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124602Z +DTSTAMP:20111219T124602Z +UID:2a152189-6b24-43d0-b3ec-3394eeb93b4f +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20130327 +DTEND;VALUE=DATE:20130328 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124620Z +DTSTAMP:20111219T124620Z +UID:bbf9eea5-50ca-4b33-8c55-b8fd63b4744b +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20130426 +DTEND;VALUE=DATE:20130427 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124712Z +DTSTAMP:20111219T124712Z +UID:961b0119-2f33-4419-a4b9-2adb7b6c7a63 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20130723 +DTEND;VALUE=DATE:20130724 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:3 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124656Z +DTSTAMP:20111219T124656Z +UID:ef897e68-94ce-4174-8503-f9adbe0063d3 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20130623 +DTEND;VALUE=DATE:20130624 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:3 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124825Z +DTSTAMP:20111219T124825Z +UID:0d6701d4-1ec4-4de8-ab09-78ff13785993 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20131117 +DTEND;VALUE=DATE:20131118 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:4 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124641Z +DTSTAMP:20111219T124641Z +UID:fd038ca9-7744-4c17-86f6-eca4a938d636 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20130525 +DTEND;VALUE=DATE:20130526 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124745Z +DTSTAMP:20111219T124745Z +UID:33af81ec-a68d-4b6f-a060-48c8e0d1a017 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20130919 +DTEND;VALUE=DATE:20130920 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:4 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124801Z +DTSTAMP:20111219T124801Z +UID:43cf6e1c-aa05-4a72-913e-55169683441a +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20131019 +DTEND;VALUE=DATE:20131020 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:4 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124843Z +DTSTAMP:20111219T124843Z +UID:719d52c7-8eeb-4bfb-a895-3f36e60cf0f3 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20131217 +DTEND;VALUE=DATE:20131218 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:4 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T125158Z +DTSTAMP:20111219T125158Z +UID:0f14f97e-0ebb-436d-8481-660246721554 +SUMMARY:Full Moon - \"Blue Moon\"! +DTSTART;VALUE=DATE:20130821 +DTEND;VALUE=DATE:20130822 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:3 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124909Z +DTSTAMP:20111219T124909Z +UID:7cbddd46-3382-465f-92f0-177a6387a9aa +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20140116 +DTEND;VALUE=DATE:20140117 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:5 +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T124922Z +DTSTAMP:20111219T124922Z +UID:53858f2a-bb8d-44e0-90d0-cd4e7f6e396c +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20140215 +DTEND;VALUE=DATE:20140216 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:5 +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T132501Z +DTSTAMP:20111219T132501Z +UID:60665d71-23f1-47bb-a8f9-965fd11e452b +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20140613 +DTEND;VALUE=DATE:20140614 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:7 +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T131810Z +DTSTAMP:20111219T131810Z +UID:0a518701-80d9-41e4-b898-0fee83484a6a +SUMMARY:Chinese New Year +DTSTART;VALUE=DATE:20140131 +DTEND;VALUE=DATE:20140203 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\n\nThai: วันตรุษจีน\n\ + n2010: Tiger\n2011: Rabbit\n2012: Dragon\n2013:Snake\n\nNot widely observe + d as a public holiday\, but some businesses may be closed\, especially in + ethnic Chinese neighborhoods.\n\nDepends on the lunar calendar\, hard to n + ail down in advance. It is on the second new moon day following Winter sol + stice (which is around December 22 in the nothern hemisphere)\n\nChinese p + eople celebrate with a week of house-cleaning\, lion dances and fireworks. + This is also the time for them to pay respect to their ancestors. +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T132346Z +DTSTAMP:20111219T132346Z +UID:f90e0fa1-5120-4c33-a5e4-2072bcdfd216 +SUMMARY:Makha Bucha (?) +DTSTART;VALUE=DATE:20130226 +DTEND;VALUE=DATE:20130227 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nor Magha Puja Day\n\nThai: วันม + าฆบูชา\n\nFairly widely celebrated as a public holiday\n\nDepe + nds on the lunar calendar\, difficult to nail down too far in advance. Ful + l moon of the 3rd lunar month\, called Makha. \n\nThis is in commemoration + of a spontaneous gathering of 1\,250 Sangha followers\, who came to Lord + Buddha's first sermon 9 months after his first enlightenment. They were or + dinated by Lord Buddha and became enlightened themselves. Celebrated with + candlelight processions three times clockwise around the temple\, usually + in the evening. It is also a day when many people give alms like instant o + r canned foods and necessities like robes\, incense and candles to the mon + ks. +SEQUENCE:3 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134703Z +DTSTAMP:20111219T134703Z +UID:c3e4a074-b432-4712-bcd2-0e3364f7f30c +SUMMARY:Makha Bucha (?) +DTSTART;VALUE=DATE:20140214 +DTEND;VALUE=DATE:20140215 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nor Magha Puja Day\n\nThai: วันม + าฆบูชา\n\nFairly widely celebrated as a public holiday\n\nDepe + nds on the lunar calendar\, difficult to nail down too far in advance. Ful + l moon of the 3rd lunar month\, called Makha. \n\nThis is in commemoration + of a spontaneous gathering of 1\,250 Sangha followers\, who came to Lord + Buddha's first sermon 9 months after his first enlightenment. They were or + dinated by Lord Buddha and became enlightened themselves. Celebrated with + candlelight processions three times clockwise around the temple\, usually + in the evening. It is also a day when many people give alms like instant o + r canned foods and necessities like robes\, incense and candles to the mon + ks. +SEQUENCE:3 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134716Z +DTSTAMP:20111219T134716Z +UID:7714f202-2b00-4125-a7d5-c861d6868ea7 +SUMMARY:Makha Bucha (?) +DTSTART;VALUE=DATE:20150304 +DTEND;VALUE=DATE:20150305 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nor Magha Puja Day\n\nThai: วันม + าฆบูชา\n\nFairly widely celebrated as a public holiday\n\nDepe + nds on the lunar calendar\, difficult to nail down too far in advance. Ful + l moon of the 3rd lunar month\, called Makha. \n\nThis is in commemoration + of a spontaneous gathering of 1\,250 Sangha followers\, who came to Lord + Buddha's first sermon 9 months after his first enlightenment. They were or + dinated by Lord Buddha and became enlightened themselves. Celebrated with + candlelight processions three times clockwise around the temple\, usually + in the evening. It is also a day when many people give alms like instant o + r canned foods and necessities like robes\, incense and candles to the mon + ks. +SEQUENCE:4 +X-MOZ-GENERATION:5 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T132451Z +DTSTAMP:20111219T132451Z +UID:7062bd21-171b-4d90-8949-1c8c6202512f +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20140514 +DTEND;VALUE=DATE:20140515 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:7 +X-MOZ-GENERATION:7 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T132423Z +DTSTAMP:20111219T132423Z +UID:038efac5-d32d-4991-ab4a-d27a17909dc9 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20140316 +DTEND;VALUE=DATE:20140317 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:6 +X-MOZ-GENERATION:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T132529Z +DTSTAMP:20111219T132529Z +UID:4af4f557-ffd6-4833-9d94-0b220b810eaf +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20140712 +DTEND;VALUE=DATE:20140713 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:8 +X-MOZ-GENERATION:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T132540Z +DTSTAMP:20111219T132540Z +UID:c9a663b2-8ef4-4924-b2a7-5d2e02decc34 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20140810 +DTEND;VALUE=DATE:20140811 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:8 +X-MOZ-GENERATION:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T132622Z +DTSTAMP:20111219T132622Z +UID:96776eaa-a41f-40a9-acdc-787920a75d6f +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20141106 +DTEND;VALUE=DATE:20141107 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:9 +X-MOZ-GENERATION:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T132609Z +DTSTAMP:20111219T132609Z +UID:fd24f556-f378-461d-aa74-9d1e492faab2 +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20141008 +DTEND;VALUE=DATE:20141009 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:9 +X-MOZ-GENERATION:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T132554Z +DTSTAMP:20111219T132554Z +UID:9768cdb8-a37f-477c-bfd3-e121b5ddb0ef +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20140909 +DTEND;VALUE=DATE:20140910 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:8 +X-MOZ-GENERATION:8 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T132638Z +DTSTAMP:20111219T132638Z +UID:0cef87e6-5e73-4240-b55f-eeff8fdb1c9b +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20141206 +DTEND;VALUE=DATE:20141207 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:9 +X-MOZ-GENERATION:9 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T132652Z +DTSTAMP:20111219T132652Z +UID:3a095073-d29f-4d21-bb9a-ce85bdc30aec +SUMMARY:Full Moon +DTSTART;VALUE=DATE:20150105 +DTEND;VALUE=DATE:20150106 +DESCRIPTION:##@@DM@@@@ssh]@@@@@ +SEQUENCE:10 +X-MOZ-GENERATION:10 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T133127Z +DTSTAMP:20111219T133127Z +UID:5d546991-afe2-46cb-9531-8e81bccebc86 +SUMMARY:Substitution day for Songkran +DTSTART;VALUE=DATE:20130416 +DTEND;VALUE=DATE:20130417 +DESCRIPTION:##@@T`@@@@@@@@@@@@@ +SEQUENCE:3 +X-MOZ-GENERATION:4 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T133636Z +DTSTAMP:20111219T133636Z +UID:dbbc27be-bdea-423f-96f9-704c03ea2409 +SUMMARY:Substitution day for Songkran +DTSTART;VALUE=DATE:20130507 +DTEND;VALUE=DATE:20130508 +DESCRIPTION:##@@T`@@@@@@@@@@@@@ +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T133725Z +DTSTAMP:20111219T133725Z +UID:96aeb521-a6e0-448e-a515-1f866ce538cc +SUMMARY:Substitution for Coronation Day +DTSTART;VALUE=DATE:20130506 +DTEND;VALUE=DATE:20130507 +DESCRIPTION:##F@T`@@@@@@@@@@@@@ +SEQUENCE:3 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134747Z +DTSTAMP:20111219T134747Z +UID:077a8f78-ce37-4abb-9008-e598094c1563 +SUMMARY:Asanha Bucha (?) +DTSTART;VALUE=DATE:20150730 +DTEND;VALUE=DATE:20150731 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nalso Asalha/Asarnha Puja\, Asalabucha\n\n + Thai: วันอาสาฬหบูชา\n\nThe day before Khao Phans + a\; depends on the moon\, which month depends on the Buddhist Lunar calend + ar - very difficult to nail down too far in advance. The full moon the eig + hth lunar month\, called Asanha (or Asarnha\, Asalha\, Asalaha)\n\nCommemo + rates when the Lord Buddha gave his first sermon\, the Dhammacakkappavatta + na Sutta\, to five disciples\, introducing the middle way\, the noble eigh + t-fold path and the four noble truths. Celebrated with candlelight process + ions. +SEQUENCE:2 +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134638Z +DTSTAMP:20111219T134638Z +UID:1a5d4fb2-84df-4c73-b79c-e3dfdeb18870 +SUMMARY:Khao Phansa (Buddhist Lent) (?) +DTSTART;VALUE=DATE:20140712 +DTEND;VALUE=DATE:20140713 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nThe day after Asanha Bucha\, very difficu + lt to nail down too far in advance.\n\nThai: วันเข้าพร + รษา\n\nThe beginning of the Buddhist Lent\, or \"Khao Phansa\". Budd + hist monks remain within the temple grounds and do not venture out for a p + eriod of three months starting from the first day of the waning moon of th + e eighth lunar month (in July) to the fifteenth day of the waxing moon of + the eleventh lunar month (in October). In former times\, this is done to p + revent monks from trampling upon rice paddies when they venture out to rec + eive offerings from the villagers. This period is translated as \"Lent\" b + ecause many lay people choose to be strict about keeping the precepts and + even refrain from eating meat. +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20091009T182520Z +LAST-MODIFIED:20111219T134950Z +DTSTAMP:20111219T134950Z +UID:d06401ca-4025-48c4-9ea3-7fc9c4bb88be +SUMMARY:Awk Phansa (?) +DTSTART;VALUE=DATE:20141027 +DTEND;VALUE=DATE:20141028 +DESCRIPTION:##@@T`@@@@@@@@@@@@@\nor Ok Paansa\nThai: วันปวาร + ณา ออกพรรษา\n\nEnd of \"Buddhist Lent\"\, which began + with Khao Phansa\; depends on the lunar calendar\, difficult to nail down + far in advance. \n\nThe monks prepare to leave their temples the next day + and travel throughout the countryside by shaving their heads and eyebrows\ + , and donning fresh robes\, offered in ceremonies the following day.\n\nAp + parently the \"Naga fireballs\" can be seen coming out of the Mekong River + about this time\, see Wikipedia or\nhttp://www.thaifolk.com/doc/literate/ + payanak/payanak_e.htm\nfor more information.\n +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20111219T135827Z +LAST-MODIFIED:20111219T135908Z +DTSTAMP:20111219T135908Z +UID:0d5c9f1b-b70c-4bd7-bb23-8dce91feda2a +SUMMARY:Substitution for New Year's Day +DTSTART;VALUE=DATE:20120102 +DTEND;VALUE=DATE:20120104 +DESCRIPTION:##@@DF@@@@@@@@@@@@@\n +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20111219T140308Z +LAST-MODIFIED:20111219T140347Z +DTSTAMP:20111219T140347Z +UID:c788dd37-17dc-4df0-aebe-5f10e8f74ef8 +SUMMARY:Substitution day for HM Queen's Birthday +DTSTART;VALUE=DATE:20120813 +DTEND;VALUE=DATE:20120814 +TRANSP:TRANSPARENT +DESCRIPTION:##@@T`@@@@@@@@@@@@@ +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/TurkeyHolidays.ics b/media/caldata/TurkeyHolidays.ics new file mode 100644 index 00000000000..91f4a3e6f36 --- /dev/null +++ b/media/caldata/TurkeyHolidays.ics @@ -0,0 +1,310 @@ +BEGIN:VCALENDAR +METHOD:PUBLISH +VERSION:2.0 +X-WR-CALNAME:Turkish Holidays +PRODID:-//Apple Inc.//iCal 5.0.1//EN +X-APPLE-CALENDAR-COLOR:#E51717 +X-WR-TIMEZONE:Europe/Berlin +CALSCALE:GREGORIAN +BEGIN:VTIMEZONE +TZID:Europe/Istanbul +BEGIN:DAYLIGHT +TZOFFSETFROM:+0200 +RRULE:FREQ=YEARLY;UNTIL=20100328T010000Z;BYMONTH=3;BYDAY=-1SU +DTSTART:20070325T030000 +TZNAME:EET +TZOFFSETTO:+0300 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0300 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU +DTSTART:20071028T040000 +TZNAME:EET +TZOFFSETTO:+0200 +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0200 +DTSTART:20110328T030000 +TZNAME:EET +TZOFFSETTO:+0300 +RDATE:20110328T030000 +END:DAYLIGHT +BEGIN:DAYLIGHT +TZOFFSETFROM:+0200 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU +DTSTART:20120325T030000 +TZNAME:EET +TZOFFSETTO:+0300 +END:DAYLIGHT +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20101224T173904Z +UID:BC84F155-CEF4-44B8-8987-70405FC67E33 +DTEND;VALUE=DATE:20111120 +TRANSP:TRANSPARENT +SUMMARY:Sacrifice Feast +DTSTART;VALUE=DATE:20111116 +DTSTAMP:20101224T173923Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T173229Z +UID:EBF5A09D-0B31-4EBE-BF0E-CE4077173C62 +DTEND;VALUE=DATE:20110424 +TRANSP:TRANSPARENT +SUMMARY:National Sovereignty and Children's Day +DTSTART;VALUE=DATE:20110423 +DTSTAMP:20101224T173241Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T173208Z +UID:EB3C3AD2-AE68-48BC-AB1D-0BDBCFC1C8F3 +DTEND;VALUE=DATE:20110102 +TRANSP:TRANSPARENT +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20110101 +DTSTAMP:20101224T173214Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T173743Z +UID:51A68371-DC88-4589-806D-AFF4D9E0C6A9 +DTEND;VALUE=DATE:20110913 +TRANSP:TRANSPARENT +SUMMARY:Ramazan Feast +DTSTART;VALUE=DATE:20110910 +DTSTAMP:20101224T173812Z +SEQUENCE:6 +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T173330Z +UID:DF108A3C-B951-4030-A2DE-0F38BA90ABC6 +DTEND;VALUE=DATE:20110831 +TRANSP:TRANSPARENT +SUMMARY:Victory Day +DTSTART;VALUE=DATE:20110830 +DTSTAMP:20101224T173336Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T173313Z +UID:F2395AEC-FC6D-4C68-8506-7BE40C80AD30 +DTEND;VALUE=DATE:20110520 +TRANSP:TRANSPARENT +SUMMARY:Commemoration of Atatürk\, Youth and Sports Day +DTSTART;VALUE=DATE:20110519 +DTSTAMP:20101224T173316Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T173300Z +UID:58FA8CB0-D669-4375-A6F8-7CBFB6467359 +DTEND;VALUE=DATE:20110502 +TRANSP:TRANSPARENT +SUMMARY:Labour and Solidarity Day +DTSTART;VALUE=DATE:20110501 +DTSTAMP:20101224T173304Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20101224T173349Z +UID:7989FFF1-B6F8-432B-8994-369DF8AED482 +DTEND;VALUE=DATE:20110930 +TRANSP:TRANSPARENT +SUMMARY:Republic Day +DTSTART;VALUE=DATE:20110929 +DTSTAMP:20101224T173353Z +SEQUENCE:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092546Z +UID:6434abdc-09b0-4633-9747-53730bc5af6b +DTEND;VALUE=DATE:20120822 +TRANSP:TRANSPARENT +SUMMARY:Ramazan Bayramı +LAST-MODIFIED:20111012T092553Z +DTSTAMP:20111012T092553Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120821 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092604Z +UID:586e5207-8787-4421-bc82-099ed337c162 +DTEND;VALUE=DATE:20120831 +TRANSP:TRANSPARENT +SUMMARY:Zafer Bayramı +LAST-MODIFIED:20111012T092622Z +DTSTAMP:20111012T092622Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120830 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092012Z +UID:c27de049-ba1b-478f-9ca8-538bd94ca153 +DTEND;VALUE=DATE:20120424 +TRANSP:TRANSPARENT +SUMMARY:Ulusal Egemenlik ve Çocuk Bayramı +LAST-MODIFIED:20111012T092026Z +DTSTAMP:20111012T092026Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120423 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092816Z +UID:a670c878-2d67-4e04-88cb-708fadfd710d +DTEND;VALUE=DATE:20121029 +TRANSP:TRANSPARENT +SUMMARY:Kurban Bayramı +LAST-MODIFIED:20111012T092821Z +DTSTAMP:20111012T092821Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121028 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092505Z +UID:bc8608bc-26ce-4f97-a996-a5c7d5431a25 +DTEND;VALUE=DATE:20120820 +TRANSP:TRANSPARENT +SUMMARY:Ramazan Bayramı +LAST-MODIFIED:20111012T092533Z +DTSTAMP:20111012T092533Z +DTSTART;VALUE=DATE:20120819 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092918Z +UID:e10f211c-72a5-457b-a0b4-b27d6640ec80 +DTEND;VALUE=DATE:20121030 +TRANSP:TRANSPARENT +SUMMARY:Cumhuriyet Bayramı +LAST-MODIFIED:20111012T092933Z +DTSTAMP:20111012T092933Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121029 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092737Z +UID:ed1237c0-f5d3-409c-ba65-aab26079c0ff +DTEND;VALUE=DATE:20121026 +TRANSP:TRANSPARENT +SUMMARY:Kurban Bayramı +LAST-MODIFIED:20111012T092748Z +DTSTAMP:20111012T092748Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121025 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092804Z +UID:b6b676ac-2855-4c93-adce-22507f51f5cc +DTEND;VALUE=DATE:20121028 +TRANSP:TRANSPARENT +SUMMARY:Kurban Bayramı +LAST-MODIFIED:20111012T092813Z +DTSTAMP:20111012T092813Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121027 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092535Z +UID:7e75a2fc-a1f0-4eac-bf8c-b28c865e5eae +DTEND;VALUE=DATE:20120821 +TRANSP:TRANSPARENT +SUMMARY:Ramazan Bayramı +LAST-MODIFIED:20111012T092543Z +DTSTAMP:20111012T092543Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120820 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092751Z +UID:b415f0da-4e83-4e77-ae0c-d3c60784b1a4 +DTEND;VALUE=DATE:20121027 +TRANSP:TRANSPARENT +SUMMARY:Kurban Bayramı +LAST-MODIFIED:20111012T092759Z +DTSTAMP:20111012T092759Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121026 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092640Z +UID:909be5fd-6472-4cef-8c75-18c42c3cb13f +DTEND;TZID=Europe/Istanbul:20121024T130000 +TRANSP:OPAQUE +SUMMARY:Kurban Bayramı Arefesi +LAST-MODIFIED:20111012T092721Z +DTSTAMP:20111012T092721Z +DTSTART;TZID=Europe/Istanbul:20121024T010000 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092106Z +UID:d831dc30-eac0-4f19-9480-a029e5939557 +DTEND;VALUE=DATE:20120502 +TRANSP:TRANSPARENT +SUMMARY:İşçi Bayramı +LAST-MODIFIED:20111012T092136Z +DTSTAMP:20111012T092136Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120501 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092202Z +UID:c3765269-a816-4adf-a14d-dd53f4254685 +DTEND;VALUE=DATE:20120520 +TRANSP:TRANSPARENT +SUMMARY:Atatürk'ü Anma Gençlik ve Spor Bayramı +LAST-MODIFIED:20111012T092213Z +DTSTAMP:20111012T092213Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120519 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092846Z +UID:0c09b100-f2d0-4e2e-9927-16bd6223f1bc +DTEND;TZID=Europe/Istanbul:20121028T130000 +TRANSP:OPAQUE +SUMMARY:Cumhuriyet Bayramı +LAST-MODIFIED:20111012T092910Z +DTSTAMP:20111012T092910Z +CATEGORIES:Holidays +DTSTART;TZID=Europe/Istanbul:20121028T010000 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T092342Z +UID:f453865b-7908-4971-9dcc-0bc7741da841 +DTEND;TZID=Europe/Istanbul:20120818T130000 +TRANSP:OPAQUE +SUMMARY:Ramazan Bayramı Arefesi +LAST-MODIFIED:20111012T092454Z +DTSTAMP:20111012T092454Z +CATEGORIES:Holidays +DTSTART;TZID=Europe/Istanbul:20120818T010000 +SEQUENCE:0 +END:VEVENT +BEGIN:VEVENT +CREATED:20111012T091921Z +UID:5092bcc9-92bd-47dd-85dc-e2491abb108d +DTEND;VALUE=DATE:20120102 +TRANSP:TRANSPARENT +SUMMARY:Yılbaşı +LAST-MODIFIED:20111012T091946Z +DTSTAMP:20111012T091946Z +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120101 +SEQUENCE:0 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/UKHolidays.ics b/media/caldata/UKHolidays.ics new file mode 100644 index 00000000000..f042ec7df54 --- /dev/null +++ b/media/caldata/UKHolidays.ics @@ -0,0 +1,817 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Europe/London +X-LIC-LOCATION:Europe/London +BEGIN:DAYLIGHT +TZOFFSETFROM:+0000 +TZOFFSETTO:+0100 +TZNAME:BST +DTSTART:19700329T010000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0100 +TZOFFSETTO:+0000 +TZNAME:GMT +DTSTART:19701025T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20100314T111710Z +LAST-MODIFIED:20100314T111852Z +DTSTAMP:20100314T111852Z +UID:98efb272-51b8-4ff0-be93-e9aefc142a4a +SUMMARY:St. Patrick's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100317 +DTEND;VALUE=DATE:20100318 +LOCATION:NI only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112321Z +LAST-MODIFIED:20100314T112410Z +DTSTAMP:20100314T112410Z +UID:56edcf7c-78bd-4087-b678-18f7df681ec7 +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112418Z +LAST-MODIFIED:20100314T112927Z +DTSTAMP:20100314T112927Z +UID:1f38f591-7d1f-42d5-affa-ae09113d74af +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100405 +DTEND;VALUE=DATE:20100406 +LOCATION:UK except Scotland +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113006Z +LAST-MODIFIED:20100314T113125Z +DTSTAMP:20100314T113125Z +UID:0c454da5-dd7f-416c-805f-5a81120b86ef +SUMMARY:Spring Bank Holiday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100531 +DTEND;VALUE=DATE:20100601 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113136Z +LAST-MODIFIED:20100314T113422Z +DTSTAMP:20100314T113422Z +UID:64bab945-367b-4897-b1d7-fa3187846b3a +SUMMARY:Battle of the Boyne (Orangemen's Day) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100712 +DTEND;VALUE=DATE:20100713 +LOCATION:NI only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T114649Z +LAST-MODIFIED:20100314T114819Z +DTSTAMP:20100314T114819Z +UID:c9679c14-2a41-4666-99ec-80f56323212d +SUMMARY:Christmas Day (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101227 +DTEND;VALUE=DATE:20101228 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T111351Z +LAST-MODIFIED:20100314T114931Z +DTSTAMP:20100314T114931Z +UID:7fd3a9e8-fea2-4024-be81-c0627a2f0474 +SUMMARY:2nd January (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100104 +DTEND;VALUE=DATE:20100105 +LOCATION:Scotland only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T115037Z +LAST-MODIFIED:20100314T115102Z +DTSTAMP:20100314T115102Z +UID:e3df2c34-2420-43dd-8f97-9baf457cc035 +SUMMARY:Boxing Day (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101228 +DTEND;VALUE=DATE:20101229 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T111351Z +LAST-MODIFIED:20100314T115238Z +DTSTAMP:20100314T115238Z +UID:60014203-1ec8-49bc-9581-8542975f9da6 +SUMMARY:2nd January (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110104 +DTEND;VALUE=DATE:20110105 +LOCATION:Scotland only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T115247Z +LAST-MODIFIED:20100314T115310Z +DTSTAMP:20100314T115310Z +UID:31ca7f2a-0016-4440-bad4-edc9d820016c +SUMMARY:New Year's Day (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110103 +DTEND;VALUE=DATE:20110104 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T111710Z +LAST-MODIFIED:20100314T115426Z +DTSTAMP:20100314T115426Z +UID:6ef58990-68b5-44af-9c4c-b5b9f84e0216 +SUMMARY:St. Patrick's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110317 +DTEND;VALUE=DATE:20110318 +LOCATION:NI only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112321Z +LAST-MODIFIED:20100314T115835Z +DTSTAMP:20100314T115835Z +UID:171ecbaa-389a-4352-88d5-c8a4db895a00 +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112418Z +LAST-MODIFIED:20100314T115854Z +DTSTAMP:20100314T115854Z +UID:885f8273-6bcb-49c8-a97c-6210ff03fce3 +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110425 +DTEND;VALUE=DATE:20110426 +LOCATION:UK except Scotland +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113006Z +LAST-MODIFIED:20100314T115929Z +DTSTAMP:20100314T115929Z +UID:cf0cdff2-d9b8-43c7-8083-64cafc1a12f3 +SUMMARY:Spring Bank Holiday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110530 +DTEND;VALUE=DATE:20110531 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113136Z +LAST-MODIFIED:20100314T120003Z +DTSTAMP:20100314T120003Z +UID:9871837b-a6d5-406a-9348-9632aa62c698 +SUMMARY:Battle of the Boyne (Orangemen's Day) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110712 +DTEND;VALUE=DATE:20110713 +LOCATION:NI only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T114649Z +LAST-MODIFIED:20100314T120330Z +DTSTAMP:20100314T120330Z +UID:9d90d494-8ce7-486a-9730-5ce3fe41c4f4 +SUMMARY:Christmas Day (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20111226 +DTEND;VALUE=DATE:20111227 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T115037Z +LAST-MODIFIED:20100314T120356Z +DTSTAMP:20100314T120356Z +UID:39ba0a61-47b7-450e-b110-6ee89b7537fc +SUMMARY:Boxing Day (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20111227 +DTEND;VALUE=DATE:20111228 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T115247Z +LAST-MODIFIED:20100314T120520Z +DTSTAMP:20100314T120520Z +UID:2a123bf4-8dba-4c71-8120-d3daf4240bc7 +SUMMARY:New Year's Day (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120102 +DTEND;VALUE=DATE:20120103 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T111351Z +LAST-MODIFIED:20100314T120543Z +DTSTAMP:20100314T120543Z +UID:2e0a0d3e-79e7-4e77-9945-1d30a38f17bf +SUMMARY:2nd January (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120103 +DTEND;VALUE=DATE:20120104 +LOCATION:Scotland only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112321Z +LAST-MODIFIED:20100314T120618Z +DTSTAMP:20100314T120618Z +UID:76d68131-2a7c-427b-9c30-ec9748402441 +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112418Z +LAST-MODIFIED:20100314T120643Z +DTSTAMP:20100314T120643Z +UID:291210b9-172e-4f03-a394-ea9b9cbb8e1c +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +LOCATION:UK except Scotland +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113136Z +LAST-MODIFIED:20100314T121121Z +DTSTAMP:20100314T121121Z +UID:c5233682-bf9b-4bf4-90a7-15608dde94de +SUMMARY:Battle of the Boyne (Orangemen's Day) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120712 +DTEND;VALUE=DATE:20120713 +LOCATION:NI only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113136Z +LAST-MODIFIED:20100314T121442Z +DTSTAMP:20100314T121442Z +UID:fd55eb6e-c5e4-4d05-88fc-2112733bd69b +SUMMARY:Battle of the Boyne (Orangemen's Day) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130712 +DTEND;VALUE=DATE:20130713 +LOCATION:NI only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113006Z +LAST-MODIFIED:20100314T121548Z +DTSTAMP:20100314T121548Z +UID:89571a0d-e73f-4ff9-b1dd-e3c8c74ed825 +SUMMARY:Spring Bank Holiday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130527 +DTEND;VALUE=DATE:20130528 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112418Z +LAST-MODIFIED:20100314T121707Z +DTSTAMP:20100314T121707Z +UID:440202d9-0efc-4682-bb97-4bed47ade443 +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130401 +DTEND;VALUE=DATE:20130402 +LOCATION:UK except Scotland +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112321Z +LAST-MODIFIED:20100314T121737Z +DTSTAMP:20100314T121737Z +UID:581ab57e-703d-4526-a7c3-b2f2e8592606 +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T111710Z +LAST-MODIFIED:20100314T121820Z +DTSTAMP:20100314T121820Z +UID:a845b654-2f52-41d1-a00b-2504e78ded79 +SUMMARY:St. Patrick's Day (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130318 +DTEND;VALUE=DATE:20130319 +LOCATION:NI only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T111710Z +LAST-MODIFIED:20100314T121847Z +DTSTAMP:20100314T121847Z +UID:5c8d9854-f5ff-487d-8b64-559b474fbb00 +SUMMARY:St. Patrick's Day (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120319 +DTEND;VALUE=DATE:20120320 +LOCATION:NI only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T111351Z +LAST-MODIFIED:20100314T121917Z +DTSTAMP:20100314T121917Z +UID:8fefaa8d-41db-4e86-9c7c-66036796b4de +SUMMARY:2nd January +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20130102 +DTEND;VALUE=DATE:20130103 +LOCATION:Scotland only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113006Z +LAST-MODIFIED:20100701T095827Z +DTSTAMP:20100701T095827Z +UID:d37d6e3f-62a1-4f8a-864c-92c905d68361 +SUMMARY:Spring Bank Holiday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120604 +DTEND;VALUE=DATE:20120605 +LOCATION:All UK +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113006Z +LAST-MODIFIED:20100701T095836Z +DTSTAMP:20100701T095836Z +UID:abf82622-7211-48a6-8f16-c67140db9d26 +SUMMARY:Queen's Diamond Jubilee +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20120605 +DTEND;VALUE=DATE:20120606 +LOCATION:All UK +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20110208T155129Z +LAST-MODIFIED:20120130T143103Z +DTSTAMP:20120130T143103Z +UID:d4b9c33c-9a47-4738-8b9a-eef26eb83dcf +SUMMARY:Royal Wedding +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20110429 +DTEND;VALUE=DATE:20110430 +TRANSP:TRANSPARENT +SEQUENCE:2 +CLASS:PUBLIC +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112321Z +LAST-MODIFIED:20120130T144621Z +DTSTAMP:20120130T144621Z +UID:f4f09035-8579-4e6b-8699-85a26de9e4e0 +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112321Z +LAST-MODIFIED:20120130T144643Z +DTSTAMP:20120130T144643Z +UID:3de77700-fd7c-4656-80bd-6fea8f5e1413 +SUMMARY:Good Friday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112418Z +LAST-MODIFIED:20120130T144707Z +DTSTAMP:20120130T144707Z +UID:59363c33-442c-44af-a65c-017251d0de14 +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140421 +DTEND;VALUE=DATE:20140422 +LOCATION:UK except Scotland +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112418Z +LAST-MODIFIED:20120130T144715Z +DTSTAMP:20120130T144715Z +UID:7652629f-111c-4046-9b6d-5d8065445e4d +SUMMARY:Easter Monday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20150406 +DTEND;VALUE=DATE:20150407 +LOCATION:UK except Scotland +TRANSP:TRANSPARENT +SEQUENCE:2 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113006Z +LAST-MODIFIED:20120130T144804Z +DTSTAMP:20120130T144804Z +UID:0a2d2e84-7453-47fb-8359-b4aa6d2262a6 +SUMMARY:Spring Bank Holiday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140526 +DTEND;VALUE=DATE:20140527 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113006Z +LAST-MODIFIED:20120130T144817Z +DTSTAMP:20120130T144817Z +UID:ed0e1452-f27f-40ff-8ef0-e16e0c79352f +SUMMARY:Spring Bank Holiday +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20150525 +DTEND;VALUE=DATE:20150526 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T115037Z +LAST-MODIFIED:20120130T145018Z +DTSTAMP:20120130T145018Z +UID:c48a042e-c0ac-47b1-aabc-f41f97a5c779 +SUMMARY:Boxing Day (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20151228 +DTEND;VALUE=DATE:20151229 +LOCATION:All UK +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T111351Z +LAST-MODIFIED:20120130T145321Z +DTSTAMP:20120130T145321Z +UID:91338d53-8a83-4495-a921-bf5d738964f6 +SUMMARY:2nd January +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140102 +DTEND;VALUE=DATE:20140103 +LOCATION:Scotland only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T111351Z +LAST-MODIFIED:20120130T145331Z +DTSTAMP:20120130T145331Z +UID:573267ea-256e-48a2-bbdb-f2a38a0862c7 +SUMMARY:2nd January +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20150102 +DTEND;VALUE=DATE:20150103 +LOCATION:Scotland only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T111710Z +LAST-MODIFIED:20120130T150203Z +DTSTAMP:20120130T150203Z +UID:bdd6f49c-b714-44c6-ad44-c98f6ad936b7 +SUMMARY:St. Patrick's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140317 +DTEND;VALUE=DATE:20140318 +LOCATION:NI only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T111710Z +LAST-MODIFIED:20120130T150211Z +DTSTAMP:20120130T150211Z +UID:dd462963-5ff9-4569-b80a-a7edbb50b424 +SUMMARY:St. Patrick's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20150317 +DTEND;VALUE=DATE:20150318 +LOCATION:NI only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113136Z +LAST-MODIFIED:20120130T150551Z +DTSTAMP:20120130T150551Z +UID:4a39e138-ce74-4757-8e8a-982bed9096fa +SUMMARY:Battle of the Boyne (Orangemen's Day) (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20140714 +DTEND;VALUE=DATE:20140715 +LOCATION:NI only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113136Z +LAST-MODIFIED:20120130T150613Z +DTSTAMP:20120130T150613Z +UID:6483728b-9960-42d7-bf46-096cde16d935 +SUMMARY:Battle of the Boyne (Orangemen's Day) (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20150713 +DTEND;VALUE=DATE:20150714 +LOCATION:NI only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113910Z +LAST-MODIFIED:20120130T151259Z +DTSTAMP:20120130T151259Z +UID:f53e51fc-0692-4013-8bd0-632c870c5a09 +SUMMARY:St. Andrew's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20151130 +DTEND;VALUE=DATE:20151201 +LOCATION:Scotland only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113910Z +LAST-MODIFIED:20120130T151316Z +DTSTAMP:20120130T151316Z +UID:b4247148-3d76-4296-b25e-0ddd440f8770 +SUMMARY:St. Andrew's Day (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20141201 +DTEND;VALUE=DATE:20141202 +LOCATION:Scotland only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113910Z +LAST-MODIFIED:20120130T151331Z +DTSTAMP:20120130T151331Z +UID:6009943f-1c39-4983-963e-e1a462cd0532 +SUMMARY:St. Andrew's Day (substitute) +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20131202 +DTEND;VALUE=DATE:20131203 +LOCATION:Scotland only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113910Z +LAST-MODIFIED:20120130T151353Z +DTSTAMP:20120130T151353Z +UID:1b213b72-dec1-4e30-b0ab-cf9566b4b878 +SUMMARY:St. Andrew's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20121130 +DTEND;VALUE=DATE:20121201 +LOCATION:Scotland only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113910Z +LAST-MODIFIED:20120130T151409Z +DTSTAMP:20120130T151409Z +UID:70a84a88-6e14-4ff0-9935-aef4d116b2d8 +SUMMARY:St. Andrew's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20111130 +DTEND;VALUE=DATE:20111201 +LOCATION:Scotland only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113910Z +LAST-MODIFIED:20120130T151426Z +DTSTAMP:20120130T151426Z +UID:c12027db-0e8e-4a80-8fb1-09cd2213716e +SUMMARY:St. Andrew's Day +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101130 +DTEND;VALUE=DATE:20101201 +LOCATION:Scotland only +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112000Z +LAST-MODIFIED:20100314T112235Z +DTSTAMP:20100314T112235Z +UID:46d8880a-8c95-4585-87a9-1724f8a051b5 +SUMMARY:BST begins +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +DTSTART;TZID=Europe/London:20100328T020000 +DTEND;TZID=Europe/London:20100328T020000 +LOCATION:All UK +DESCRIPTION:Clocks move forward 1 hour at 01:00 +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T112439Z +LAST-MODIFIED:20100314T112822Z +DTSTAMP:20100314T112822Z +UID:21626542-636f-43d7-8fa9-bad05bb82dca +SUMMARY:Early May Bank Holiday +RRULE:FREQ=YEARLY;BYDAY=1MO;BYMONTH=5 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100503 +DTEND;VALUE=DATE:20100504 +LOCATION:All UK +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113458Z +LAST-MODIFIED:20100314T113537Z +DTSTAMP:20100314T113537Z +UID:5dac6a63-e519-4ad1-a687-2fd5fccb4656 +SUMMARY:Summer Bank Holiday +RRULE:FREQ=YEARLY;BYDAY=1MO;BYMONTH=8 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100802 +DTEND;VALUE=DATE:20100803 +LOCATION:Scotland only +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T113623Z +LAST-MODIFIED:20100314T113827Z +DTSTAMP:20100314T113827Z +UID:3d37b115-f0fa-4456-98c9-3b18cfffb47d +SUMMARY:Summer Bank Holiday +RRULE:FREQ=YEARLY;BYDAY=-1MO;BYMONTH=8 +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100830 +DTEND;VALUE=DATE:20100831 +LOCATION:UK except Scotland +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T114306Z +LAST-MODIFIED:20100314T115011Z +DTSTAMP:20100314T115011Z +UID:436a5833-73a8-4b78-87f3-ad0db20b018f +SUMMARY:Christmas Day +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101225 +DTEND;VALUE=DATE:20101226 +LOCATION:All UK +DESCRIPTION:If this is a Sat or Sun\, following Monday is substitute holid + ay. +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T114434Z +LAST-MODIFIED:20100314T115034Z +DTSTAMP:20100314T115034Z +UID:07180b7b-fed1-4a59-bff0-619056033b1a +SUMMARY:Boxing Day +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20101226 +DTEND;VALUE=DATE:20101227 +LOCATION:All UK +DESCRIPTION:If this is a Sat\, following Monday is substitute holiday. If + this is a Sun or Mon\, following Tuesday is substitute holiday. +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T105710Z +LAST-MODIFIED:20100314T115118Z +DTSTAMP:20100314T115118Z +UID:4694f46a-aef0-49a0-a8eb-44ab6531e0d9 +SUMMARY:New Year's Day +RRULE:FREQ=YEARLY +CATEGORIES:Public Holiday +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +DESCRIPTION:If this is a Sat or Sun\, following Monday is substitute holid + ay. +TRANSP:TRANSPARENT +LOCATION:All UK +SEQUENCE:1 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T115442Z +LAST-MODIFIED:20100314T115724Z +DTSTAMP:20100314T115724Z +UID:8eb163f3-6d42-494e-9e7c-747619cf965f +SUMMARY:BST ends +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +DTSTART;TZID=Europe/London:20101031T020000 +DTEND;TZID=Europe/London:20101031T030000 +LOCATION:All UK +TRANSP:OPAQUE +DESCRIPTION:Clocks move back 1 hour at 03:00 +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T122046Z +LAST-MODIFIED:20100314T122139Z +DTSTAMP:20100314T122139Z +UID:a08053d8-530b-4025-8edf-81c88d05fe84 +SUMMARY:St. David's Day +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20100301 +DTEND;VALUE=DATE:20100302 +LOCATION:Wales +DESCRIPTION:Not official holiday +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100314T122242Z +LAST-MODIFIED:20100314T122442Z +DTSTAMP:20100314T122442Z +UID:b58227e2-7f9d-4571-afa5-0ae93192d10e +SUMMARY:St. George's Day +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20100423 +DTEND;VALUE=DATE:20100424 +LOCATION:England +DESCRIPTION:Not an official holiday +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/USHolidays.ics b/media/caldata/USHolidays.ics new file mode 100644 index 00000000000..3ddf429c59a --- /dev/null +++ b/media/caldata/USHolidays.ics @@ -0,0 +1,3323 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20080827T223540Z +LAST-MODIFIED:20090611T212419Z +UID:b8388cae-2125-4614-9801-5fec40a07408 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000423 +DTEND;VALUE=DATE:20000424 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T223613Z +LAST-MODIFIED:20090611T212419Z +UID:27198947-51d4-475c-9116-6dd475ab4729 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20010415 +DTEND;VALUE=DATE:20010416 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T223633Z +LAST-MODIFIED:20090611T212419Z +UID:adebaeec-b7da-4d1e-baff-73e54a5bbe5d +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20020331 +DTEND;VALUE=DATE:20020401 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T223650Z +LAST-MODIFIED:20090611T212419Z +UID:3378f42f-00f3-42be-888e-8368d5e140b2 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20030420 +DTEND;VALUE=DATE:20030421 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T223704Z +LAST-MODIFIED:20090611T212419Z +UID:18eae8ac-65e1-4cc0-8bf3-0c287882fbd9 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20040411 +DTEND;VALUE=DATE:20040412 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T223726Z +LAST-MODIFIED:20090611T212419Z +UID:d0a68adf-3eca-4585-a7a7-853b5d5b03e4 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20050327 +DTEND;VALUE=DATE:20050328 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T223741Z +LAST-MODIFIED:20090611T212419Z +UID:daf76dce-468b-4f99-8d42-01487f8fafa9 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20060416 +DTEND;VALUE=DATE:20060417 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T223757Z +LAST-MODIFIED:20090611T212419Z +UID:fa7a1db3-1c5f-472d-9ee4-988d0d0287eb +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20070408 +DTEND;VALUE=DATE:20070409 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T223818Z +LAST-MODIFIED:20090611T212419Z +UID:69230f5f-f2d2-428d-a90c-a7e1c7deea5e +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090412 +DTEND;VALUE=DATE:20090413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T223828Z +LAST-MODIFIED:20090611T212419Z +UID:0bc494ff-69b5-4dca-8699-c4fe5ea25a13 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100404 +DTEND;VALUE=DATE:20100405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T223934Z +LAST-MODIFIED:20090611T212419Z +UID:44a937c0-f0d8-4458-947c-8a33db7217ef +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T223946Z +LAST-MODIFIED:20090611T212419Z +UID:734e6d03-ab3c-4693-8c81-f73e3b576c27 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130331 +DTEND;VALUE=DATE:20130401 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T224000Z +LAST-MODIFIED:20090611T212419Z +UID:c4d6a9e0-a5d6-41d4-9297-97e4fdcc85a5 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140420 +DTEND;VALUE=DATE:20140421 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T224012Z +LAST-MODIFIED:20090611T212419Z +UID:b2cab02a-a164-44a4-af66-ccb1b3c253b9 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150405 +DTEND;VALUE=DATE:20150406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T224028Z +LAST-MODIFIED:20090611T212419Z +UID:763686f7-3ec4-4dfc-9a33-e4c0bae652fa +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160327 +DTEND;VALUE=DATE:20160328 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T224043Z +LAST-MODIFIED:20090611T212419Z +UID:31edb1e8-a064-4a8b-a041-eecd22a4d419 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170416 +DTEND;VALUE=DATE:20170417 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T224101Z +LAST-MODIFIED:20090611T212419Z +UID:d869e442-0b4d-40c4-b34c-6780afce8c46 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180401 +DTEND;VALUE=DATE:20180402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T224121Z +LAST-MODIFIED:20090611T212419Z +UID:135738b2-b8d5-4e65-bf7c-736e22c6b8b1 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190421 +DTEND;VALUE=DATE:20190422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T224133Z +LAST-MODIFIED:20090611T212419Z +UID:7606494f-0019-46e6-9d47-ab9498569e5a +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200412 +DTEND;VALUE=DATE:20200413 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212419Z +UID:c5c154cc-1dd1-11b2-85c7-e3de2bfad30f +SUMMARY:Easter Sunday +STATUS:CONFIRMED +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20080323 +DTEND;VALUE=DATE:20080324 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T024422Z +LAST-MODIFIED:20090611T212419Z +UID:5e604c83-cacc-46fe-bc40-b4f50e2412e7 +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000308 +DTEND;VALUE=DATE:20000309 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T024533Z +LAST-MODIFIED:20090611T212419Z +UID:847021ce-03b6-4f2d-abe5-2ba869066b5d +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20010228 +DTEND;VALUE=DATE:20010301 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T024626Z +LAST-MODIFIED:20090611T212419Z +UID:0e313bdb-171d-40dd-9ddb-1dfb4a777bb5 +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20020213 +DTEND;VALUE=DATE:20020214 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T024822Z +LAST-MODIFIED:20090611T212419Z +UID:1577ed41-e8c5-45f9-83e5-86079fe2510b +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20030305 +DTEND;VALUE=DATE:20030306 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T024847Z +LAST-MODIFIED:20090611T212419Z +UID:fcbfe576-82e9-4f68-b1ad-5366ff6968ac +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20040225 +DTEND;VALUE=DATE:20040226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T024911Z +LAST-MODIFIED:20090611T212419Z +UID:a403894c-bb2c-4d02-8dca-91c359a54bfe +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20050209 +DTEND;VALUE=DATE:20050210 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T024924Z +LAST-MODIFIED:20090611T212419Z +UID:dcc3c2f4-d214-49d8-bb3e-f13c6acf3295 +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20060301 +DTEND;VALUE=DATE:20060302 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T024939Z +LAST-MODIFIED:20090611T212419Z +UID:b81a6c71-9a3d-49a5-b695-8ac5f1bb013b +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20070221 +DTEND;VALUE=DATE:20070222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T024951Z +LAST-MODIFIED:20090611T212419Z +UID:40090c1d-8669-4d7a-b63a-288006cfac65 +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20080206 +DTEND;VALUE=DATE:20080207 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025003Z +LAST-MODIFIED:20090611T212419Z +UID:609ce29c-966c-40b4-81c4-8ccac74e98dd +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090225 +DTEND;VALUE=DATE:20090226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025017Z +LAST-MODIFIED:20090611T212419Z +UID:f96c0bf5-1cf2-4d2e-9955-eb89f4e645d3 +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100217 +DTEND;VALUE=DATE:20100218 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025046Z +LAST-MODIFIED:20090611T212419Z +UID:a0b949a8-2a75-4617-a687-1e7dffc098f5 +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120222 +DTEND;VALUE=DATE:20120223 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025058Z +LAST-MODIFIED:20090611T212419Z +UID:8caed879-6158-477c-9901-e1531dc855e8 +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130213 +DTEND;VALUE=DATE:20130214 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025131Z +LAST-MODIFIED:20090611T212419Z +UID:69e06d74-9acc-4667-8eb0-7c33299d82c0 +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140305 +DTEND;VALUE=DATE:20140306 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025146Z +LAST-MODIFIED:20090611T212419Z +UID:a05d7fa6-4c65-4465-a32a-1b5c2d1189aa +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150218 +DTEND;VALUE=DATE:20150219 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025202Z +LAST-MODIFIED:20090611T212419Z +UID:ce5fe814-c4b3-4aab-8298-86f54e34ffe4 +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160210 +DTEND;VALUE=DATE:20160211 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025220Z +LAST-MODIFIED:20090611T212419Z +UID:746c3ee3-3439-41bd-9ee1-7944812a8a29 +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170301 +DTEND;VALUE=DATE:20170302 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025235Z +LAST-MODIFIED:20090611T212419Z +UID:6eff84ea-6763-46d3-9c64-b847376f3e34 +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180214 +DTEND;VALUE=DATE:20180215 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025254Z +LAST-MODIFIED:20090611T212419Z +UID:e5d798cf-474f-42c3-83b8-0d1186c2c3ad +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190306 +DTEND;VALUE=DATE:20190307 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025309Z +LAST-MODIFIED:20090611T212419Z +UID:9d17488f-12b8-474b-8790-d22e6786735e +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200226 +DTEND;VALUE=DATE:20200227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025421Z +LAST-MODIFIED:20090611T212419Z +UID:1abe0e7a-fa55-42b8-b6cc-bf037ab5c7f4 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000416 +DTEND;VALUE=DATE:20000417 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025457Z +LAST-MODIFIED:20090611T212419Z +UID:ff8dd4a7-0593-4fb6-bcdc-7cd8db41a451 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20010408 +DTEND;VALUE=DATE:20010409 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025510Z +LAST-MODIFIED:20090611T212419Z +UID:e403c114-aa09-4dcd-b8cf-b342be833477 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20020324 +DTEND;VALUE=DATE:20020325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025522Z +LAST-MODIFIED:20090611T212419Z +UID:8ebc922a-a220-456f-937b-a943e5df123b +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20030413 +DTEND;VALUE=DATE:20030414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025549Z +LAST-MODIFIED:20090611T212419Z +UID:e03d10c1-ce57-426f-9a08-cd49c25920a9 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20040404 +DTEND;VALUE=DATE:20040405 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025630Z +LAST-MODIFIED:20090611T212419Z +UID:8ed86db1-ea90-453a-a1cd-36878811826e +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20070401 +DTEND;VALUE=DATE:20070402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025646Z +LAST-MODIFIED:20090611T212419Z +UID:b45150e2-da4d-477b-aace-b255186d89b1 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20080316 +DTEND;VALUE=DATE:20080317 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025820Z +LAST-MODIFIED:20090611T212419Z +UID:96b2e223-1b4f-44e1-80a3-8b57ab7d2f12 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090405 +DTEND;VALUE=DATE:20090406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025837Z +LAST-MODIFIED:20090611T212419Z +UID:863b0192-787d-4b4b-8550-c7e2db820b0a +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100328 +DTEND;VALUE=DATE:20100329 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025908Z +LAST-MODIFIED:20090611T212419Z +UID:ac159587-0a97-4f98-b11c-2193fe61265a +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120401 +DTEND;VALUE=DATE:20120402 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025922Z +LAST-MODIFIED:20090611T212419Z +UID:4dcb5128-64b8-488c-b9ec-6b8c6184c0e9 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130324 +DTEND;VALUE=DATE:20130325 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025939Z +LAST-MODIFIED:20090611T212419Z +UID:0b3db3ec-fa4c-4e71-bf0b-251fde472ef6 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140413 +DTEND;VALUE=DATE:20140414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025956Z +LAST-MODIFIED:20090611T212419Z +UID:b3ac2edc-39ac-4d09-b45b-9a380ecbb63e +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150329 +DTEND;VALUE=DATE:20150330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030027Z +LAST-MODIFIED:20090611T212419Z +UID:7af33c57-7711-4581-86e5-221ac5c59ecd +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160320 +DTEND;VALUE=DATE:20160321 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030042Z +LAST-MODIFIED:20090611T212419Z +UID:b372c357-0224-493e-a95c-50f69a9ee376 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170409 +DTEND;VALUE=DATE:20170410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030101Z +LAST-MODIFIED:20090611T212419Z +UID:2ed9175e-e119-4569-9371-390d70acc0fa +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180325 +DTEND;VALUE=DATE:20180326 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030124Z +LAST-MODIFIED:20090611T212419Z +UID:334646f6-5fef-43a9-83bc-d2dd88c9ebe6 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190414 +DTEND;VALUE=DATE:20190415 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030150Z +LAST-MODIFIED:20090611T212419Z +UID:7f9c6e82-610a-4485-b5fd-dde7f0dba4b8 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200405 +DTEND;VALUE=DATE:20200406 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030214Z +LAST-MODIFIED:20090611T212419Z +UID:af35fdb4-b67e-4b43-887f-c23f58bf9847 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000421 +DTEND;VALUE=DATE:20000422 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030234Z +LAST-MODIFIED:20090611T212419Z +UID:116e335b-4cae-40b1-abf5-4e2f7121a4c0 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20010413 +DTEND;VALUE=DATE:20010414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030250Z +LAST-MODIFIED:20090611T212420Z +UID:7700d32c-2728-439f-b3a2-e458ba1052d7 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20020329 +DTEND;VALUE=DATE:20020330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030320Z +LAST-MODIFIED:20090611T212420Z +UID:2710e06f-c089-40d4-945a-9f8fe125a59c +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20040409 +DTEND;VALUE=DATE:20040410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030337Z +LAST-MODIFIED:20090611T212420Z +UID:1dfafc7f-17b6-4a8d-b1ef-492adb9bd9dc +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20050325 +DTEND;VALUE=DATE:20050326 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030352Z +LAST-MODIFIED:20090611T212420Z +UID:8371454e-8dda-4667-81e5-3680dc8cc542 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20060414 +DTEND;VALUE=DATE:20060415 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030406Z +LAST-MODIFIED:20090611T212420Z +UID:93b64832-1179-4db9-a8e5-4d3375156294 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20070406 +DTEND;VALUE=DATE:20070407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030423Z +LAST-MODIFIED:20090611T212420Z +UID:ee7bc7d8-d5a8-43f1-b817-54b5458429fa +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20080321 +DTEND;VALUE=DATE:20080322 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030436Z +LAST-MODIFIED:20090611T212420Z +UID:98652109-bdda-4451-afd3-9955bfe918c7 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030446Z +LAST-MODIFIED:20090611T212420Z +UID:7241d18c-6e4a-4a15-b262-a0415d05e5c0 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100402 +DTEND;VALUE=DATE:20100403 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030513Z +LAST-MODIFIED:20090611T212420Z +UID:be42b228-382d-4add-be00-c36fdb2508c7 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030526Z +LAST-MODIFIED:20090611T212420Z +UID:db8d6551-0b2d-44c1-8c21-ba96030a445e +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130329 +DTEND;VALUE=DATE:20130330 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030543Z +LAST-MODIFIED:20090611T212420Z +UID:c14a8a90-a69d-44fe-9e34-a28feed1a1c0 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140418 +DTEND;VALUE=DATE:20140419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030602Z +LAST-MODIFIED:20090611T212420Z +UID:269d06c4-2eed-45de-af47-6668b7e58902 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150403 +DTEND;VALUE=DATE:20150404 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030616Z +LAST-MODIFIED:20090611T212420Z +UID:8e3f7823-a340-4b6e-8b7c-10a539f5db8f +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160325 +DTEND;VALUE=DATE:20160326 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030630Z +LAST-MODIFIED:20090611T212420Z +UID:a6d17884-5c3e-4f4b-9383-7b83814ada9d +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170414 +DTEND;VALUE=DATE:20170415 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030648Z +LAST-MODIFIED:20090611T212420Z +UID:19fb2499-97ae-457f-8d41-6ec76292c77f +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180330 +DTEND;VALUE=DATE:20180331 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030704Z +LAST-MODIFIED:20090611T212420Z +UID:0a125549-300d-4bd9-af20-3fc28935946e +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190419 +DTEND;VALUE=DATE:20190420 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030718Z +LAST-MODIFIED:20090611T212420Z +UID:50de218e-013d-4739-b8d4-f30f74a57168 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200410 +DTEND;VALUE=DATE:20200411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030737Z +LAST-MODIFIED:20090611T212420Z +UID:af9df15d-af91-4e19-b7d2-e80bf8dfc378 +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000611 +DTEND;VALUE=DATE:20000612 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030855Z +LAST-MODIFIED:20090611T212420Z +UID:b5eb3eae-875a-4b50-a10c-b8a487907eac +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20010603 +DTEND;VALUE=DATE:20010604 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030907Z +LAST-MODIFIED:20090611T212420Z +UID:c5a9ee90-d177-4ca5-917e-245791f15312 +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20020519 +DTEND;VALUE=DATE:20020520 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030942Z +LAST-MODIFIED:20090611T212420Z +UID:9bbe68fb-4d23-4d27-9171-26177baf984d +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20030608 +DTEND;VALUE=DATE:20030609 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030959Z +LAST-MODIFIED:20090611T212420Z +UID:c4f15038-8df9-475b-bc85-9948f97cddc7 +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20040530 +DTEND;VALUE=DATE:20040531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031013Z +LAST-MODIFIED:20090611T212420Z +UID:d54dd907-ba90-4607-88ee-b15d7b79736f +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20050515 +DTEND;VALUE=DATE:20050516 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031027Z +LAST-MODIFIED:20090611T212420Z +UID:810562a0-2467-4a43-860d-db69cbf92fdf +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20060604 +DTEND;VALUE=DATE:20060605 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031042Z +LAST-MODIFIED:20090611T212420Z +UID:8212e80d-6efa-4e79-bcd0-44fc831a1ecc +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20070527 +DTEND;VALUE=DATE:20070528 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031101Z +LAST-MODIFIED:20090611T212420Z +UID:da7b884d-0d0f-48d3-97f7-d13b21cea817 +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20080511 +DTEND;VALUE=DATE:20080512 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031112Z +LAST-MODIFIED:20090611T212420Z +UID:719c1eff-d26b-4316-86b5-464a4d24bf98 +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090531 +DTEND;VALUE=DATE:20090601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031123Z +LAST-MODIFIED:20090611T212420Z +UID:a61992d7-0747-46db-aa4c-49ddef65de55 +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100523 +DTEND;VALUE=DATE:20100524 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031210Z +LAST-MODIFIED:20090611T212420Z +UID:09673ae2-e44c-4cac-90de-deaf49b6b875 +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120527 +DTEND;VALUE=DATE:20120528 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031224Z +LAST-MODIFIED:20090611T212420Z +UID:1919a739-59f5-46c2-8cb0-b86726b1e72d +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130519 +DTEND;VALUE=DATE:20130520 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031235Z +LAST-MODIFIED:20090611T212420Z +UID:0a4fae5e-4698-427f-bbdf-b6c08fd96053 +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140608 +DTEND;VALUE=DATE:20140609 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031253Z +LAST-MODIFIED:20090611T212420Z +UID:3d5c4095-4429-4abe-8a7a-4bbf5236eaa4 +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150524 +DTEND;VALUE=DATE:20150525 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031311Z +LAST-MODIFIED:20090611T212420Z +UID:1177a296-0723-4fcb-8d35-e79b1c021330 +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160515 +DTEND;VALUE=DATE:20160516 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031323Z +LAST-MODIFIED:20090611T212420Z +UID:452c678d-0b42-4a89-a347-a0b8e12c4fd6 +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170604 +DTEND;VALUE=DATE:20170605 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031341Z +LAST-MODIFIED:20090611T212420Z +UID:01fec43b-b371-4f56-97cb-ef454132a74a +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180520 +DTEND;VALUE=DATE:20180521 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031401Z +LAST-MODIFIED:20090611T212420Z +UID:697b8004-261c-4c0b-a15e-06c1af95ab9b +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190609 +DTEND;VALUE=DATE:20190610 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031412Z +LAST-MODIFIED:20090611T212420Z +UID:ac723797-16b2-4fd9-9d5e-2f55cc90dc22 +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200531 +DTEND;VALUE=DATE:20200601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031600Z +LAST-MODIFIED:20090611T212420Z +UID:bec77dd4-49e7-46b5-9ea4-7409cc5369e1 +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000618 +DTEND;VALUE=DATE:20000619 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031731Z +LAST-MODIFIED:20090611T212420Z +UID:f395a03d-27e2-4214-88c2-20c638c7f99d +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20010610 +DTEND;VALUE=DATE:20010611 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031843Z +LAST-MODIFIED:20090611T212420Z +UID:fb37469f-ba53-4fec-9c65-fb22c59470a8 +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20020526 +DTEND;VALUE=DATE:20020527 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030305Z +LAST-MODIFIED:20090611T212420Z +UID:a2eb4297-f3a3-414b-b53a-e7cdaad20ac9 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20030418 +DTEND;VALUE=DATE:20030419 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T032035Z +LAST-MODIFIED:20090611T212420Z +UID:078f774d-1113-4bad-b7e5-6f4c48100fc4 +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20030615 +DTEND;VALUE=DATE:20030616 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T032128Z +LAST-MODIFIED:20090611T212420Z +UID:c2df343c-bf38-4e86-9129-010bd55de1b1 +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20040606 +DTEND;VALUE=DATE:20040607 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025605Z +LAST-MODIFIED:20090611T212420Z +UID:e4891762-ad19-402e-8195-828fb3386d22 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20050320 +DTEND;VALUE=DATE:20050321 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T032246Z +LAST-MODIFIED:20090611T212420Z +UID:f14c5274-2112-4470-a3f8-f8a5b4eb8199 +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20050522 +DTEND;VALUE=DATE:20050523 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025617Z +LAST-MODIFIED:20090611T212420Z +UID:33a3f736-bd5b-4a87-b983-612e01ea4dbe +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20060409 +DTEND;VALUE=DATE:20060410 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T032352Z +LAST-MODIFIED:20090611T212421Z +UID:43eeeab3-5836-41cc-82b4-d91d922871c4 +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20060611 +DTEND;VALUE=DATE:20060612 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T032435Z +LAST-MODIFIED:20090611T212421Z +UID:72234667-e98f-4532-b4da-a2cdd2e56ce4 +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20070603 +DTEND;VALUE=DATE:20070604 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T032512Z +LAST-MODIFIED:20090611T212421Z +UID:a289a44f-5eb2-4f14-b458-e55dcbc00e9d +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20080518 +DTEND;VALUE=DATE:20080519 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T032617Z +LAST-MODIFIED:20090611T212421Z +UID:b5d1e103-7807-4049-ac80-df13ab666b5e +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090607 +DTEND;VALUE=DATE:20090608 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T032717Z +LAST-MODIFIED:20090611T212421Z +UID:59ef3b5c-a65f-4a5f-81ec-25d201285670 +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100530 +DTEND;VALUE=DATE:20100531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T033236Z +LAST-MODIFIED:20090611T212421Z +UID:f931f051-1dec-4a6c-b78b-615474143fd1 +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120603 +DTEND;VALUE=DATE:20120604 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T033315Z +LAST-MODIFIED:20090611T212421Z +UID:838f906b-f3c8-4b94-9cdb-ef698d0222b8 +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130526 +DTEND;VALUE=DATE:20130527 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T033425Z +LAST-MODIFIED:20090611T212421Z +UID:de98efc2-cd59-41fd-af0d-d2dcb58b23fe +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140615 +DTEND;VALUE=DATE:20140616 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T033511Z +LAST-MODIFIED:20090611T212421Z +UID:139b7040-5cfd-4db4-abf2-8251ae17368e +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150531 +DTEND;VALUE=DATE:20150601 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T033614Z +LAST-MODIFIED:20090611T212421Z +UID:78d6d38a-a0ae-4b75-bcbb-0276d69a430e +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160522 +DTEND;VALUE=DATE:20160523 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T033655Z +LAST-MODIFIED:20090611T212421Z +UID:83608056-f721-4564-88ed-3cc5d12b01fb +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170611 +DTEND;VALUE=DATE:20170612 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T033759Z +LAST-MODIFIED:20090611T212421Z +UID:cc92b242-3a24-471c-b1be-b8918fb8b6de +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180527 +DTEND;VALUE=DATE:20180528 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T033848Z +LAST-MODIFIED:20090611T212421Z +UID:006195b6-8021-4814-9635-f9f5bffa7a36 +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190616 +DTEND;VALUE=DATE:20190617 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T033920Z +LAST-MODIFIED:20090611T212421Z +UID:b60896ca-b1eb-4ec1-a9cd-67c7403c6335 +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200607 +DTEND;VALUE=DATE:20200608 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T224733Z +LAST-MODIFIED:20090611T212421Z +UID:d41971bd-5c3f-4293-a154-a210d39b6667 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000601 +DTEND;VALUE=DATE:20000602 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T224836Z +LAST-MODIFIED:20090611T212421Z +UID:e6166189-6b80-44b8-9902-60e58f0cbe0c +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20010524 +DTEND;VALUE=DATE:20010525 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T224858Z +LAST-MODIFIED:20090611T212421Z +UID:7f5a197b-441e-40e3-a31a-1c0cb5ffed19 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20020509 +DTEND;VALUE=DATE:20020510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T224916Z +LAST-MODIFIED:20090611T212421Z +UID:192d84d7-7a76-4d98-a335-919203fa28e1 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20030529 +DTEND;VALUE=DATE:20030530 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T224929Z +LAST-MODIFIED:20090611T212421Z +UID:52cb0477-1dab-4881-bf56-64099c934453 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20040520 +DTEND;VALUE=DATE:20040521 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T224944Z +LAST-MODIFIED:20090611T212421Z +UID:17c27008-29e2-4050-adda-5757c94fb673 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20050505 +DTEND;VALUE=DATE:20050506 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T224959Z +LAST-MODIFIED:20090611T212421Z +UID:03f7a269-b863-4fb9-a02f-135803fa2972 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20060525 +DTEND;VALUE=DATE:20060526 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225014Z +LAST-MODIFIED:20090611T212421Z +UID:fc9f7abd-c3fc-42b2-bd87-7528470f77f3 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20070517 +DTEND;VALUE=DATE:20070518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225025Z +LAST-MODIFIED:20090611T212421Z +UID:c1649dbc-9ad2-4257-a687-7dc706b08ea2 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20080501 +DTEND;VALUE=DATE:20080502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225039Z +LAST-MODIFIED:20090611T212421Z +UID:82c49077-6f81-42ed-84e1-53ebe66f981d +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090521 +DTEND;VALUE=DATE:20090522 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225051Z +LAST-MODIFIED:20090611T212421Z +UID:5203b99c-f304-4d25-ba4e-1e776237186d +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100513 +DTEND;VALUE=DATE:20100514 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225111Z +LAST-MODIFIED:20090611T212421Z +UID:18e27f82-2d27-42fa-b04c-315c6fadcd9d +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120517 +DTEND;VALUE=DATE:20120518 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225120Z +LAST-MODIFIED:20090611T212421Z +UID:7726ca21-1f4d-4cc5-ade3-8c384f5d72a5 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130509 +DTEND;VALUE=DATE:20130510 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225133Z +LAST-MODIFIED:20090611T212421Z +UID:6d025a60-733c-4af4-a2ee-f1b904090666 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140529 +DTEND;VALUE=DATE:20140530 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225144Z +LAST-MODIFIED:20090611T212421Z +UID:cd092661-b37e-4ec9-b798-8f957c4278b4 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150514 +DTEND;VALUE=DATE:20150515 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225154Z +LAST-MODIFIED:20090611T212421Z +UID:ed1358ef-c818-4af3-9f8e-4d965d800a21 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160505 +DTEND;VALUE=DATE:20160506 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225204Z +LAST-MODIFIED:20090611T212421Z +UID:7c8351e3-e3fd-4c0b-a60c-f558aa31df55 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170525 +DTEND;VALUE=DATE:20170526 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225214Z +LAST-MODIFIED:20090611T212421Z +UID:db037aff-17bf-430b-b094-52e99879ba4e +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180510 +DTEND;VALUE=DATE:20180511 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225224Z +LAST-MODIFIED:20090611T212421Z +UID:dddeea06-c165-474c-96aa-6c1b705c6b0a +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190530 +DTEND;VALUE=DATE:20190531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225238Z +LAST-MODIFIED:20090611T212421Z +UID:09a3f71c-83df-4649-b7d1-4792ae2fb523 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200521 +DTEND;VALUE=DATE:20200522 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025033Z +LAST-MODIFIED:20100911T002511Z +DTSTAMP:20100911T002511Z +UID:a02038e9-a094-4744-b09d-d7d2ef96bd28 +SUMMARY:Ash Wednesday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110309 +DTEND;VALUE=DATE:20110310 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T025855Z +LAST-MODIFIED:20100911T002525Z +DTSTAMP:20100911T002525Z +UID:844a3d56-4fab-4df1-92d3-8f4385d8efc9 +SUMMARY:Palm Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110417 +DTEND;VALUE=DATE:20110418 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T030501Z +LAST-MODIFIED:20100911T002555Z +DTSTAMP:20100911T002555Z +UID:6e05d4a1-8b7f-446d-a7fc-566b6837c927 +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110422 +DTEND;VALUE=DATE:20110423 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T223849Z +LAST-MODIFIED:20100911T002632Z +DTSTAMP:20100911T002632Z +UID:fa0cda04-283e-4b53-95b0-c9903a3f85e2 +SUMMARY:Easter Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110424 +DTEND;VALUE=DATE:20110425 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20081125T225101Z +LAST-MODIFIED:20100911T002740Z +DTSTAMP:20100911T002740Z +UID:5250764e-c50c-44ba-b3d6-32ee24ee49e1 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110602 +DTEND;VALUE=DATE:20110603 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T031143Z +LAST-MODIFIED:20100911T002756Z +DTSTAMP:20100911T002756Z +UID:5e614422-74fe-47d6-bf89-dca8c4d7df3a +SUMMARY:Pentecost +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110612 +DTEND;VALUE=DATE:20110613 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T033004Z +LAST-MODIFIED:20100911T002812Z +DTSTAMP:20100911T002812Z +UID:001f88a2-a3b4-4dff-a577-c9860d01dcbd +SUMMARY:Trinity Sunday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110619 +DTEND;VALUE=DATE:20110620 +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:9f3df592-1dd1-11b2-8b51-a8c49a575f97 +SUMMARY:President's Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYDAY=3MO;BYMONTH=2 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000221 +DTEND;VALUE=DATE:20000222 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:e0d4c156-1dd1-11b2-b6a4-dac750e0163e +SUMMARY:Mother's Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=5 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000514 +DTEND;VALUE=DATE:20000515 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:c2783248-1dd1-11b2-affa-ee50c39d8083 +SUMMARY:Armed Forces Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYDAY=3SA;BYMONTH=5 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000520 +DTEND;VALUE=DATE:20000521 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:d9706fa6-1dd1-11b2-a349-e97241bd4740 +SUMMARY:Memorial Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYDAY=-1MO;BYMONTH=5 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000529 +DTEND;VALUE=DATE:20000530 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:46e6845c-1dd2-11b2-bd3d-d8755a1a171f +SUMMARY:Parents' Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYDAY=4SU;BYMONTH=7 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000723 +DTEND;VALUE=DATE:20000724 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:0726ea42-1dd2-11b2-9fe6-dda3d063fb50 +SUMMARY:Labor Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYDAY=1MO;BYMONTH=9 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000904 +DTEND;VALUE=DATE:20000905 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:7d4402f4-1dd2-11b2-9790-b6193cfa4349 +SUMMARY:Halloween +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001031 +DTEND;VALUE=DATE:20001101 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:2c7ba10c-1dd2-11b2-b0b7-96f89f288199 +SUMMARY:Veteran's Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001111 +DTEND;VALUE=DATE:20001112 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:4299a358-1dd2-11b2-a228-d062222b6f88 +SUMMARY:Thanksgiving Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYDAY=4TH;BYMONTH=11 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001123 +DTEND;VALUE=DATE:20001124 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:54f392fa-1dd2-11b2-8ecb-9ae0a7fcebd1 +SUMMARY:Christmas Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001225 +DTEND;VALUE=DATE:20001226 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:b1f194fc-1dd1-11b2-a973-d219c68b95c4 +SUMMARY:New Year's Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000101 +DTEND;VALUE=DATE:20000102 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:a2cbca9c-1dd1-11b2-83e2-abab36f0506d +SUMMARY:New Year's Eve +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001231 +DTEND;VALUE=DATE:20010101 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212421Z +UID:13f83ed2-1dd2-11b2-a0de-ee8645423959 +SUMMARY:Daylight Savings Time ends +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20071104 +DTEND;VALUE=DATE:20071105 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:f669a974-1dd1-11b2-9fac-f44d91c657af +SUMMARY:Independence Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000704 +DTEND;VALUE=DATE:20000705 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:cb90487e-1dd1-11b2-9e06-d1a12cc963dc +SUMMARY:Father's Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYDAY=3SU;BYMONTH=6 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000618 +DTEND;VALUE=DATE:20000619 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:e8022726-1dd1-11b2-aae6-9f73f16c0f01 +SUMMARY:Flag Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000614 +DTEND;VALUE=DATE:20000615 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:f1561106-1dd1-11b2-955f-ba14e5210f45 +SUMMARY:Earth Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000422 +DTEND;VALUE=DATE:20000423 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:e46086c2-1dd1-11b2-8a16-a2c99f1c525a +SUMMARY:Tax Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000415 +DTEND;VALUE=DATE:20000416 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:c981b858-1dd1-11b2-b69b-94d05f8bda66 +SUMMARY:April Fool's Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000401 +DTEND;VALUE=DATE:20000402 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:bd6cfe4c-1dd1-11b2-b3dc-ebaab9302c26 +SUMMARY:St. Patrick's Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000317 +DTEND;VALUE=DATE:20000318 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:aff9f3c8-1dd1-11b2-8593-c63469762eb1 +SUMMARY:George Washington's Birthday (actual) +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000222 +DTEND;VALUE=DATE:20000223 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:790b86e2-1dd2-11b2-9cb9-c905fa35c6f9 +SUMMARY:Valentine's Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000214 +DTEND;VALUE=DATE:20000215 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:4d5b843e-1dd2-11b2-a6c9-8ea942124d1b +SUMMARY:Abraham Lincoln's Birthday +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000212 +DTEND;VALUE=DATE:20000213 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:0c771532-1dd2-11b2-8dd9-8638db3aef63 +SUMMARY:Groundhog's Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000202 +DTEND;VALUE=DATE:20000203 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T220831Z +LAST-MODIFIED:20090611T212422Z +UID:8a05b5d3-6b97-4fe1-b26e-b258a073c5e0 +SUMMARY:United Nations Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001024 +DTEND;VALUE=DATE:20001025 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:e462881a-20b8-4b70-ab3c-cf38016d3398 +SUMMARY:Daylight Savings Time begins +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20070311 +DTEND;VALUE=DATE:20070312 +CLASS:PUBLIC +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T221253Z +LAST-MODIFIED:20090611T212422Z +UID:1eb525d5-26cd-43f0-819e-acc3003b35ad +SUMMARY:Daylight Savings Time begins +RRULE:FREQ=YEARLY;UNTIL=20060402T000000;BYDAY=1SU;BYMONTH=4 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000402 +DTEND;VALUE=DATE:20000403 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T221447Z +LAST-MODIFIED:20090611T212422Z +UID:05504c5b-5984-4eb0-a60a-c6d5cf083d82 +SUMMARY:Daylight Savings Time ends +RRULE:FREQ=YEARLY;UNTIL=20061029T000000;BYDAY=-1SU;BYMONTH=10 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001029 +DTEND;VALUE=DATE:20001030 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T214410Z +LAST-MODIFIED:20090611T212422Z +UID:088031d1-abea-47ed-978d-39c6319e8bf2 +SUMMARY:Inauguration Day +RRULE:FREQ=YEARLY;INTERVAL=4 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20010120 +DTEND;VALUE=DATE:20010121 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T164802Z +LAST-MODIFIED:20090611T212422Z +UID:d3c521e1-ffab-414c-8cfa-99e76758d8c8 +SUMMARY:Constitution Day\, Citizenship Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000917 +DTEND;VALUE=DATE:20000918 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T165106Z +LAST-MODIFIED:20090611T212422Z +UID:a44b8b6e-7ae4-4120-b7ad-14e91691be2a +SUMMARY:National Day of Prayer +RRULE:FREQ=YEARLY;BYDAY=1TH;BYMONTH=5 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000504 +DTEND;VALUE=DATE:20000505 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080828T165839Z +LAST-MODIFIED:20090611T212422Z +UID:e20f1b5c-8ac4-4bea-acf4-b4f2bfe95329 +SUMMARY:Arbor Day +RRULE:FREQ=YEARLY;BYDAY=-1FR;BYMONTH=4 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000428 +DTEND;VALUE=DATE:20000429 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080830T011903Z +LAST-MODIFIED:20090611T212422Z +UID:feae8f6c-bdce-46c8-aa45-e2d1c0fb9cb0 +SUMMARY:US General Election +RRULE:FREQ=YEARLY;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8;BYMONTH=11 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001107 +DTEND;VALUE=DATE:20001108 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080830T021222Z +LAST-MODIFIED:20090611T212422Z +UID:60b5ca68-d0a6-4634-9254-16cc300bb12e +SUMMARY:Black Friday +RRULE:FREQ=YEARLY;BYDAY=FR;BYMONTHDAY=23,24,25,26,27,28,29;BYMONTH=11 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001124 +DTEND;VALUE=DATE:20001125 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:dd9bfdf4-1dd1-11b2-ab6e-8da990a14639 +SUMMARY:Martin Luther King Jr.'s Day +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYDAY=3MO;BYMONTH=1 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000117 +DTEND;VALUE=DATE:20000118 +CLASS:PUBLIC +TRANSP:TRANSPARENT +DESCRIPTION:Traditionally on January 15th.\nObserved on 3rd Monday of Janu + ary. +END:VEVENT +BEGIN:VEVENT +CREATED:20070315T171800Z +LAST-MODIFIED:20090611T212422Z +UID:175691b0-1dd2-11b2-9596-e9837a6245dd +SUMMARY:Columbus Day (observed) +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;BYDAY=2MO;BYMONTH=10 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001009 +DTEND;VALUE=DATE:20001010 +CLASS:PUBLIC +TRANSP:TRANSPARENT +DESCRIPTION:Traditionally on October 12th.\nObserved on 2nd Monday of Octo + ber. +END:VEVENT +BEGIN:VEVENT +CREATED:20080902T140125Z +LAST-MODIFIED:20090611T212422Z +UID:22896130-ef70-46ca-a071-a15f3a746b04 +SUMMARY:Administrative Professionals Day +RRULE:FREQ=YEARLY;BYDAY=WE;BYMONTHDAY=21,22,23,24,25,26,27;BYMONTH=4 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000426 +DTEND;VALUE=DATE:20000427 +DESCRIPTION:Traditionally called the Secretaries Day\,\nthis day recognize + s the work of secretaries\,\nadministrative assistants\, receptionists\,\n + and other administrative support professionals.\n\nThe last full week of A + pril is recognized as\nthe Administrative Professionals Week\,\nand the We + dnesday of the week is observed\nas the Administrative Professionals Day. + +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T212909Z +LAST-MODIFIED:20090611T212422Z +UID:a0486410-f87b-4e09-939a-77121b58b535 +SUMMARY:Christmas Eve +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001224 +DTEND;VALUE=DATE:20001225 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081126T134531Z +LAST-MODIFIED:20090611T212422Z +UID:8c320d1a-fc56-4282-962c-4c67763a4c58 +SUMMARY:Grandparents Day +RRULE:FREQ=YEARLY;BYDAY=SU;BYMONTHDAY=7,8,9,10,11,12,13;BYMONTH=9 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000910 +DTEND;VALUE=DATE:20000911 +DESCRIPTION:First Sunday following Labor Day +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T214111Z +LAST-MODIFIED:20090611T212422Z +UID:efab1245-c19c-4693-8391-eb5f40cc3743 +SUMMARY:Epiphany +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000106 +DTEND;VALUE=DATE:20000107 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080827T220608Z +LAST-MODIFIED:20090611T212422Z +UID:37f09326-5105-4092-8535-1b4cad9812ac +SUMMARY:Reformation Day +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001029 +DTEND;VALUE=DATE:20001030 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20080829T034030Z +LAST-MODIFIED:20090611T212422Z +UID:af808fce-8a77-4d15-ad63-c096737303d2 +SUMMARY:All Saints Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001101 +DTEND;VALUE=DATE:20001102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081118T135517Z +LAST-MODIFIED:20090611T212422Z +UID:6c6e277f-d344-4807-8d91-bea1689eac7c +SUMMARY:Immaculate Conception +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001208 +DTEND;VALUE=DATE:20001209 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081118T141534Z +LAST-MODIFIED:20090611T212422Z +UID:25db674e-6d6a-41ee-848b-2b79552f071a +SUMMARY:Assumption Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000815 +DTEND;VALUE=DATE:20000816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20081126T151107Z +LAST-MODIFIED:20090611T212422Z +UID:c3a78810-ea6a-48bc-8178-56fe3fe61e23 +SUMMARY:Kwanzaa +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:19661226 +DTEND;VALUE=DATE:19670102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20091128T184942Z +LAST-MODIFIED:20091128T185038Z +UID:cebdafa9-6b2a-4869-a751-5554b6da2e45 +SUMMARY:Pearl Harbor Remembrance Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20001207 +DTEND;VALUE=DATE:20001208 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100911T004419Z +LAST-MODIFIED:20100911T004455Z +DTSTAMP:20100911T004455Z +UID:1ee4d840-eb70-44f0-8f2a-db778c373ac5 +SUMMARY:Patriot Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20010911 +DTEND;VALUE=DATE:20010912 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100911T004608Z +LAST-MODIFIED:20100911T004647Z +DTSTAMP:20100911T004647Z +UID:e8c8b4f6-1e0a-4bbb-b077-0fcce9077e1d +SUMMARY:Women's Equality Day +RRULE:FREQ=YEARLY +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20000826 +DTEND;VALUE=DATE:20000827 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225155Z +LAST-MODIFIED:20100625T230014Z +DTSTAMP:20100625T230014Z +UID:4c53aa44-f014-4334-8e39-5b2ff090445a +SUMMARY:New Year's Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100101 +DTEND;VALUE=DATE:20100102 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225222Z +LAST-MODIFIED:20100625T230022Z +DTSTAMP:20100625T230022Z +UID:5705d0cf-01b6-4511-9f36-0fc9739b21fc +SUMMARY:Birthday of Martin Luther King\, Jr. (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100118 +DTEND;VALUE=DATE:20100119 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225249Z +LAST-MODIFIED:20100625T230034Z +DTSTAMP:20100625T230034Z +UID:26751c39-998f-4d1c-bc77-454f21d94fd1 +SUMMARY:Washington's Birthday (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100215 +DTEND;VALUE=DATE:20100216 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225312Z +LAST-MODIFIED:20100625T230050Z +DTSTAMP:20100625T230050Z +UID:91cde8ea-009b-4a07-b835-7d33b1b7e4e1 +SUMMARY:Memorial Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100531 +DTEND;VALUE=DATE:20100601 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225342Z +LAST-MODIFIED:20100625T230108Z +DTSTAMP:20100625T230108Z +UID:63368446-395a-42ca-8108-f1bb7ee5a851 +SUMMARY:Independence Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100705 +DTEND;VALUE=DATE:20100706 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225406Z +LAST-MODIFIED:20100625T230123Z +DTSTAMP:20100625T230123Z +UID:6cbc2eb9-d818-40f0-8e91-7c7ca5e43e0f +SUMMARY:Labor Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20100906 +DTEND;VALUE=DATE:20100907 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225422Z +LAST-MODIFIED:20100625T230138Z +DTSTAMP:20100625T230138Z +UID:26ab3aae-1f30-4eea-9a30-35aab72d9e67 +SUMMARY:Columbus Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101011 +DTEND;VALUE=DATE:20101012 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225442Z +LAST-MODIFIED:20100625T230149Z +DTSTAMP:20100625T230149Z +UID:c08f4482-8591-4940-8838-80381b0cf69b +SUMMARY:Veterans Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101111 +DTEND;VALUE=DATE:20101112 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225456Z +LAST-MODIFIED:20100625T230155Z +DTSTAMP:20100625T230155Z +UID:7262eefe-a1b1-4370-8262-c2f900150c0f +SUMMARY:Thanksgiving Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101125 +DTEND;VALUE=DATE:20101126 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225512Z +LAST-MODIFIED:20100625T230205Z +DTSTAMP:20100625T230205Z +UID:431576fe-17ac-48ea-941e-08d25998c7c2 +SUMMARY:Christmas Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101224 +DTEND;VALUE=DATE:20101225 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225649Z +LAST-MODIFIED:20100625T230212Z +DTSTAMP:20100625T230212Z +UID:ff38e9bf-6a04-4140-8e14-17f77bfabbdf +SUMMARY:New Year's Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20101231 +DTEND;VALUE=DATE:20110101 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225710Z +LAST-MODIFIED:20100625T230225Z +DTSTAMP:20100625T230225Z +UID:c670bd38-0675-4746-8eca-cd06d5d0fb46 +SUMMARY:Birthday of Martin Luther King\, Jr. (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110117 +DTEND;VALUE=DATE:20110118 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225733Z +LAST-MODIFIED:20100625T230234Z +DTSTAMP:20100625T230234Z +UID:486ce67b-2a71-44ae-87d1-ec8d000a9584 +SUMMARY:Washington's Birthday (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110221 +DTEND;VALUE=DATE:20110222 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225753Z +LAST-MODIFIED:20100625T230259Z +DTSTAMP:20100625T230259Z +UID:aca86965-d147-47d7-8e88-3990efe7188a +SUMMARY:Memorial Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110530 +DTEND;VALUE=DATE:20110531 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225812Z +LAST-MODIFIED:20100625T230311Z +DTSTAMP:20100625T230311Z +UID:40f9466a-95bd-40fd-a0a5-df005fbee438 +SUMMARY:Independence Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110704 +DTEND;VALUE=DATE:20110705 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225826Z +LAST-MODIFIED:20100625T230320Z +DTSTAMP:20100625T230320Z +UID:86a93453-eb85-4836-8e35-f3d7403eb02c +SUMMARY:Labor Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20110905 +DTEND;VALUE=DATE:20110906 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225845Z +LAST-MODIFIED:20100625T230329Z +DTSTAMP:20100625T230329Z +UID:8aed5642-2ab6-4d47-ae3e-d6bda178c530 +SUMMARY:Columbus Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20111010 +DTEND;VALUE=DATE:20111011 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225901Z +LAST-MODIFIED:20100625T230342Z +DTSTAMP:20100625T230342Z +UID:095e361c-db8c-4936-80ff-6ac356e3a8af +SUMMARY:Veterans Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20111111 +DTEND;VALUE=DATE:20111112 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225917Z +LAST-MODIFIED:20100625T230349Z +DTSTAMP:20100625T230349Z +UID:859d4dfe-1eae-4b3b-9d42-438d500ca455 +SUMMARY:Thanksgiving Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20111124 +DTEND;VALUE=DATE:20111125 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T225933Z +LAST-MODIFIED:20100625T230400Z +DTSTAMP:20100625T230400Z +UID:06a9583b-01fb-4ed4-926a-ac995e5dac6d +SUMMARY:Christmas Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20111226 +DTEND;VALUE=DATE:20111227 +TRANSP:TRANSPARENT +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230426Z +LAST-MODIFIED:20100625T230432Z +DTSTAMP:20100625T230432Z +UID:ec58e9d8-27fa-4f3a-8cb2-8073b860982f +SUMMARY:New Year's Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120102 +DTEND;VALUE=DATE:20120103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230442Z +LAST-MODIFIED:20100625T230451Z +DTSTAMP:20100625T230451Z +UID:e3e1f541-ad97-4683-ab18-13c9d8620130 +SUMMARY:Birthday of Martin Luther King\, Jr. (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120116 +DTEND;VALUE=DATE:20120117 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230503Z +LAST-MODIFIED:20100625T230510Z +DTSTAMP:20100625T230510Z +UID:b2f98535-66c6-423f-846d-7be00b63d315 +SUMMARY:Washington's Birthday (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120220 +DTEND;VALUE=DATE:20120221 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230528Z +LAST-MODIFIED:20100625T230537Z +DTSTAMP:20100625T230537Z +UID:6b1d9233-40b7-406b-a98c-769b2681d9ad +SUMMARY:Memorial Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120528 +DTEND;VALUE=DATE:20120529 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230550Z +LAST-MODIFIED:20100625T230558Z +DTSTAMP:20100625T230558Z +UID:9c6685c4-cf34-406d-a52d-457432cd2e72 +SUMMARY:Independence Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120704 +DTEND;VALUE=DATE:20120705 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230608Z +LAST-MODIFIED:20100625T230616Z +DTSTAMP:20100625T230616Z +UID:64e8f36b-30ca-4a68-bb68-b6be1bac33e7 +SUMMARY:Labor Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20120903 +DTEND;VALUE=DATE:20120904 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230625Z +LAST-MODIFIED:20100625T230633Z +DTSTAMP:20100625T230633Z +UID:0feaf063-8cc3-4dcc-80a4-3006dd3ee395 +SUMMARY:Columbus Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121008 +DTEND;VALUE=DATE:20121009 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230640Z +LAST-MODIFIED:20100625T230646Z +DTSTAMP:20100625T230646Z +UID:a3ab943c-efa6-403a-94d6-266351d1bb9a +SUMMARY:Veterans Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121112 +DTEND;VALUE=DATE:20121113 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230652Z +LAST-MODIFIED:20100625T230659Z +DTSTAMP:20100625T230659Z +UID:e29b795e-0f37-4ea4-84e6-0f277cf5a8ba +SUMMARY:Thanksgiving Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121122 +DTEND;VALUE=DATE:20121123 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230711Z +LAST-MODIFIED:20100625T230719Z +DTSTAMP:20100625T230719Z +UID:9986c0ee-983a-4538-ad4a-4688fe5b5636 +SUMMARY:Christmas Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230745Z +LAST-MODIFIED:20100625T230752Z +DTSTAMP:20100625T230752Z +UID:0b3180aa-65a8-4732-bb4c-36cd3c79a650 +SUMMARY:New Year's Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130101 +DTEND;VALUE=DATE:20130102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230800Z +LAST-MODIFIED:20100625T230806Z +DTSTAMP:20100625T230806Z +UID:19f0cc25-bec1-4e84-915b-a70bb532fcfb +SUMMARY:Birthday of Martin Luther King\, Jr. (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130121 +DTEND;VALUE=DATE:20130122 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230816Z +LAST-MODIFIED:20100625T230822Z +DTSTAMP:20100625T230822Z +UID:db225df5-a20c-4889-9511-bcf81acad6e4 +SUMMARY:Washington's Birthday (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130218 +DTEND;VALUE=DATE:20130219 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230833Z +LAST-MODIFIED:20100625T230839Z +DTSTAMP:20100625T230839Z +UID:9b12b9be-0f16-42ff-97a5-53a67cc46f2c +SUMMARY:Memorial Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130527 +DTEND;VALUE=DATE:20130528 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230849Z +LAST-MODIFIED:20100625T230856Z +DTSTAMP:20100625T230856Z +UID:9b6b81e1-e4f8-490b-9062-24726dbf27f2 +SUMMARY:Independence Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130704 +DTEND;VALUE=DATE:20130705 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230905Z +LAST-MODIFIED:20100625T230910Z +DTSTAMP:20100625T230910Z +UID:5b722439-56b8-4f26-a21d-c2c99898bf47 +SUMMARY:Labor Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20130902 +DTEND;VALUE=DATE:20130903 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230922Z +LAST-MODIFIED:20100625T230927Z +DTSTAMP:20100625T230927Z +UID:e44229c1-89cd-4c96-8094-c09a56f1a028 +SUMMARY:Columbus Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131014 +DTEND;VALUE=DATE:20131015 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230935Z +LAST-MODIFIED:20100625T230941Z +DTSTAMP:20100625T230941Z +UID:fea08c25-1cbc-4d7b-ab30-87bf5b87c4e0 +SUMMARY:Veterans Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131111 +DTEND;VALUE=DATE:20131112 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T230955Z +LAST-MODIFIED:20100625T231001Z +DTSTAMP:20100625T231001Z +UID:12eb5737-4e7f-4278-9f8f-36202257d434 +SUMMARY:Thanksgiving Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131128 +DTEND;VALUE=DATE:20131129 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T231008Z +LAST-MODIFIED:20100625T231016Z +DTSTAMP:20100625T231016Z +UID:a2acacd4-e541-4334-b5ad-e2e215cf32fc +SUMMARY:Christmas Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20131225 +DTEND;VALUE=DATE:20131226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232203Z +LAST-MODIFIED:20100625T232211Z +DTSTAMP:20100625T232211Z +UID:784620c2-befa-40af-9aa2-5232ceebf80f +SUMMARY:New Year's Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140101 +DTEND;VALUE=DATE:20140102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232227Z +LAST-MODIFIED:20100625T232233Z +DTSTAMP:20100625T232233Z +UID:7d90511b-c99b-4937-af69-1da4781923c8 +SUMMARY:Birthday of Martin Luther King\, Jr. (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140120 +DTEND;VALUE=DATE:20140121 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232242Z +LAST-MODIFIED:20100625T232249Z +DTSTAMP:20100625T232249Z +UID:760534b9-7b1c-41b1-8797-6dd6583d7b98 +SUMMARY:Washington's Birthday (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140217 +DTEND;VALUE=DATE:20140218 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232259Z +LAST-MODIFIED:20100625T232307Z +DTSTAMP:20100625T232307Z +UID:3a66f3a1-bce5-4dcf-a815-2d50057ba758 +SUMMARY:Memorial Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140526 +DTEND;VALUE=DATE:20140527 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232324Z +LAST-MODIFIED:20100625T232333Z +DTSTAMP:20100625T232333Z +UID:8dec8541-cada-48c8-bae1-7b64e5bd96f1 +SUMMARY:Independence Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140704 +DTEND;VALUE=DATE:20140705 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232344Z +LAST-MODIFIED:20100625T232352Z +DTSTAMP:20100625T232352Z +UID:f1a94187-1b1a-46eb-9eba-9f2e03efff7e +SUMMARY:Labor Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20140901 +DTEND;VALUE=DATE:20140902 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232358Z +LAST-MODIFIED:20100625T232405Z +DTSTAMP:20100625T232405Z +UID:aa078715-e039-42e8-bfca-ceb787c3eceb +SUMMARY:Columbus Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20141013 +DTEND;VALUE=DATE:20141014 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232416Z +LAST-MODIFIED:20100625T232424Z +DTSTAMP:20100625T232424Z +UID:5a0ec2c2-3b70-4440-928d-d3c435205736 +SUMMARY:Veterans Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20141111 +DTEND;VALUE=DATE:20141112 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232432Z +LAST-MODIFIED:20100625T232438Z +DTSTAMP:20100625T232438Z +UID:ec969553-a7c6-4ad1-bbf9-061bd48b91dc +SUMMARY:Thanksgiving Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20141127 +DTEND;VALUE=DATE:20141128 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232449Z +LAST-MODIFIED:20100625T232456Z +DTSTAMP:20100625T232456Z +UID:f01417f3-4570-4711-9abc-bf20a01cea0c +SUMMARY:Christmas Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20141225 +DTEND;VALUE=DATE:20141226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232517Z +LAST-MODIFIED:20100625T232523Z +DTSTAMP:20100625T232523Z +UID:f37395e6-1056-4175-a457-399cdab4eda2 +SUMMARY:New Year's Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150101 +DTEND;VALUE=DATE:20150102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232529Z +LAST-MODIFIED:20100625T232536Z +DTSTAMP:20100625T232536Z +UID:3f07705a-a1fb-4915-8dbd-4e1513ade06b +SUMMARY:Birthday of Martin Luther King\, Jr. (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150119 +DTEND;VALUE=DATE:20150120 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232547Z +LAST-MODIFIED:20100625T232553Z +DTSTAMP:20100625T232553Z +UID:2dff572d-fc88-4925-8817-960c9f913974 +SUMMARY:Washington's Birthday (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150216 +DTEND;VALUE=DATE:20150217 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232604Z +LAST-MODIFIED:20100625T232611Z +DTSTAMP:20100625T232611Z +UID:62aa4902-1113-4e89-ab08-9a344ff2709f +SUMMARY:Memorial Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150525 +DTEND;VALUE=DATE:20150526 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232621Z +LAST-MODIFIED:20100625T232628Z +DTSTAMP:20100625T232628Z +UID:ed53ac56-5535-4877-acf1-84919821da44 +SUMMARY:Independence Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150703 +DTEND;VALUE=DATE:20150704 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232639Z +LAST-MODIFIED:20100625T232645Z +DTSTAMP:20100625T232645Z +UID:fdb30d77-208e-4b9c-acbb-877549b0c60e +SUMMARY:Labor Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20150907 +DTEND;VALUE=DATE:20150908 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232656Z +LAST-MODIFIED:20100625T232703Z +DTSTAMP:20100625T232703Z +UID:a0add000-7f34-4a12-8cfc-dbf98872b532 +SUMMARY:Columbus Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20151012 +DTEND;VALUE=DATE:20151013 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232710Z +LAST-MODIFIED:20100625T232716Z +DTSTAMP:20100625T232716Z +UID:57bbf2f3-e92c-4864-9171-80e1aefa9b25 +SUMMARY:Veterans Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20151111 +DTEND;VALUE=DATE:20151112 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232724Z +LAST-MODIFIED:20100625T232730Z +DTSTAMP:20100625T232730Z +UID:17357cbf-822b-4e16-97fe-9212a98262ea +SUMMARY:Thanksgiving Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20151126 +DTEND;VALUE=DATE:20151127 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232740Z +LAST-MODIFIED:20100625T232746Z +DTSTAMP:20100625T232746Z +UID:a5ae0bfb-a761-48a7-80b3-85c4dec3459d +SUMMARY:Christmas Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20151225 +DTEND;VALUE=DATE:20151226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232806Z +LAST-MODIFIED:20100625T232813Z +DTSTAMP:20100625T232813Z +UID:e84cfee3-d9f8-4088-9709-995258432145 +SUMMARY:New Year's Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160101 +DTEND;VALUE=DATE:20160102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232819Z +LAST-MODIFIED:20100625T232826Z +DTSTAMP:20100625T232826Z +UID:2c19281f-8160-4886-ae2b-35f5a83d32ec +SUMMARY:Birthday of Martin Luther King\, Jr. (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160118 +DTEND;VALUE=DATE:20160119 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232836Z +LAST-MODIFIED:20100625T232842Z +DTSTAMP:20100625T232842Z +UID:ccb48d24-c58f-478b-a941-1706c642cd39 +SUMMARY:Washington's Birthday (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160215 +DTEND;VALUE=DATE:20160216 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232851Z +LAST-MODIFIED:20100625T232858Z +DTSTAMP:20100625T232858Z +UID:067c379d-cdfa-49f5-9de7-65be7b5b0158 +SUMMARY:Memorial Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160530 +DTEND;VALUE=DATE:20160531 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232911Z +LAST-MODIFIED:20100625T232917Z +DTSTAMP:20100625T232917Z +UID:dddf90ce-a186-4bfb-aaf8-878e07450fcf +SUMMARY:Independence Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160704 +DTEND;VALUE=DATE:20160705 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232925Z +LAST-MODIFIED:20100625T232931Z +DTSTAMP:20100625T232931Z +UID:c734ef2f-53a9-48f3-9da0-f70b70c0d881 +SUMMARY:Labor Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20160905 +DTEND;VALUE=DATE:20160906 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232938Z +LAST-MODIFIED:20100625T232944Z +DTSTAMP:20100625T232944Z +UID:c9d05e3a-bd7d-4a5d-94ba-020335a9b3aa +SUMMARY:Columbus Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20161010 +DTEND;VALUE=DATE:20161011 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T232953Z +LAST-MODIFIED:20100625T233000Z +DTSTAMP:20100625T233000Z +UID:819d893b-af2b-4423-aaff-c4286ee349ee +SUMMARY:Veterans Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20161111 +DTEND;VALUE=DATE:20161112 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233007Z +LAST-MODIFIED:20100625T233013Z +DTSTAMP:20100625T233013Z +UID:9af9e892-e3a8-4a2c-a130-4e25c92c2baa +SUMMARY:Thanksgiving Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20161124 +DTEND;VALUE=DATE:20161125 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233022Z +LAST-MODIFIED:20100625T233028Z +DTSTAMP:20100625T233028Z +UID:8b5ff666-fec7-487b-99c0-aa621548e9ea +SUMMARY:Christmas Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20161226 +DTEND;VALUE=DATE:20161227 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233045Z +LAST-MODIFIED:20100625T233052Z +DTSTAMP:20100625T233052Z +UID:9943b6be-9c4b-4fc3-b690-80114b559f26 +SUMMARY:New Year's Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170102 +DTEND;VALUE=DATE:20170103 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233101Z +LAST-MODIFIED:20100625T233109Z +DTSTAMP:20100625T233109Z +UID:4c3b85b1-2144-470e-b986-418c087cb5a0 +SUMMARY:Birthday of Martin Luther King\, Jr. (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170116 +DTEND;VALUE=DATE:20170117 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233117Z +LAST-MODIFIED:20100625T233123Z +DTSTAMP:20100625T233123Z +UID:c09d860f-6464-41c4-b2ef-25011d25cecf +SUMMARY:Washington's Birthday (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170220 +DTEND;VALUE=DATE:20170221 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233131Z +LAST-MODIFIED:20100625T233138Z +DTSTAMP:20100625T233138Z +UID:ba4752c9-4032-4385-820d-2c4213e14fa5 +SUMMARY:Memorial Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170529 +DTEND;VALUE=DATE:20170530 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233145Z +LAST-MODIFIED:20100625T233151Z +DTSTAMP:20100625T233151Z +UID:59e934c5-672e-4ccc-a686-9d9c495b3883 +SUMMARY:Independence Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170704 +DTEND;VALUE=DATE:20170705 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233158Z +LAST-MODIFIED:20100625T233205Z +DTSTAMP:20100625T233205Z +UID:90340458-52db-4697-b2d7-8bfd51cfaaf7 +SUMMARY:Labor Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20170904 +DTEND;VALUE=DATE:20170905 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233212Z +LAST-MODIFIED:20100625T233218Z +DTSTAMP:20100625T233218Z +UID:70c9c1e3-31a2-4b0a-9712-69a184fbfb7c +SUMMARY:Columbus Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20171009 +DTEND;VALUE=DATE:20171010 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233225Z +LAST-MODIFIED:20100625T233232Z +DTSTAMP:20100625T233232Z +UID:e9f86e06-9f1c-44bc-b3db-43a220802fe9 +SUMMARY:Veterans Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20171110 +DTEND;VALUE=DATE:20171111 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233240Z +LAST-MODIFIED:20100625T233246Z +DTSTAMP:20100625T233246Z +UID:d82d8d11-0793-4a68-a876-83c7e29736d0 +SUMMARY:Thanksgiving Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20171123 +DTEND;VALUE=DATE:20171124 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233255Z +LAST-MODIFIED:20100625T233302Z +DTSTAMP:20100625T233302Z +UID:4526de1c-b74d-4643-b299-4c4c42ed82bb +SUMMARY:Christmas Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20171225 +DTEND;VALUE=DATE:20171226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233318Z +LAST-MODIFIED:20100625T233324Z +DTSTAMP:20100625T233324Z +UID:885fb7d7-ea3f-4938-9e40-f612986566f3 +SUMMARY:New Year's Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180101 +DTEND;VALUE=DATE:20180102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233329Z +LAST-MODIFIED:20100625T233335Z +DTSTAMP:20100625T233335Z +UID:89c44a14-aee8-49ce-8528-0e7a8bbe6e06 +SUMMARY:Birthday of Martin Luther King\, Jr. (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180115 +DTEND;VALUE=DATE:20180116 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233342Z +LAST-MODIFIED:20100625T233348Z +DTSTAMP:20100625T233348Z +UID:e65fa03d-c681-458c-a26b-4206e3297280 +SUMMARY:Washington's Birthday (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180219 +DTEND;VALUE=DATE:20180220 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233358Z +LAST-MODIFIED:20100625T233404Z +DTSTAMP:20100625T233404Z +UID:f0a9e5e8-077c-424a-a668-970951c307d5 +SUMMARY:Memorial Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180528 +DTEND;VALUE=DATE:20180529 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233413Z +LAST-MODIFIED:20100625T233419Z +DTSTAMP:20100625T233419Z +UID:f00cd4b3-3f19-4b46-9d69-e33790eda2ea +SUMMARY:Independence Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180704 +DTEND;VALUE=DATE:20180705 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233426Z +LAST-MODIFIED:20100625T233432Z +DTSTAMP:20100625T233432Z +UID:d0cdf502-fcdd-48ee-8cdc-2a6bc947a906 +SUMMARY:Labor Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20180903 +DTEND;VALUE=DATE:20180904 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233441Z +LAST-MODIFIED:20100625T233447Z +DTSTAMP:20100625T233447Z +UID:4ca554db-e59d-4de8-b043-d28988ae0b39 +SUMMARY:Columbus Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20181008 +DTEND;VALUE=DATE:20181009 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233455Z +LAST-MODIFIED:20100625T233502Z +DTSTAMP:20100625T233502Z +UID:876c8ca9-48a3-405d-86a1-432a66fb0ceb +SUMMARY:Veterans Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20181112 +DTEND;VALUE=DATE:20181113 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233510Z +LAST-MODIFIED:20100625T233516Z +DTSTAMP:20100625T233516Z +UID:5adaf364-32e7-4f8e-bc69-ad93c1c3aa15 +SUMMARY:Thanksgiving Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20181122 +DTEND;VALUE=DATE:20181123 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233527Z +LAST-MODIFIED:20100625T233532Z +DTSTAMP:20100625T233532Z +UID:05f95ef4-6098-4337-8d15-8b57ff37f251 +SUMMARY:Christmas Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20181225 +DTEND;VALUE=DATE:20181226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233551Z +LAST-MODIFIED:20100625T233558Z +DTSTAMP:20100625T233558Z +UID:43fc5a98-b57a-456b-a50b-8e0e1de018ff +SUMMARY:New Year's Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190101 +DTEND;VALUE=DATE:20190102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233603Z +LAST-MODIFIED:20100625T233610Z +DTSTAMP:20100625T233610Z +UID:e1f23ce9-56fe-47e0-8f0e-2d408847c5d6 +SUMMARY:Birthday of Martin Luther King\, Jr. (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190121 +DTEND;VALUE=DATE:20190122 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233618Z +LAST-MODIFIED:20100625T233626Z +DTSTAMP:20100625T233626Z +UID:3e8909b9-74aa-41bb-b8e7-23beff8c362d +SUMMARY:Washington's Birthday (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190218 +DTEND;VALUE=DATE:20190219 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233635Z +LAST-MODIFIED:20100625T233641Z +DTSTAMP:20100625T233641Z +UID:1aac6453-abbf-47de-bf5d-4bd0dfb9cd44 +SUMMARY:Memorial Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190527 +DTEND;VALUE=DATE:20190528 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233650Z +LAST-MODIFIED:20100625T233700Z +DTSTAMP:20100625T233700Z +UID:dce26b68-5fd3-4b45-a8a6-cb68c8946935 +SUMMARY:Independence Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190704 +DTEND;VALUE=DATE:20190705 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233710Z +LAST-MODIFIED:20100625T233716Z +DTSTAMP:20100625T233716Z +UID:199ec585-69d7-45df-9cf2-c1e83d570e3a +SUMMARY:Labor Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20190902 +DTEND;VALUE=DATE:20190903 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233723Z +LAST-MODIFIED:20100625T233728Z +DTSTAMP:20100625T233728Z +UID:61d39eb7-ae9a-4667-bbfa-6107df1e09e7 +SUMMARY:Columbus Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20191014 +DTEND;VALUE=DATE:20191015 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233735Z +LAST-MODIFIED:20100625T233741Z +DTSTAMP:20100625T233741Z +UID:290c9fe0-e39e-425a-95b4-831945c6b8f2 +SUMMARY:Veterans Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20191111 +DTEND;VALUE=DATE:20191112 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233747Z +LAST-MODIFIED:20100625T233754Z +DTSTAMP:20100625T233754Z +UID:b7680e77-a64f-4861-bb35-f2d917a9c437 +SUMMARY:Thanksgiving Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20191128 +DTEND;VALUE=DATE:20191129 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233801Z +LAST-MODIFIED:20100625T233808Z +DTSTAMP:20100625T233808Z +UID:b234249f-565e-4159-b4e5-b0314c48a191 +SUMMARY:Christmas Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20191225 +DTEND;VALUE=DATE:20191226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233825Z +LAST-MODIFIED:20100625T233832Z +DTSTAMP:20100625T233832Z +UID:a48665de-2184-4468-9f8a-c21cf582455f +SUMMARY:New Year's Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200101 +DTEND;VALUE=DATE:20200102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233838Z +LAST-MODIFIED:20100625T233844Z +DTSTAMP:20100625T233844Z +UID:f03dfc3e-924e-4574-87e7-e30fa1166025 +SUMMARY:Birthday of Martin Luther King\, Jr. (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200120 +DTEND;VALUE=DATE:20200121 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233852Z +LAST-MODIFIED:20100625T233858Z +DTSTAMP:20100625T233858Z +UID:95d5c62a-4a58-49cf-9c91-d66a0fae1acd +SUMMARY:Washington's Birthday (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200217 +DTEND;VALUE=DATE:20200218 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233906Z +LAST-MODIFIED:20100625T233912Z +DTSTAMP:20100625T233912Z +UID:dd42517c-228b-44b3-a3ac-0bd4a7aadb75 +SUMMARY:Memorial Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200525 +DTEND;VALUE=DATE:20200526 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233921Z +LAST-MODIFIED:20100625T233927Z +DTSTAMP:20100625T233927Z +UID:cb3e2de7-2c55-4882-820a-df01c8c6aae7 +SUMMARY:Independence Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200703 +DTEND;VALUE=DATE:20200704 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233935Z +LAST-MODIFIED:20100625T233941Z +DTSTAMP:20100625T233941Z +UID:65eb7b18-064f-4939-a840-f11ef4bec981 +SUMMARY:Labor Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20200907 +DTEND;VALUE=DATE:20200908 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T233952Z +LAST-MODIFIED:20100625T233959Z +DTSTAMP:20100625T233959Z +UID:2d13e3c5-8a26-49be-bdbc-9a1e9715ae4b +SUMMARY:Columbus Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20201012 +DTEND;VALUE=DATE:20201013 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T234006Z +LAST-MODIFIED:20100625T234017Z +DTSTAMP:20100625T234017Z +UID:8ffd1252-87f4-481c-b46a-c2aa4cba74c7 +SUMMARY:Veterans Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20201111 +DTEND;VALUE=DATE:20201112 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T234023Z +LAST-MODIFIED:20100625T234029Z +DTSTAMP:20100625T234029Z +UID:557d2349-5c21-45c8-aad7-9c24a6aceb66 +SUMMARY:Thanksgiving Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20201126 +DTEND;VALUE=DATE:20201127 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20100625T234036Z +LAST-MODIFIED:20100625T234041Z +DTSTAMP:20100625T234041Z +UID:1c5f2dc5-7cea-48cd-8c36-905930f8eee9 +SUMMARY:Christmas Day (US-OPM) +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20201225 +DTEND;VALUE=DATE:20201226 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/UruguayHolidays.ics b/media/caldata/UruguayHolidays.ics new file mode 100644 index 00000000000..c3678a89309 --- /dev/null +++ b/media/caldata/UruguayHolidays.ics @@ -0,0 +1,177 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20110523T223235Z +LAST-MODIFIED:20110523T223326Z +DTSTAMP:20110523T223326Z +UID:4b14f858-921e-4787-827a-15c4d35c3dff +SUMMARY:Batalla de Las Piedras +RRULE:FREQ=YEARLY +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20110518 +DTEND;VALUE=DATE:20110519 +LOCATION:Uruguay +DESCRIPTION:Laborable.\n\nSi cae sábado\, domingo o lunes: se conmemora e + n dicha fecha.\n\nSi cae martes o miércoles: se conmemora el lunes anteri + or.\n\nSi cae jueves o viernes: se conmemora el lunes siguiente.\n\nFuente + : http://es.wikipedia.org/wiki/Uruguay#Fiestas +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110523T223138Z +LAST-MODIFIED:20110523T223333Z +DTSTAMP:20110523T223333Z +UID:b4e21504-9387-4b2a-8bbc-be4750102b43 +SUMMARY:Día de los trabajadores +RRULE:FREQ=YEARLY +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20110501 +DTEND;VALUE=DATE:20110502 +LOCATION:Uruguay +DESCRIPTION:No laborable. +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110523T222757Z +LAST-MODIFIED:20110523T223345Z +DTSTAMP:20110523T223345Z +UID:2dc352b2-5f36-4ec8-ae6a-e5e3c1242d8a +SUMMARY:Año Nuevo +RRULE:FREQ=YEARLY +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20110101 +DTEND;VALUE=DATE:20110102 +LOCATION:Uruguay +TRANSP:TRANSPARENT +DESCRIPTION:No laborable. +X-MOZ-GENERATION:2 +SEQUENCE:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110523T222902Z +LAST-MODIFIED:20110523T223351Z +DTSTAMP:20110523T223351Z +UID:7e38b56e-fe7e-4304-a4f4-990bd0b276bb +SUMMARY:Día de los niños +RRULE:FREQ=YEARLY +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20110106 +DTEND;VALUE=DATE:20110107 +LOCATION:Uruguay +DESCRIPTION:Laborable. +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110523T223016Z +LAST-MODIFIED:20110523T223402Z +DTSTAMP:20110523T223402Z +UID:8273db5b-3c50-4708-b570-f625fc832317 +SUMMARY:Desembarco de los 33 Orientales +RRULE:FREQ=YEARLY +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20110419 +DTEND;VALUE=DATE:20110420 +LOCATION:Uruguay +DESCRIPTION:Laborable.\n\nSi cae sábado\, domingo o lunes: se conmemora e + n dicha fecha.\n\nSi cae martes o miércoles: se conmemora el lunes anteri + or.\n\nSi cae jueves o viernes: se conmemora el lunes siguiente.\n\nFuente + : http://es.wikipedia.org/wiki/Uruguay#Fiestas +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110523T223434Z +LAST-MODIFIED:20110523T223515Z +DTSTAMP:20110523T223515Z +UID:54464668-2fe2-43d2-bdca-e2b6d99598c7 +SUMMARY:Natalicio de José Artigas +RRULE:FREQ=YEARLY +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20110619 +DTEND;VALUE=DATE:20110620 +LOCATION:Uruguay +DESCRIPTION:Laborable e inamovible. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110523T223605Z +LAST-MODIFIED:20110523T223627Z +DTSTAMP:20110523T223627Z +UID:c43b3fb2-a33c-4997-8cdf-334eb8408f1a +SUMMARY:Declaratoria de la Independencia +RRULE:FREQ=YEARLY +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20110825 +DTEND;VALUE=DATE:20110826 +LOCATION:Uruguay +DESCRIPTION:No laborable. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110523T223537Z +LAST-MODIFIED:20110523T223634Z +DTSTAMP:20110523T223634Z +UID:f1130d0c-9f1c-4871-9c57-c6af100961dd +SUMMARY:Jura de la Constitución +RRULE:FREQ=YEARLY +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20110718 +DTEND;VALUE=DATE:20110719 +LOCATION:Uruguay +DESCRIPTION:No laborable. +TRANSP:TRANSPARENT +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20110523T223700Z +LAST-MODIFIED:20110523T223807Z +DTSTAMP:20110523T223807Z +UID:61289d42-ff12-4656-918f-81aca99abf40 +SUMMARY:Día de las Américas +RRULE:FREQ=YEARLY +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20111012 +DTEND;VALUE=DATE:20111013 +LOCATION:Uruguay +DESCRIPTION:Laborable. \n\nSi cae en sábado\, domingo o lunes: se conmemo + ra en dicha fecha.\n\nSi cae martes o miércoles: se conmemora el lunes an + terior.\n\nSi cae jueves o viernes: se conmemora el lunes siguiente.\n\nFu + ente: http://es.wikipedia.org/wiki/Uruguay#Fiestas +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110523T223822Z +LAST-MODIFIED:20110523T223844Z +DTSTAMP:20110523T223844Z +UID:ff1414f0-a42f-434f-85f8-2e49bb77f743 +SUMMARY:Día de los difuntos +RRULE:FREQ=YEARLY +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20111102 +DTEND;VALUE=DATE:20111103 +LOCATION:Uruguay +DESCRIPTION:Laborable e inamovible. +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20110523T223902Z +LAST-MODIFIED:20110523T223924Z +DTSTAMP:20110523T223924Z +UID:73f591e7-33b3-4414-bf64-5511953c06dd +SUMMARY:Día de la familia +RRULE:FREQ=YEARLY +CATEGORIES:Festivos +DTSTART;VALUE=DATE:20111225 +DTEND;VALUE=DATE:20111226 +LOCATION:Uruguay +DESCRIPTION:No laborable. +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/VanuatuHolidays.ics b/media/caldata/VanuatuHolidays.ics new file mode 100644 index 00000000000..cba97c27769 --- /dev/null +++ b/media/caldata/VanuatuHolidays.ics @@ -0,0 +1,158 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VEVENT +CREATED:20090114T084940Z +LAST-MODIFIED:20090114T085003Z +DTSTAMP:20090114T084940Z +UID:42f0d1ca-14c7-42d0-9a6d-bd09208f5e6a +SUMMARY:New year's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090101 +DTEND;VALUE=DATE:20090102 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085056Z +LAST-MODIFIED:20090114T085140Z +DTSTAMP:20090114T085056Z +UID:06a9f422-6e07-453e-af26-c4420291d35c +SUMMARY:Fr Walter Lini Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090221 +DTEND;VALUE=DATE:20090222 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085157Z +LAST-MODIFIED:20090114T085207Z +DTSTAMP:20090114T085157Z +UID:3a9c6460-5328-4016-b3ab-9035dae87c47 +SUMMARY:Custom Chief's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090305 +DTEND;VALUE=DATE:20090306 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085234Z +LAST-MODIFIED:20090114T085244Z +DTSTAMP:20090114T085234Z +UID:c0d975de-1d35-413f-a924-ac618558565e +SUMMARY:Good Friday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090410 +DTEND;VALUE=DATE:20090411 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085250Z +LAST-MODIFIED:20090114T085303Z +DTSTAMP:20090114T085250Z +UID:d5b10bad-4abc-4ddd-8051-7d7bf8d93c83 +SUMMARY:Easter Monday +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090413 +DTEND;VALUE=DATE:20090414 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085320Z +LAST-MODIFIED:20090114T085328Z +DTSTAMP:20090114T085320Z +UID:16bcfb20-bf00-4734-b1ff-af0428a611c6 +SUMMARY:Labour Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090501 +DTEND;VALUE=DATE:20090502 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085344Z +LAST-MODIFIED:20090114T085354Z +DTSTAMP:20090114T085344Z +UID:1eba60cc-980a-4616-920d-29223e4ff929 +SUMMARY:Ascension Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090521 +DTEND;VALUE=DATE:20090522 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085417Z +LAST-MODIFIED:20090114T085425Z +DTSTAMP:20090114T085417Z +UID:20358a2b-7fb5-4a25-863c-952056a5c1bc +SUMMARY:Children's Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090724 +DTEND;VALUE=DATE:20090725 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085441Z +LAST-MODIFIED:20090114T085449Z +DTSTAMP:20090114T085441Z +UID:a3ad803d-58ec-4f72-ad02-e457e0b86d84 +SUMMARY:Independence Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090730 +DTEND;VALUE=DATE:20090731 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085506Z +LAST-MODIFIED:20090114T085513Z +DTSTAMP:20090114T085506Z +UID:8f08e633-d1f3-4052-a16f-0d0a1b1abaf5 +SUMMARY:Assumption Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20090815 +DTEND;VALUE=DATE:20090816 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085537Z +LAST-MODIFIED:20090114T085545Z +DTSTAMP:20090114T085537Z +UID:0e5c0d10-f65d-4b55-b047-75b95f632f53 +SUMMARY:Constitution Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20091005 +DTEND;VALUE=DATE:20091006 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085602Z +LAST-MODIFIED:20090114T085610Z +DTSTAMP:20090114T085602Z +UID:63e5c69b-3b99-4b99-97cb-664625c4bcd2 +SUMMARY:Unity Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20091130 +DTEND;VALUE=DATE:20091201 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085628Z +LAST-MODIFIED:20090114T085635Z +DTSTAMP:20090114T085628Z +UID:09a77244-c49e-4e4d-95f3-c9923496b651 +SUMMARY:Christmas Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20091225 +DTEND;VALUE=DATE:20091226 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +CREATED:20090114T085643Z +LAST-MODIFIED:20090114T085701Z +DTSTAMP:20090114T085643Z +UID:15ca168a-48ec-4229-b409-6039822aee89 +SUMMARY:Family Day +CATEGORIES:Holidays +DTSTART;VALUE=DATE:20091226 +DTEND;VALUE=DATE:20091227 +TRANSP:TRANSPARENT +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/VietnamHolidays.ics b/media/caldata/VietnamHolidays.ics new file mode 100644 index 00000000000..308cde2be4d --- /dev/null +++ b/media/caldata/VietnamHolidays.ics @@ -0,0 +1,137 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Asia/Bangkok +X-LIC-LOCATION:Asia/Bangkok +BEGIN:STANDARD +TZOFFSETFROM:+0700 +TZOFFSETTO:+0700 +TZNAME:ICT +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20090819T152559Z +LAST-MODIFIED:20090819T152704Z +DTSTAMP:20090819T152559Z +UID:fefd5be8-a33d-453b-a374-cac4725806a1 +SUMMARY:TET Holidays +CATEGORIES:Holidays +DTSTART;TZID=Asia/Bangkok:20090125T000000 +DTEND;TZID=Asia/Bangkok:20090129T235900 +DESCRIPTION:Kỳ nghỉ Tết Âm lịch. +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +CREATED:20090819T152901Z +LAST-MODIFIED:20090819T153001Z +DTSTAMP:20090819T152901Z +UID:144ff44f-052a-4890-a9e5-121cee82e5d4 +SUMMARY:TET Holidays +CATEGORIES:Holidays +DTSTART;TZID=Asia/Bangkok:20100213T230000 +DTEND;TZID=Asia/Bangkok:20100217T235900 +DESCRIPTION:Nghỉ Tết Nguyên Đán. (Tet holidays) +END:VEVENT +BEGIN:VEVENT +CREATED:20090819T153024Z +LAST-MODIFIED:20090819T153235Z +DTSTAMP:20090819T153024Z +UID:ba71dea8-e699-4458-8e3a-9460b213a74e +SUMMARY:Liberation southern of Vietnam. +CATEGORIES:Holidays +DTSTART;TZID=Asia/Bangkok:20100430T000000 +DTEND;TZID=Asia/Bangkok:20100430T235900 +DESCRIPTION:Giải phóng miền nam - thống nhất đất nước. + (Liberation southern of Vietnam). +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090819T153312Z +LAST-MODIFIED:20090819T153403Z +DTSTAMP:20090819T153312Z +UID:1068637d-6d0d-4c89-b48f-a90f9d187a5c +SUMMARY:International Labor. +CATEGORIES:Holidays +DTSTART;TZID=Asia/Bangkok:20100501T000000 +DTEND;TZID=Asia/Bangkok:20100501T235900 +DESCRIPTION:Quốc tế lao động. (International Labor) +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20090819T153947Z +LAST-MODIFIED:20090819T154119Z +DTSTAMP:20090819T153947Z +UID:eae7d2de-4ca4-4361-b39d-53d832d3c3be +SUMMARY:TET Holidays +CATEGORIES:Holidays +DTSTART;TZID=Asia/Bangkok:20110202T000000 +DTEND;TZID=Asia/Bangkok:20110206T235900 +DESCRIPTION:Tết Nguyên Đán. (Tet Holidays) +END:VEVENT +BEGIN:VEVENT +CREATED:20090819T154203Z +LAST-MODIFIED:20090819T154254Z +DTSTAMP:20090819T154203Z +UID:f320d317-3b84-43d0-9e74-688a8eeb3b18 +SUMMARY:TET Holidays +CATEGORIES:Holidays +DTSTART;TZID=Asia/Bangkok:20120121T000000 +DTEND;TZID=Asia/Bangkok:20120125T235900 +DESCRIPTION:Tết Nguyên Đán. (Tet Holidays) +END:VEVENT +BEGIN:VEVENT +CREATED:20090819T154405Z +LAST-MODIFIED:20090819T154441Z +DTSTAMP:20090819T154405Z +UID:3bfb226d-5ca0-4595-8095-46a63fc35ab2 +SUMMARY:TET Holidays +CATEGORIES:Holidays +DTSTART;TZID=Asia/Bangkok:20130208T230000 +DTEND;TZID=Asia/Bangkok:20130212T235900 +DESCRIPTION:Tết Nguyên Đán. (Tet Holidays) +END:VEVENT +BEGIN:VEVENT +CREATED:20090819T151740Z +LAST-MODIFIED:20090819T153527Z +DTSTAMP:20090819T151740Z +UID:60204833-6823-4e70-9478-0c0d5839d245 +SUMMARY:National Day +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;TZID=Asia/Bangkok:20090902T000000 +DTEND;TZID=Asia/Bangkok:20090902T235900 +DESCRIPTION:Quốc khánh nước Cộng hòa xã hội chủ nghĩa + Việt Nam (National Day). +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20090819T152234Z +LAST-MODIFIED:20090819T153619Z +DTSTAMP:20090819T152234Z +UID:969accfd-cbbb-43c5-aa56-8aa76d7f5a52 +SUMMARY:International Labor +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;TZID=Asia/Bangkok:20090501T000000 +DTEND;TZID=Asia/Bangkok:20090501T235900 +TRANSP:OPAQUE +DESCRIPTION:Quốc tế lao động. (International Labor) +X-MOZ-GENERATION:3 +END:VEVENT +BEGIN:VEVENT +CREATED:20090819T152028Z +LAST-MODIFIED:20090819T153624Z +DTSTAMP:20090819T152028Z +UID:3761f705-fd95-47ef-915b-5181d34a9dd8 +SUMMARY:Liberation southern of Vietnam. +RRULE:FREQ=YEARLY;INTERVAL=1 +CATEGORIES:Holidays +DTSTART;TZID=Asia/Bangkok:20090430T000000 +DTEND;TZID=Asia/Bangkok:20090430T235900 +DESCRIPTION:Giải phóng miền nam - thống nhất đất nước. + (Liberation southern of Vietnam). +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/media/caldata/calendars.json b/media/caldata/calendars.json new file mode 100644 index 00000000000..b7df4b9f5a3 --- /dev/null +++ b/media/caldata/calendars.json @@ -0,0 +1,404 @@ +[ + { + "country":"Algeria", + "filename":"AlgeriaHolidays.ics", + "datespan":"2007-2020", + "authors":"Imad Tbahriti" + }, + { + "country":"Argentina", + "filename":"ArgentinaHolidays.ics", + "datespan":"2011-2013", + "authors":"Hernan Belloni" + }, + { + "country":"Australia", + "filename":"AustraliaHolidays.ics", + "datespan":"2013", + "authors":"Jason Stirling" + }, + { + "country":"Austria", + "filename":"AustrianHolidays.ics", + "datespan":"2002-2015", + "authors":"Patrick Loschmidt" + }, + { + "country":"Basque", + "filename":"BasqueHolidays.ics", + "datespan":"2010-2012", + "authors":"Ander Elortondo" + }, + { + "country":"Belgium", + "filename":"BelgianHolidays.ics", + "datespan":"2011-2022", + "authors":"Hubertus Verdonck" + }, + { + "country":"Belgium (Dutch)", + "filename":"BelgianDutchHolidays.ics", + "datespan":"2007-2015", + "authors":"Peter Tonoli" + }, + { + "country":"Belgium (French)", + "filename":"BelgianFrenchHolidays.ics", + "datespan":"2007-2015", + "authors":"Olivier Bosschem" + }, + { + "country":"Bolivia", + "filename":"BoliviaHolidays.ics", + "datespan":"2010-2020", + "authors":"Rebelde Boliche" + }, + { + "country":"Brazil", + "filename":"BrazilHolidays.ics", + "datespan":"2009-2020", + "authors":"Henrique Faria" + }, + { + "country":"Bulgaria", + "filename":"BulgarianHolidays.ics", + "datespan":"2009 and beyond", + "authors":"Georgi D. Sotirov" + }, + { + "country":"Canada", + "filename":"CanadaHolidays.ics", + "datespan":"2012-2020", + "authors":"Sigurd Schmidt" + }, + { + "country":"Chile", + "filename":"ChileHolidays.ics", + "datespan":"2011-2012", + "authors":"Emilio Sepulveda, Pablo Olmos de Aguilera Corradini" + }, + { + "country":"China", + "filename":"ChinaHolidays.ics", + "datespan":"2010-2012", + "authors":"Pingju" + }, + { + "country":"Colombia", + "filename":"ColombianHolidays.ics", + "datespan":"2000-2020", + "authors":"Mauricio Sanchez" + }, + { + "country":"Costa Rica", + "filename":"CostaRicaHolidays.ics", + "datespan":"2012-2020", + "authors":"Gerardo Tovar" + }, + { + "country":"Croatia", + "filename":"CroatiaHolidays.ics", + "datespan":"2009-2017", + "authors":"Domagoj Debic" + }, + { + "country":"Czech", + "filename":"CzechHolidays.ics", + "datespan":"2007-2015", + "authors":"Martin Matula" + }, + { + "country":"Denmark", + "filename":"DanishHolidays.ics", + "datespan":"2006-2015", + "authors":"Mads Boserup Lauritsen" + }, + { + "country":"England", + "filename":"EnglishHolidays.ics", + "datespan":"2002-2015", + "authors":"Ian Walker" + }, + { + "country":"Estonia", + "filename":"EstoniaHolidays.ics", + "datespan":"2009-2013", + "authors":"Merike Sell" + }, + { + "country":"Finland (Finnish)", + "filename":"FinlandHolidays.ics", + "datespan":"2007-2013", + "authors":"Magnus Melin" + }, + { + "country":"Finland (Swedish)", + "filename":"FinlandHolidaysSwedish.ics", + "datespan":"2007-2013", + "authors":"Magnus Melin" + }, + { + "country":"Flanders", + "filename":"FlandersHolidays.ics", + "datespan":"2011-2021", + "authors":"Hubertus Verdonck" + }, + { + "country":"France", + "filename":"FrenchHolidays.ics", + "datespan":"2007-2015", + "authors":"Chris Ross" + }, + { + "country":"Frisian", + "filename":"FrisianHolidays.ics", + "datespan":"2009-2015", + "authors":"Wim Benes" + }, + { + "country":"Germany", + "filename":"GermanHolidays.ics", + "datespan":"2010-2015", + "authors":"Hagen Halbach" + }, + { + "country":"Guyana", + "filename":"GuyanaHolidays.ics", + "datespan":"2013", + "authors":"RedSpider" + }, + { + "country":"Hong Kong", + "filename":"HongKongHolidays.ics", + "datespan":"2007-2013", + "authors":"Chun Chung Au" + }, + { + "country":"Hungary", + "filename":"HungarianHolidays.ics", + "datespan":"2011-2012", + "authors":"Kalman Kemenczy" + }, + { + "country":"Iceland", + "filename":"IcelandHolidays.ics", + "datespan":"2008-2020", + "authors":"Kristjan Bjarni Gudmundsson" + }, + { + "country":"Indonesia (Bahasa)", + "filename":"IndonesianHolidays.ics", + "datespan":"2013", + "authors":"Tjung Steven" + }, + { + "country":"Indonesia (English)", + "filename":"IndonesianHolidaysEnglish.ics", + "datespan":"2013", + "authors":"Tjung Steven" + }, + { + "country":"Iran (English)", + "filename":"IranHolidays_English.ics", + "datespan":"2007-2012", + "authors":"Mana Ghavifekr" + }, + { + "country":"Iran (Persian)", + "filename":"IranHolidays_Persian.ics", + "datespan":"2012-2013", + "authors":"Mahdi" + }, + { + "country":"Italy", + "filename":"ItalianHolidays.ics", + "datespan":"2000-2030", + "authors":"Gianni Luppi/Gianfranco Balza" + }, + { + "country":"Japan", + "filename":"JapanHolidays.ics", + "datespan":"2007-2022", + "authors":"Atsushi Sakai" + }, + { + "country":"Kenya", + "filename":"KenyaHolidays.ics", + "datespan":"2007-2015", + "authors":"Kevin Warnke" + }, + { + "country":"Latvia", + "filename":"LatviaHolidays.ics", + "datespan":"2009-2014", + "authors":"dm" + }, + { + "country":"Lithuanian", + "filename":"LithuanianHolidays.ics", + "datespan":"2012", + "authors":"Zai" + }, + { + "country":"Luxembourg", + "filename":"LuxembourgHolidays.ics", + "datespan":"2010-2013", + "authors":"Ondra Kotecky" + }, + { + "country":"Netherlands", + "filename":"DutchHolidays.ics", + "datespan":"2011-2018", + "authors":"Juuk Slager" + }, + { + "country":"New Zealand", + "filename":"NewZealandHolidays.ics", + "datespan":"2010-2013", + "authors":"Pete Griffin" + }, + { + "country":"Norway", + "filename":"NorwegianHolidays.ics", + "datespan":"2009-2013", + "authors":"H\u00e5vard Wigtil" + }, + { + "country":"Pakistan", + "filename":"PakistanHolidays.ics", + "datespan":"2007-2020", + "authors":"Umar Toseef" + }, + { + "country":"Peru", + "filename":"PeruHolidays.ics", + "datespan":"2008-2013", + "authors":"Fernando Bustamante G" + }, + { + "country":"Poland", + "filename":"PolishHolidays.ics", + "datespan":"2009-2020", + "authors":"Damian Szczepanik" + }, + { + "country":"Portugal", + "filename":"PortugalHolidays.ics", + "datespan":"2001-2030", + "authors":"Nuno Rua" + }, + { + "country":"Queensland", + "filename":"QueenslandHolidays.ics", + "datespan":"2010-2014", + "authors":"Alan Kingsley" + }, + { + "country":"Russia", + "filename":"RussiaHolidays.ics", + "datespan":"2010-2020", + "authors":"Alexander L. Slovesnik" + }, + { + "country":"Romania", + "filename":"RomaniaHolidays.ics", + "datespan":"2013", + "authors":"Budai E. Bogdan" + }, + { + "country":"Singapore", + "filename":"SingaporeHolidays.ics", + "datespan":"2012", + "authors":"Gary Kwong" + }, + { + "country":"Slovenia", + "filename":"SlovenianHolidays.ics", + "datespan":"2012-2013", + "authors":"Klemen Robnik" + }, + { + "country":"Slovakia", + "filename":"SlovakHolidays.ics", + "datespan":"2009-2015", + "authors":"Branislav Rozbora" + }, + { + "country":"South Africa", + "filename":"SouthAfricaHolidays.ics", + "datespan":"2012-2015", + "authors":"Malcolm McLean" + }, + { + "country":"South Korea", + "filename":"SouthKoreaHolidays.ics", + "datespan":"2000-2020", + "authors":"Marcus Yoo" + }, + { + "country":"Spain", + "filename":"SpanishHolidays.ics", + "datespan":"2007-2013", + "authors":"Ricardo Palomares Martinez" + }, + { + "country":"Sri Lanka", + "filename":"SriLankaHolidays.ics", + "datespan":"2013", + "authors":"Rukshan Abeyratne" + }, + { + "country":"Sweden", + "filename":"SwedishHolidays.ics", + "datespan":"2000-2020", + "authors":"Soren Petersen" + }, + { + "country":"Switzerland", + "filename":"SwissHolidays.ics", + "datespan":"2011-2013", + "authors":"tb" + }, + { + "country":"Taiwan", + "filename":"TaiwanHolidays.ics", + "datespan":"2011-2013", + "authors":"brli, Irvin, Pin-Guang Chen" + }, + { + "country":"Thailand", + "filename":"ThaiHolidays.ics", + "datespan":"2012-2014", + "authors":"Hans Henderson" + }, + { + "country":"Turkey", + "filename":"TurkeyHolidays.ics", + "datespan":"2011-2012", + "authors":"Berker Peksag, Jan Bambach" + }, + { + "country":"UK", + "filename":"UKHolidays.ics", + "datespan":"2010-2015", + "authors":"Brian Wray, Dave Ewart" + }, + { + "country":"Uruguay", + "filename":"UruguayHolidays.ics", + "datespan":"2011-2021", + "authors":"Gonzalo Alvarez" + }, + { + "country":"USA", + "filename":"USHolidays.ics", + "datespan":"2000-2020", + "authors":"Marcus Yoo, Rob Craver" + }, + { + "country":"Vietnam", + "filename":"VietnamHolidays.ics", + "datespan":"2009-2013", + "authors":"Tri Luu" + } +] From cb933e003920c32acdf5be7c0b0fd3f07d420b8c Mon Sep 17 00:00:00 2001 From: Andrei Hajdukewycz Date: Fri, 20 Dec 2013 04:57:38 -0500 Subject: [PATCH 02/23] [Fix Bug 952429] Add Lightning holiday calendar index page --- .../templates/mozorg/projects/calendar.html | 3 +- .../mozorg/projects/holiday-calendars.html | 77 +++++++++++++++++++ bedrock/mozorg/urls.py | 1 + bedrock/mozorg/views.py | 21 +++++ etc/httpd/global.conf | 4 + media/css/mozorg/projects/calendar.less | 39 +++++++--- 6 files changed, 132 insertions(+), 13 deletions(-) create mode 100644 bedrock/mozorg/templates/mozorg/projects/holiday-calendars.html diff --git a/bedrock/mozorg/templates/mozorg/projects/calendar.html b/bedrock/mozorg/templates/mozorg/projects/calendar.html index ac4c7b4cfc5..71eb5ddf606 100644 --- a/bedrock/mozorg/templates/mozorg/projects/calendar.html +++ b/bedrock/mozorg/templates/mozorg/projects/calendar.html @@ -32,7 +32,8 @@

{{ _('Organize your life — it’s about time!') }}

- {{ _('Organize your schedule and life’s important events in a calendar that’s fully integrated with your Thunderbird or Seamonkey email. Manage multiple calendars, create your daily to do list, invite friends to events, and subscribe to public calendars.') }} +

{{ _('Organize your schedule and life’s important events in a calendar that’s fully integrated with your Thunderbird or Seamonkey email. Manage multiple calendars, create your daily to do list, invite friends to events, and subscribe to public calendars.') }}

+

{{ _('Our contributors have put together holiday calendars for many national holiday schedules.')|format(url('mozorg.projects.holiday_calendars')) }}

    diff --git a/bedrock/mozorg/templates/mozorg/projects/holiday-calendars.html b/bedrock/mozorg/templates/mozorg/projects/holiday-calendars.html new file mode 100644 index 00000000000..229140a7275 --- /dev/null +++ b/bedrock/mozorg/templates/mozorg/projects/holiday-calendars.html @@ -0,0 +1,77 @@ +{# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. -#} + +{% extends "mozorg/base-resp.html" %} + +{% block page_title %}{{ _('Mozilla Thunderbird - Holiday Calendars') }}{% endblock %} +{% block page_desc %}{{ _('Holiday calendar data for Lightning') }}{% endblock %} +{% block body_id %}holiday-calendars{% endblock %} + +{% block extrahead %} + {{ css('projects-calendar') }} +{% endblock %} + +{% block content %} + +
    +
    +
    + +

    {{ _('Holiday Calendars') }}

    +

    {{ _('Add your nation’s holidays to Lightning!') }}

    +
    +
    +
    +

    {{ _('We’ve got some holiday calendar files available for download. You can either download and then import them into Sunbird or Lightning or you can just subscribe to these calendars by copying their URL and then adding them as new remote calendar files. More information on installing a holiday calendar can be found in the Adding a holiday calendar article.')|format('https://support.mozillamessaging.com/en-US/kb/Adding+a+holiday+calendar') }}

    +

    {{ _('You can also find calendars to subscribe to at iCalShare.com.')|format('http://icalshare.com') }}

    +
    +
    +
      + {% for letter in letters -%} +
    • {{ letter }}
    • + {% endfor -%} +
    + + {% set first_letter = '' %} + {% for calendar in calendars -%} + {% if first_letter != calendar.country[:1] %} + {% set first_letter = calendar.country[:1] %} + + {% endif %} + + {% trans calurl=CALDATA_URL + calendar.filename, datespan=calendar.datespan, + country=calendar.country, authors=calendar.authors %} + + + {% endtrans %} + + {% endfor %} +
    {{ first_letter }}
    {{ country }} holidays thanks to {{ authors }}{{ datespan }}
    +

    {{ ('Contributing a Holiday Calendar') }}

    +

    {{ ('If you would like to send us your calendar files, please follow these steps:') }}

    +
      +
    1. {{ _('Create a new local calendar, e.g. "$Country$ Holidays".') }}
    2. +
    3. {{ _('Create the different holidays of your country in this local calendar.') }}
    4. +
    5. {{ _('Right-click on this calendar and choose "Export Calendar". Please use the iCalendar (ics) format.') }}
    6. +
    7. {{ _('Open a bug in Bugzilla.')|format('http://bugzilla.mozilla.org/enter_bug.cgi?product=Calendar&component=Website') }}
    8. +
    9. {{ _('Add your holiday file as an attachment in the new bug.') }}
    10. +
    +
    +
    + +{% endblock %} + +{% block js %} + {{ js('projects-calendar') }} +{% endblock %} + + diff --git a/bedrock/mozorg/urls.py b/bedrock/mozorg/urls.py index c21626db886..eb294f2d4db 100644 --- a/bedrock/mozorg/urls.py +++ b/bedrock/mozorg/urls.py @@ -17,6 +17,7 @@ page('products', 'mozorg/products.html'), page('about/mozilla-based', 'mozorg/projects/mozilla-based.html'), page('projects/calendar', 'mozorg/projects/calendar.html'), + url('projects/calendar/holidays', views.holiday_calendars, name='mozorg.projects.holiday_calendars'), page('button', 'mozorg/button.html'), page('mission', 'mozorg/mission.html'), page('ITU', 'mozorg/itu.html'), diff --git a/bedrock/mozorg/views.py b/bedrock/mozorg/views.py index b0dbe2820a2..1ed786bdd00 100644 --- a/bedrock/mozorg/views.py +++ b/bedrock/mozorg/views.py @@ -3,6 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. import re +import json from django.conf import settings from django.core.context_processors import csrf @@ -216,6 +217,26 @@ def contribute_studentambassadors_join(request): ) +def holiday_calendars(request, template='mozorg/projects/holiday-calendars.html'): + """Generate the table of holiday calendars from JSON.""" + calendars = [] + json_file = settings.MEDIA_ROOT + '/caldata/calendars.json' + with open(json_file) as calendar_data: + calendars = json.load(calendar_data) + + letters = set() + for calendar in calendars: + letters.add(calendar['country'][:1]) + + data = { + 'calendars': sorted(calendars, key=lambda k: k['country']), + 'letters': sorted(letters), + 'CALDATA_URL': settings.MEDIA_URL + 'caldata/' + } + + return l10n_utils.render(request, template, data) + + class Robots(TemplateView): template_name = 'mozorg/robots.txt' diff --git a/etc/httpd/global.conf b/etc/httpd/global.conf index 1e1e3bbff1c..a26fa4a659b 100644 --- a/etc/httpd/global.conf +++ b/etc/httpd/global.conf @@ -663,6 +663,10 @@ RewriteRule ^/(\w{2,3}(?:-\w{2})?/)?mobile/android-download-beta\.html https://p # bug 723267 RewriteRule ^/(\w{2,3}(?:-\w{2})?/)?projects/calendar(/?)$ /b/$1projects/calendar$2 [PT] +# bug 885799 +RewriteRule ^/(\w{2,3}(?:-\w{2})?/)?projects/calendar/holidays.html$ /b/$1projects/calendar/holidays [PT] +RewriteRule ^/(\w{2,3}(?:-\w{2})?/)?projects/calendar/caldata/(.*)$ /b/$1media/caldata/$2 [PT] + # bug 947890 RewriteRule ^/(\w{2,3}(?:-\w{2})?/)?firefox/latest/releasenotes(/?)$ /b/$1firefox/latest/releasenotes$2 [PT] diff --git a/media/css/mozorg/projects/calendar.less b/media/css/mozorg/projects/calendar.less index 4fbddabef84..a1b9f1a2974 100644 --- a/media/css/mozorg/projects/calendar.less +++ b/media/css/mozorg/projects/calendar.less @@ -6,7 +6,7 @@ @import "../../sandstone/lib.less"; #lightning { - padding: (@baseLine * 2) (@baseLine * 5); + padding: (@baseLine * 2) (@baseLine * 4); .infobox { padding-bottom: @baseLine; float: right; @@ -23,21 +23,40 @@ h1 { font-size: 57px; } - h2 { - letter-spacing: -0.5px; - font-size: 24px; - } + } + h2 { + letter-spacing: -0.5px; + font-size: 24px; } .midbox { - padding: @baseLine 0; + padding: @baseLine 0 0 0; border-top: 1px solid #d6d6d6; - border-bottom: 1px solid #d6d6d6; } .topbox { img { vertical-align: top; } } + .holiday { + float: none; + } + table.data { + width: 100%; + margin-bottom: @baseLine; + } + .calendar-table { + padding: 0px 20px; + } + ul.holiday-nav { + text-align: center; + padding: @baseLine 0; + border-bottom: 1px solid #d6d6d6; + li { + display: inline; + float: none; + width: auto; + } + } } #download { @@ -151,13 +170,9 @@ font-size: 36px; } #download { - float: none; + display: none; } } - .midbox { - float: left; - margin-bottom: @baseLine; - } .topbox { padding: 0; } From 878152fa2e683a092fcca3f7538fe4ab2fd5e436 Mon Sep 17 00:00:00 2001 From: Jared Hirsch Date: Fri, 10 Jan 2014 19:33:07 -0800 Subject: [PATCH 03/23] Make subject line of contribute email for end-users localizable. Keep the existing filterable subject lines for Mozilla contacts. Fixes 854992 --- bedrock/mozorg/email_contribute.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bedrock/mozorg/email_contribute.py b/bedrock/mozorg/email_contribute.py index a72428d79d7..003dd7525ce 100644 --- a/bedrock/mozorg/email_contribute.py +++ b/bedrock/mozorg/email_contribute.py @@ -180,7 +180,7 @@ def autorespond(request, data): """ functional_area = FUNCTIONAL_AREAS_DICT[data['interest']] - subject = 'Inquiry about Mozilla %s' % functional_area.subject + subject = _('Welcome to Mozilla!') to = [data['email']] from_ = 'contribute-form@mozilla.org' reply_to = ['contribute@mozilla.org'] From 5e9985b35161d45e006a6f3a2de8ac18a9e21d02 Mon Sep 17 00:00:00 2001 From: Kohei Yoshino Date: Fri, 21 Feb 2014 16:48:20 -0500 Subject: [PATCH 04/23] Fix Bug 962061 - Fix the footer RTL layout (language switcher: ltr direction is hard-coded) --- .../templates/includes/lang_switcher.html | 4 ++-- media/css/firefox/simple_footer.less | 8 +++++-- media/css/sandstone/sandstone-resp.less | 23 +++++++++++++++++++ media/css/sandstone/sandstone.less | 8 +++++++ 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/bedrock/base/templates/includes/lang_switcher.html b/bedrock/base/templates/includes/lang_switcher.html index 8bce4ca6cda..ce0726783f6 100644 --- a/bedrock/base/templates/includes/lang_switcher.html +++ b/bedrock/base/templates/includes/lang_switcher.html @@ -3,13 +3,13 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. -#} {% if translations|length > 1 %} -
    +
+ + + + {% block footer %} + + {% endblock %} + + {% block script %} + + + + + {% endblock %} + + diff --git a/vendor-local/lib/python/rest_framework/templates/rest_framework/form.html b/vendor-local/lib/python/rest_framework/templates/rest_framework/form.html new file mode 100644 index 00000000000..b27f652e98d --- /dev/null +++ b/vendor-local/lib/python/rest_framework/templates/rest_framework/form.html @@ -0,0 +1,13 @@ +{% load rest_framework %} +{% csrf_token %} +{{ form.non_field_errors }} +{% for field in form %} +
+ {{ field.label_tag|add_class:"control-label" }} +
+ {{ field }} + {{ field.help_text }} + +
+
+{% endfor %} diff --git a/vendor-local/lib/python/rest_framework/templates/rest_framework/login.html b/vendor-local/lib/python/rest_framework/templates/rest_framework/login.html new file mode 100644 index 00000000000..b76293279a5 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/templates/rest_framework/login.html @@ -0,0 +1,3 @@ +{% extends "rest_framework/login_base.html" %} + +{# Override this template in your own templates directory to customize #} diff --git a/vendor-local/lib/python/rest_framework/templates/rest_framework/login_base.html b/vendor-local/lib/python/rest_framework/templates/rest_framework/login_base.html new file mode 100644 index 00000000000..be9a0072a84 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/templates/rest_framework/login_base.html @@ -0,0 +1,53 @@ +{% load url from future %} +{% load rest_framework %} + + + + {% block style %} + {% block bootstrap_theme %} + + + {% endblock %} + + {% endblock %} + + + + +
+
+
+
+
+ {% block branding %}

Django REST framework

{% endblock %} +
+
+ +
+
+
+ {% csrf_token %} +
+
+ + +
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
+
+
+ + diff --git a/vendor-local/lib/python/rest_framework/templatetags/__init__.py b/vendor-local/lib/python/rest_framework/templatetags/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/vendor-local/lib/python/rest_framework/templatetags/rest_framework.py b/vendor-local/lib/python/rest_framework/templatetags/rest_framework.py new file mode 100644 index 00000000000..e9c1cdd545b --- /dev/null +++ b/vendor-local/lib/python/rest_framework/templatetags/rest_framework.py @@ -0,0 +1,273 @@ +from __future__ import unicode_literals, absolute_import +from django import template +from django.core.urlresolvers import reverse, NoReverseMatch +from django.http import QueryDict +from django.utils.html import escape +from django.utils.safestring import SafeData, mark_safe +from rest_framework.compat import urlparse, force_text, six, smart_urlquote +import re, string + +register = template.Library() + + +# Note we don't use 'load staticfiles', because we need a 1.3 compatible +# version, so instead we include the `static` template tag ourselves. + +# When 1.3 becomes unsupported by REST framework, we can instead start to +# use the {% load staticfiles %} tag, remove the following code, +# and add a dependency that `django.contrib.staticfiles` must be installed. + +# Note: We can't put this into the `compat` module because the compat import +# from rest_framework.compat import ... +# conflicts with this rest_framework template tag module. + +try: # Django 1.5+ + from django.contrib.staticfiles.templatetags.staticfiles import StaticFilesNode + + @register.tag('static') + def do_static(parser, token): + return StaticFilesNode.handle_token(parser, token) + +except ImportError: + try: # Django 1.4 + from django.contrib.staticfiles.storage import staticfiles_storage + + @register.simple_tag + def static(path): + """ + A template tag that returns the URL to a file + using staticfiles' storage backend + """ + return staticfiles_storage.url(path) + + except ImportError: # Django 1.3 + from urlparse import urljoin + from django import template + from django.templatetags.static import PrefixNode + + class StaticNode(template.Node): + def __init__(self, varname=None, path=None): + if path is None: + raise template.TemplateSyntaxError( + "Static template nodes must be given a path to return.") + self.path = path + self.varname = varname + + def url(self, context): + path = self.path.resolve(context) + return self.handle_simple(path) + + def render(self, context): + url = self.url(context) + if self.varname is None: + return url + context[self.varname] = url + return '' + + @classmethod + def handle_simple(cls, path): + return urljoin(PrefixNode.handle_simple("STATIC_URL"), path) + + @classmethod + def handle_token(cls, parser, token): + """ + Class method to parse prefix node and return a Node. + """ + bits = token.split_contents() + + if len(bits) < 2: + raise template.TemplateSyntaxError( + "'%s' takes at least one argument (path to file)" % bits[0]) + + path = parser.compile_filter(bits[1]) + + if len(bits) >= 2 and bits[-2] == 'as': + varname = bits[3] + else: + varname = None + + return cls(varname, path) + + @register.tag('static') + def do_static_13(parser, token): + return StaticNode.handle_token(parser, token) + + +def replace_query_param(url, key, val): + """ + Given a URL and a key/val pair, set or replace an item in the query + parameters of the URL, and return the new URL. + """ + (scheme, netloc, path, query, fragment) = urlparse.urlsplit(url) + query_dict = QueryDict(query).copy() + query_dict[key] = val + query = query_dict.urlencode() + return urlparse.urlunsplit((scheme, netloc, path, query, fragment)) + + +# Regex for adding classes to html snippets +class_re = re.compile(r'(?<=class=["\'])(.*)(?=["\'])') + + +# And the template tags themselves... + +@register.simple_tag +def optional_login(request): + """ + Include a login snippet if REST framework's login view is in the URLconf. + """ + try: + login_url = reverse('rest_framework:login') + except NoReverseMatch: + return '' + + snippet = "Log in" % (login_url, request.path) + return snippet + + +@register.simple_tag +def optional_logout(request): + """ + Include a logout snippet if REST framework's logout view is in the URLconf. + """ + try: + logout_url = reverse('rest_framework:logout') + except NoReverseMatch: + return '' + + snippet = "Log out" % (logout_url, request.path) + return snippet + + +@register.simple_tag +def add_query_param(request, key, val): + """ + Add a query parameter to the current request url, and return the new url. + """ + return replace_query_param(request.get_full_path(), key, val) + + +@register.filter +def add_class(value, css_class): + """ + http://stackoverflow.com/questions/4124220/django-adding-css-classes-when-rendering-form-fields-in-a-template + + Inserts classes into template variables that contain HTML tags, + useful for modifying forms without needing to change the Form objects. + + Usage: + + {{ field.label_tag|add_class:"control-label" }} + + In the case of REST Framework, the filter is used to add Bootstrap-specific + classes to the forms. + """ + html = six.text_type(value) + match = class_re.search(html) + if match: + m = re.search(r'^%s$|^%s\s|\s%s\s|\s%s$' % (css_class, css_class, + css_class, css_class), + match.group(1)) + if not m: + return mark_safe(class_re.sub(match.group(1) + " " + css_class, + html)) + else: + return mark_safe(html.replace('>', ' class="%s">' % css_class, 1)) + return value + + +# Bunch of stuff cloned from urlize +TRAILING_PUNCTUATION = ['.', ',', ':', ';', '.)', '"', "'"] +WRAPPING_PUNCTUATION = [('(', ')'), ('<', '>'), ('[', ']'), ('<', '>'), + ('"', '"'), ("'", "'")] +word_split_re = re.compile(r'(\s+)') +simple_url_re = re.compile(r'^https?://\[?\w', re.IGNORECASE) +simple_url_2_re = re.compile(r'^www\.|^(?!http)\w[^@]+\.(com|edu|gov|int|mil|net|org)$', re.IGNORECASE) +simple_email_re = re.compile(r'^\S+@\S+\.\S+$') + + +@register.filter +def urlize_quoted_links(text, trim_url_limit=None, nofollow=True, autoescape=True): + """ + Converts any URLs in text into clickable links. + + Works on http://, https://, www. links, and also on links ending in one of + the original seven gTLDs (.com, .edu, .gov, .int, .mil, .net, and .org). + Links can have trailing punctuation (periods, commas, close-parens) and + leading punctuation (opening parens) and it'll still do the right thing. + + If trim_url_limit is not None, the URLs in link text longer than this limit + will truncated to trim_url_limit-3 characters and appended with an elipsis. + + If nofollow is True, the URLs in link text will get a rel="nofollow" + attribute. + + If autoescape is True, the link text and URLs will get autoescaped. + """ + trim_url = lambda x, limit=trim_url_limit: limit is not None and (len(x) > limit and ('%s...' % x[:max(0, limit - 3)])) or x + safe_input = isinstance(text, SafeData) + words = word_split_re.split(force_text(text)) + for i, word in enumerate(words): + match = None + if '.' in word or '@' in word or ':' in word: + # Deal with punctuation. + lead, middle, trail = '', word, '' + for punctuation in TRAILING_PUNCTUATION: + if middle.endswith(punctuation): + middle = middle[:-len(punctuation)] + trail = punctuation + trail + for opening, closing in WRAPPING_PUNCTUATION: + if middle.startswith(opening): + middle = middle[len(opening):] + lead = lead + opening + # Keep parentheses at the end only if they're balanced. + if (middle.endswith(closing) + and middle.count(closing) == middle.count(opening) + 1): + middle = middle[:-len(closing)] + trail = closing + trail + + # Make URL we want to point to. + url = None + nofollow_attr = ' rel="nofollow"' if nofollow else '' + if simple_url_re.match(middle): + url = smart_urlquote(middle) + elif simple_url_2_re.match(middle): + url = smart_urlquote('http://%s' % middle) + elif not ':' in middle and simple_email_re.match(middle): + local, domain = middle.rsplit('@', 1) + try: + domain = domain.encode('idna').decode('ascii') + except UnicodeError: + continue + url = 'mailto:%s@%s' % (local, domain) + nofollow_attr = '' + + # Make link. + if url: + trimmed = trim_url(middle) + if autoescape and not safe_input: + lead, trail = escape(lead), escape(trail) + url, trimmed = escape(url), escape(trimmed) + middle = '%s' % (url, nofollow_attr, trimmed) + words[i] = mark_safe('%s%s%s' % (lead, middle, trail)) + else: + if safe_input: + words[i] = mark_safe(word) + elif autoescape: + words[i] = escape(word) + elif safe_input: + words[i] = mark_safe(word) + elif autoescape: + words[i] = escape(word) + return ''.join(words) + + +@register.filter +def break_long_headers(header): + """ + Breaks headers longer than 160 characters (~page length) + when possible (are comma separated) + """ + if len(header) > 160 and ',' in header: + header = mark_safe('
' + ',
'.join(header.split(','))) + return header diff --git a/vendor-local/lib/python/rest_framework/test.py b/vendor-local/lib/python/rest_framework/test.py new file mode 100644 index 00000000000..a18f5a29386 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/test.py @@ -0,0 +1,157 @@ +# -- coding: utf-8 -- + +# Note that we import as `DjangoRequestFactory` and `DjangoClient` in order +# to make it harder for the user to import the wrong thing without realizing. +from __future__ import unicode_literals +import django +from django.conf import settings +from django.test.client import Client as DjangoClient +from django.test.client import ClientHandler +from django.test import testcases +from rest_framework.settings import api_settings +from rest_framework.compat import RequestFactory as DjangoRequestFactory +from rest_framework.compat import force_bytes_or_smart_bytes, six + + +def force_authenticate(request, user=None, token=None): + request._force_auth_user = user + request._force_auth_token = token + + +class APIRequestFactory(DjangoRequestFactory): + renderer_classes_list = api_settings.TEST_REQUEST_RENDERER_CLASSES + default_format = api_settings.TEST_REQUEST_DEFAULT_FORMAT + + def __init__(self, enforce_csrf_checks=False, **defaults): + self.enforce_csrf_checks = enforce_csrf_checks + self.renderer_classes = {} + for cls in self.renderer_classes_list: + self.renderer_classes[cls.format] = cls + super(APIRequestFactory, self).__init__(**defaults) + + def _encode_data(self, data, format=None, content_type=None): + """ + Encode the data returning a two tuple of (bytes, content_type) + """ + + if not data: + return ('', None) + + assert format is None or content_type is None, ( + 'You may not set both `format` and `content_type`.' + ) + + if content_type: + # Content type specified explicitly, treat data as a raw bytestring + ret = force_bytes_or_smart_bytes(data, settings.DEFAULT_CHARSET) + + else: + format = format or self.default_format + + assert format in self.renderer_classes, ("Invalid format '{0}'. " + "Available formats are {1}. Set TEST_REQUEST_RENDERER_CLASSES " + "to enable extra request formats.".format( + format, + ', '.join(["'" + fmt + "'" for fmt in self.renderer_classes.keys()]) + ) + ) + + # Use format and render the data into a bytestring + renderer = self.renderer_classes[format]() + ret = renderer.render(data) + + # Determine the content-type header from the renderer + content_type = "{0}; charset={1}".format( + renderer.media_type, renderer.charset + ) + + # Coerce text to bytes if required. + if isinstance(ret, six.text_type): + ret = bytes(ret.encode(renderer.charset)) + + return ret, content_type + + def post(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('POST', path, data, content_type, **extra) + + def put(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('PUT', path, data, content_type, **extra) + + def patch(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('PATCH', path, data, content_type, **extra) + + def delete(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('DELETE', path, data, content_type, **extra) + + def options(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('OPTIONS', path, data, content_type, **extra) + + def request(self, **kwargs): + request = super(APIRequestFactory, self).request(**kwargs) + request._dont_enforce_csrf_checks = not self.enforce_csrf_checks + return request + + +class ForceAuthClientHandler(ClientHandler): + """ + A patched version of ClientHandler that can enforce authentication + on the outgoing requests. + """ + + def __init__(self, *args, **kwargs): + self._force_user = None + self._force_token = None + super(ForceAuthClientHandler, self).__init__(*args, **kwargs) + + def get_response(self, request): + # This is the simplest place we can hook into to patch the + # request object. + force_authenticate(request, self._force_user, self._force_token) + return super(ForceAuthClientHandler, self).get_response(request) + + +class APIClient(APIRequestFactory, DjangoClient): + def __init__(self, enforce_csrf_checks=False, **defaults): + super(APIClient, self).__init__(**defaults) + self.handler = ForceAuthClientHandler(enforce_csrf_checks) + self._credentials = {} + + def credentials(self, **kwargs): + """ + Sets headers that will be used on every outgoing request. + """ + self._credentials = kwargs + + def force_authenticate(self, user=None, token=None): + """ + Forcibly authenticates outgoing requests with the given + user and/or token. + """ + self.handler._force_user = user + self.handler._force_token = token + + def request(self, **kwargs): + # Ensure that any credentials set get added to every request. + kwargs.update(self._credentials) + return super(APIClient, self).request(**kwargs) + + +class APITransactionTestCase(testcases.TransactionTestCase): + client_class = APIClient + + +class APITestCase(testcases.TestCase): + client_class = APIClient + + +if django.VERSION >= (1, 4): + class APISimpleTestCase(testcases.SimpleTestCase): + client_class = APIClient + + class APILiveServerTestCase(testcases.LiveServerTestCase): + client_class = APIClient diff --git a/vendor-local/lib/python/rest_framework/tests/__init__.py b/vendor-local/lib/python/rest_framework/tests/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/vendor-local/lib/python/rest_framework/tests/description.py b/vendor-local/lib/python/rest_framework/tests/description.py new file mode 100644 index 00000000000..b46d7f54d8a --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/description.py @@ -0,0 +1,26 @@ +# -- coding: utf-8 -- + +# Apparently there is a python 2.6 issue where docstrings of imported view classes +# do not retain their encoding information even if a module has a proper +# encoding declaration at the top of its source file. Therefore for tests +# to catch unicode related errors, a mock view has to be declared in a separate +# module. + +from rest_framework.views import APIView + + +# test strings snatched from http://www.columbia.edu/~fdc/utf8/, +# http://winrus.com/utf8-jap.htm and memory +UTF8_TEST_DOCSTRING = ( + 'zażółć gęślą jaźń' + 'Sîne klâwen durh die wolken sint geslagen' + 'Τη γλώσσα μου έδωσαν ελληνική' + 'யாமறிந்த மொழிகளிலே தமிழ்மொழி' + 'На берегу пустынных волн' + 'てすと' + 'アイウエオカキクケコサシスセソタチツテ' +) + + +class ViewWithNonASCIICharactersInDocstring(APIView): + __doc__ = UTF8_TEST_DOCSTRING diff --git a/vendor-local/lib/python/rest_framework/tests/extras/__init__.py b/vendor-local/lib/python/rest_framework/tests/extras/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/vendor-local/lib/python/rest_framework/tests/extras/bad_import.py b/vendor-local/lib/python/rest_framework/tests/extras/bad_import.py new file mode 100644 index 00000000000..68263d9474e --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/extras/bad_import.py @@ -0,0 +1 @@ +raise ValueError diff --git a/vendor-local/lib/python/rest_framework/tests/models.py b/vendor-local/lib/python/rest_framework/tests/models.py new file mode 100644 index 00000000000..1598ecd94ac --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/models.py @@ -0,0 +1,169 @@ +from __future__ import unicode_literals +from django.db import models +from django.utils.translation import ugettext_lazy as _ +from rest_framework import serializers + + +def foobar(): + return 'foobar' + + +class CustomField(models.CharField): + + def __init__(self, *args, **kwargs): + kwargs['max_length'] = 12 + super(CustomField, self).__init__(*args, **kwargs) + + +class RESTFrameworkModel(models.Model): + """ + Base for test models that sets app_label, so they play nicely. + """ + class Meta: + app_label = 'tests' + abstract = True + + +class HasPositiveIntegerAsChoice(RESTFrameworkModel): + some_choices = ((1, 'A'), (2, 'B'), (3, 'C')) + some_integer = models.PositiveIntegerField(choices=some_choices) + + +class Anchor(RESTFrameworkModel): + text = models.CharField(max_length=100, default='anchor') + + +class BasicModel(RESTFrameworkModel): + text = models.CharField(max_length=100, verbose_name=_("Text comes here"), help_text=_("Text description.")) + + +class SlugBasedModel(RESTFrameworkModel): + text = models.CharField(max_length=100) + slug = models.SlugField(max_length=32) + + +class DefaultValueModel(RESTFrameworkModel): + text = models.CharField(default='foobar', max_length=100) + extra = models.CharField(blank=True, null=True, max_length=100) + + +class CallableDefaultValueModel(RESTFrameworkModel): + text = models.CharField(default=foobar, max_length=100) + + +class ManyToManyModel(RESTFrameworkModel): + rel = models.ManyToManyField(Anchor, help_text='Some help text.') + + +class ReadOnlyManyToManyModel(RESTFrameworkModel): + text = models.CharField(max_length=100, default='anchor') + rel = models.ManyToManyField(Anchor) + + +# Model for regression test for #285 + +class Comment(RESTFrameworkModel): + email = models.EmailField() + content = models.CharField(max_length=200) + created = models.DateTimeField(auto_now_add=True) + + +class ActionItem(RESTFrameworkModel): + title = models.CharField(max_length=200) + done = models.BooleanField(default=False) + info = CustomField(default='---', max_length=12) + + +# Models for reverse relations +class Person(RESTFrameworkModel): + name = models.CharField(max_length=10) + age = models.IntegerField(null=True, blank=True) + + @property + def info(self): + return { + 'name': self.name, + 'age': self.age, + } + + +class BlogPost(RESTFrameworkModel): + title = models.CharField(max_length=100) + writer = models.ForeignKey(Person, null=True, blank=True) + + def get_first_comment(self): + return self.blogpostcomment_set.all()[0] + + +class BlogPostComment(RESTFrameworkModel): + text = models.TextField() + blog_post = models.ForeignKey(BlogPost) + + +class Album(RESTFrameworkModel): + title = models.CharField(max_length=100, unique=True) + + +class Photo(RESTFrameworkModel): + description = models.TextField() + album = models.ForeignKey(Album) + + +# Model for issue #324 +class BlankFieldModel(RESTFrameworkModel): + title = models.CharField(max_length=100, blank=True, null=False) + + +# Model for issue #380 +class OptionalRelationModel(RESTFrameworkModel): + other = models.ForeignKey('OptionalRelationModel', blank=True, null=True) + + +# Model for RegexField +class Book(RESTFrameworkModel): + isbn = models.CharField(max_length=13) + + +# Models for relations tests +# ManyToMany +class ManyToManyTarget(RESTFrameworkModel): + name = models.CharField(max_length=100) + + +class ManyToManySource(RESTFrameworkModel): + name = models.CharField(max_length=100) + targets = models.ManyToManyField(ManyToManyTarget, related_name='sources') + + +# ForeignKey +class ForeignKeyTarget(RESTFrameworkModel): + name = models.CharField(max_length=100) + + +class ForeignKeySource(RESTFrameworkModel): + name = models.CharField(max_length=100) + target = models.ForeignKey(ForeignKeyTarget, related_name='sources') + + +# Nullable ForeignKey +class NullableForeignKeySource(RESTFrameworkModel): + name = models.CharField(max_length=100) + target = models.ForeignKey(ForeignKeyTarget, null=True, blank=True, + related_name='nullable_sources') + + +# OneToOne +class OneToOneTarget(RESTFrameworkModel): + name = models.CharField(max_length=100) + + +class NullableOneToOneSource(RESTFrameworkModel): + name = models.CharField(max_length=100) + target = models.OneToOneField(OneToOneTarget, null=True, blank=True, + related_name='nullable_source') + + +# Serializer used to test BasicModel +class BasicModelSerializer(serializers.ModelSerializer): + class Meta: + model = BasicModel diff --git a/vendor-local/lib/python/rest_framework/tests/test_authentication.py b/vendor-local/lib/python/rest_framework/tests/test_authentication.py new file mode 100644 index 00000000000..a44813b6910 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_authentication.py @@ -0,0 +1,635 @@ +from __future__ import unicode_literals +from django.contrib.auth.models import User +from django.http import HttpResponse +from django.test import TestCase +from django.utils import unittest +from rest_framework import HTTP_HEADER_ENCODING +from rest_framework import exceptions +from rest_framework import permissions +from rest_framework import renderers +from rest_framework.response import Response +from rest_framework import status +from rest_framework.authentication import ( + BaseAuthentication, + TokenAuthentication, + BasicAuthentication, + SessionAuthentication, + OAuthAuthentication, + OAuth2Authentication +) +from rest_framework.authtoken.models import Token +from rest_framework.compat import patterns, url, include +from rest_framework.compat import oauth2_provider, oauth2_provider_models, oauth2_provider_scope +from rest_framework.compat import oauth, oauth_provider +from rest_framework.test import APIRequestFactory, APIClient +from rest_framework.views import APIView +import base64 +import time +import datetime + +factory = APIRequestFactory() + + +class MockView(APIView): + permission_classes = (permissions.IsAuthenticated,) + + def get(self, request): + return HttpResponse({'a': 1, 'b': 2, 'c': 3}) + + def post(self, request): + return HttpResponse({'a': 1, 'b': 2, 'c': 3}) + + def put(self, request): + return HttpResponse({'a': 1, 'b': 2, 'c': 3}) + + +urlpatterns = patterns('', + (r'^session/$', MockView.as_view(authentication_classes=[SessionAuthentication])), + (r'^basic/$', MockView.as_view(authentication_classes=[BasicAuthentication])), + (r'^token/$', MockView.as_view(authentication_classes=[TokenAuthentication])), + (r'^auth-token/$', 'rest_framework.authtoken.views.obtain_auth_token'), + (r'^oauth/$', MockView.as_view(authentication_classes=[OAuthAuthentication])), + (r'^oauth-with-scope/$', MockView.as_view(authentication_classes=[OAuthAuthentication], + permission_classes=[permissions.TokenHasReadWriteScope])) +) + +if oauth2_provider is not None: + urlpatterns += patterns('', + url(r'^oauth2/', include('provider.oauth2.urls', namespace='oauth2')), + url(r'^oauth2-test/$', MockView.as_view(authentication_classes=[OAuth2Authentication])), + url(r'^oauth2-with-scope-test/$', MockView.as_view(authentication_classes=[OAuth2Authentication], + permission_classes=[permissions.TokenHasReadWriteScope])), + ) + + +class BasicAuthTests(TestCase): + """Basic authentication""" + urls = 'rest_framework.tests.test_authentication' + + def setUp(self): + self.csrf_client = APIClient(enforce_csrf_checks=True) + self.username = 'john' + self.email = 'lennon@thebeatles.com' + self.password = 'password' + self.user = User.objects.create_user(self.username, self.email, self.password) + + def test_post_form_passing_basic_auth(self): + """Ensure POSTing json over basic auth with correct credentials passes and does not require CSRF""" + credentials = ('%s:%s' % (self.username, self.password)) + base64_credentials = base64.b64encode(credentials.encode(HTTP_HEADER_ENCODING)).decode(HTTP_HEADER_ENCODING) + auth = 'Basic %s' % base64_credentials + response = self.csrf_client.post('/basic/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_post_json_passing_basic_auth(self): + """Ensure POSTing form over basic auth with correct credentials passes and does not require CSRF""" + credentials = ('%s:%s' % (self.username, self.password)) + base64_credentials = base64.b64encode(credentials.encode(HTTP_HEADER_ENCODING)).decode(HTTP_HEADER_ENCODING) + auth = 'Basic %s' % base64_credentials + response = self.csrf_client.post('/basic/', {'example': 'example'}, format='json', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_post_form_failing_basic_auth(self): + """Ensure POSTing form over basic auth without correct credentials fails""" + response = self.csrf_client.post('/basic/', {'example': 'example'}) + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + + def test_post_json_failing_basic_auth(self): + """Ensure POSTing json over basic auth without correct credentials fails""" + response = self.csrf_client.post('/basic/', {'example': 'example'}, format='json') + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + self.assertEqual(response['WWW-Authenticate'], 'Basic realm="api"') + + +class SessionAuthTests(TestCase): + """User session authentication""" + urls = 'rest_framework.tests.test_authentication' + + def setUp(self): + self.csrf_client = APIClient(enforce_csrf_checks=True) + self.non_csrf_client = APIClient(enforce_csrf_checks=False) + self.username = 'john' + self.email = 'lennon@thebeatles.com' + self.password = 'password' + self.user = User.objects.create_user(self.username, self.email, self.password) + + def tearDown(self): + self.csrf_client.logout() + + def test_post_form_session_auth_failing_csrf(self): + """ + Ensure POSTing form over session authentication without CSRF token fails. + """ + self.csrf_client.login(username=self.username, password=self.password) + response = self.csrf_client.post('/session/', {'example': 'example'}) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_post_form_session_auth_passing(self): + """ + Ensure POSTing form over session authentication with logged in user and CSRF token passes. + """ + self.non_csrf_client.login(username=self.username, password=self.password) + response = self.non_csrf_client.post('/session/', {'example': 'example'}) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_put_form_session_auth_passing(self): + """ + Ensure PUTting form over session authentication with logged in user and CSRF token passes. + """ + self.non_csrf_client.login(username=self.username, password=self.password) + response = self.non_csrf_client.put('/session/', {'example': 'example'}) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_post_form_session_auth_failing(self): + """ + Ensure POSTing form over session authentication without logged in user fails. + """ + response = self.csrf_client.post('/session/', {'example': 'example'}) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + +class TokenAuthTests(TestCase): + """Token authentication""" + urls = 'rest_framework.tests.test_authentication' + + def setUp(self): + self.csrf_client = APIClient(enforce_csrf_checks=True) + self.username = 'john' + self.email = 'lennon@thebeatles.com' + self.password = 'password' + self.user = User.objects.create_user(self.username, self.email, self.password) + + self.key = 'abcd1234' + self.token = Token.objects.create(key=self.key, user=self.user) + + def test_post_form_passing_token_auth(self): + """Ensure POSTing json over token auth with correct credentials passes and does not require CSRF""" + auth = 'Token ' + self.key + response = self.csrf_client.post('/token/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_post_json_passing_token_auth(self): + """Ensure POSTing form over token auth with correct credentials passes and does not require CSRF""" + auth = "Token " + self.key + response = self.csrf_client.post('/token/', {'example': 'example'}, format='json', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_post_form_failing_token_auth(self): + """Ensure POSTing form over token auth without correct credentials fails""" + response = self.csrf_client.post('/token/', {'example': 'example'}) + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + + def test_post_json_failing_token_auth(self): + """Ensure POSTing json over token auth without correct credentials fails""" + response = self.csrf_client.post('/token/', {'example': 'example'}, format='json') + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + + def test_token_has_auto_assigned_key_if_none_provided(self): + """Ensure creating a token with no key will auto-assign a key""" + self.token.delete() + token = Token.objects.create(user=self.user) + self.assertTrue(bool(token.key)) + + def test_token_login_json(self): + """Ensure token login view using JSON POST works.""" + client = APIClient(enforce_csrf_checks=True) + response = client.post('/auth-token/', + {'username': self.username, 'password': self.password}, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['token'], self.key) + + def test_token_login_json_bad_creds(self): + """Ensure token login view using JSON POST fails if bad credentials are used.""" + client = APIClient(enforce_csrf_checks=True) + response = client.post('/auth-token/', + {'username': self.username, 'password': "badpass"}, format='json') + self.assertEqual(response.status_code, 400) + + def test_token_login_json_missing_fields(self): + """Ensure token login view using JSON POST fails if missing fields.""" + client = APIClient(enforce_csrf_checks=True) + response = client.post('/auth-token/', + {'username': self.username}, format='json') + self.assertEqual(response.status_code, 400) + + def test_token_login_form(self): + """Ensure token login view using form POST works.""" + client = APIClient(enforce_csrf_checks=True) + response = client.post('/auth-token/', + {'username': self.username, 'password': self.password}) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['token'], self.key) + + +class IncorrectCredentialsTests(TestCase): + def test_incorrect_credentials(self): + """ + If a request contains bad authentication credentials, then + authentication should run and error, even if no permissions + are set on the view. + """ + class IncorrectCredentialsAuth(BaseAuthentication): + def authenticate(self, request): + raise exceptions.AuthenticationFailed('Bad credentials') + + request = factory.get('/') + view = MockView.as_view( + authentication_classes=(IncorrectCredentialsAuth,), + permission_classes=() + ) + response = view(request) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertEqual(response.data, {'detail': 'Bad credentials'}) + + +class OAuthTests(TestCase): + """OAuth 1.0a authentication""" + urls = 'rest_framework.tests.test_authentication' + + def setUp(self): + # these imports are here because oauth is optional and hiding them in try..except block or compat + # could obscure problems if something breaks + from oauth_provider.models import Consumer, Resource + from oauth_provider.models import Token as OAuthToken + from oauth_provider import consts + + self.consts = consts + + self.csrf_client = APIClient(enforce_csrf_checks=True) + self.username = 'john' + self.email = 'lennon@thebeatles.com' + self.password = 'password' + self.user = User.objects.create_user(self.username, self.email, self.password) + + self.CONSUMER_KEY = 'consumer_key' + self.CONSUMER_SECRET = 'consumer_secret' + self.TOKEN_KEY = "token_key" + self.TOKEN_SECRET = "token_secret" + + self.consumer = Consumer.objects.create(key=self.CONSUMER_KEY, secret=self.CONSUMER_SECRET, + name='example', user=self.user, status=self.consts.ACCEPTED) + + self.resource = Resource.objects.create(name="resource name", url="api/") + self.token = OAuthToken.objects.create(user=self.user, consumer=self.consumer, resource=self.resource, + token_type=OAuthToken.ACCESS, key=self.TOKEN_KEY, secret=self.TOKEN_SECRET, is_approved=True + ) + + def _create_authorization_header(self): + params = { + 'oauth_version': "1.0", + 'oauth_nonce': oauth.generate_nonce(), + 'oauth_timestamp': int(time.time()), + 'oauth_token': self.token.key, + 'oauth_consumer_key': self.consumer.key + } + + req = oauth.Request(method="GET", url="http://example.com", parameters=params) + + signature_method = oauth.SignatureMethod_PLAINTEXT() + req.sign_request(signature_method, self.consumer, self.token) + + return req.to_header()["Authorization"] + + def _create_authorization_url_parameters(self): + params = { + 'oauth_version': "1.0", + 'oauth_nonce': oauth.generate_nonce(), + 'oauth_timestamp': int(time.time()), + 'oauth_token': self.token.key, + 'oauth_consumer_key': self.consumer.key + } + + req = oauth.Request(method="GET", url="http://example.com", parameters=params) + + signature_method = oauth.SignatureMethod_PLAINTEXT() + req.sign_request(signature_method, self.consumer, self.token) + return dict(req) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_post_form_passing_oauth(self): + """Ensure POSTing form over OAuth with correct credentials passes and does not require CSRF""" + auth = self._create_authorization_header() + response = self.csrf_client.post('/oauth/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 200) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_post_form_repeated_nonce_failing_oauth(self): + """Ensure POSTing form over OAuth with repeated auth (same nonces and timestamp) credentials fails""" + auth = self._create_authorization_header() + response = self.csrf_client.post('/oauth/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 200) + + # simulate reply attack auth header containes already used (nonce, timestamp) pair + response = self.csrf_client.post('/oauth/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) + self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_post_form_token_removed_failing_oauth(self): + """Ensure POSTing when there is no OAuth access token in db fails""" + self.token.delete() + auth = self._create_authorization_header() + response = self.csrf_client.post('/oauth/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) + self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_post_form_consumer_status_not_accepted_failing_oauth(self): + """Ensure POSTing when consumer status is anything other than ACCEPTED fails""" + for consumer_status in (self.consts.CANCELED, self.consts.PENDING, self.consts.REJECTED): + self.consumer.status = consumer_status + self.consumer.save() + + auth = self._create_authorization_header() + response = self.csrf_client.post('/oauth/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) + self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_post_form_with_request_token_failing_oauth(self): + """Ensure POSTing with unauthorized request token instead of access token fails""" + self.token.token_type = self.token.REQUEST + self.token.save() + + auth = self._create_authorization_header() + response = self.csrf_client.post('/oauth/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) + self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_post_form_with_urlencoded_parameters(self): + """Ensure POSTing with x-www-form-urlencoded auth parameters passes""" + params = self._create_authorization_url_parameters() + response = self.csrf_client.post('/oauth/', params) + self.assertEqual(response.status_code, 200) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_get_form_with_url_parameters(self): + """Ensure GETing with auth in url parameters passes""" + params = self._create_authorization_url_parameters() + response = self.csrf_client.get('/oauth/', params) + self.assertEqual(response.status_code, 200) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_post_hmac_sha1_signature_passes(self): + """Ensure POSTing using HMAC_SHA1 signature method passes""" + params = { + 'oauth_version': "1.0", + 'oauth_nonce': oauth.generate_nonce(), + 'oauth_timestamp': int(time.time()), + 'oauth_token': self.token.key, + 'oauth_consumer_key': self.consumer.key + } + + req = oauth.Request(method="POST", url="http://testserver/oauth/", parameters=params) + + signature_method = oauth.SignatureMethod_HMAC_SHA1() + req.sign_request(signature_method, self.consumer, self.token) + auth = req.to_header()["Authorization"] + + response = self.csrf_client.post('/oauth/', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 200) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_get_form_with_readonly_resource_passing_auth(self): + """Ensure POSTing with a readonly resource instead of a write scope fails""" + read_only_access_token = self.token + read_only_access_token.resource.is_readonly = True + read_only_access_token.resource.save() + params = self._create_authorization_url_parameters() + response = self.csrf_client.get('/oauth-with-scope/', params) + self.assertEqual(response.status_code, 200) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_post_form_with_readonly_resource_failing_auth(self): + """Ensure POSTing with a readonly resource instead of a write scope fails""" + read_only_access_token = self.token + read_only_access_token.resource.is_readonly = True + read_only_access_token.resource.save() + params = self._create_authorization_url_parameters() + response = self.csrf_client.post('/oauth-with-scope/', params) + self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_post_form_with_write_resource_passing_auth(self): + """Ensure POSTing with a write resource succeed""" + read_write_access_token = self.token + read_write_access_token.resource.is_readonly = False + read_write_access_token.resource.save() + params = self._create_authorization_url_parameters() + response = self.csrf_client.post('/oauth-with-scope/', params) + self.assertEqual(response.status_code, 200) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_bad_consumer_key(self): + """Ensure POSTing using HMAC_SHA1 signature method passes""" + params = { + 'oauth_version': "1.0", + 'oauth_nonce': oauth.generate_nonce(), + 'oauth_timestamp': int(time.time()), + 'oauth_token': self.token.key, + 'oauth_consumer_key': 'badconsumerkey' + } + + req = oauth.Request(method="POST", url="http://testserver/oauth/", parameters=params) + + signature_method = oauth.SignatureMethod_HMAC_SHA1() + req.sign_request(signature_method, self.consumer, self.token) + auth = req.to_header()["Authorization"] + + response = self.csrf_client.post('/oauth/', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 401) + + @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') + @unittest.skipUnless(oauth, 'oauth2 not installed') + def test_bad_token_key(self): + """Ensure POSTing using HMAC_SHA1 signature method passes""" + params = { + 'oauth_version': "1.0", + 'oauth_nonce': oauth.generate_nonce(), + 'oauth_timestamp': int(time.time()), + 'oauth_token': 'badtokenkey', + 'oauth_consumer_key': self.consumer.key + } + + req = oauth.Request(method="POST", url="http://testserver/oauth/", parameters=params) + + signature_method = oauth.SignatureMethod_HMAC_SHA1() + req.sign_request(signature_method, self.consumer, self.token) + auth = req.to_header()["Authorization"] + + response = self.csrf_client.post('/oauth/', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 401) + + +class OAuth2Tests(TestCase): + """OAuth 2.0 authentication""" + urls = 'rest_framework.tests.test_authentication' + + def setUp(self): + self.csrf_client = APIClient(enforce_csrf_checks=True) + self.username = 'john' + self.email = 'lennon@thebeatles.com' + self.password = 'password' + self.user = User.objects.create_user(self.username, self.email, self.password) + + self.CLIENT_ID = 'client_key' + self.CLIENT_SECRET = 'client_secret' + self.ACCESS_TOKEN = "access_token" + self.REFRESH_TOKEN = "refresh_token" + + self.oauth2_client = oauth2_provider_models.Client.objects.create( + client_id=self.CLIENT_ID, + client_secret=self.CLIENT_SECRET, + redirect_uri='', + client_type=0, + name='example', + user=None, + ) + + self.access_token = oauth2_provider_models.AccessToken.objects.create( + token=self.ACCESS_TOKEN, + client=self.oauth2_client, + user=self.user, + ) + self.refresh_token = oauth2_provider_models.RefreshToken.objects.create( + user=self.user, + access_token=self.access_token, + client=self.oauth2_client + ) + + def _create_authorization_header(self, token=None): + return "Bearer {0}".format(token or self.access_token.token) + + @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') + def test_get_form_with_wrong_authorization_header_token_type_failing(self): + """Ensure that a wrong token type lead to the correct HTTP error status code""" + auth = "Wrong token-type-obsviously" + response = self.csrf_client.get('/oauth2-test/', {}, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 401) + response = self.csrf_client.get('/oauth2-test/', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 401) + + @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') + def test_get_form_with_wrong_authorization_header_token_format_failing(self): + """Ensure that a wrong token format lead to the correct HTTP error status code""" + auth = "Bearer wrong token format" + response = self.csrf_client.get('/oauth2-test/', {}, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 401) + response = self.csrf_client.get('/oauth2-test/', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 401) + + @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') + def test_get_form_with_wrong_authorization_header_token_failing(self): + """Ensure that a wrong token lead to the correct HTTP error status code""" + auth = "Bearer wrong-token" + response = self.csrf_client.get('/oauth2-test/', {}, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 401) + response = self.csrf_client.get('/oauth2-test/', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 401) + + @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') + def test_get_form_passing_auth(self): + """Ensure GETing form over OAuth with correct client credentials succeed""" + auth = self._create_authorization_header() + response = self.csrf_client.get('/oauth2-test/', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 200) + + @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') + def test_post_form_passing_auth(self): + """Ensure POSTing form over OAuth with correct credentials passes and does not require CSRF""" + auth = self._create_authorization_header() + response = self.csrf_client.post('/oauth2-test/', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 200) + + @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') + def test_post_form_token_removed_failing_auth(self): + """Ensure POSTing when there is no OAuth access token in db fails""" + self.access_token.delete() + auth = self._create_authorization_header() + response = self.csrf_client.post('/oauth2-test/', HTTP_AUTHORIZATION=auth) + self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) + + @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') + def test_post_form_with_refresh_token_failing_auth(self): + """Ensure POSTing with refresh token instead of access token fails""" + auth = self._create_authorization_header(token=self.refresh_token.token) + response = self.csrf_client.post('/oauth2-test/', HTTP_AUTHORIZATION=auth) + self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) + + @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') + def test_post_form_with_expired_access_token_failing_auth(self): + """Ensure POSTing with expired access token fails with an 'Invalid token' error""" + self.access_token.expires = datetime.datetime.now() - datetime.timedelta(seconds=10) # 10 seconds late + self.access_token.save() + auth = self._create_authorization_header() + response = self.csrf_client.post('/oauth2-test/', HTTP_AUTHORIZATION=auth) + self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) + self.assertIn('Invalid token', response.content) + + @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') + def test_post_form_with_invalid_scope_failing_auth(self): + """Ensure POSTing with a readonly scope instead of a write scope fails""" + read_only_access_token = self.access_token + read_only_access_token.scope = oauth2_provider_scope.SCOPE_NAME_DICT['read'] + read_only_access_token.save() + auth = self._create_authorization_header(token=read_only_access_token.token) + response = self.csrf_client.get('/oauth2-with-scope-test/', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 200) + response = self.csrf_client.post('/oauth2-with-scope-test/', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') + def test_post_form_with_valid_scope_passing_auth(self): + """Ensure POSTing with a write scope succeed""" + read_write_access_token = self.access_token + read_write_access_token.scope = oauth2_provider_scope.SCOPE_NAME_DICT['write'] + read_write_access_token.save() + auth = self._create_authorization_header(token=read_write_access_token.token) + response = self.csrf_client.post('/oauth2-with-scope-test/', HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 200) + + +class FailingAuthAccessedInRenderer(TestCase): + def setUp(self): + class AuthAccessingRenderer(renderers.BaseRenderer): + media_type = 'text/plain' + format = 'txt' + + def render(self, data, media_type=None, renderer_context=None): + request = renderer_context['request'] + if request.user.is_authenticated(): + return b'authenticated' + return b'not authenticated' + + class FailingAuth(BaseAuthentication): + def authenticate(self, request): + raise exceptions.AuthenticationFailed('authentication failed') + + class ExampleView(APIView): + authentication_classes = (FailingAuth,) + renderer_classes = (AuthAccessingRenderer,) + + def get(self, request): + return Response({'foo': 'bar'}) + + self.view = ExampleView.as_view() + + def test_failing_auth_accessed_in_renderer(self): + """ + When authentication fails the renderer should still be able to access + `request.user` without raising an exception. Particularly relevant + to HTML responses that might reasonably access `request.user`. + """ + request = factory.get('/') + response = self.view(request) + content = response.render().content + self.assertEqual(content, b'not authenticated') diff --git a/vendor-local/lib/python/rest_framework/tests/test_breadcrumbs.py b/vendor-local/lib/python/rest_framework/tests/test_breadcrumbs.py new file mode 100644 index 00000000000..41ddf2ceac6 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_breadcrumbs.py @@ -0,0 +1,73 @@ +from __future__ import unicode_literals +from django.test import TestCase +from rest_framework.compat import patterns, url +from rest_framework.utils.breadcrumbs import get_breadcrumbs +from rest_framework.views import APIView + + +class Root(APIView): + pass + + +class ResourceRoot(APIView): + pass + + +class ResourceInstance(APIView): + pass + + +class NestedResourceRoot(APIView): + pass + + +class NestedResourceInstance(APIView): + pass + +urlpatterns = patterns('', + url(r'^$', Root.as_view()), + url(r'^resource/$', ResourceRoot.as_view()), + url(r'^resource/(?P[0-9]+)$', ResourceInstance.as_view()), + url(r'^resource/(?P[0-9]+)/$', NestedResourceRoot.as_view()), + url(r'^resource/(?P[0-9]+)/(?P[A-Za-z]+)$', NestedResourceInstance.as_view()), +) + + +class BreadcrumbTests(TestCase): + """Tests the breadcrumb functionality used by the HTML renderer.""" + + urls = 'rest_framework.tests.test_breadcrumbs' + + def test_root_breadcrumbs(self): + url = '/' + self.assertEqual(get_breadcrumbs(url), [('Root', '/')]) + + def test_resource_root_breadcrumbs(self): + url = '/resource/' + self.assertEqual(get_breadcrumbs(url), [('Root', '/'), + ('Resource Root', '/resource/')]) + + def test_resource_instance_breadcrumbs(self): + url = '/resource/123' + self.assertEqual(get_breadcrumbs(url), [('Root', '/'), + ('Resource Root', '/resource/'), + ('Resource Instance', '/resource/123')]) + + def test_nested_resource_breadcrumbs(self): + url = '/resource/123/' + self.assertEqual(get_breadcrumbs(url), [('Root', '/'), + ('Resource Root', '/resource/'), + ('Resource Instance', '/resource/123'), + ('Nested Resource Root', '/resource/123/')]) + + def test_nested_resource_instance_breadcrumbs(self): + url = '/resource/123/abc' + self.assertEqual(get_breadcrumbs(url), [('Root', '/'), + ('Resource Root', '/resource/'), + ('Resource Instance', '/resource/123'), + ('Nested Resource Root', '/resource/123/'), + ('Nested Resource Instance', '/resource/123/abc')]) + + def test_broken_url_breadcrumbs_handled_gracefully(self): + url = '/foobar' + self.assertEqual(get_breadcrumbs(url), [('Root', '/')]) diff --git a/vendor-local/lib/python/rest_framework/tests/test_decorators.py b/vendor-local/lib/python/rest_framework/tests/test_decorators.py new file mode 100644 index 00000000000..195f0ba3e46 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_decorators.py @@ -0,0 +1,157 @@ +from __future__ import unicode_literals +from django.test import TestCase +from rest_framework import status +from rest_framework.authentication import BasicAuthentication +from rest_framework.parsers import JSONParser +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response +from rest_framework.renderers import JSONRenderer +from rest_framework.test import APIRequestFactory +from rest_framework.throttling import UserRateThrottle +from rest_framework.views import APIView +from rest_framework.decorators import ( + api_view, + renderer_classes, + parser_classes, + authentication_classes, + throttle_classes, + permission_classes, +) + + +class DecoratorTestCase(TestCase): + + def setUp(self): + self.factory = APIRequestFactory() + + def _finalize_response(self, request, response, *args, **kwargs): + response.request = request + return APIView.finalize_response(self, request, response, *args, **kwargs) + + def test_api_view_incorrect(self): + """ + If @api_view is not applied correct, we should raise an assertion. + """ + + @api_view + def view(request): + return Response() + + request = self.factory.get('/') + self.assertRaises(AssertionError, view, request) + + def test_api_view_incorrect_arguments(self): + """ + If @api_view is missing arguments, we should raise an assertion. + """ + + with self.assertRaises(AssertionError): + @api_view('GET') + def view(request): + return Response() + + def test_calling_method(self): + + @api_view(['GET']) + def view(request): + return Response({}) + + request = self.factory.get('/') + response = view(request) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + request = self.factory.post('/') + response = view(request) + self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + + def test_calling_put_method(self): + + @api_view(['GET', 'PUT']) + def view(request): + return Response({}) + + request = self.factory.put('/') + response = view(request) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + request = self.factory.post('/') + response = view(request) + self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + + def test_calling_patch_method(self): + + @api_view(['GET', 'PATCH']) + def view(request): + return Response({}) + + request = self.factory.patch('/') + response = view(request) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + request = self.factory.post('/') + response = view(request) + self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + + def test_renderer_classes(self): + + @api_view(['GET']) + @renderer_classes([JSONRenderer]) + def view(request): + return Response({}) + + request = self.factory.get('/') + response = view(request) + self.assertTrue(isinstance(response.accepted_renderer, JSONRenderer)) + + def test_parser_classes(self): + + @api_view(['GET']) + @parser_classes([JSONParser]) + def view(request): + self.assertEqual(len(request.parsers), 1) + self.assertTrue(isinstance(request.parsers[0], + JSONParser)) + return Response({}) + + request = self.factory.get('/') + view(request) + + def test_authentication_classes(self): + + @api_view(['GET']) + @authentication_classes([BasicAuthentication]) + def view(request): + self.assertEqual(len(request.authenticators), 1) + self.assertTrue(isinstance(request.authenticators[0], + BasicAuthentication)) + return Response({}) + + request = self.factory.get('/') + view(request) + + def test_permission_classes(self): + + @api_view(['GET']) + @permission_classes([IsAuthenticated]) + def view(request): + return Response({}) + + request = self.factory.get('/') + response = view(request) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_throttle_classes(self): + class OncePerDayUserThrottle(UserRateThrottle): + rate = '1/day' + + @api_view(['GET']) + @throttle_classes([OncePerDayUserThrottle]) + def view(request): + return Response({}) + + request = self.factory.get('/') + response = view(request) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + response = view(request) + self.assertEqual(response.status_code, status.HTTP_429_TOO_MANY_REQUESTS) diff --git a/vendor-local/lib/python/rest_framework/tests/test_description.py b/vendor-local/lib/python/rest_framework/tests/test_description.py new file mode 100644 index 00000000000..8019f5ecafd --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_description.py @@ -0,0 +1,109 @@ +# -- coding: utf-8 -- + +from __future__ import unicode_literals +from django.test import TestCase +from rest_framework.compat import apply_markdown, smart_text +from rest_framework.views import APIView +from rest_framework.tests.description import ViewWithNonASCIICharactersInDocstring +from rest_framework.tests.description import UTF8_TEST_DOCSTRING +from rest_framework.utils.formatting import get_view_name, get_view_description + +# We check that docstrings get nicely un-indented. +DESCRIPTION = """an example docstring +==================== + +* list +* list + +another header +-------------- + + code block + +indented + +# hash style header #""" + +# If markdown is installed we also test it's working +# (and that our wrapped forces '=' to h2 and '-' to h3) + +# We support markdown < 2.1 and markdown >= 2.1 +MARKED_DOWN_lt_21 = """

an example docstring

+
    +
  • list
  • +
  • list
  • +
+

another header

+
code block
+
+

indented

+

hash style header

""" + +MARKED_DOWN_gte_21 = """

an example docstring

+
    +
  • list
  • +
  • list
  • +
+

another header

+
code block
+
+

indented

+

hash style header

""" + + +class TestViewNamesAndDescriptions(TestCase): + def test_view_name_uses_class_name(self): + """ + Ensure view names are based on the class name. + """ + class MockView(APIView): + pass + self.assertEqual(get_view_name(MockView), 'Mock') + + def test_view_description_uses_docstring(self): + """Ensure view descriptions are based on the docstring.""" + class MockView(APIView): + """an example docstring + ==================== + + * list + * list + + another header + -------------- + + code block + + indented + + # hash style header #""" + + self.assertEqual(get_view_description(MockView), DESCRIPTION) + + def test_view_description_supports_unicode(self): + """ + Unicode in docstrings should be respected. + """ + + self.assertEqual( + get_view_description(ViewWithNonASCIICharactersInDocstring), + smart_text(UTF8_TEST_DOCSTRING) + ) + + def test_view_description_can_be_empty(self): + """ + Ensure that if a view has no docstring, + then it's description is the empty string. + """ + class MockView(APIView): + pass + self.assertEqual(get_view_description(MockView), '') + + def test_markdown(self): + """ + Ensure markdown to HTML works as expected. + """ + if apply_markdown: + gte_21_match = apply_markdown(DESCRIPTION) == MARKED_DOWN_gte_21 + lt_21_match = apply_markdown(DESCRIPTION) == MARKED_DOWN_lt_21 + self.assertTrue(gte_21_match or lt_21_match) diff --git a/vendor-local/lib/python/rest_framework/tests/test_fields.py b/vendor-local/lib/python/rest_framework/tests/test_fields.py new file mode 100644 index 00000000000..6836ec86f6b --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_fields.py @@ -0,0 +1,898 @@ +""" +General serializer field tests. +""" +from __future__ import unicode_literals + +import datetime +from decimal import Decimal +from uuid import uuid4 +from django.core import validators +from django.db import models +from django.test import TestCase +from django.utils.datastructures import SortedDict +from rest_framework import serializers +from rest_framework.tests.models import RESTFrameworkModel + + +class TimestampedModel(models.Model): + added = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + + +class CharPrimaryKeyModel(models.Model): + id = models.CharField(max_length=20, primary_key=True) + + +class TimestampedModelSerializer(serializers.ModelSerializer): + class Meta: + model = TimestampedModel + + +class CharPrimaryKeyModelSerializer(serializers.ModelSerializer): + class Meta: + model = CharPrimaryKeyModel + + +class TimeFieldModel(models.Model): + clock = models.TimeField() + + +class TimeFieldModelSerializer(serializers.ModelSerializer): + class Meta: + model = TimeFieldModel + + +class BasicFieldTests(TestCase): + def test_auto_now_fields_read_only(self): + """ + auto_now and auto_now_add fields should be read_only by default. + """ + serializer = TimestampedModelSerializer() + self.assertEqual(serializer.fields['added'].read_only, True) + + def test_auto_pk_fields_read_only(self): + """ + AutoField fields should be read_only by default. + """ + serializer = TimestampedModelSerializer() + self.assertEqual(serializer.fields['id'].read_only, True) + + def test_non_auto_pk_fields_not_read_only(self): + """ + PK fields other than AutoField fields should not be read_only by default. + """ + serializer = CharPrimaryKeyModelSerializer() + self.assertEqual(serializer.fields['id'].read_only, False) + + def test_dict_field_ordering(self): + """ + Field should preserve dictionary ordering, if it exists. + See: https://github.com/tomchristie/django-rest-framework/issues/832 + """ + ret = SortedDict() + ret['c'] = 1 + ret['b'] = 1 + ret['a'] = 1 + ret['z'] = 1 + field = serializers.Field() + keys = list(field.to_native(ret).keys()) + self.assertEqual(keys, ['c', 'b', 'a', 'z']) + + +class DateFieldTest(TestCase): + """ + Tests for the DateFieldTest from_native() and to_native() behavior + """ + + def test_from_native_string(self): + """ + Make sure from_native() accepts default iso input formats. + """ + f = serializers.DateField() + result_1 = f.from_native('1984-07-31') + + self.assertEqual(datetime.date(1984, 7, 31), result_1) + + def test_from_native_datetime_date(self): + """ + Make sure from_native() accepts a datetime.date instance. + """ + f = serializers.DateField() + result_1 = f.from_native(datetime.date(1984, 7, 31)) + + self.assertEqual(result_1, datetime.date(1984, 7, 31)) + + def test_from_native_custom_format(self): + """ + Make sure from_native() accepts custom input formats. + """ + f = serializers.DateField(input_formats=['%Y -- %d']) + result = f.from_native('1984 -- 31') + + self.assertEqual(datetime.date(1984, 1, 31), result) + + def test_from_native_invalid_default_on_custom_format(self): + """ + Make sure from_native() don't accept default formats if custom format is preset + """ + f = serializers.DateField(input_formats=['%Y -- %d']) + + try: + f.from_native('1984-07-31') + except validators.ValidationError as e: + self.assertEqual(e.messages, ["Date has wrong format. Use one of these formats instead: YYYY -- DD"]) + else: + self.fail("ValidationError was not properly raised") + + def test_from_native_empty(self): + """ + Make sure from_native() returns None on empty param. + """ + f = serializers.DateField() + result = f.from_native('') + + self.assertEqual(result, None) + + def test_from_native_none(self): + """ + Make sure from_native() returns None on None param. + """ + f = serializers.DateField() + result = f.from_native(None) + + self.assertEqual(result, None) + + def test_from_native_invalid_date(self): + """ + Make sure from_native() raises a ValidationError on passing an invalid date. + """ + f = serializers.DateField() + + try: + f.from_native('1984-13-31') + except validators.ValidationError as e: + self.assertEqual(e.messages, ["Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]]"]) + else: + self.fail("ValidationError was not properly raised") + + def test_from_native_invalid_format(self): + """ + Make sure from_native() raises a ValidationError on passing an invalid format. + """ + f = serializers.DateField() + + try: + f.from_native('1984 -- 31') + except validators.ValidationError as e: + self.assertEqual(e.messages, ["Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]]"]) + else: + self.fail("ValidationError was not properly raised") + + def test_to_native(self): + """ + Make sure to_native() returns datetime as default. + """ + f = serializers.DateField() + + result_1 = f.to_native(datetime.date(1984, 7, 31)) + + self.assertEqual(datetime.date(1984, 7, 31), result_1) + + def test_to_native_iso(self): + """ + Make sure to_native() with 'iso-8601' returns iso formated date. + """ + f = serializers.DateField(format='iso-8601') + + result_1 = f.to_native(datetime.date(1984, 7, 31)) + + self.assertEqual('1984-07-31', result_1) + + def test_to_native_custom_format(self): + """ + Make sure to_native() returns correct custom format. + """ + f = serializers.DateField(format="%Y - %m.%d") + + result_1 = f.to_native(datetime.date(1984, 7, 31)) + + self.assertEqual('1984 - 07.31', result_1) + + def test_to_native_none(self): + """ + Make sure from_native() returns None on None param. + """ + f = serializers.DateField(required=False) + self.assertEqual(None, f.to_native(None)) + + +class DateTimeFieldTest(TestCase): + """ + Tests for the DateTimeField from_native() and to_native() behavior + """ + + def test_from_native_string(self): + """ + Make sure from_native() accepts default iso input formats. + """ + f = serializers.DateTimeField() + result_1 = f.from_native('1984-07-31 04:31') + result_2 = f.from_native('1984-07-31 04:31:59') + result_3 = f.from_native('1984-07-31 04:31:59.000200') + + self.assertEqual(datetime.datetime(1984, 7, 31, 4, 31), result_1) + self.assertEqual(datetime.datetime(1984, 7, 31, 4, 31, 59), result_2) + self.assertEqual(datetime.datetime(1984, 7, 31, 4, 31, 59, 200), result_3) + + def test_from_native_datetime_datetime(self): + """ + Make sure from_native() accepts a datetime.datetime instance. + """ + f = serializers.DateTimeField() + result_1 = f.from_native(datetime.datetime(1984, 7, 31, 4, 31)) + result_2 = f.from_native(datetime.datetime(1984, 7, 31, 4, 31, 59)) + result_3 = f.from_native(datetime.datetime(1984, 7, 31, 4, 31, 59, 200)) + + self.assertEqual(result_1, datetime.datetime(1984, 7, 31, 4, 31)) + self.assertEqual(result_2, datetime.datetime(1984, 7, 31, 4, 31, 59)) + self.assertEqual(result_3, datetime.datetime(1984, 7, 31, 4, 31, 59, 200)) + + def test_from_native_custom_format(self): + """ + Make sure from_native() accepts custom input formats. + """ + f = serializers.DateTimeField(input_formats=['%Y -- %H:%M']) + result = f.from_native('1984 -- 04:59') + + self.assertEqual(datetime.datetime(1984, 1, 1, 4, 59), result) + + def test_from_native_invalid_default_on_custom_format(self): + """ + Make sure from_native() don't accept default formats if custom format is preset + """ + f = serializers.DateTimeField(input_formats=['%Y -- %H:%M']) + + try: + f.from_native('1984-07-31 04:31:59') + except validators.ValidationError as e: + self.assertEqual(e.messages, ["Datetime has wrong format. Use one of these formats instead: YYYY -- hh:mm"]) + else: + self.fail("ValidationError was not properly raised") + + def test_from_native_empty(self): + """ + Make sure from_native() returns None on empty param. + """ + f = serializers.DateTimeField() + result = f.from_native('') + + self.assertEqual(result, None) + + def test_from_native_none(self): + """ + Make sure from_native() returns None on None param. + """ + f = serializers.DateTimeField() + result = f.from_native(None) + + self.assertEqual(result, None) + + def test_from_native_invalid_datetime(self): + """ + Make sure from_native() raises a ValidationError on passing an invalid datetime. + """ + f = serializers.DateTimeField() + + try: + f.from_native('04:61:59') + except validators.ValidationError as e: + self.assertEqual(e.messages, ["Datetime has wrong format. Use one of these formats instead: " + "YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HHMM|-HHMM|Z]"]) + else: + self.fail("ValidationError was not properly raised") + + def test_from_native_invalid_format(self): + """ + Make sure from_native() raises a ValidationError on passing an invalid format. + """ + f = serializers.DateTimeField() + + try: + f.from_native('04 -- 31') + except validators.ValidationError as e: + self.assertEqual(e.messages, ["Datetime has wrong format. Use one of these formats instead: " + "YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HHMM|-HHMM|Z]"]) + else: + self.fail("ValidationError was not properly raised") + + def test_to_native(self): + """ + Make sure to_native() returns isoformat as default. + """ + f = serializers.DateTimeField() + + result_1 = f.to_native(datetime.datetime(1984, 7, 31)) + result_2 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31)) + result_3 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31, 59)) + result_4 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31, 59, 200)) + + self.assertEqual(datetime.datetime(1984, 7, 31), result_1) + self.assertEqual(datetime.datetime(1984, 7, 31, 4, 31), result_2) + self.assertEqual(datetime.datetime(1984, 7, 31, 4, 31, 59), result_3) + self.assertEqual(datetime.datetime(1984, 7, 31, 4, 31, 59, 200), result_4) + + def test_to_native_iso(self): + """ + Make sure to_native() with format=iso-8601 returns iso formatted datetime. + """ + f = serializers.DateTimeField(format='iso-8601') + + result_1 = f.to_native(datetime.datetime(1984, 7, 31)) + result_2 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31)) + result_3 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31, 59)) + result_4 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31, 59, 200)) + + self.assertEqual('1984-07-31T00:00:00', result_1) + self.assertEqual('1984-07-31T04:31:00', result_2) + self.assertEqual('1984-07-31T04:31:59', result_3) + self.assertEqual('1984-07-31T04:31:59.000200', result_4) + + def test_to_native_custom_format(self): + """ + Make sure to_native() returns correct custom format. + """ + f = serializers.DateTimeField(format="%Y - %H:%M") + + result_1 = f.to_native(datetime.datetime(1984, 7, 31)) + result_2 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31)) + result_3 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31, 59)) + result_4 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31, 59, 200)) + + self.assertEqual('1984 - 00:00', result_1) + self.assertEqual('1984 - 04:31', result_2) + self.assertEqual('1984 - 04:31', result_3) + self.assertEqual('1984 - 04:31', result_4) + + def test_to_native_none(self): + """ + Make sure from_native() returns None on None param. + """ + f = serializers.DateTimeField(required=False) + self.assertEqual(None, f.to_native(None)) + + +class TimeFieldTest(TestCase): + """ + Tests for the TimeField from_native() and to_native() behavior + """ + + def test_from_native_string(self): + """ + Make sure from_native() accepts default iso input formats. + """ + f = serializers.TimeField() + result_1 = f.from_native('04:31') + result_2 = f.from_native('04:31:59') + result_3 = f.from_native('04:31:59.000200') + + self.assertEqual(datetime.time(4, 31), result_1) + self.assertEqual(datetime.time(4, 31, 59), result_2) + self.assertEqual(datetime.time(4, 31, 59, 200), result_3) + + def test_from_native_datetime_time(self): + """ + Make sure from_native() accepts a datetime.time instance. + """ + f = serializers.TimeField() + result_1 = f.from_native(datetime.time(4, 31)) + result_2 = f.from_native(datetime.time(4, 31, 59)) + result_3 = f.from_native(datetime.time(4, 31, 59, 200)) + + self.assertEqual(result_1, datetime.time(4, 31)) + self.assertEqual(result_2, datetime.time(4, 31, 59)) + self.assertEqual(result_3, datetime.time(4, 31, 59, 200)) + + def test_from_native_custom_format(self): + """ + Make sure from_native() accepts custom input formats. + """ + f = serializers.TimeField(input_formats=['%H -- %M']) + result = f.from_native('04 -- 31') + + self.assertEqual(datetime.time(4, 31), result) + + def test_from_native_invalid_default_on_custom_format(self): + """ + Make sure from_native() don't accept default formats if custom format is preset + """ + f = serializers.TimeField(input_formats=['%H -- %M']) + + try: + f.from_native('04:31:59') + except validators.ValidationError as e: + self.assertEqual(e.messages, ["Time has wrong format. Use one of these formats instead: hh -- mm"]) + else: + self.fail("ValidationError was not properly raised") + + def test_from_native_empty(self): + """ + Make sure from_native() returns None on empty param. + """ + f = serializers.TimeField() + result = f.from_native('') + + self.assertEqual(result, None) + + def test_from_native_none(self): + """ + Make sure from_native() returns None on None param. + """ + f = serializers.TimeField() + result = f.from_native(None) + + self.assertEqual(result, None) + + def test_from_native_invalid_time(self): + """ + Make sure from_native() raises a ValidationError on passing an invalid time. + """ + f = serializers.TimeField() + + try: + f.from_native('04:61:59') + except validators.ValidationError as e: + self.assertEqual(e.messages, ["Time has wrong format. Use one of these formats instead: " + "hh:mm[:ss[.uuuuuu]]"]) + else: + self.fail("ValidationError was not properly raised") + + def test_from_native_invalid_format(self): + """ + Make sure from_native() raises a ValidationError on passing an invalid format. + """ + f = serializers.TimeField() + + try: + f.from_native('04 -- 31') + except validators.ValidationError as e: + self.assertEqual(e.messages, ["Time has wrong format. Use one of these formats instead: " + "hh:mm[:ss[.uuuuuu]]"]) + else: + self.fail("ValidationError was not properly raised") + + def test_to_native(self): + """ + Make sure to_native() returns time object as default. + """ + f = serializers.TimeField() + result_1 = f.to_native(datetime.time(4, 31)) + result_2 = f.to_native(datetime.time(4, 31, 59)) + result_3 = f.to_native(datetime.time(4, 31, 59, 200)) + + self.assertEqual(datetime.time(4, 31), result_1) + self.assertEqual(datetime.time(4, 31, 59), result_2) + self.assertEqual(datetime.time(4, 31, 59, 200), result_3) + + def test_to_native_iso(self): + """ + Make sure to_native() with format='iso-8601' returns iso formatted time. + """ + f = serializers.TimeField(format='iso-8601') + result_1 = f.to_native(datetime.time(4, 31)) + result_2 = f.to_native(datetime.time(4, 31, 59)) + result_3 = f.to_native(datetime.time(4, 31, 59, 200)) + + self.assertEqual('04:31:00', result_1) + self.assertEqual('04:31:59', result_2) + self.assertEqual('04:31:59.000200', result_3) + + def test_to_native_custom_format(self): + """ + Make sure to_native() returns correct custom format. + """ + f = serializers.TimeField(format="%H - %S [%f]") + result_1 = f.to_native(datetime.time(4, 31)) + result_2 = f.to_native(datetime.time(4, 31, 59)) + result_3 = f.to_native(datetime.time(4, 31, 59, 200)) + + self.assertEqual('04 - 00 [000000]', result_1) + self.assertEqual('04 - 59 [000000]', result_2) + self.assertEqual('04 - 59 [000200]', result_3) + + +class DecimalFieldTest(TestCase): + """ + Tests for the DecimalField from_native() and to_native() behavior + """ + + def test_from_native_string(self): + """ + Make sure from_native() accepts string values + """ + f = serializers.DecimalField() + result_1 = f.from_native('9000') + result_2 = f.from_native('1.00000001') + + self.assertEqual(Decimal('9000'), result_1) + self.assertEqual(Decimal('1.00000001'), result_2) + + def test_from_native_invalid_string(self): + """ + Make sure from_native() raises ValidationError on passing invalid string + """ + f = serializers.DecimalField() + + try: + f.from_native('123.45.6') + except validators.ValidationError as e: + self.assertEqual(e.messages, ["Enter a number."]) + else: + self.fail("ValidationError was not properly raised") + + def test_from_native_integer(self): + """ + Make sure from_native() accepts integer values + """ + f = serializers.DecimalField() + result = f.from_native(9000) + + self.assertEqual(Decimal('9000'), result) + + def test_from_native_float(self): + """ + Make sure from_native() accepts float values + """ + f = serializers.DecimalField() + result = f.from_native(1.00000001) + + self.assertEqual(Decimal('1.00000001'), result) + + def test_from_native_empty(self): + """ + Make sure from_native() returns None on empty param. + """ + f = serializers.DecimalField() + result = f.from_native('') + + self.assertEqual(result, None) + + def test_from_native_none(self): + """ + Make sure from_native() returns None on None param. + """ + f = serializers.DecimalField() + result = f.from_native(None) + + self.assertEqual(result, None) + + def test_to_native(self): + """ + Make sure to_native() returns Decimal as string. + """ + f = serializers.DecimalField() + + result_1 = f.to_native(Decimal('9000')) + result_2 = f.to_native(Decimal('1.00000001')) + + self.assertEqual(Decimal('9000'), result_1) + self.assertEqual(Decimal('1.00000001'), result_2) + + def test_to_native_none(self): + """ + Make sure from_native() returns None on None param. + """ + f = serializers.DecimalField(required=False) + self.assertEqual(None, f.to_native(None)) + + def test_valid_serialization(self): + """ + Make sure the serializer works correctly + """ + class DecimalSerializer(serializers.Serializer): + decimal_field = serializers.DecimalField(max_value=9010, + min_value=9000, + max_digits=6, + decimal_places=2) + + self.assertTrue(DecimalSerializer(data={'decimal_field': '9001'}).is_valid()) + self.assertTrue(DecimalSerializer(data={'decimal_field': '9001.2'}).is_valid()) + self.assertTrue(DecimalSerializer(data={'decimal_field': '9001.23'}).is_valid()) + + self.assertFalse(DecimalSerializer(data={'decimal_field': '8000'}).is_valid()) + self.assertFalse(DecimalSerializer(data={'decimal_field': '9900'}).is_valid()) + self.assertFalse(DecimalSerializer(data={'decimal_field': '9001.234'}).is_valid()) + + def test_raise_max_value(self): + """ + Make sure max_value violations raises ValidationError + """ + class DecimalSerializer(serializers.Serializer): + decimal_field = serializers.DecimalField(max_value=100) + + s = DecimalSerializer(data={'decimal_field': '123'}) + + self.assertFalse(s.is_valid()) + self.assertEqual(s.errors, {'decimal_field': ['Ensure this value is less than or equal to 100.']}) + + def test_raise_min_value(self): + """ + Make sure min_value violations raises ValidationError + """ + class DecimalSerializer(serializers.Serializer): + decimal_field = serializers.DecimalField(min_value=100) + + s = DecimalSerializer(data={'decimal_field': '99'}) + + self.assertFalse(s.is_valid()) + self.assertEqual(s.errors, {'decimal_field': ['Ensure this value is greater than or equal to 100.']}) + + def test_raise_max_digits(self): + """ + Make sure max_digits violations raises ValidationError + """ + class DecimalSerializer(serializers.Serializer): + decimal_field = serializers.DecimalField(max_digits=5) + + s = DecimalSerializer(data={'decimal_field': '123.456'}) + + self.assertFalse(s.is_valid()) + self.assertEqual(s.errors, {'decimal_field': ['Ensure that there are no more than 5 digits in total.']}) + + def test_raise_max_decimal_places(self): + """ + Make sure max_decimal_places violations raises ValidationError + """ + class DecimalSerializer(serializers.Serializer): + decimal_field = serializers.DecimalField(decimal_places=3) + + s = DecimalSerializer(data={'decimal_field': '123.4567'}) + + self.assertFalse(s.is_valid()) + self.assertEqual(s.errors, {'decimal_field': ['Ensure that there are no more than 3 decimal places.']}) + + def test_raise_max_whole_digits(self): + """ + Make sure max_whole_digits violations raises ValidationError + """ + class DecimalSerializer(serializers.Serializer): + decimal_field = serializers.DecimalField(max_digits=4, decimal_places=3) + + s = DecimalSerializer(data={'decimal_field': '12345.6'}) + + self.assertFalse(s.is_valid()) + self.assertEqual(s.errors, {'decimal_field': ['Ensure that there are no more than 4 digits in total.']}) + + +class ChoiceFieldTests(TestCase): + """ + Tests for the ChoiceField options generator + """ + + SAMPLE_CHOICES = [ + ('red', 'Red'), + ('green', 'Green'), + ('blue', 'Blue'), + ] + + def test_choices_required(self): + """ + Make sure proper choices are rendered if field is required + """ + f = serializers.ChoiceField(required=True, choices=self.SAMPLE_CHOICES) + self.assertEqual(f.choices, self.SAMPLE_CHOICES) + + def test_choices_not_required(self): + """ + Make sure proper choices (plus blank) are rendered if the field isn't required + """ + f = serializers.ChoiceField(required=False, choices=self.SAMPLE_CHOICES) + self.assertEqual(f.choices, models.fields.BLANK_CHOICE_DASH + self.SAMPLE_CHOICES) + + +class EmailFieldTests(TestCase): + """ + Tests for EmailField attribute values + """ + + class EmailFieldModel(RESTFrameworkModel): + email_field = models.EmailField(blank=True) + + class EmailFieldWithGivenMaxLengthModel(RESTFrameworkModel): + email_field = models.EmailField(max_length=150, blank=True) + + def test_default_model_value(self): + class EmailFieldSerializer(serializers.ModelSerializer): + class Meta: + model = self.EmailFieldModel + + serializer = EmailFieldSerializer(data={}) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(getattr(serializer.fields['email_field'], 'max_length'), 75) + + def test_given_model_value(self): + class EmailFieldSerializer(serializers.ModelSerializer): + class Meta: + model = self.EmailFieldWithGivenMaxLengthModel + + serializer = EmailFieldSerializer(data={}) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(getattr(serializer.fields['email_field'], 'max_length'), 150) + + def test_given_serializer_value(self): + class EmailFieldSerializer(serializers.ModelSerializer): + email_field = serializers.EmailField(source='email_field', max_length=20, required=False) + + class Meta: + model = self.EmailFieldModel + + serializer = EmailFieldSerializer(data={}) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(getattr(serializer.fields['email_field'], 'max_length'), 20) + + +class SlugFieldTests(TestCase): + """ + Tests for SlugField attribute values + """ + + class SlugFieldModel(RESTFrameworkModel): + slug_field = models.SlugField(blank=True) + + class SlugFieldWithGivenMaxLengthModel(RESTFrameworkModel): + slug_field = models.SlugField(max_length=84, blank=True) + + def test_default_model_value(self): + class SlugFieldSerializer(serializers.ModelSerializer): + class Meta: + model = self.SlugFieldModel + + serializer = SlugFieldSerializer(data={}) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(getattr(serializer.fields['slug_field'], 'max_length'), 50) + + def test_given_model_value(self): + class SlugFieldSerializer(serializers.ModelSerializer): + class Meta: + model = self.SlugFieldWithGivenMaxLengthModel + + serializer = SlugFieldSerializer(data={}) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(getattr(serializer.fields['slug_field'], 'max_length'), 84) + + def test_given_serializer_value(self): + class SlugFieldSerializer(serializers.ModelSerializer): + slug_field = serializers.SlugField(source='slug_field', + max_length=20, required=False) + + class Meta: + model = self.SlugFieldModel + + serializer = SlugFieldSerializer(data={}) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(getattr(serializer.fields['slug_field'], + 'max_length'), 20) + + def test_invalid_slug(self): + """ + Make sure an invalid slug raises ValidationError + """ + class SlugFieldSerializer(serializers.ModelSerializer): + slug_field = serializers.SlugField(source='slug_field', max_length=20, required=True) + + class Meta: + model = self.SlugFieldModel + + s = SlugFieldSerializer(data={'slug_field': 'a b'}) + + self.assertEqual(s.is_valid(), False) + self.assertEqual(s.errors, {'slug_field': ["Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."]}) + + +class URLFieldTests(TestCase): + """ + Tests for URLField attribute values + """ + + class URLFieldModel(RESTFrameworkModel): + url_field = models.URLField(blank=True) + + class URLFieldWithGivenMaxLengthModel(RESTFrameworkModel): + url_field = models.URLField(max_length=128, blank=True) + + def test_default_model_value(self): + class URLFieldSerializer(serializers.ModelSerializer): + class Meta: + model = self.URLFieldModel + + serializer = URLFieldSerializer(data={}) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(getattr(serializer.fields['url_field'], + 'max_length'), 200) + + def test_given_model_value(self): + class URLFieldSerializer(serializers.ModelSerializer): + class Meta: + model = self.URLFieldWithGivenMaxLengthModel + + serializer = URLFieldSerializer(data={}) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(getattr(serializer.fields['url_field'], + 'max_length'), 128) + + def test_given_serializer_value(self): + class URLFieldSerializer(serializers.ModelSerializer): + url_field = serializers.URLField(source='url_field', + max_length=20, required=False) + + class Meta: + model = self.URLFieldWithGivenMaxLengthModel + + serializer = URLFieldSerializer(data={}) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(getattr(serializer.fields['url_field'], + 'max_length'), 20) + + +class FieldMetadata(TestCase): + def setUp(self): + self.required_field = serializers.Field() + self.required_field.label = uuid4().hex + self.required_field.required = True + + self.optional_field = serializers.Field() + self.optional_field.label = uuid4().hex + self.optional_field.required = False + + def test_required(self): + self.assertEqual(self.required_field.metadata()['required'], True) + + def test_optional(self): + self.assertEqual(self.optional_field.metadata()['required'], False) + + def test_label(self): + for field in (self.required_field, self.optional_field): + self.assertEqual(field.metadata()['label'], field.label) + + +class FieldCallableDefault(TestCase): + def setUp(self): + self.simple_callable = lambda: 'foo bar' + + def test_default_can_be_simple_callable(self): + """ + Ensure that the 'default' argument can also be a simple callable. + """ + field = serializers.WritableField(default=self.simple_callable) + into = {} + field.field_from_native({}, {}, 'field', into) + self.assertEqual(into, {'field': 'foo bar'}) + + +class CustomIntegerField(TestCase): + """ + Test that custom fields apply min_value and max_value constraints + """ + def test_custom_fields_can_be_validated_for_value(self): + + class MoneyField(models.PositiveIntegerField): + pass + + class EntryModel(models.Model): + bank = MoneyField(validators=[validators.MaxValueValidator(100)]) + + class EntrySerializer(serializers.ModelSerializer): + class Meta: + model = EntryModel + + entry = EntryModel(bank=1) + + serializer = EntrySerializer(entry, data={"bank": 11}) + self.assertTrue(serializer.is_valid()) + + serializer = EntrySerializer(entry, data={"bank": -1}) + self.assertFalse(serializer.is_valid()) + + serializer = EntrySerializer(entry, data={"bank": 101}) + self.assertFalse(serializer.is_valid()) + + diff --git a/vendor-local/lib/python/rest_framework/tests/test_files.py b/vendor-local/lib/python/rest_framework/tests/test_files.py new file mode 100644 index 00000000000..487046aca49 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_files.py @@ -0,0 +1,51 @@ +from __future__ import unicode_literals +from django.test import TestCase +from rest_framework import serializers +from rest_framework.compat import BytesIO +from rest_framework.compat import six +import datetime + + +class UploadedFile(object): + def __init__(self, file, created=None): + self.file = file + self.created = created or datetime.datetime.now() + + +class UploadedFileSerializer(serializers.Serializer): + file = serializers.FileField() + created = serializers.DateTimeField() + + def restore_object(self, attrs, instance=None): + if instance: + instance.file = attrs['file'] + instance.created = attrs['created'] + return instance + return UploadedFile(**attrs) + + +class FileSerializerTests(TestCase): + def test_create(self): + now = datetime.datetime.now() + file = BytesIO(six.b('stuff')) + file.name = 'stuff.txt' + file.size = len(file.getvalue()) + serializer = UploadedFileSerializer(data={'created': now}, files={'file': file}) + uploaded_file = UploadedFile(file=file, created=now) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.object.created, uploaded_file.created) + self.assertEqual(serializer.object.file, uploaded_file.file) + self.assertFalse(serializer.object is uploaded_file) + + def test_creation_failure(self): + """ + Passing files=None should result in an ValidationError + + Regression test for: + https://github.com/tomchristie/django-rest-framework/issues/542 + """ + now = datetime.datetime.now() + + serializer = UploadedFileSerializer(data={'created': now}) + self.assertFalse(serializer.is_valid()) + self.assertIn('file', serializer.errors) diff --git a/vendor-local/lib/python/rest_framework/tests/test_filters.py b/vendor-local/lib/python/rest_framework/tests/test_filters.py new file mode 100644 index 00000000000..c9d9e7ffaa6 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_filters.py @@ -0,0 +1,474 @@ +from __future__ import unicode_literals +import datetime +from decimal import Decimal +from django.db import models +from django.core.urlresolvers import reverse +from django.test import TestCase +from django.utils import unittest +from rest_framework import generics, serializers, status, filters +from rest_framework.compat import django_filters, patterns, url +from rest_framework.test import APIRequestFactory +from rest_framework.tests.models import BasicModel + +factory = APIRequestFactory() + + +class FilterableItem(models.Model): + text = models.CharField(max_length=100) + decimal = models.DecimalField(max_digits=4, decimal_places=2) + date = models.DateField() + + +if django_filters: + # Basic filter on a list view. + class FilterFieldsRootView(generics.ListCreateAPIView): + model = FilterableItem + filter_fields = ['decimal', 'date'] + filter_backends = (filters.DjangoFilterBackend,) + + # These class are used to test a filter class. + class SeveralFieldsFilter(django_filters.FilterSet): + text = django_filters.CharFilter(lookup_type='icontains') + decimal = django_filters.NumberFilter(lookup_type='lt') + date = django_filters.DateFilter(lookup_type='gt') + + class Meta: + model = FilterableItem + fields = ['text', 'decimal', 'date'] + + class FilterClassRootView(generics.ListCreateAPIView): + model = FilterableItem + filter_class = SeveralFieldsFilter + filter_backends = (filters.DjangoFilterBackend,) + + # These classes are used to test a misconfigured filter class. + class MisconfiguredFilter(django_filters.FilterSet): + text = django_filters.CharFilter(lookup_type='icontains') + + class Meta: + model = BasicModel + fields = ['text'] + + class IncorrectlyConfiguredRootView(generics.ListCreateAPIView): + model = FilterableItem + filter_class = MisconfiguredFilter + filter_backends = (filters.DjangoFilterBackend,) + + class FilterClassDetailView(generics.RetrieveAPIView): + model = FilterableItem + filter_class = SeveralFieldsFilter + filter_backends = (filters.DjangoFilterBackend,) + + # Regression test for #814 + class FilterableItemSerializer(serializers.ModelSerializer): + class Meta: + model = FilterableItem + + class FilterFieldsQuerysetView(generics.ListCreateAPIView): + queryset = FilterableItem.objects.all() + serializer_class = FilterableItemSerializer + filter_fields = ['decimal', 'date'] + filter_backends = (filters.DjangoFilterBackend,) + + class GetQuerysetView(generics.ListCreateAPIView): + serializer_class = FilterableItemSerializer + filter_class = SeveralFieldsFilter + filter_backends = (filters.DjangoFilterBackend,) + + def get_queryset(self): + return FilterableItem.objects.all() + + urlpatterns = patterns('', + url(r'^(?P\d+)/$', FilterClassDetailView.as_view(), name='detail-view'), + url(r'^$', FilterClassRootView.as_view(), name='root-view'), + url(r'^get-queryset/$', GetQuerysetView.as_view(), + name='get-queryset-view'), + ) + + +class CommonFilteringTestCase(TestCase): + def _serialize_object(self, obj): + return {'id': obj.id, 'text': obj.text, 'decimal': obj.decimal, 'date': obj.date} + + def setUp(self): + """ + Create 10 FilterableItem instances. + """ + base_data = ('a', Decimal('0.25'), datetime.date(2012, 10, 8)) + for i in range(10): + text = chr(i + ord(base_data[0])) * 3 # Produces string 'aaa', 'bbb', etc. + decimal = base_data[1] + i + date = base_data[2] - datetime.timedelta(days=i * 2) + FilterableItem(text=text, decimal=decimal, date=date).save() + + self.objects = FilterableItem.objects + self.data = [ + self._serialize_object(obj) + for obj in self.objects.all() + ] + + +class IntegrationTestFiltering(CommonFilteringTestCase): + """ + Integration tests for filtered list views. + """ + + @unittest.skipUnless(django_filters, 'django-filters not installed') + def test_get_filtered_fields_root_view(self): + """ + GET requests to paginated ListCreateAPIView should return paginated results. + """ + view = FilterFieldsRootView.as_view() + + # Basic test with no filter. + request = factory.get('/') + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, self.data) + + # Tests that the decimal filter works. + search_decimal = Decimal('2.25') + request = factory.get('/?decimal=%s' % search_decimal) + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + expected_data = [f for f in self.data if f['decimal'] == search_decimal] + self.assertEqual(response.data, expected_data) + + # Tests that the date filter works. + search_date = datetime.date(2012, 9, 22) + request = factory.get('/?date=%s' % search_date) # search_date str: '2012-09-22' + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + expected_data = [f for f in self.data if f['date'] == search_date] + self.assertEqual(response.data, expected_data) + + @unittest.skipUnless(django_filters, 'django-filters not installed') + def test_filter_with_queryset(self): + """ + Regression test for #814. + """ + view = FilterFieldsQuerysetView.as_view() + + # Tests that the decimal filter works. + search_decimal = Decimal('2.25') + request = factory.get('/?decimal=%s' % search_decimal) + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + expected_data = [f for f in self.data if f['decimal'] == search_decimal] + self.assertEqual(response.data, expected_data) + + @unittest.skipUnless(django_filters, 'django-filters not installed') + def test_filter_with_get_queryset_only(self): + """ + Regression test for #834. + """ + view = GetQuerysetView.as_view() + request = factory.get('/get-queryset/') + view(request).render() + # Used to raise "issubclass() arg 2 must be a class or tuple of classes" + # here when neither `model' nor `queryset' was specified. + + @unittest.skipUnless(django_filters, 'django-filters not installed') + def test_get_filtered_class_root_view(self): + """ + GET requests to filtered ListCreateAPIView that have a filter_class set + should return filtered results. + """ + view = FilterClassRootView.as_view() + + # Basic test with no filter. + request = factory.get('/') + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, self.data) + + # Tests that the decimal filter set with 'lt' in the filter class works. + search_decimal = Decimal('4.25') + request = factory.get('/?decimal=%s' % search_decimal) + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + expected_data = [f for f in self.data if f['decimal'] < search_decimal] + self.assertEqual(response.data, expected_data) + + # Tests that the date filter set with 'gt' in the filter class works. + search_date = datetime.date(2012, 10, 2) + request = factory.get('/?date=%s' % search_date) # search_date str: '2012-10-02' + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + expected_data = [f for f in self.data if f['date'] > search_date] + self.assertEqual(response.data, expected_data) + + # Tests that the text filter set with 'icontains' in the filter class works. + search_text = 'ff' + request = factory.get('/?text=%s' % search_text) + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + expected_data = [f for f in self.data if search_text in f['text'].lower()] + self.assertEqual(response.data, expected_data) + + # Tests that multiple filters works. + search_decimal = Decimal('5.25') + search_date = datetime.date(2012, 10, 2) + request = factory.get('/?decimal=%s&date=%s' % (search_decimal, search_date)) + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + expected_data = [f for f in self.data if f['date'] > search_date and + f['decimal'] < search_decimal] + self.assertEqual(response.data, expected_data) + + @unittest.skipUnless(django_filters, 'django-filters not installed') + def test_incorrectly_configured_filter(self): + """ + An error should be displayed when the filter class is misconfigured. + """ + view = IncorrectlyConfiguredRootView.as_view() + + request = factory.get('/') + self.assertRaises(AssertionError, view, request) + + @unittest.skipUnless(django_filters, 'django-filters not installed') + def test_unknown_filter(self): + """ + GET requests with filters that aren't configured should return 200. + """ + view = FilterFieldsRootView.as_view() + + search_integer = 10 + request = factory.get('/?integer=%s' % search_integer) + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + + +class IntegrationTestDetailFiltering(CommonFilteringTestCase): + """ + Integration tests for filtered detail views. + """ + urls = 'rest_framework.tests.test_filters' + + def _get_url(self, item): + return reverse('detail-view', kwargs=dict(pk=item.pk)) + + @unittest.skipUnless(django_filters, 'django-filters not installed') + def test_get_filtered_detail_view(self): + """ + GET requests to filtered RetrieveAPIView that have a filter_class set + should return filtered results. + """ + item = self.objects.all()[0] + data = self._serialize_object(item) + + # Basic test with no filter. + response = self.client.get(self._get_url(item)) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, data) + + # Tests that the decimal filter set that should fail. + search_decimal = Decimal('4.25') + high_item = self.objects.filter(decimal__gt=search_decimal)[0] + response = self.client.get('{url}?decimal={param}'.format(url=self._get_url(high_item), param=search_decimal)) + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + + # Tests that the decimal filter set that should succeed. + search_decimal = Decimal('4.25') + low_item = self.objects.filter(decimal__lt=search_decimal)[0] + low_item_data = self._serialize_object(low_item) + response = self.client.get('{url}?decimal={param}'.format(url=self._get_url(low_item), param=search_decimal)) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, low_item_data) + + # Tests that multiple filters works. + search_decimal = Decimal('5.25') + search_date = datetime.date(2012, 10, 2) + valid_item = self.objects.filter(decimal__lt=search_decimal, date__gt=search_date)[0] + valid_item_data = self._serialize_object(valid_item) + response = self.client.get('{url}?decimal={decimal}&date={date}'.format(url=self._get_url(valid_item), decimal=search_decimal, date=search_date)) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, valid_item_data) + + +class SearchFilterModel(models.Model): + title = models.CharField(max_length=20) + text = models.CharField(max_length=100) + + +class SearchFilterTests(TestCase): + def setUp(self): + # Sequence of title/text is: + # + # z abc + # zz bcd + # zzz cde + # ... + for idx in range(10): + title = 'z' * (idx + 1) + text = ( + chr(idx + ord('a')) + + chr(idx + ord('b')) + + chr(idx + ord('c')) + ) + SearchFilterModel(title=title, text=text).save() + + def test_search(self): + class SearchListView(generics.ListAPIView): + model = SearchFilterModel + filter_backends = (filters.SearchFilter,) + search_fields = ('title', 'text') + + view = SearchListView.as_view() + request = factory.get('?search=b') + response = view(request) + self.assertEqual( + response.data, + [ + {'id': 1, 'title': 'z', 'text': 'abc'}, + {'id': 2, 'title': 'zz', 'text': 'bcd'} + ] + ) + + def test_exact_search(self): + class SearchListView(generics.ListAPIView): + model = SearchFilterModel + filter_backends = (filters.SearchFilter,) + search_fields = ('=title', 'text') + + view = SearchListView.as_view() + request = factory.get('?search=zzz') + response = view(request) + self.assertEqual( + response.data, + [ + {'id': 3, 'title': 'zzz', 'text': 'cde'} + ] + ) + + def test_startswith_search(self): + class SearchListView(generics.ListAPIView): + model = SearchFilterModel + filter_backends = (filters.SearchFilter,) + search_fields = ('title', '^text') + + view = SearchListView.as_view() + request = factory.get('?search=b') + response = view(request) + self.assertEqual( + response.data, + [ + {'id': 2, 'title': 'zz', 'text': 'bcd'} + ] + ) + + +class OrdringFilterModel(models.Model): + title = models.CharField(max_length=20) + text = models.CharField(max_length=100) + + +class OrderingFilterTests(TestCase): + def setUp(self): + # Sequence of title/text is: + # + # zyx abc + # yxw bcd + # xwv cde + for idx in range(3): + title = ( + chr(ord('z') - idx) + + chr(ord('y') - idx) + + chr(ord('x') - idx) + ) + text = ( + chr(idx + ord('a')) + + chr(idx + ord('b')) + + chr(idx + ord('c')) + ) + OrdringFilterModel(title=title, text=text).save() + + def test_ordering(self): + class OrderingListView(generics.ListAPIView): + model = OrdringFilterModel + filter_backends = (filters.OrderingFilter,) + ordering = ('title',) + + view = OrderingListView.as_view() + request = factory.get('?ordering=text') + response = view(request) + self.assertEqual( + response.data, + [ + {'id': 1, 'title': 'zyx', 'text': 'abc'}, + {'id': 2, 'title': 'yxw', 'text': 'bcd'}, + {'id': 3, 'title': 'xwv', 'text': 'cde'}, + ] + ) + + def test_reverse_ordering(self): + class OrderingListView(generics.ListAPIView): + model = OrdringFilterModel + filter_backends = (filters.OrderingFilter,) + ordering = ('title',) + + view = OrderingListView.as_view() + request = factory.get('?ordering=-text') + response = view(request) + self.assertEqual( + response.data, + [ + {'id': 3, 'title': 'xwv', 'text': 'cde'}, + {'id': 2, 'title': 'yxw', 'text': 'bcd'}, + {'id': 1, 'title': 'zyx', 'text': 'abc'}, + ] + ) + + def test_incorrectfield_ordering(self): + class OrderingListView(generics.ListAPIView): + model = OrdringFilterModel + filter_backends = (filters.OrderingFilter,) + ordering = ('title',) + + view = OrderingListView.as_view() + request = factory.get('?ordering=foobar') + response = view(request) + self.assertEqual( + response.data, + [ + {'id': 3, 'title': 'xwv', 'text': 'cde'}, + {'id': 2, 'title': 'yxw', 'text': 'bcd'}, + {'id': 1, 'title': 'zyx', 'text': 'abc'}, + ] + ) + + def test_default_ordering(self): + class OrderingListView(generics.ListAPIView): + model = OrdringFilterModel + filter_backends = (filters.OrderingFilter,) + ordering = ('title',) + + view = OrderingListView.as_view() + request = factory.get('') + response = view(request) + self.assertEqual( + response.data, + [ + {'id': 3, 'title': 'xwv', 'text': 'cde'}, + {'id': 2, 'title': 'yxw', 'text': 'bcd'}, + {'id': 1, 'title': 'zyx', 'text': 'abc'}, + ] + ) + + def test_default_ordering_using_string(self): + class OrderingListView(generics.ListAPIView): + model = OrdringFilterModel + filter_backends = (filters.OrderingFilter,) + ordering = 'title' + + view = OrderingListView.as_view() + request = factory.get('') + response = view(request) + self.assertEqual( + response.data, + [ + {'id': 3, 'title': 'xwv', 'text': 'cde'}, + {'id': 2, 'title': 'yxw', 'text': 'bcd'}, + {'id': 1, 'title': 'zyx', 'text': 'abc'}, + ] + ) diff --git a/vendor-local/lib/python/rest_framework/tests/test_genericrelations.py b/vendor-local/lib/python/rest_framework/tests/test_genericrelations.py new file mode 100644 index 00000000000..c38bfb9f367 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_genericrelations.py @@ -0,0 +1,100 @@ +from __future__ import unicode_literals +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes.generic import GenericRelation, GenericForeignKey +from django.db import models +from django.test import TestCase +from rest_framework import serializers + + +class Tag(models.Model): + """ + Tags have a descriptive slug, and are attached to an arbitrary object. + """ + tag = models.SlugField() + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + tagged_item = GenericForeignKey('content_type', 'object_id') + + def __unicode__(self): + return self.tag + + +class Bookmark(models.Model): + """ + A URL bookmark that may have multiple tags attached. + """ + url = models.URLField() + tags = GenericRelation(Tag) + + def __unicode__(self): + return 'Bookmark: %s' % self.url + + +class Note(models.Model): + """ + A textual note that may have multiple tags attached. + """ + text = models.TextField() + tags = GenericRelation(Tag) + + def __unicode__(self): + return 'Note: %s' % self.text + + +class TestGenericRelations(TestCase): + def setUp(self): + self.bookmark = Bookmark.objects.create(url='https://www.djangoproject.com/') + Tag.objects.create(tagged_item=self.bookmark, tag='django') + Tag.objects.create(tagged_item=self.bookmark, tag='python') + self.note = Note.objects.create(text='Remember the milk') + Tag.objects.create(tagged_item=self.note, tag='reminder') + + def test_generic_relation(self): + """ + Test a relationship that spans a GenericRelation field. + IE. A reverse generic relationship. + """ + + class BookmarkSerializer(serializers.ModelSerializer): + tags = serializers.RelatedField(many=True) + + class Meta: + model = Bookmark + exclude = ('id',) + + serializer = BookmarkSerializer(self.bookmark) + expected = { + 'tags': ['django', 'python'], + 'url': 'https://www.djangoproject.com/' + } + self.assertEqual(serializer.data, expected) + + def test_generic_fk(self): + """ + Test a relationship that spans a GenericForeignKey field. + IE. A forward generic relationship. + """ + + class TagSerializer(serializers.ModelSerializer): + tagged_item = serializers.RelatedField() + + class Meta: + model = Tag + exclude = ('id', 'content_type', 'object_id') + + serializer = TagSerializer(Tag.objects.all(), many=True) + expected = [ + { + 'tag': 'django', + 'tagged_item': 'Bookmark: https://www.djangoproject.com/' + }, + { + 'tag': 'python', + 'tagged_item': 'Bookmark: https://www.djangoproject.com/' + }, + { + 'tag': 'reminder', + 'tagged_item': 'Note: Remember the milk' + } + ] + self.assertEqual(serializer.data, expected) diff --git a/vendor-local/lib/python/rest_framework/tests/test_generics.py b/vendor-local/lib/python/rest_framework/tests/test_generics.py new file mode 100644 index 00000000000..1550880b56b --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_generics.py @@ -0,0 +1,544 @@ +from __future__ import unicode_literals +from django.db import models +from django.shortcuts import get_object_or_404 +from django.test import TestCase +from rest_framework import generics, renderers, serializers, status +from rest_framework.test import APIRequestFactory +from rest_framework.tests.models import BasicModel, Comment, SlugBasedModel +from rest_framework.compat import six + +factory = APIRequestFactory() + + +class RootView(generics.ListCreateAPIView): + """ + Example description for OPTIONS. + """ + model = BasicModel + + +class InstanceView(generics.RetrieveUpdateDestroyAPIView): + """ + Example description for OPTIONS. + """ + model = BasicModel + + +class SlugSerializer(serializers.ModelSerializer): + slug = serializers.Field() # read only + + class Meta: + model = SlugBasedModel + exclude = ('id',) + + +class SlugBasedInstanceView(InstanceView): + """ + A model with a slug-field. + """ + model = SlugBasedModel + serializer_class = SlugSerializer + lookup_field = 'slug' + + +class TestRootView(TestCase): + def setUp(self): + """ + Create 3 BasicModel instances. + """ + items = ['foo', 'bar', 'baz'] + for item in items: + BasicModel(text=item).save() + self.objects = BasicModel.objects + self.data = [ + {'id': obj.id, 'text': obj.text} + for obj in self.objects.all() + ] + self.view = RootView.as_view() + + def test_get_root_view(self): + """ + GET requests to ListCreateAPIView should return list of objects. + """ + request = factory.get('/') + with self.assertNumQueries(1): + response = self.view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, self.data) + + def test_post_root_view(self): + """ + POST requests to ListCreateAPIView should create a new object. + """ + data = {'text': 'foobar'} + request = factory.post('/', data, format='json') + with self.assertNumQueries(1): + response = self.view(request).render() + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(response.data, {'id': 4, 'text': 'foobar'}) + created = self.objects.get(id=4) + self.assertEqual(created.text, 'foobar') + + def test_put_root_view(self): + """ + PUT requests to ListCreateAPIView should not be allowed + """ + data = {'text': 'foobar'} + request = factory.put('/', data, format='json') + with self.assertNumQueries(0): + response = self.view(request).render() + self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + self.assertEqual(response.data, {"detail": "Method 'PUT' not allowed."}) + + def test_delete_root_view(self): + """ + DELETE requests to ListCreateAPIView should not be allowed + """ + request = factory.delete('/') + with self.assertNumQueries(0): + response = self.view(request).render() + self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + self.assertEqual(response.data, {"detail": "Method 'DELETE' not allowed."}) + + def test_options_root_view(self): + """ + OPTIONS requests to ListCreateAPIView should return metadata + """ + request = factory.options('/') + with self.assertNumQueries(0): + response = self.view(request).render() + expected = { + 'parses': [ + 'application/json', + 'application/x-www-form-urlencoded', + 'multipart/form-data' + ], + 'renders': [ + 'application/json', + 'text/html' + ], + 'name': 'Root', + 'description': 'Example description for OPTIONS.', + 'actions': { + 'POST': { + 'text': { + 'max_length': 100, + 'read_only': False, + 'required': True, + 'type': 'string', + "label": "Text comes here", + "help_text": "Text description." + }, + 'id': { + 'read_only': True, + 'required': False, + 'type': 'integer', + 'label': 'ID', + }, + } + } + } + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, expected) + + def test_post_cannot_set_id(self): + """ + POST requests to create a new object should not be able to set the id. + """ + data = {'id': 999, 'text': 'foobar'} + request = factory.post('/', data, format='json') + with self.assertNumQueries(1): + response = self.view(request).render() + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(response.data, {'id': 4, 'text': 'foobar'}) + created = self.objects.get(id=4) + self.assertEqual(created.text, 'foobar') + + +class TestInstanceView(TestCase): + def setUp(self): + """ + Create 3 BasicModel intances. + """ + items = ['foo', 'bar', 'baz'] + for item in items: + BasicModel(text=item).save() + self.objects = BasicModel.objects + self.data = [ + {'id': obj.id, 'text': obj.text} + for obj in self.objects.all() + ] + self.view = InstanceView.as_view() + self.slug_based_view = SlugBasedInstanceView.as_view() + + def test_get_instance_view(self): + """ + GET requests to RetrieveUpdateDestroyAPIView should return a single object. + """ + request = factory.get('/1') + with self.assertNumQueries(1): + response = self.view(request, pk=1).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, self.data[0]) + + def test_post_instance_view(self): + """ + POST requests to RetrieveUpdateDestroyAPIView should not be allowed + """ + data = {'text': 'foobar'} + request = factory.post('/', data, format='json') + with self.assertNumQueries(0): + response = self.view(request).render() + self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + self.assertEqual(response.data, {"detail": "Method 'POST' not allowed."}) + + def test_put_instance_view(self): + """ + PUT requests to RetrieveUpdateDestroyAPIView should update an object. + """ + data = {'text': 'foobar'} + request = factory.put('/1', data, format='json') + with self.assertNumQueries(2): + response = self.view(request, pk='1').render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, {'id': 1, 'text': 'foobar'}) + updated = self.objects.get(id=1) + self.assertEqual(updated.text, 'foobar') + + def test_patch_instance_view(self): + """ + PATCH requests to RetrieveUpdateDestroyAPIView should update an object. + """ + data = {'text': 'foobar'} + request = factory.patch('/1', data, format='json') + + with self.assertNumQueries(2): + response = self.view(request, pk=1).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, {'id': 1, 'text': 'foobar'}) + updated = self.objects.get(id=1) + self.assertEqual(updated.text, 'foobar') + + def test_delete_instance_view(self): + """ + DELETE requests to RetrieveUpdateDestroyAPIView should delete an object. + """ + request = factory.delete('/1') + with self.assertNumQueries(2): + response = self.view(request, pk=1).render() + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + self.assertEqual(response.content, six.b('')) + ids = [obj.id for obj in self.objects.all()] + self.assertEqual(ids, [2, 3]) + + def test_options_instance_view(self): + """ + OPTIONS requests to RetrieveUpdateDestroyAPIView should return metadata + """ + request = factory.options('/1') + with self.assertNumQueries(1): + response = self.view(request, pk=1).render() + expected = { + 'parses': [ + 'application/json', + 'application/x-www-form-urlencoded', + 'multipart/form-data' + ], + 'renders': [ + 'application/json', + 'text/html' + ], + 'name': 'Instance', + 'description': 'Example description for OPTIONS.', + 'actions': { + 'PUT': { + 'text': { + 'max_length': 100, + 'read_only': False, + 'required': True, + 'type': 'string', + 'label': 'Text comes here', + 'help_text': 'Text description.' + }, + 'id': { + 'read_only': True, + 'required': False, + 'type': 'integer', + 'label': 'ID', + }, + } + } + } + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, expected) + + def test_get_instance_view_incorrect_arg(self): + """ + GET requests with an incorrect pk type, should raise 404, not 500. + Regression test for #890. + """ + request = factory.get('/a') + with self.assertNumQueries(0): + response = self.view(request, pk='a').render() + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + + def test_put_cannot_set_id(self): + """ + PUT requests to create a new object should not be able to set the id. + """ + data = {'id': 999, 'text': 'foobar'} + request = factory.put('/1', data, format='json') + with self.assertNumQueries(2): + response = self.view(request, pk=1).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, {'id': 1, 'text': 'foobar'}) + updated = self.objects.get(id=1) + self.assertEqual(updated.text, 'foobar') + + def test_put_to_deleted_instance(self): + """ + PUT requests to RetrieveUpdateDestroyAPIView should create an object + if it does not currently exist. + """ + self.objects.get(id=1).delete() + data = {'text': 'foobar'} + request = factory.put('/1', data, format='json') + with self.assertNumQueries(3): + response = self.view(request, pk=1).render() + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(response.data, {'id': 1, 'text': 'foobar'}) + updated = self.objects.get(id=1) + self.assertEqual(updated.text, 'foobar') + + def test_put_as_create_on_id_based_url(self): + """ + PUT requests to RetrieveUpdateDestroyAPIView should create an object + at the requested url if it doesn't exist. + """ + data = {'text': 'foobar'} + # pk fields can not be created on demand, only the database can set the pk for a new object + request = factory.put('/5', data, format='json') + with self.assertNumQueries(3): + response = self.view(request, pk=5).render() + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + new_obj = self.objects.get(pk=5) + self.assertEqual(new_obj.text, 'foobar') + + def test_put_as_create_on_slug_based_url(self): + """ + PUT requests to RetrieveUpdateDestroyAPIView should create an object + at the requested url if possible, else return HTTP_403_FORBIDDEN error-response. + """ + data = {'text': 'foobar'} + request = factory.put('/test_slug', data, format='json') + with self.assertNumQueries(2): + response = self.slug_based_view(request, slug='test_slug').render() + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(response.data, {'slug': 'test_slug', 'text': 'foobar'}) + new_obj = SlugBasedModel.objects.get(slug='test_slug') + self.assertEqual(new_obj.text, 'foobar') + + +class TestOverriddenGetObject(TestCase): + """ + Test cases for a RetrieveUpdateDestroyAPIView that does NOT use the + queryset/model mechanism but instead overrides get_object() + """ + def setUp(self): + """ + Create 3 BasicModel intances. + """ + items = ['foo', 'bar', 'baz'] + for item in items: + BasicModel(text=item).save() + self.objects = BasicModel.objects + self.data = [ + {'id': obj.id, 'text': obj.text} + for obj in self.objects.all() + ] + + class OverriddenGetObjectView(generics.RetrieveUpdateDestroyAPIView): + """ + Example detail view for override of get_object(). + """ + model = BasicModel + + def get_object(self): + pk = int(self.kwargs['pk']) + return get_object_or_404(BasicModel.objects.all(), id=pk) + + self.view = OverriddenGetObjectView.as_view() + + def test_overridden_get_object_view(self): + """ + GET requests to RetrieveUpdateDestroyAPIView should return a single object. + """ + request = factory.get('/1') + with self.assertNumQueries(1): + response = self.view(request, pk=1).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, self.data[0]) + + +# Regression test for #285 + +class CommentSerializer(serializers.ModelSerializer): + class Meta: + model = Comment + exclude = ('created',) + + +class CommentView(generics.ListCreateAPIView): + serializer_class = CommentSerializer + model = Comment + + +class TestCreateModelWithAutoNowAddField(TestCase): + def setUp(self): + self.objects = Comment.objects + self.view = CommentView.as_view() + + def test_create_model_with_auto_now_add_field(self): + """ + Regression test for #285 + + https://github.com/tomchristie/django-rest-framework/issues/285 + """ + data = {'email': 'foobar@example.com', 'content': 'foobar'} + request = factory.post('/', data, format='json') + response = self.view(request).render() + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + created = self.objects.get(id=1) + self.assertEqual(created.content, 'foobar') + + +# Test for particularly ugly regression with m2m in browsable API +class ClassB(models.Model): + name = models.CharField(max_length=255) + + +class ClassA(models.Model): + name = models.CharField(max_length=255) + childs = models.ManyToManyField(ClassB, blank=True, null=True) + + +class ClassASerializer(serializers.ModelSerializer): + childs = serializers.PrimaryKeyRelatedField(many=True, source='childs') + + class Meta: + model = ClassA + + +class ExampleView(generics.ListCreateAPIView): + serializer_class = ClassASerializer + model = ClassA + + +class TestM2MBrowseableAPI(TestCase): + def test_m2m_in_browseable_api(self): + """ + Test for particularly ugly regression with m2m in browsable API + """ + request = factory.get('/', HTTP_ACCEPT='text/html') + view = ExampleView().as_view() + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + + +class InclusiveFilterBackend(object): + def filter_queryset(self, request, queryset, view): + return queryset.filter(text='foo') + + +class ExclusiveFilterBackend(object): + def filter_queryset(self, request, queryset, view): + return queryset.filter(text='other') + + +class TestFilterBackendAppliedToViews(TestCase): + + def setUp(self): + """ + Create 3 BasicModel instances to filter on. + """ + items = ['foo', 'bar', 'baz'] + for item in items: + BasicModel(text=item).save() + self.objects = BasicModel.objects + self.data = [ + {'id': obj.id, 'text': obj.text} + for obj in self.objects.all() + ] + + def test_get_root_view_filters_by_name_with_filter_backend(self): + """ + GET requests to ListCreateAPIView should return filtered list. + """ + root_view = RootView.as_view(filter_backends=(InclusiveFilterBackend,)) + request = factory.get('/') + response = root_view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data), 1) + self.assertEqual(response.data, [{'id': 1, 'text': 'foo'}]) + + def test_get_root_view_filters_out_all_models_with_exclusive_filter_backend(self): + """ + GET requests to ListCreateAPIView should return empty list when all models are filtered out. + """ + root_view = RootView.as_view(filter_backends=(ExclusiveFilterBackend,)) + request = factory.get('/') + response = root_view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, []) + + def test_get_instance_view_filters_out_name_with_filter_backend(self): + """ + GET requests to RetrieveUpdateDestroyAPIView should raise 404 when model filtered out. + """ + instance_view = InstanceView.as_view(filter_backends=(ExclusiveFilterBackend,)) + request = factory.get('/1') + response = instance_view(request, pk=1).render() + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + self.assertEqual(response.data, {'detail': 'Not found'}) + + def test_get_instance_view_will_return_single_object_when_filter_does_not_exclude_it(self): + """ + GET requests to RetrieveUpdateDestroyAPIView should return a single object when not excluded + """ + instance_view = InstanceView.as_view(filter_backends=(InclusiveFilterBackend,)) + request = factory.get('/1') + response = instance_view(request, pk=1).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, {'id': 1, 'text': 'foo'}) + + +class TwoFieldModel(models.Model): + field_a = models.CharField(max_length=100) + field_b = models.CharField(max_length=100) + + +class DynamicSerializerView(generics.ListCreateAPIView): + model = TwoFieldModel + renderer_classes = (renderers.BrowsableAPIRenderer, renderers.JSONRenderer) + + def get_serializer_class(self): + if self.request.method == 'POST': + class DynamicSerializer(serializers.ModelSerializer): + class Meta: + model = TwoFieldModel + fields = ('field_b',) + return DynamicSerializer + return super(DynamicSerializerView, self).get_serializer_class() + + +class TestFilterBackendAppliedToViews(TestCase): + + def test_dynamic_serializer_form_in_browsable_api(self): + """ + GET requests to ListCreateAPIView should return filtered list. + """ + view = DynamicSerializerView.as_view() + request = factory.get('/') + response = view(request).render() + self.assertContains(response, 'field_b') + self.assertNotContains(response, 'field_a') diff --git a/vendor-local/lib/python/rest_framework/tests/test_htmlrenderer.py b/vendor-local/lib/python/rest_framework/tests/test_htmlrenderer.py new file mode 100644 index 00000000000..8957a43c72f --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_htmlrenderer.py @@ -0,0 +1,118 @@ +from __future__ import unicode_literals +from django.core.exceptions import PermissionDenied +from django.http import Http404 +from django.test import TestCase +from django.template import TemplateDoesNotExist, Template +import django.template.loader +from rest_framework import status +from rest_framework.compat import patterns, url +from rest_framework.decorators import api_view, renderer_classes +from rest_framework.renderers import TemplateHTMLRenderer +from rest_framework.response import Response +from rest_framework.compat import six + + +@api_view(('GET',)) +@renderer_classes((TemplateHTMLRenderer,)) +def example(request): + """ + A view that can returns an HTML representation. + """ + data = {'object': 'foobar'} + return Response(data, template_name='example.html') + + +@api_view(('GET',)) +@renderer_classes((TemplateHTMLRenderer,)) +def permission_denied(request): + raise PermissionDenied() + + +@api_view(('GET',)) +@renderer_classes((TemplateHTMLRenderer,)) +def not_found(request): + raise Http404() + + +urlpatterns = patterns('', + url(r'^$', example), + url(r'^permission_denied$', permission_denied), + url(r'^not_found$', not_found), +) + + +class TemplateHTMLRendererTests(TestCase): + urls = 'rest_framework.tests.test_htmlrenderer' + + def setUp(self): + """ + Monkeypatch get_template + """ + self.get_template = django.template.loader.get_template + + def get_template(template_name): + if template_name == 'example.html': + return Template("example: {{ object }}") + raise TemplateDoesNotExist(template_name) + + django.template.loader.get_template = get_template + + def tearDown(self): + """ + Revert monkeypatching + """ + django.template.loader.get_template = self.get_template + + def test_simple_html_view(self): + response = self.client.get('/') + self.assertContains(response, "example: foobar") + self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') + + def test_not_found_html_view(self): + response = self.client.get('/not_found') + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + self.assertEqual(response.content, six.b("404 Not Found")) + self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') + + def test_permission_denied_html_view(self): + response = self.client.get('/permission_denied') + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertEqual(response.content, six.b("403 Forbidden")) + self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') + + +class TemplateHTMLRendererExceptionTests(TestCase): + urls = 'rest_framework.tests.test_htmlrenderer' + + def setUp(self): + """ + Monkeypatch get_template + """ + self.get_template = django.template.loader.get_template + + def get_template(template_name): + if template_name == '404.html': + return Template("404: {{ detail }}") + if template_name == '403.html': + return Template("403: {{ detail }}") + raise TemplateDoesNotExist(template_name) + + django.template.loader.get_template = get_template + + def tearDown(self): + """ + Revert monkeypatching + """ + django.template.loader.get_template = self.get_template + + def test_not_found_html_view_with_template(self): + response = self.client.get('/not_found') + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + self.assertEqual(response.content, six.b("404: Not found")) + self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') + + def test_permission_denied_html_view_with_template(self): + response = self.client.get('/permission_denied') + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertEqual(response.content, six.b("403: Permission denied")) + self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') diff --git a/vendor-local/lib/python/rest_framework/tests/test_hyperlinkedserializers.py b/vendor-local/lib/python/rest_framework/tests/test_hyperlinkedserializers.py new file mode 100644 index 00000000000..61e613d75ef --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_hyperlinkedserializers.py @@ -0,0 +1,333 @@ +from __future__ import unicode_literals +import json +from django.test import TestCase +from rest_framework import generics, status, serializers +from rest_framework.compat import patterns, url +from rest_framework.test import APIRequestFactory +from rest_framework.tests.models import ( + Anchor, BasicModel, ManyToManyModel, BlogPost, BlogPostComment, + Album, Photo, OptionalRelationModel +) + +factory = APIRequestFactory() + + +class BlogPostCommentSerializer(serializers.ModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='blogpostcomment-detail') + text = serializers.CharField() + blog_post_url = serializers.HyperlinkedRelatedField(source='blog_post', view_name='blogpost-detail') + + class Meta: + model = BlogPostComment + fields = ('text', 'blog_post_url', 'url') + + +class PhotoSerializer(serializers.Serializer): + description = serializers.CharField() + album_url = serializers.HyperlinkedRelatedField(source='album', view_name='album-detail', queryset=Album.objects.all(), lookup_field='title', slug_url_kwarg='title') + + def restore_object(self, attrs, instance=None): + return Photo(**attrs) + + +class AlbumSerializer(serializers.ModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='album-detail', lookup_field='title') + + class Meta: + model = Album + fields = ('title', 'url') + + +class BasicList(generics.ListCreateAPIView): + model = BasicModel + model_serializer_class = serializers.HyperlinkedModelSerializer + + +class BasicDetail(generics.RetrieveUpdateDestroyAPIView): + model = BasicModel + model_serializer_class = serializers.HyperlinkedModelSerializer + + +class AnchorDetail(generics.RetrieveAPIView): + model = Anchor + model_serializer_class = serializers.HyperlinkedModelSerializer + + +class ManyToManyList(generics.ListAPIView): + model = ManyToManyModel + model_serializer_class = serializers.HyperlinkedModelSerializer + + +class ManyToManyDetail(generics.RetrieveAPIView): + model = ManyToManyModel + model_serializer_class = serializers.HyperlinkedModelSerializer + + +class BlogPostCommentListCreate(generics.ListCreateAPIView): + model = BlogPostComment + serializer_class = BlogPostCommentSerializer + + +class BlogPostCommentDetail(generics.RetrieveAPIView): + model = BlogPostComment + serializer_class = BlogPostCommentSerializer + + +class BlogPostDetail(generics.RetrieveAPIView): + model = BlogPost + + +class PhotoListCreate(generics.ListCreateAPIView): + model = Photo + model_serializer_class = PhotoSerializer + + +class AlbumDetail(generics.RetrieveAPIView): + model = Album + serializer_class = AlbumSerializer + lookup_field = 'title' + + +class OptionalRelationDetail(generics.RetrieveUpdateDestroyAPIView): + model = OptionalRelationModel + model_serializer_class = serializers.HyperlinkedModelSerializer + + +urlpatterns = patterns('', + url(r'^basic/$', BasicList.as_view(), name='basicmodel-list'), + url(r'^basic/(?P\d+)/$', BasicDetail.as_view(), name='basicmodel-detail'), + url(r'^anchor/(?P\d+)/$', AnchorDetail.as_view(), name='anchor-detail'), + url(r'^manytomany/$', ManyToManyList.as_view(), name='manytomanymodel-list'), + url(r'^manytomany/(?P\d+)/$', ManyToManyDetail.as_view(), name='manytomanymodel-detail'), + url(r'^posts/(?P\d+)/$', BlogPostDetail.as_view(), name='blogpost-detail'), + url(r'^comments/$', BlogPostCommentListCreate.as_view(), name='blogpostcomment-list'), + url(r'^comments/(?P\d+)/$', BlogPostCommentDetail.as_view(), name='blogpostcomment-detail'), + url(r'^albums/(?P\w[\w-]*)/$', AlbumDetail.as_view(), name='album-detail'), + url(r'^photos/$', PhotoListCreate.as_view(), name='photo-list'), + url(r'^optionalrelation/(?P<pk>\d+)/$', OptionalRelationDetail.as_view(), name='optionalrelationmodel-detail'), +) + + +class TestBasicHyperlinkedView(TestCase): + urls = 'rest_framework.tests.test_hyperlinkedserializers' + + def setUp(self): + """ + Create 3 BasicModel instances. + """ + items = ['foo', 'bar', 'baz'] + for item in items: + BasicModel(text=item).save() + self.objects = BasicModel.objects + self.data = [ + {'url': 'http://testserver/basic/%d/' % obj.id, 'text': obj.text} + for obj in self.objects.all() + ] + self.list_view = BasicList.as_view() + self.detail_view = BasicDetail.as_view() + + def test_get_list_view(self): + """ + GET requests to ListCreateAPIView should return list of objects. + """ + request = factory.get('/basic/') + response = self.list_view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, self.data) + + def test_get_detail_view(self): + """ + GET requests to ListCreateAPIView should return list of objects. + """ + request = factory.get('/basic/1') + response = self.detail_view(request, pk=1).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, self.data[0]) + + +class TestManyToManyHyperlinkedView(TestCase): + urls = 'rest_framework.tests.test_hyperlinkedserializers' + + def setUp(self): + """ + Create 3 BasicModel instances. + """ + items = ['foo', 'bar', 'baz'] + anchors = [] + for item in items: + anchor = Anchor(text=item) + anchor.save() + anchors.append(anchor) + + manytomany = ManyToManyModel() + manytomany.save() + manytomany.rel.add(*anchors) + + self.data = [{ + 'url': 'http://testserver/manytomany/1/', + 'rel': [ + 'http://testserver/anchor/1/', + 'http://testserver/anchor/2/', + 'http://testserver/anchor/3/', + ] + }] + self.list_view = ManyToManyList.as_view() + self.detail_view = ManyToManyDetail.as_view() + + def test_get_list_view(self): + """ + GET requests to ListCreateAPIView should return list of objects. + """ + request = factory.get('/manytomany/') + response = self.list_view(request) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, self.data) + + def test_get_detail_view(self): + """ + GET requests to ListCreateAPIView should return list of objects. + """ + request = factory.get('/manytomany/1/') + response = self.detail_view(request, pk=1) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, self.data[0]) + + +class TestHyperlinkedIdentityFieldLookup(TestCase): + urls = 'rest_framework.tests.test_hyperlinkedserializers' + + def setUp(self): + """ + Create 3 Album instances. + """ + titles = ['foo', 'bar', 'baz'] + for title in titles: + album = Album(title=title) + album.save() + self.detail_view = AlbumDetail.as_view() + self.data = { + 'foo': {'title': 'foo', 'url': 'http://testserver/albums/foo/'}, + 'bar': {'title': 'bar', 'url': 'http://testserver/albums/bar/'}, + 'baz': {'title': 'baz', 'url': 'http://testserver/albums/baz/'} + } + + def test_lookup_field(self): + """ + GET requests to AlbumDetail view should return serialized Albums + with a url field keyed by `title`. + """ + for album in Album.objects.all(): + request = factory.get('/albums/{0}/'.format(album.title)) + response = self.detail_view(request, title=album.title) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, self.data[album.title]) + + +class TestCreateWithForeignKeys(TestCase): + urls = 'rest_framework.tests.test_hyperlinkedserializers' + + def setUp(self): + """ + Create a blog post + """ + self.post = BlogPost.objects.create(title="Test post") + self.create_view = BlogPostCommentListCreate.as_view() + + def test_create_comment(self): + + data = { + 'text': 'A test comment', + 'blog_post_url': 'http://testserver/posts/1/' + } + + request = factory.post('/comments/', data=data) + response = self.create_view(request) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(response['Location'], 'http://testserver/comments/1/') + self.assertEqual(self.post.blogpostcomment_set.count(), 1) + self.assertEqual(self.post.blogpostcomment_set.all()[0].text, 'A test comment') + + +class TestCreateWithForeignKeysAndCustomSlug(TestCase): + urls = 'rest_framework.tests.test_hyperlinkedserializers' + + def setUp(self): + """ + Create an Album + """ + self.post = Album.objects.create(title='test-album') + self.list_create_view = PhotoListCreate.as_view() + + def test_create_photo(self): + + data = { + 'description': 'A test photo', + 'album_url': 'http://testserver/albums/test-album/' + } + + request = factory.post('/photos/', data=data) + response = self.list_create_view(request) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertNotIn('Location', response, msg='Location should only be included if there is a "url" field on the serializer') + self.assertEqual(self.post.photo_set.count(), 1) + self.assertEqual(self.post.photo_set.all()[0].description, 'A test photo') + + +class TestOptionalRelationHyperlinkedView(TestCase): + urls = 'rest_framework.tests.test_hyperlinkedserializers' + + def setUp(self): + """ + Create 1 OptionalRelationModel instances. + """ + OptionalRelationModel().save() + self.objects = OptionalRelationModel.objects + self.detail_view = OptionalRelationDetail.as_view() + self.data = {"url": "http://testserver/optionalrelation/1/", "other": None} + + def test_get_detail_view(self): + """ + GET requests to RetrieveAPIView with optional relations should return None + for non existing relations. + """ + request = factory.get('/optionalrelationmodel-detail/1') + response = self.detail_view(request, pk=1) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, self.data) + + def test_put_detail_view(self): + """ + PUT requests to RetrieveUpdateDestroyAPIView with optional relations + should accept None for non existing relations. + """ + response = self.client.put('/optionalrelation/1/', + data=json.dumps(self.data), + content_type='application/json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + +class TestOverriddenURLField(TestCase): + def setUp(self): + class OverriddenURLSerializer(serializers.HyperlinkedModelSerializer): + url = serializers.SerializerMethodField('get_url') + + class Meta: + model = BlogPost + fields = ('title', 'url') + + def get_url(self, obj): + return 'foo bar' + + self.Serializer = OverriddenURLSerializer + self.obj = BlogPost.objects.create(title='New blog post') + + def test_overridden_url_field(self): + """ + The 'url' field should respect overriding. + Regression test for #936. + """ + serializer = self.Serializer(self.obj) + self.assertEqual( + serializer.data, + {'title': 'New blog post', 'url': 'foo bar'} + ) diff --git a/vendor-local/lib/python/rest_framework/tests/test_multitable_inheritance.py b/vendor-local/lib/python/rest_framework/tests/test_multitable_inheritance.py new file mode 100644 index 00000000000..00c15327608 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_multitable_inheritance.py @@ -0,0 +1,67 @@ +from __future__ import unicode_literals +from django.db import models +from django.test import TestCase +from rest_framework import serializers +from rest_framework.tests.models import RESTFrameworkModel + + +# Models +class ParentModel(RESTFrameworkModel): + name1 = models.CharField(max_length=100) + + +class ChildModel(ParentModel): + name2 = models.CharField(max_length=100) + + +class AssociatedModel(RESTFrameworkModel): + ref = models.OneToOneField(ParentModel, primary_key=True) + name = models.CharField(max_length=100) + + +# Serializers +class DerivedModelSerializer(serializers.ModelSerializer): + class Meta: + model = ChildModel + + +class AssociatedModelSerializer(serializers.ModelSerializer): + class Meta: + model = AssociatedModel + + +# Tests +class IneritedModelSerializationTests(TestCase): + + def test_multitable_inherited_model_fields_as_expected(self): + """ + Assert that the parent pointer field is not included in the fields + serialized fields + """ + child = ChildModel(name1='parent name', name2='child name') + serializer = DerivedModelSerializer(child) + self.assertEqual(set(serializer.data.keys()), + set(['name1', 'name2', 'id'])) + + def test_onetoone_primary_key_model_fields_as_expected(self): + """ + Assert that a model with a onetoone field that is the primary key is + not treated like a derived model + """ + parent = ParentModel(name1='parent name') + associate = AssociatedModel(name='hello', ref=parent) + serializer = AssociatedModelSerializer(associate) + self.assertEqual(set(serializer.data.keys()), + set(['name', 'ref'])) + + def test_data_is_valid_without_parent_ptr(self): + """ + Assert that the pointer to the parent table is not a required field + for input data + """ + data = { + 'name1': 'parent name', + 'name2': 'child name', + } + serializer = DerivedModelSerializer(data=data) + self.assertEqual(serializer.is_valid(), True) diff --git a/vendor-local/lib/python/rest_framework/tests/test_negotiation.py b/vendor-local/lib/python/rest_framework/tests/test_negotiation.py new file mode 100644 index 00000000000..04b89eb6000 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_negotiation.py @@ -0,0 +1,45 @@ +from __future__ import unicode_literals +from django.test import TestCase +from rest_framework.negotiation import DefaultContentNegotiation +from rest_framework.request import Request +from rest_framework.renderers import BaseRenderer +from rest_framework.test import APIRequestFactory + + +factory = APIRequestFactory() + + +class MockJSONRenderer(BaseRenderer): + media_type = 'application/json' + + +class MockHTMLRenderer(BaseRenderer): + media_type = 'text/html' + + +class NoCharsetSpecifiedRenderer(BaseRenderer): + media_type = 'my/media' + + +class TestAcceptedMediaType(TestCase): + def setUp(self): + self.renderers = [MockJSONRenderer(), MockHTMLRenderer()] + self.negotiator = DefaultContentNegotiation() + + def select_renderer(self, request): + return self.negotiator.select_renderer(request, self.renderers) + + def test_client_without_accept_use_renderer(self): + request = Request(factory.get('/')) + accepted_renderer, accepted_media_type = self.select_renderer(request) + self.assertEqual(accepted_media_type, 'application/json') + + def test_client_underspecifies_accept_use_renderer(self): + request = Request(factory.get('/', HTTP_ACCEPT='*/*')) + accepted_renderer, accepted_media_type = self.select_renderer(request) + self.assertEqual(accepted_media_type, 'application/json') + + def test_client_overspecifies_accept_use_client(self): + request = Request(factory.get('/', HTTP_ACCEPT='application/json; indent=8')) + accepted_renderer, accepted_media_type = self.select_renderer(request) + self.assertEqual(accepted_media_type, 'application/json; indent=8') diff --git a/vendor-local/lib/python/rest_framework/tests/test_pagination.py b/vendor-local/lib/python/rest_framework/tests/test_pagination.py new file mode 100644 index 00000000000..85d4640ead7 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_pagination.py @@ -0,0 +1,385 @@ +from __future__ import unicode_literals +import datetime +from decimal import Decimal +from django.db import models +from django.core.paginator import Paginator +from django.test import TestCase +from django.utils import unittest +from rest_framework import generics, status, pagination, filters, serializers +from rest_framework.compat import django_filters +from rest_framework.test import APIRequestFactory +from rest_framework.tests.models import BasicModel + +factory = APIRequestFactory() + + +class FilterableItem(models.Model): + text = models.CharField(max_length=100) + decimal = models.DecimalField(max_digits=4, decimal_places=2) + date = models.DateField() + + +class RootView(generics.ListCreateAPIView): + """ + Example description for OPTIONS. + """ + model = BasicModel + paginate_by = 10 + + +class DefaultPageSizeKwargView(generics.ListAPIView): + """ + View for testing default paginate_by_param usage + """ + model = BasicModel + + +class PaginateByParamView(generics.ListAPIView): + """ + View for testing custom paginate_by_param usage + """ + model = BasicModel + paginate_by_param = 'page_size' + + +class IntegrationTestPagination(TestCase): + """ + Integration tests for paginated list views. + """ + + def setUp(self): + """ + Create 26 BasicModel instances. + """ + for char in 'abcdefghijklmnopqrstuvwxyz': + BasicModel(text=char * 3).save() + self.objects = BasicModel.objects + self.data = [ + {'id': obj.id, 'text': obj.text} + for obj in self.objects.all() + ] + self.view = RootView.as_view() + + def test_get_paginated_root_view(self): + """ + GET requests to paginated ListCreateAPIView should return paginated results. + """ + request = factory.get('/') + # Note: Database queries are a `SELECT COUNT`, and `SELECT <fields>` + with self.assertNumQueries(2): + response = self.view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 26) + self.assertEqual(response.data['results'], self.data[:10]) + self.assertNotEqual(response.data['next'], None) + self.assertEqual(response.data['previous'], None) + + request = factory.get(response.data['next']) + with self.assertNumQueries(2): + response = self.view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 26) + self.assertEqual(response.data['results'], self.data[10:20]) + self.assertNotEqual(response.data['next'], None) + self.assertNotEqual(response.data['previous'], None) + + request = factory.get(response.data['next']) + with self.assertNumQueries(2): + response = self.view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 26) + self.assertEqual(response.data['results'], self.data[20:]) + self.assertEqual(response.data['next'], None) + self.assertNotEqual(response.data['previous'], None) + + +class IntegrationTestPaginationAndFiltering(TestCase): + + def setUp(self): + """ + Create 50 FilterableItem instances. + """ + base_data = ('a', Decimal('0.25'), datetime.date(2012, 10, 8)) + for i in range(26): + text = chr(i + ord(base_data[0])) * 3 # Produces string 'aaa', 'bbb', etc. + decimal = base_data[1] + i + date = base_data[2] - datetime.timedelta(days=i * 2) + FilterableItem(text=text, decimal=decimal, date=date).save() + + self.objects = FilterableItem.objects + self.data = [ + {'id': obj.id, 'text': obj.text, 'decimal': obj.decimal, 'date': obj.date} + for obj in self.objects.all() + ] + + @unittest.skipUnless(django_filters, 'django-filters not installed') + def test_get_django_filter_paginated_filtered_root_view(self): + """ + GET requests to paginated filtered ListCreateAPIView should return + paginated results. The next and previous links should preserve the + filtered parameters. + """ + class DecimalFilter(django_filters.FilterSet): + decimal = django_filters.NumberFilter(lookup_type='lt') + + class Meta: + model = FilterableItem + fields = ['text', 'decimal', 'date'] + + class FilterFieldsRootView(generics.ListCreateAPIView): + model = FilterableItem + paginate_by = 10 + filter_class = DecimalFilter + filter_backends = (filters.DjangoFilterBackend,) + + view = FilterFieldsRootView.as_view() + + EXPECTED_NUM_QUERIES = 2 + + request = factory.get('/?decimal=15.20') + with self.assertNumQueries(EXPECTED_NUM_QUERIES): + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 15) + self.assertEqual(response.data['results'], self.data[:10]) + self.assertNotEqual(response.data['next'], None) + self.assertEqual(response.data['previous'], None) + + request = factory.get(response.data['next']) + with self.assertNumQueries(EXPECTED_NUM_QUERIES): + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 15) + self.assertEqual(response.data['results'], self.data[10:15]) + self.assertEqual(response.data['next'], None) + self.assertNotEqual(response.data['previous'], None) + + request = factory.get(response.data['previous']) + with self.assertNumQueries(EXPECTED_NUM_QUERIES): + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 15) + self.assertEqual(response.data['results'], self.data[:10]) + self.assertNotEqual(response.data['next'], None) + self.assertEqual(response.data['previous'], None) + + def test_get_basic_paginated_filtered_root_view(self): + """ + Same as `test_get_django_filter_paginated_filtered_root_view`, + except using a custom filter backend instead of the django-filter + backend, + """ + + class DecimalFilterBackend(filters.BaseFilterBackend): + def filter_queryset(self, request, queryset, view): + return queryset.filter(decimal__lt=Decimal(request.GET['decimal'])) + + class BasicFilterFieldsRootView(generics.ListCreateAPIView): + model = FilterableItem + paginate_by = 10 + filter_backends = (DecimalFilterBackend,) + + view = BasicFilterFieldsRootView.as_view() + + request = factory.get('/?decimal=15.20') + with self.assertNumQueries(2): + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 15) + self.assertEqual(response.data['results'], self.data[:10]) + self.assertNotEqual(response.data['next'], None) + self.assertEqual(response.data['previous'], None) + + request = factory.get(response.data['next']) + with self.assertNumQueries(2): + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 15) + self.assertEqual(response.data['results'], self.data[10:15]) + self.assertEqual(response.data['next'], None) + self.assertNotEqual(response.data['previous'], None) + + request = factory.get(response.data['previous']) + with self.assertNumQueries(2): + response = view(request).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 15) + self.assertEqual(response.data['results'], self.data[:10]) + self.assertNotEqual(response.data['next'], None) + self.assertEqual(response.data['previous'], None) + + +class PassOnContextPaginationSerializer(pagination.PaginationSerializer): + class Meta: + object_serializer_class = serializers.Serializer + + +class UnitTestPagination(TestCase): + """ + Unit tests for pagination of primitive objects. + """ + + def setUp(self): + self.objects = [char * 3 for char in 'abcdefghijklmnopqrstuvwxyz'] + paginator = Paginator(self.objects, 10) + self.first_page = paginator.page(1) + self.last_page = paginator.page(3) + + def test_native_pagination(self): + serializer = pagination.PaginationSerializer(self.first_page) + self.assertEqual(serializer.data['count'], 26) + self.assertEqual(serializer.data['next'], '?page=2') + self.assertEqual(serializer.data['previous'], None) + self.assertEqual(serializer.data['results'], self.objects[:10]) + + serializer = pagination.PaginationSerializer(self.last_page) + self.assertEqual(serializer.data['count'], 26) + self.assertEqual(serializer.data['next'], None) + self.assertEqual(serializer.data['previous'], '?page=2') + self.assertEqual(serializer.data['results'], self.objects[20:]) + + def test_context_available_in_result(self): + """ + Ensure context gets passed through to the object serializer. + """ + serializer = PassOnContextPaginationSerializer(self.first_page, context={'foo': 'bar'}) + serializer.data + results = serializer.fields[serializer.results_field] + self.assertEqual(serializer.context, results.context) + + +class TestUnpaginated(TestCase): + """ + Tests for list views without pagination. + """ + + def setUp(self): + """ + Create 13 BasicModel instances. + """ + for i in range(13): + BasicModel(text=i).save() + self.objects = BasicModel.objects + self.data = [ + {'id': obj.id, 'text': obj.text} + for obj in self.objects.all() + ] + self.view = DefaultPageSizeKwargView.as_view() + + def test_unpaginated(self): + """ + Tests the default page size for this view. + no page size --> no limit --> no meta data + """ + request = factory.get('/') + response = self.view(request) + self.assertEqual(response.data, self.data) + + +class TestCustomPaginateByParam(TestCase): + """ + Tests for list views with default page size kwarg + """ + + def setUp(self): + """ + Create 13 BasicModel instances. + """ + for i in range(13): + BasicModel(text=i).save() + self.objects = BasicModel.objects + self.data = [ + {'id': obj.id, 'text': obj.text} + for obj in self.objects.all() + ] + self.view = PaginateByParamView.as_view() + + def test_default_page_size(self): + """ + Tests the default page size for this view. + no page size --> no limit --> no meta data + """ + request = factory.get('/') + response = self.view(request).render() + self.assertEqual(response.data, self.data) + + def test_paginate_by_param(self): + """ + If paginate_by_param is set, the new kwarg should limit per view requests. + """ + request = factory.get('/?page_size=5') + response = self.view(request).render() + self.assertEqual(response.data['count'], 13) + self.assertEqual(response.data['results'], self.data[:5]) + + +### Tests for context in pagination serializers + +class CustomField(serializers.Field): + def to_native(self, value): + if not 'view' in self.context: + raise RuntimeError("context isn't getting passed into custom field") + return "value" + + +class BasicModelSerializer(serializers.Serializer): + text = CustomField() + + def __init__(self, *args, **kwargs): + super(BasicModelSerializer, self).__init__(*args, **kwargs) + if not 'view' in self.context: + raise RuntimeError("context isn't getting passed into serializer init") + + +class TestContextPassedToCustomField(TestCase): + def setUp(self): + BasicModel.objects.create(text='ala ma kota') + + def test_with_pagination(self): + class ListView(generics.ListCreateAPIView): + model = BasicModel + serializer_class = BasicModelSerializer + paginate_by = 1 + + self.view = ListView.as_view() + request = factory.get('/') + response = self.view(request).render() + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + +### Tests for custom pagination serializers + +class LinksSerializer(serializers.Serializer): + next = pagination.NextPageField(source='*') + prev = pagination.PreviousPageField(source='*') + + +class CustomPaginationSerializer(pagination.BasePaginationSerializer): + links = LinksSerializer(source='*') # Takes the page object as the source + total_results = serializers.Field(source='paginator.count') + + results_field = 'objects' + + +class TestCustomPaginationSerializer(TestCase): + def setUp(self): + objects = ['john', 'paul', 'george', 'ringo'] + paginator = Paginator(objects, 2) + self.page = paginator.page(1) + + def test_custom_pagination_serializer(self): + request = APIRequestFactory().get('/foobar') + serializer = CustomPaginationSerializer( + instance=self.page, + context={'request': request} + ) + expected = { + 'links': { + 'next': 'http://testserver/foobar?page=2', + 'prev': None + }, + 'total_results': 4, + 'objects': ['john', 'paul'] + } + self.assertEqual(serializer.data, expected) diff --git a/vendor-local/lib/python/rest_framework/tests/test_parsers.py b/vendor-local/lib/python/rest_framework/tests/test_parsers.py new file mode 100644 index 00000000000..7699e10c91b --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_parsers.py @@ -0,0 +1,115 @@ +from __future__ import unicode_literals +from rest_framework.compat import StringIO +from django import forms +from django.core.files.uploadhandler import MemoryFileUploadHandler +from django.test import TestCase +from django.utils import unittest +from rest_framework.compat import etree +from rest_framework.parsers import FormParser, FileUploadParser +from rest_framework.parsers import XMLParser +import datetime + + +class Form(forms.Form): + field1 = forms.CharField(max_length=3) + field2 = forms.CharField() + + +class TestFormParser(TestCase): + def setUp(self): + self.string = "field1=abc&field2=defghijk" + + def test_parse(self): + """ Make sure the `QueryDict` works OK """ + parser = FormParser() + + stream = StringIO(self.string) + data = parser.parse(stream) + + self.assertEqual(Form(data).is_valid(), True) + + +class TestXMLParser(TestCase): + def setUp(self): + self._input = StringIO( + '<?xml version="1.0" encoding="utf-8"?>' + '<root>' + '<field_a>121.0</field_a>' + '<field_b>dasd</field_b>' + '<field_c></field_c>' + '<field_d>2011-12-25 12:45:00</field_d>' + '</root>' + ) + self._data = { + 'field_a': 121, + 'field_b': 'dasd', + 'field_c': None, + 'field_d': datetime.datetime(2011, 12, 25, 12, 45, 00) + } + self._complex_data_input = StringIO( + '<?xml version="1.0" encoding="utf-8"?>' + '<root>' + '<creation_date>2011-12-25 12:45:00</creation_date>' + '<sub_data_list>' + '<list-item><sub_id>1</sub_id><sub_name>first</sub_name></list-item>' + '<list-item><sub_id>2</sub_id><sub_name>second</sub_name></list-item>' + '</sub_data_list>' + '<name>name</name>' + '</root>' + ) + self._complex_data = { + "creation_date": datetime.datetime(2011, 12, 25, 12, 45, 00), + "name": "name", + "sub_data_list": [ + { + "sub_id": 1, + "sub_name": "first" + }, + { + "sub_id": 2, + "sub_name": "second" + } + ] + } + + @unittest.skipUnless(etree, 'defusedxml not installed') + def test_parse(self): + parser = XMLParser() + data = parser.parse(self._input) + self.assertEqual(data, self._data) + + @unittest.skipUnless(etree, 'defusedxml not installed') + def test_complex_data_parse(self): + parser = XMLParser() + data = parser.parse(self._complex_data_input) + self.assertEqual(data, self._complex_data) + + +class TestFileUploadParser(TestCase): + def setUp(self): + class MockRequest(object): + pass + from io import BytesIO + self.stream = BytesIO( + "Test text file".encode('utf-8') + ) + request = MockRequest() + request.upload_handlers = (MemoryFileUploadHandler(),) + request.META = { + 'HTTP_CONTENT_DISPOSITION': 'Content-Disposition: inline; filename=file.txt'.encode('utf-8'), + 'HTTP_CONTENT_LENGTH': 14, + } + self.parser_context = {'request': request, 'kwargs': {}} + + def test_parse(self): + """ Make sure the `QueryDict` works OK """ + parser = FileUploadParser() + self.stream.seek(0) + data_and_files = parser.parse(self.stream, None, self.parser_context) + file_obj = data_and_files.files['file'] + self.assertEqual(file_obj._size, 14) + + def test_get_filename(self): + parser = FileUploadParser() + filename = parser.get_filename(self.stream, None, self.parser_context) + self.assertEqual(filename, 'file.txt'.encode('utf-8')) diff --git a/vendor-local/lib/python/rest_framework/tests/test_permissions.py b/vendor-local/lib/python/rest_framework/tests/test_permissions.py new file mode 100644 index 00000000000..e2cca3808ca --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_permissions.py @@ -0,0 +1,188 @@ +from __future__ import unicode_literals +from django.contrib.auth.models import User, Permission +from django.db import models +from django.test import TestCase +from rest_framework import generics, status, permissions, authentication, HTTP_HEADER_ENCODING +from rest_framework.test import APIRequestFactory +import base64 + +factory = APIRequestFactory() + + +class BasicModel(models.Model): + text = models.CharField(max_length=100) + + +class RootView(generics.ListCreateAPIView): + model = BasicModel + authentication_classes = [authentication.BasicAuthentication] + permission_classes = [permissions.DjangoModelPermissions] + + +class InstanceView(generics.RetrieveUpdateDestroyAPIView): + model = BasicModel + authentication_classes = [authentication.BasicAuthentication] + permission_classes = [permissions.DjangoModelPermissions] + +root_view = RootView.as_view() +instance_view = InstanceView.as_view() + + +def basic_auth_header(username, password): + credentials = ('%s:%s' % (username, password)) + base64_credentials = base64.b64encode(credentials.encode(HTTP_HEADER_ENCODING)).decode(HTTP_HEADER_ENCODING) + return 'Basic %s' % base64_credentials + + +class ModelPermissionsIntegrationTests(TestCase): + def setUp(self): + User.objects.create_user('disallowed', 'disallowed@example.com', 'password') + user = User.objects.create_user('permitted', 'permitted@example.com', 'password') + user.user_permissions = [ + Permission.objects.get(codename='add_basicmodel'), + Permission.objects.get(codename='change_basicmodel'), + Permission.objects.get(codename='delete_basicmodel') + ] + user = User.objects.create_user('updateonly', 'updateonly@example.com', 'password') + user.user_permissions = [ + Permission.objects.get(codename='change_basicmodel'), + ] + + self.permitted_credentials = basic_auth_header('permitted', 'password') + self.disallowed_credentials = basic_auth_header('disallowed', 'password') + self.updateonly_credentials = basic_auth_header('updateonly', 'password') + + BasicModel(text='foo').save() + + def test_has_create_permissions(self): + request = factory.post('/', {'text': 'foobar'}, format='json', + HTTP_AUTHORIZATION=self.permitted_credentials) + response = root_view(request, pk=1) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + + def test_has_put_permissions(self): + request = factory.put('/1', {'text': 'foobar'}, format='json', + HTTP_AUTHORIZATION=self.permitted_credentials) + response = instance_view(request, pk='1') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_has_delete_permissions(self): + request = factory.delete('/1', HTTP_AUTHORIZATION=self.permitted_credentials) + response = instance_view(request, pk=1) + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + + def test_does_not_have_create_permissions(self): + request = factory.post('/', {'text': 'foobar'}, format='json', + HTTP_AUTHORIZATION=self.disallowed_credentials) + response = root_view(request, pk=1) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_does_not_have_put_permissions(self): + request = factory.put('/1', {'text': 'foobar'}, format='json', + HTTP_AUTHORIZATION=self.disallowed_credentials) + response = instance_view(request, pk='1') + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_does_not_have_delete_permissions(self): + request = factory.delete('/1', HTTP_AUTHORIZATION=self.disallowed_credentials) + response = instance_view(request, pk=1) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_has_put_as_create_permissions(self): + # User only has update permissions - should be able to update an entity. + request = factory.put('/1', {'text': 'foobar'}, format='json', + HTTP_AUTHORIZATION=self.updateonly_credentials) + response = instance_view(request, pk='1') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + # But if PUTing to a new entity, permission should be denied. + request = factory.put('/2', {'text': 'foobar'}, format='json', + HTTP_AUTHORIZATION=self.updateonly_credentials) + response = instance_view(request, pk='2') + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_options_permitted(self): + request = factory.options('/', + HTTP_AUTHORIZATION=self.permitted_credentials) + response = root_view(request, pk='1') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn('actions', response.data) + self.assertEqual(list(response.data['actions'].keys()), ['POST']) + + request = factory.options('/1', + HTTP_AUTHORIZATION=self.permitted_credentials) + response = instance_view(request, pk='1') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn('actions', response.data) + self.assertEqual(list(response.data['actions'].keys()), ['PUT']) + + def test_options_disallowed(self): + request = factory.options('/', + HTTP_AUTHORIZATION=self.disallowed_credentials) + response = root_view(request, pk='1') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertNotIn('actions', response.data) + + request = factory.options('/1', + HTTP_AUTHORIZATION=self.disallowed_credentials) + response = instance_view(request, pk='1') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertNotIn('actions', response.data) + + def test_options_updateonly(self): + request = factory.options('/', + HTTP_AUTHORIZATION=self.updateonly_credentials) + response = root_view(request, pk='1') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertNotIn('actions', response.data) + + request = factory.options('/1', + HTTP_AUTHORIZATION=self.updateonly_credentials) + response = instance_view(request, pk='1') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn('actions', response.data) + self.assertEqual(list(response.data['actions'].keys()), ['PUT']) + + +class OwnerModel(models.Model): + text = models.CharField(max_length=100) + owner = models.ForeignKey(User) + + +class IsOwnerPermission(permissions.BasePermission): + def has_object_permission(self, request, view, obj): + return request.user == obj.owner + + +class OwnerInstanceView(generics.RetrieveUpdateDestroyAPIView): + model = OwnerModel + authentication_classes = [authentication.BasicAuthentication] + permission_classes = [IsOwnerPermission] + + +owner_instance_view = OwnerInstanceView.as_view() + + +class ObjectPermissionsIntegrationTests(TestCase): + """ + Integration tests for the object level permissions API. + """ + + def setUp(self): + User.objects.create_user('not_owner', 'not_owner@example.com', 'password') + user = User.objects.create_user('owner', 'owner@example.com', 'password') + + self.not_owner_credentials = basic_auth_header('not_owner', 'password') + self.owner_credentials = basic_auth_header('owner', 'password') + + OwnerModel(text='foo', owner=user).save() + + def test_owner_has_delete_permissions(self): + request = factory.delete('/1', HTTP_AUTHORIZATION=self.owner_credentials) + response = owner_instance_view(request, pk='1') + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + + def test_non_owner_does_not_have_delete_permissions(self): + request = factory.delete('/1', HTTP_AUTHORIZATION=self.not_owner_credentials) + response = owner_instance_view(request, pk='1') + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) diff --git a/vendor-local/lib/python/rest_framework/tests/test_relations.py b/vendor-local/lib/python/rest_framework/tests/test_relations.py new file mode 100644 index 00000000000..d19219c908e --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_relations.py @@ -0,0 +1,100 @@ +""" +General tests for relational fields. +""" +from __future__ import unicode_literals +from django.db import models +from django.test import TestCase +from rest_framework import serializers +from rest_framework.tests.models import BlogPost + + +class NullModel(models.Model): + pass + + +class FieldTests(TestCase): + def test_pk_related_field_with_empty_string(self): + """ + Regression test for #446 + + https://github.com/tomchristie/django-rest-framework/issues/446 + """ + field = serializers.PrimaryKeyRelatedField(queryset=NullModel.objects.all()) + self.assertRaises(serializers.ValidationError, field.from_native, '') + self.assertRaises(serializers.ValidationError, field.from_native, []) + + def test_hyperlinked_related_field_with_empty_string(self): + field = serializers.HyperlinkedRelatedField(queryset=NullModel.objects.all(), view_name='') + self.assertRaises(serializers.ValidationError, field.from_native, '') + self.assertRaises(serializers.ValidationError, field.from_native, []) + + def test_slug_related_field_with_empty_string(self): + field = serializers.SlugRelatedField(queryset=NullModel.objects.all(), slug_field='pk') + self.assertRaises(serializers.ValidationError, field.from_native, '') + self.assertRaises(serializers.ValidationError, field.from_native, []) + + +class TestManyRelatedMixin(TestCase): + def test_missing_many_to_many_related_field(self): + ''' + Regression test for #632 + + https://github.com/tomchristie/django-rest-framework/pull/632 + ''' + field = serializers.RelatedField(many=True, read_only=False) + + into = {} + field.field_from_native({}, None, 'field_name', into) + self.assertEqual(into['field_name'], []) + + +# Regression tests for #694 (`source` attribute on related fields) + +class RelatedFieldSourceTests(TestCase): + def test_related_manager_source(self): + """ + Relational fields should be able to use manager-returning methods as their source. + """ + BlogPost.objects.create(title='blah') + field = serializers.RelatedField(many=True, source='get_blogposts_manager') + + class ClassWithManagerMethod(object): + def get_blogposts_manager(self): + return BlogPost.objects + + obj = ClassWithManagerMethod() + value = field.field_to_native(obj, 'field_name') + self.assertEqual(value, ['BlogPost object']) + + def test_related_queryset_source(self): + """ + Relational fields should be able to use queryset-returning methods as their source. + """ + BlogPost.objects.create(title='blah') + field = serializers.RelatedField(many=True, source='get_blogposts_queryset') + + class ClassWithQuerysetMethod(object): + def get_blogposts_queryset(self): + return BlogPost.objects.all() + + obj = ClassWithQuerysetMethod() + value = field.field_to_native(obj, 'field_name') + self.assertEqual(value, ['BlogPost object']) + + def test_dotted_source(self): + """ + Source argument should support dotted.source notation. + """ + BlogPost.objects.create(title='blah') + field = serializers.RelatedField(many=True, source='a.b.c') + + class ClassWithQuerysetMethod(object): + a = { + 'b': { + 'c': BlogPost.objects.all() + } + } + + obj = ClassWithQuerysetMethod() + value = field.field_to_native(obj, 'field_name') + self.assertEqual(value, ['BlogPost object']) diff --git a/vendor-local/lib/python/rest_framework/tests/test_relations_hyperlink.py b/vendor-local/lib/python/rest_framework/tests/test_relations_hyperlink.py new file mode 100644 index 00000000000..3c4d39af634 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_relations_hyperlink.py @@ -0,0 +1,524 @@ +from __future__ import unicode_literals +from django.test import TestCase +from rest_framework import serializers +from rest_framework.compat import patterns, url +from rest_framework.test import APIRequestFactory +from rest_framework.tests.models import ( + BlogPost, + ManyToManyTarget, ManyToManySource, ForeignKeyTarget, ForeignKeySource, + NullableForeignKeySource, OneToOneTarget, NullableOneToOneSource +) + +factory = APIRequestFactory() +request = factory.get('/') # Just to ensure we have a request in the serializer context + + +def dummy_view(request, pk): + pass + +urlpatterns = patterns('', + url(r'^dummyurl/(?P<pk>[0-9]+)/$', dummy_view, name='dummy-url'), + url(r'^manytomanysource/(?P<pk>[0-9]+)/$', dummy_view, name='manytomanysource-detail'), + url(r'^manytomanytarget/(?P<pk>[0-9]+)/$', dummy_view, name='manytomanytarget-detail'), + url(r'^foreignkeysource/(?P<pk>[0-9]+)/$', dummy_view, name='foreignkeysource-detail'), + url(r'^foreignkeytarget/(?P<pk>[0-9]+)/$', dummy_view, name='foreignkeytarget-detail'), + url(r'^nullableforeignkeysource/(?P<pk>[0-9]+)/$', dummy_view, name='nullableforeignkeysource-detail'), + url(r'^onetoonetarget/(?P<pk>[0-9]+)/$', dummy_view, name='onetoonetarget-detail'), + url(r'^nullableonetoonesource/(?P<pk>[0-9]+)/$', dummy_view, name='nullableonetoonesource-detail'), +) + + +# ManyToMany +class ManyToManyTargetSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = ManyToManyTarget + fields = ('url', 'name', 'sources') + + +class ManyToManySourceSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = ManyToManySource + fields = ('url', 'name', 'targets') + + +# ForeignKey +class ForeignKeyTargetSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = ForeignKeyTarget + fields = ('url', 'name', 'sources') + + +class ForeignKeySourceSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = ForeignKeySource + fields = ('url', 'name', 'target') + + +# Nullable ForeignKey +class NullableForeignKeySourceSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = NullableForeignKeySource + fields = ('url', 'name', 'target') + + +# Nullable OneToOne +class NullableOneToOneTargetSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = OneToOneTarget + fields = ('url', 'name', 'nullable_source') + + +# TODO: Add test that .data cannot be accessed prior to .is_valid + +class HyperlinkedManyToManyTests(TestCase): + urls = 'rest_framework.tests.test_relations_hyperlink' + + def setUp(self): + for idx in range(1, 4): + target = ManyToManyTarget(name='target-%d' % idx) + target.save() + source = ManyToManySource(name='source-%d' % idx) + source.save() + for target in ManyToManyTarget.objects.all(): + source.targets.add(target) + + def test_many_to_many_retrieve(self): + queryset = ManyToManySource.objects.all() + serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/']}, + {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, + {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_many_to_many_retrieve(self): + queryset = ManyToManyTarget.objects.all() + serializer = ManyToManyTargetSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, + {'url': 'http://testserver/manytomanytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, + {'url': 'http://testserver/manytomanytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/manytomanysource/3/']} + ] + self.assertEqual(serializer.data, expected) + + def test_many_to_many_update(self): + data = {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} + instance = ManyToManySource.objects.get(pk=1) + serializer = ManyToManySourceSerializer(instance, data=data, context={'request': request}) + self.assertTrue(serializer.is_valid()) + serializer.save() + self.assertEqual(serializer.data, data) + + # Ensure source 1 is updated, and everything else is as expected + queryset = ManyToManySource.objects.all() + serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']}, + {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, + {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_many_to_many_update(self): + data = {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/']} + instance = ManyToManyTarget.objects.get(pk=1) + serializer = ManyToManyTargetSerializer(instance, data=data, context={'request': request}) + self.assertTrue(serializer.is_valid()) + serializer.save() + self.assertEqual(serializer.data, data) + + # Ensure target 1 is updated, and everything else is as expected + queryset = ManyToManyTarget.objects.all() + serializer = ManyToManyTargetSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/']}, + {'url': 'http://testserver/manytomanytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, + {'url': 'http://testserver/manytomanytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/manytomanysource/3/']} + + ] + self.assertEqual(serializer.data, expected) + + def test_many_to_many_create(self): + data = {'url': 'http://testserver/manytomanysource/4/', 'name': 'source-4', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/3/']} + serializer = ManyToManySourceSerializer(data=data, context={'request': request}) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'source-4') + + # Ensure source 4 is added, and everything else is as expected + queryset = ManyToManySource.objects.all() + serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/']}, + {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, + {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']}, + {'url': 'http://testserver/manytomanysource/4/', 'name': 'source-4', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/3/']} + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_many_to_many_create(self): + data = {'url': 'http://testserver/manytomanytarget/4/', 'name': 'target-4', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/3/']} + serializer = ManyToManyTargetSerializer(data=data, context={'request': request}) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'target-4') + + # Ensure target 4 is added, and everything else is as expected + queryset = ManyToManyTarget.objects.all() + serializer = ManyToManyTargetSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, + {'url': 'http://testserver/manytomanytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, + {'url': 'http://testserver/manytomanytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/manytomanysource/3/']}, + {'url': 'http://testserver/manytomanytarget/4/', 'name': 'target-4', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/3/']} + ] + self.assertEqual(serializer.data, expected) + + +class HyperlinkedForeignKeyTests(TestCase): + urls = 'rest_framework.tests.test_relations_hyperlink' + + def setUp(self): + target = ForeignKeyTarget(name='target-1') + target.save() + new_target = ForeignKeyTarget(name='target-2') + new_target.save() + for idx in range(1, 4): + source = ForeignKeySource(name='source-%d' % idx, target=target) + source.save() + + def test_foreign_key_retrieve(self): + queryset = ForeignKeySource.objects.all() + serializer = ForeignKeySourceSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/foreignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/foreignkeysource/3/', 'name': 'source-3', 'target': 'http://testserver/foreignkeytarget/1/'} + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_foreign_key_retrieve(self): + queryset = ForeignKeyTarget.objects.all() + serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/2/', 'http://testserver/foreignkeysource/3/']}, + {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': []}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update(self): + data = {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/2/'} + instance = ForeignKeySource.objects.get(pk=1) + serializer = ForeignKeySourceSerializer(instance, data=data, context={'request': request}) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.data, data) + serializer.save() + + # Ensure source 1 is updated, and everything else is as expected + queryset = ForeignKeySource.objects.all() + serializer = ForeignKeySourceSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/2/'}, + {'url': 'http://testserver/foreignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/foreignkeysource/3/', 'name': 'source-3', 'target': 'http://testserver/foreignkeytarget/1/'} + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update_incorrect_type(self): + data = {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 2} + instance = ForeignKeySource.objects.get(pk=1) + serializer = ForeignKeySourceSerializer(instance, data=data, context={'request': request}) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'target': ['Incorrect type. Expected url string, received int.']}) + + def test_reverse_foreign_key_update(self): + data = {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']} + instance = ForeignKeyTarget.objects.get(pk=2) + serializer = ForeignKeyTargetSerializer(instance, data=data, context={'request': request}) + self.assertTrue(serializer.is_valid()) + # We shouldn't have saved anything to the db yet since save + # hasn't been called. + queryset = ForeignKeyTarget.objects.all() + new_serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/2/', 'http://testserver/foreignkeysource/3/']}, + {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': []}, + ] + self.assertEqual(new_serializer.data, expected) + + serializer.save() + self.assertEqual(serializer.data, data) + + # Ensure target 2 is update, and everything else is as expected + queryset = ForeignKeyTarget.objects.all() + serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/2/']}, + {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_create(self): + data = {'url': 'http://testserver/foreignkeysource/4/', 'name': 'source-4', 'target': 'http://testserver/foreignkeytarget/2/'} + serializer = ForeignKeySourceSerializer(data=data, context={'request': request}) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'source-4') + + # Ensure source 1 is updated, and everything else is as expected + queryset = ForeignKeySource.objects.all() + serializer = ForeignKeySourceSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/foreignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/foreignkeysource/3/', 'name': 'source-3', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/foreignkeysource/4/', 'name': 'source-4', 'target': 'http://testserver/foreignkeytarget/2/'}, + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_foreign_key_create(self): + data = {'url': 'http://testserver/foreignkeytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']} + serializer = ForeignKeyTargetSerializer(data=data, context={'request': request}) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'target-3') + + # Ensure target 4 is added, and everything else is as expected + queryset = ForeignKeyTarget.objects.all() + serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/2/']}, + {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': []}, + {'url': 'http://testserver/foreignkeytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update_with_invalid_null(self): + data = {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': None} + instance = ForeignKeySource.objects.get(pk=1) + serializer = ForeignKeySourceSerializer(instance, data=data, context={'request': request}) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'target': ['This field is required.']}) + + +class HyperlinkedNullableForeignKeyTests(TestCase): + urls = 'rest_framework.tests.test_relations_hyperlink' + + def setUp(self): + target = ForeignKeyTarget(name='target-1') + target.save() + for idx in range(1, 4): + if idx == 3: + target = None + source = NullableForeignKeySource(name='source-%d' % idx, target=target) + source.save() + + def test_foreign_key_retrieve_with_null(self): + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_create_with_valid_null(self): + data = {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} + serializer = NullableForeignKeySourceSerializer(data=data, context={'request': request}) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'source-4') + + # Ensure source 4 is created, and everything else is as expected + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, + {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_create_with_valid_emptystring(self): + """ + The emptystring should be interpreted as null in the context + of relationships. + """ + data = {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': ''} + expected_data = {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} + serializer = NullableForeignKeySourceSerializer(data=data, context={'request': request}) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, expected_data) + self.assertEqual(obj.name, 'source-4') + + # Ensure source 4 is created, and everything else is as expected + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, + {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update_with_valid_null(self): + data = {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None} + instance = NullableForeignKeySource.objects.get(pk=1) + serializer = NullableForeignKeySourceSerializer(instance, data=data, context={'request': request}) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.data, data) + serializer.save() + + # Ensure source 1 is updated, and everything else is as expected + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None}, + {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update_with_valid_emptystring(self): + """ + The emptystring should be interpreted as null in the context + of relationships. + """ + data = {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': ''} + expected_data = {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None} + instance = NullableForeignKeySource.objects.get(pk=1) + serializer = NullableForeignKeySourceSerializer(instance, data=data, context={'request': request}) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.data, expected_data) + serializer.save() + + # Ensure source 1 is updated, and everything else is as expected + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None}, + {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, + {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, + ] + self.assertEqual(serializer.data, expected) + + # reverse foreign keys MUST be read_only + # In the general case they do not provide .remove() or .clear() + # and cannot be arbitrarily set. + + # def test_reverse_foreign_key_update(self): + # data = {'id': 1, 'name': 'target-1', 'sources': [1]} + # instance = ForeignKeyTarget.objects.get(pk=1) + # serializer = ForeignKeyTargetSerializer(instance, data=data) + # self.assertTrue(serializer.is_valid()) + # self.assertEqual(serializer.data, data) + # serializer.save() + + # # Ensure target 1 is updated, and everything else is as expected + # queryset = ForeignKeyTarget.objects.all() + # serializer = ForeignKeyTargetSerializer(queryset, many=True) + # expected = [ + # {'id': 1, 'name': 'target-1', 'sources': [1]}, + # {'id': 2, 'name': 'target-2', 'sources': []}, + # ] + # self.assertEqual(serializer.data, expected) + + +class HyperlinkedNullableOneToOneTests(TestCase): + urls = 'rest_framework.tests.test_relations_hyperlink' + + def setUp(self): + target = OneToOneTarget(name='target-1') + target.save() + new_target = OneToOneTarget(name='target-2') + new_target.save() + source = NullableOneToOneSource(name='source-1', target=target) + source.save() + + def test_reverse_foreign_key_retrieve_with_null(self): + queryset = OneToOneTarget.objects.all() + serializer = NullableOneToOneTargetSerializer(queryset, many=True, context={'request': request}) + expected = [ + {'url': 'http://testserver/onetoonetarget/1/', 'name': 'target-1', 'nullable_source': 'http://testserver/nullableonetoonesource/1/'}, + {'url': 'http://testserver/onetoonetarget/2/', 'name': 'target-2', 'nullable_source': None}, + ] + self.assertEqual(serializer.data, expected) + + +# Regression tests for #694 (`source` attribute on related fields) + +class HyperlinkedRelatedFieldSourceTests(TestCase): + urls = 'rest_framework.tests.test_relations_hyperlink' + + def test_related_manager_source(self): + """ + Relational fields should be able to use manager-returning methods as their source. + """ + BlogPost.objects.create(title='blah') + field = serializers.HyperlinkedRelatedField( + many=True, + source='get_blogposts_manager', + view_name='dummy-url', + ) + field.context = {'request': request} + + class ClassWithManagerMethod(object): + def get_blogposts_manager(self): + return BlogPost.objects + + obj = ClassWithManagerMethod() + value = field.field_to_native(obj, 'field_name') + self.assertEqual(value, ['http://testserver/dummyurl/1/']) + + def test_related_queryset_source(self): + """ + Relational fields should be able to use queryset-returning methods as their source. + """ + BlogPost.objects.create(title='blah') + field = serializers.HyperlinkedRelatedField( + many=True, + source='get_blogposts_queryset', + view_name='dummy-url', + ) + field.context = {'request': request} + + class ClassWithQuerysetMethod(object): + def get_blogposts_queryset(self): + return BlogPost.objects.all() + + obj = ClassWithQuerysetMethod() + value = field.field_to_native(obj, 'field_name') + self.assertEqual(value, ['http://testserver/dummyurl/1/']) + + def test_dotted_source(self): + """ + Source argument should support dotted.source notation. + """ + BlogPost.objects.create(title='blah') + field = serializers.HyperlinkedRelatedField( + many=True, + source='a.b.c', + view_name='dummy-url', + ) + field.context = {'request': request} + + class ClassWithQuerysetMethod(object): + a = { + 'b': { + 'c': BlogPost.objects.all() + } + } + + obj = ClassWithQuerysetMethod() + value = field.field_to_native(obj, 'field_name') + self.assertEqual(value, ['http://testserver/dummyurl/1/']) diff --git a/vendor-local/lib/python/rest_framework/tests/test_relations_nested.py b/vendor-local/lib/python/rest_framework/tests/test_relations_nested.py new file mode 100644 index 00000000000..f6d006b39bc --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_relations_nested.py @@ -0,0 +1,107 @@ +from __future__ import unicode_literals +from django.test import TestCase +from rest_framework import serializers +from rest_framework.tests.models import ForeignKeyTarget, ForeignKeySource, NullableForeignKeySource, OneToOneTarget, NullableOneToOneSource + + +class ForeignKeySourceSerializer(serializers.ModelSerializer): + class Meta: + model = ForeignKeySource + fields = ('id', 'name', 'target') + depth = 1 + + +class ForeignKeyTargetSerializer(serializers.ModelSerializer): + class Meta: + model = ForeignKeyTarget + fields = ('id', 'name', 'sources') + depth = 1 + + +class NullableForeignKeySourceSerializer(serializers.ModelSerializer): + class Meta: + model = NullableForeignKeySource + fields = ('id', 'name', 'target') + depth = 1 + + +class NullableOneToOneTargetSerializer(serializers.ModelSerializer): + class Meta: + model = OneToOneTarget + fields = ('id', 'name', 'nullable_source') + depth = 1 + + +class ReverseForeignKeyTests(TestCase): + def setUp(self): + target = ForeignKeyTarget(name='target-1') + target.save() + new_target = ForeignKeyTarget(name='target-2') + new_target.save() + for idx in range(1, 4): + source = ForeignKeySource(name='source-%d' % idx, target=target) + source.save() + + def test_foreign_key_retrieve(self): + queryset = ForeignKeySource.objects.all() + serializer = ForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': {'id': 1, 'name': 'target-1'}}, + {'id': 2, 'name': 'source-2', 'target': {'id': 1, 'name': 'target-1'}}, + {'id': 3, 'name': 'source-3', 'target': {'id': 1, 'name': 'target-1'}}, + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_foreign_key_retrieve(self): + queryset = ForeignKeyTarget.objects.all() + serializer = ForeignKeyTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'sources': [ + {'id': 1, 'name': 'source-1', 'target': 1}, + {'id': 2, 'name': 'source-2', 'target': 1}, + {'id': 3, 'name': 'source-3', 'target': 1}, + ]}, + {'id': 2, 'name': 'target-2', 'sources': [ + ]} + ] + self.assertEqual(serializer.data, expected) + + +class NestedNullableForeignKeyTests(TestCase): + def setUp(self): + target = ForeignKeyTarget(name='target-1') + target.save() + for idx in range(1, 4): + if idx == 3: + target = None + source = NullableForeignKeySource(name='source-%d' % idx, target=target) + source.save() + + def test_foreign_key_retrieve_with_null(self): + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': {'id': 1, 'name': 'target-1'}}, + {'id': 2, 'name': 'source-2', 'target': {'id': 1, 'name': 'target-1'}}, + {'id': 3, 'name': 'source-3', 'target': None}, + ] + self.assertEqual(serializer.data, expected) + + +class NestedNullableOneToOneTests(TestCase): + def setUp(self): + target = OneToOneTarget(name='target-1') + target.save() + new_target = OneToOneTarget(name='target-2') + new_target.save() + source = NullableOneToOneSource(name='source-1', target=target) + source.save() + + def test_reverse_foreign_key_retrieve_with_null(self): + queryset = OneToOneTarget.objects.all() + serializer = NullableOneToOneTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'nullable_source': {'id': 1, 'name': 'source-1', 'target': 1}}, + {'id': 2, 'name': 'target-2', 'nullable_source': None}, + ] + self.assertEqual(serializer.data, expected) diff --git a/vendor-local/lib/python/rest_framework/tests/test_relations_pk.py b/vendor-local/lib/python/rest_framework/tests/test_relations_pk.py new file mode 100644 index 00000000000..e2a1b815205 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_relations_pk.py @@ -0,0 +1,542 @@ +from __future__ import unicode_literals +from django.db import models +from django.test import TestCase +from rest_framework import serializers +from rest_framework.tests.models import ( + BlogPost, ManyToManyTarget, ManyToManySource, ForeignKeyTarget, ForeignKeySource, + NullableForeignKeySource, OneToOneTarget, NullableOneToOneSource, +) +from rest_framework.compat import six + + +# ManyToMany +class ManyToManyTargetSerializer(serializers.ModelSerializer): + class Meta: + model = ManyToManyTarget + fields = ('id', 'name', 'sources') + + +class ManyToManySourceSerializer(serializers.ModelSerializer): + class Meta: + model = ManyToManySource + fields = ('id', 'name', 'targets') + + +# ForeignKey +class ForeignKeyTargetSerializer(serializers.ModelSerializer): + class Meta: + model = ForeignKeyTarget + fields = ('id', 'name', 'sources') + + +class ForeignKeySourceSerializer(serializers.ModelSerializer): + class Meta: + model = ForeignKeySource + fields = ('id', 'name', 'target') + + +# Nullable ForeignKey +class NullableForeignKeySourceSerializer(serializers.ModelSerializer): + class Meta: + model = NullableForeignKeySource + fields = ('id', 'name', 'target') + + +# Nullable OneToOne +class NullableOneToOneTargetSerializer(serializers.ModelSerializer): + class Meta: + model = OneToOneTarget + fields = ('id', 'name', 'nullable_source') + + +# TODO: Add test that .data cannot be accessed prior to .is_valid + +class PKManyToManyTests(TestCase): + def setUp(self): + for idx in range(1, 4): + target = ManyToManyTarget(name='target-%d' % idx) + target.save() + source = ManyToManySource(name='source-%d' % idx) + source.save() + for target in ManyToManyTarget.objects.all(): + source.targets.add(target) + + def test_many_to_many_retrieve(self): + queryset = ManyToManySource.objects.all() + serializer = ManyToManySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'targets': [1]}, + {'id': 2, 'name': 'source-2', 'targets': [1, 2]}, + {'id': 3, 'name': 'source-3', 'targets': [1, 2, 3]} + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_many_to_many_retrieve(self): + queryset = ManyToManyTarget.objects.all() + serializer = ManyToManyTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'sources': [1, 2, 3]}, + {'id': 2, 'name': 'target-2', 'sources': [2, 3]}, + {'id': 3, 'name': 'target-3', 'sources': [3]} + ] + self.assertEqual(serializer.data, expected) + + def test_many_to_many_update(self): + data = {'id': 1, 'name': 'source-1', 'targets': [1, 2, 3]} + instance = ManyToManySource.objects.get(pk=1) + serializer = ManyToManySourceSerializer(instance, data=data) + self.assertTrue(serializer.is_valid()) + serializer.save() + self.assertEqual(serializer.data, data) + + # Ensure source 1 is updated, and everything else is as expected + queryset = ManyToManySource.objects.all() + serializer = ManyToManySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'targets': [1, 2, 3]}, + {'id': 2, 'name': 'source-2', 'targets': [1, 2]}, + {'id': 3, 'name': 'source-3', 'targets': [1, 2, 3]} + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_many_to_many_update(self): + data = {'id': 1, 'name': 'target-1', 'sources': [1]} + instance = ManyToManyTarget.objects.get(pk=1) + serializer = ManyToManyTargetSerializer(instance, data=data) + self.assertTrue(serializer.is_valid()) + serializer.save() + self.assertEqual(serializer.data, data) + + # Ensure target 1 is updated, and everything else is as expected + queryset = ManyToManyTarget.objects.all() + serializer = ManyToManyTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'sources': [1]}, + {'id': 2, 'name': 'target-2', 'sources': [2, 3]}, + {'id': 3, 'name': 'target-3', 'sources': [3]} + ] + self.assertEqual(serializer.data, expected) + + def test_many_to_many_create(self): + data = {'id': 4, 'name': 'source-4', 'targets': [1, 3]} + serializer = ManyToManySourceSerializer(data=data) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'source-4') + + # Ensure source 4 is added, and everything else is as expected + queryset = ManyToManySource.objects.all() + serializer = ManyToManySourceSerializer(queryset, many=True) + self.assertFalse(serializer.fields['targets'].read_only) + expected = [ + {'id': 1, 'name': 'source-1', 'targets': [1]}, + {'id': 2, 'name': 'source-2', 'targets': [1, 2]}, + {'id': 3, 'name': 'source-3', 'targets': [1, 2, 3]}, + {'id': 4, 'name': 'source-4', 'targets': [1, 3]}, + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_many_to_many_create(self): + data = {'id': 4, 'name': 'target-4', 'sources': [1, 3]} + serializer = ManyToManyTargetSerializer(data=data) + self.assertFalse(serializer.fields['sources'].read_only) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'target-4') + + # Ensure target 4 is added, and everything else is as expected + queryset = ManyToManyTarget.objects.all() + serializer = ManyToManyTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'sources': [1, 2, 3]}, + {'id': 2, 'name': 'target-2', 'sources': [2, 3]}, + {'id': 3, 'name': 'target-3', 'sources': [3]}, + {'id': 4, 'name': 'target-4', 'sources': [1, 3]} + ] + self.assertEqual(serializer.data, expected) + + +class PKForeignKeyTests(TestCase): + def setUp(self): + target = ForeignKeyTarget(name='target-1') + target.save() + new_target = ForeignKeyTarget(name='target-2') + new_target.save() + for idx in range(1, 4): + source = ForeignKeySource(name='source-%d' % idx, target=target) + source.save() + + def test_foreign_key_retrieve(self): + queryset = ForeignKeySource.objects.all() + serializer = ForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': 1}, + {'id': 2, 'name': 'source-2', 'target': 1}, + {'id': 3, 'name': 'source-3', 'target': 1} + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_foreign_key_retrieve(self): + queryset = ForeignKeyTarget.objects.all() + serializer = ForeignKeyTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'sources': [1, 2, 3]}, + {'id': 2, 'name': 'target-2', 'sources': []}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update(self): + data = {'id': 1, 'name': 'source-1', 'target': 2} + instance = ForeignKeySource.objects.get(pk=1) + serializer = ForeignKeySourceSerializer(instance, data=data) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.data, data) + serializer.save() + + # Ensure source 1 is updated, and everything else is as expected + queryset = ForeignKeySource.objects.all() + serializer = ForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': 2}, + {'id': 2, 'name': 'source-2', 'target': 1}, + {'id': 3, 'name': 'source-3', 'target': 1} + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update_incorrect_type(self): + data = {'id': 1, 'name': 'source-1', 'target': 'foo'} + instance = ForeignKeySource.objects.get(pk=1) + serializer = ForeignKeySourceSerializer(instance, data=data) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'target': ['Incorrect type. Expected pk value, received %s.' % six.text_type.__name__]}) + + def test_reverse_foreign_key_update(self): + data = {'id': 2, 'name': 'target-2', 'sources': [1, 3]} + instance = ForeignKeyTarget.objects.get(pk=2) + serializer = ForeignKeyTargetSerializer(instance, data=data) + self.assertTrue(serializer.is_valid()) + # We shouldn't have saved anything to the db yet since save + # hasn't been called. + queryset = ForeignKeyTarget.objects.all() + new_serializer = ForeignKeyTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'sources': [1, 2, 3]}, + {'id': 2, 'name': 'target-2', 'sources': []}, + ] + self.assertEqual(new_serializer.data, expected) + + serializer.save() + self.assertEqual(serializer.data, data) + + # Ensure target 2 is update, and everything else is as expected + queryset = ForeignKeyTarget.objects.all() + serializer = ForeignKeyTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'sources': [2]}, + {'id': 2, 'name': 'target-2', 'sources': [1, 3]}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_create(self): + data = {'id': 4, 'name': 'source-4', 'target': 2} + serializer = ForeignKeySourceSerializer(data=data) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'source-4') + + # Ensure source 4 is added, and everything else is as expected + queryset = ForeignKeySource.objects.all() + serializer = ForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': 1}, + {'id': 2, 'name': 'source-2', 'target': 1}, + {'id': 3, 'name': 'source-3', 'target': 1}, + {'id': 4, 'name': 'source-4', 'target': 2}, + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_foreign_key_create(self): + data = {'id': 3, 'name': 'target-3', 'sources': [1, 3]} + serializer = ForeignKeyTargetSerializer(data=data) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'target-3') + + # Ensure target 3 is added, and everything else is as expected + queryset = ForeignKeyTarget.objects.all() + serializer = ForeignKeyTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'sources': [2]}, + {'id': 2, 'name': 'target-2', 'sources': []}, + {'id': 3, 'name': 'target-3', 'sources': [1, 3]}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update_with_invalid_null(self): + data = {'id': 1, 'name': 'source-1', 'target': None} + instance = ForeignKeySource.objects.get(pk=1) + serializer = ForeignKeySourceSerializer(instance, data=data) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'target': ['This field is required.']}) + + +class PKNullableForeignKeyTests(TestCase): + def setUp(self): + target = ForeignKeyTarget(name='target-1') + target.save() + for idx in range(1, 4): + if idx == 3: + target = None + source = NullableForeignKeySource(name='source-%d' % idx, target=target) + source.save() + + def test_foreign_key_retrieve_with_null(self): + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': 1}, + {'id': 2, 'name': 'source-2', 'target': 1}, + {'id': 3, 'name': 'source-3', 'target': None}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_create_with_valid_null(self): + data = {'id': 4, 'name': 'source-4', 'target': None} + serializer = NullableForeignKeySourceSerializer(data=data) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'source-4') + + # Ensure source 4 is created, and everything else is as expected + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': 1}, + {'id': 2, 'name': 'source-2', 'target': 1}, + {'id': 3, 'name': 'source-3', 'target': None}, + {'id': 4, 'name': 'source-4', 'target': None} + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_create_with_valid_emptystring(self): + """ + The emptystring should be interpreted as null in the context + of relationships. + """ + data = {'id': 4, 'name': 'source-4', 'target': ''} + expected_data = {'id': 4, 'name': 'source-4', 'target': None} + serializer = NullableForeignKeySourceSerializer(data=data) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, expected_data) + self.assertEqual(obj.name, 'source-4') + + # Ensure source 4 is created, and everything else is as expected + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': 1}, + {'id': 2, 'name': 'source-2', 'target': 1}, + {'id': 3, 'name': 'source-3', 'target': None}, + {'id': 4, 'name': 'source-4', 'target': None} + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update_with_valid_null(self): + data = {'id': 1, 'name': 'source-1', 'target': None} + instance = NullableForeignKeySource.objects.get(pk=1) + serializer = NullableForeignKeySourceSerializer(instance, data=data) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.data, data) + serializer.save() + + # Ensure source 1 is updated, and everything else is as expected + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': None}, + {'id': 2, 'name': 'source-2', 'target': 1}, + {'id': 3, 'name': 'source-3', 'target': None} + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update_with_valid_emptystring(self): + """ + The emptystring should be interpreted as null in the context + of relationships. + """ + data = {'id': 1, 'name': 'source-1', 'target': ''} + expected_data = {'id': 1, 'name': 'source-1', 'target': None} + instance = NullableForeignKeySource.objects.get(pk=1) + serializer = NullableForeignKeySourceSerializer(instance, data=data) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.data, expected_data) + serializer.save() + + # Ensure source 1 is updated, and everything else is as expected + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': None}, + {'id': 2, 'name': 'source-2', 'target': 1}, + {'id': 3, 'name': 'source-3', 'target': None} + ] + self.assertEqual(serializer.data, expected) + + # reverse foreign keys MUST be read_only + # In the general case they do not provide .remove() or .clear() + # and cannot be arbitrarily set. + + # def test_reverse_foreign_key_update(self): + # data = {'id': 1, 'name': 'target-1', 'sources': [1]} + # instance = ForeignKeyTarget.objects.get(pk=1) + # serializer = ForeignKeyTargetSerializer(instance, data=data) + # self.assertTrue(serializer.is_valid()) + # self.assertEqual(serializer.data, data) + # serializer.save() + + # # Ensure target 1 is updated, and everything else is as expected + # queryset = ForeignKeyTarget.objects.all() + # serializer = ForeignKeyTargetSerializer(queryset, many=True) + # expected = [ + # {'id': 1, 'name': 'target-1', 'sources': [1]}, + # {'id': 2, 'name': 'target-2', 'sources': []}, + # ] + # self.assertEqual(serializer.data, expected) + + +class PKNullableOneToOneTests(TestCase): + def setUp(self): + target = OneToOneTarget(name='target-1') + target.save() + new_target = OneToOneTarget(name='target-2') + new_target.save() + source = NullableOneToOneSource(name='source-1', target=new_target) + source.save() + + def test_reverse_foreign_key_retrieve_with_null(self): + queryset = OneToOneTarget.objects.all() + serializer = NullableOneToOneTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'nullable_source': None}, + {'id': 2, 'name': 'target-2', 'nullable_source': 1}, + ] + self.assertEqual(serializer.data, expected) + + +# The below models and tests ensure that serializer fields corresponding +# to a ManyToManyField field with a user-specified ``through`` model are +# set to read only + + +class ManyToManyThroughTarget(models.Model): + name = models.CharField(max_length=100) + + +class ManyToManyThrough(models.Model): + source = models.ForeignKey('ManyToManyThroughSource') + target = models.ForeignKey(ManyToManyThroughTarget) + + +class ManyToManyThroughSource(models.Model): + name = models.CharField(max_length=100) + targets = models.ManyToManyField(ManyToManyThroughTarget, + related_name='sources', + through='ManyToManyThrough') + + +class ManyToManyThroughTargetSerializer(serializers.ModelSerializer): + class Meta: + model = ManyToManyThroughTarget + fields = ('id', 'name', 'sources') + + +class ManyToManyThroughSourceSerializer(serializers.ModelSerializer): + class Meta: + model = ManyToManyThroughSource + fields = ('id', 'name', 'targets') + + +class PKManyToManyThroughTests(TestCase): + def setUp(self): + self.source = ManyToManyThroughSource.objects.create( + name='through-source-1') + self.target = ManyToManyThroughTarget.objects.create( + name='through-target-1') + + def test_many_to_many_create(self): + data = {'id': 2, 'name': 'source-2', 'targets': [self.target.pk]} + serializer = ManyToManyThroughSourceSerializer(data=data) + self.assertTrue(serializer.fields['targets'].read_only) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(obj.name, 'source-2') + self.assertEqual(obj.targets.count(), 0) + + def test_many_to_many_reverse_create(self): + data = {'id': 2, 'name': 'target-2', 'sources': [self.source.pk]} + serializer = ManyToManyThroughTargetSerializer(data=data) + self.assertTrue(serializer.fields['sources'].read_only) + self.assertTrue(serializer.is_valid()) + serializer.save() + obj = serializer.save() + self.assertEqual(obj.name, 'target-2') + self.assertEqual(obj.sources.count(), 0) + + +# Regression tests for #694 (`source` attribute on related fields) + + +class PrimaryKeyRelatedFieldSourceTests(TestCase): + def test_related_manager_source(self): + """ + Relational fields should be able to use manager-returning methods as their source. + """ + BlogPost.objects.create(title='blah') + field = serializers.PrimaryKeyRelatedField(many=True, source='get_blogposts_manager') + + class ClassWithManagerMethod(object): + def get_blogposts_manager(self): + return BlogPost.objects + + obj = ClassWithManagerMethod() + value = field.field_to_native(obj, 'field_name') + self.assertEqual(value, [1]) + + def test_related_queryset_source(self): + """ + Relational fields should be able to use queryset-returning methods as their source. + """ + BlogPost.objects.create(title='blah') + field = serializers.PrimaryKeyRelatedField(many=True, source='get_blogposts_queryset') + + class ClassWithQuerysetMethod(object): + def get_blogposts_queryset(self): + return BlogPost.objects.all() + + obj = ClassWithQuerysetMethod() + value = field.field_to_native(obj, 'field_name') + self.assertEqual(value, [1]) + + def test_dotted_source(self): + """ + Source argument should support dotted.source notation. + """ + BlogPost.objects.create(title='blah') + field = serializers.PrimaryKeyRelatedField(many=True, source='a.b.c') + + class ClassWithQuerysetMethod(object): + a = { + 'b': { + 'c': BlogPost.objects.all() + } + } + + obj = ClassWithQuerysetMethod() + value = field.field_to_native(obj, 'field_name') + self.assertEqual(value, [1]) diff --git a/vendor-local/lib/python/rest_framework/tests/test_relations_slug.py b/vendor-local/lib/python/rest_framework/tests/test_relations_slug.py new file mode 100644 index 00000000000..435c821cfa7 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_relations_slug.py @@ -0,0 +1,257 @@ +from django.test import TestCase +from rest_framework import serializers +from rest_framework.tests.models import NullableForeignKeySource, ForeignKeySource, ForeignKeyTarget + + +class ForeignKeyTargetSerializer(serializers.ModelSerializer): + sources = serializers.SlugRelatedField(many=True, slug_field='name') + + class Meta: + model = ForeignKeyTarget + + +class ForeignKeySourceSerializer(serializers.ModelSerializer): + target = serializers.SlugRelatedField(slug_field='name') + + class Meta: + model = ForeignKeySource + + +class NullableForeignKeySourceSerializer(serializers.ModelSerializer): + target = serializers.SlugRelatedField(slug_field='name', required=False) + + class Meta: + model = NullableForeignKeySource + + +# TODO: M2M Tests, FKTests (Non-nullable), One2One +class SlugForeignKeyTests(TestCase): + def setUp(self): + target = ForeignKeyTarget(name='target-1') + target.save() + new_target = ForeignKeyTarget(name='target-2') + new_target.save() + for idx in range(1, 4): + source = ForeignKeySource(name='source-%d' % idx, target=target) + source.save() + + def test_foreign_key_retrieve(self): + queryset = ForeignKeySource.objects.all() + serializer = ForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': 'target-1'}, + {'id': 2, 'name': 'source-2', 'target': 'target-1'}, + {'id': 3, 'name': 'source-3', 'target': 'target-1'} + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_foreign_key_retrieve(self): + queryset = ForeignKeyTarget.objects.all() + serializer = ForeignKeyTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'sources': ['source-1', 'source-2', 'source-3']}, + {'id': 2, 'name': 'target-2', 'sources': []}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update(self): + data = {'id': 1, 'name': 'source-1', 'target': 'target-2'} + instance = ForeignKeySource.objects.get(pk=1) + serializer = ForeignKeySourceSerializer(instance, data=data) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.data, data) + serializer.save() + + # Ensure source 1 is updated, and everything else is as expected + queryset = ForeignKeySource.objects.all() + serializer = ForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': 'target-2'}, + {'id': 2, 'name': 'source-2', 'target': 'target-1'}, + {'id': 3, 'name': 'source-3', 'target': 'target-1'} + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update_incorrect_type(self): + data = {'id': 1, 'name': 'source-1', 'target': 123} + instance = ForeignKeySource.objects.get(pk=1) + serializer = ForeignKeySourceSerializer(instance, data=data) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'target': ['Object with name=123 does not exist.']}) + + def test_reverse_foreign_key_update(self): + data = {'id': 2, 'name': 'target-2', 'sources': ['source-1', 'source-3']} + instance = ForeignKeyTarget.objects.get(pk=2) + serializer = ForeignKeyTargetSerializer(instance, data=data) + self.assertTrue(serializer.is_valid()) + # We shouldn't have saved anything to the db yet since save + # hasn't been called. + queryset = ForeignKeyTarget.objects.all() + new_serializer = ForeignKeyTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'sources': ['source-1', 'source-2', 'source-3']}, + {'id': 2, 'name': 'target-2', 'sources': []}, + ] + self.assertEqual(new_serializer.data, expected) + + serializer.save() + self.assertEqual(serializer.data, data) + + # Ensure target 2 is update, and everything else is as expected + queryset = ForeignKeyTarget.objects.all() + serializer = ForeignKeyTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'sources': ['source-2']}, + {'id': 2, 'name': 'target-2', 'sources': ['source-1', 'source-3']}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_create(self): + data = {'id': 4, 'name': 'source-4', 'target': 'target-2'} + serializer = ForeignKeySourceSerializer(data=data) + serializer.is_valid() + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'source-4') + + # Ensure source 4 is added, and everything else is as expected + queryset = ForeignKeySource.objects.all() + serializer = ForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': 'target-1'}, + {'id': 2, 'name': 'source-2', 'target': 'target-1'}, + {'id': 3, 'name': 'source-3', 'target': 'target-1'}, + {'id': 4, 'name': 'source-4', 'target': 'target-2'}, + ] + self.assertEqual(serializer.data, expected) + + def test_reverse_foreign_key_create(self): + data = {'id': 3, 'name': 'target-3', 'sources': ['source-1', 'source-3']} + serializer = ForeignKeyTargetSerializer(data=data) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'target-3') + + # Ensure target 3 is added, and everything else is as expected + queryset = ForeignKeyTarget.objects.all() + serializer = ForeignKeyTargetSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'target-1', 'sources': ['source-2']}, + {'id': 2, 'name': 'target-2', 'sources': []}, + {'id': 3, 'name': 'target-3', 'sources': ['source-1', 'source-3']}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update_with_invalid_null(self): + data = {'id': 1, 'name': 'source-1', 'target': None} + instance = ForeignKeySource.objects.get(pk=1) + serializer = ForeignKeySourceSerializer(instance, data=data) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'target': ['This field is required.']}) + + +class SlugNullableForeignKeyTests(TestCase): + def setUp(self): + target = ForeignKeyTarget(name='target-1') + target.save() + for idx in range(1, 4): + if idx == 3: + target = None + source = NullableForeignKeySource(name='source-%d' % idx, target=target) + source.save() + + def test_foreign_key_retrieve_with_null(self): + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': 'target-1'}, + {'id': 2, 'name': 'source-2', 'target': 'target-1'}, + {'id': 3, 'name': 'source-3', 'target': None}, + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_create_with_valid_null(self): + data = {'id': 4, 'name': 'source-4', 'target': None} + serializer = NullableForeignKeySourceSerializer(data=data) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, data) + self.assertEqual(obj.name, 'source-4') + + # Ensure source 4 is created, and everything else is as expected + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': 'target-1'}, + {'id': 2, 'name': 'source-2', 'target': 'target-1'}, + {'id': 3, 'name': 'source-3', 'target': None}, + {'id': 4, 'name': 'source-4', 'target': None} + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_create_with_valid_emptystring(self): + """ + The emptystring should be interpreted as null in the context + of relationships. + """ + data = {'id': 4, 'name': 'source-4', 'target': ''} + expected_data = {'id': 4, 'name': 'source-4', 'target': None} + serializer = NullableForeignKeySourceSerializer(data=data) + self.assertTrue(serializer.is_valid()) + obj = serializer.save() + self.assertEqual(serializer.data, expected_data) + self.assertEqual(obj.name, 'source-4') + + # Ensure source 4 is created, and everything else is as expected + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': 'target-1'}, + {'id': 2, 'name': 'source-2', 'target': 'target-1'}, + {'id': 3, 'name': 'source-3', 'target': None}, + {'id': 4, 'name': 'source-4', 'target': None} + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update_with_valid_null(self): + data = {'id': 1, 'name': 'source-1', 'target': None} + instance = NullableForeignKeySource.objects.get(pk=1) + serializer = NullableForeignKeySourceSerializer(instance, data=data) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.data, data) + serializer.save() + + # Ensure source 1 is updated, and everything else is as expected + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': None}, + {'id': 2, 'name': 'source-2', 'target': 'target-1'}, + {'id': 3, 'name': 'source-3', 'target': None} + ] + self.assertEqual(serializer.data, expected) + + def test_foreign_key_update_with_valid_emptystring(self): + """ + The emptystring should be interpreted as null in the context + of relationships. + """ + data = {'id': 1, 'name': 'source-1', 'target': ''} + expected_data = {'id': 1, 'name': 'source-1', 'target': None} + instance = NullableForeignKeySource.objects.get(pk=1) + serializer = NullableForeignKeySourceSerializer(instance, data=data) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.data, expected_data) + serializer.save() + + # Ensure source 1 is updated, and everything else is as expected + queryset = NullableForeignKeySource.objects.all() + serializer = NullableForeignKeySourceSerializer(queryset, many=True) + expected = [ + {'id': 1, 'name': 'source-1', 'target': None}, + {'id': 2, 'name': 'source-2', 'target': 'target-1'}, + {'id': 3, 'name': 'source-3', 'target': None} + ] + self.assertEqual(serializer.data, expected) diff --git a/vendor-local/lib/python/rest_framework/tests/test_renderers.py b/vendor-local/lib/python/rest_framework/tests/test_renderers.py new file mode 100644 index 00000000000..df6f4aa63fa --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_renderers.py @@ -0,0 +1,539 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from decimal import Decimal +from django.core.cache import cache +from django.test import TestCase +from django.utils import unittest +from django.utils.translation import ugettext_lazy as _ +from rest_framework import status, permissions +from rest_framework.compat import yaml, etree, patterns, url, include, six, StringIO +from rest_framework.response import Response +from rest_framework.views import APIView +from rest_framework.renderers import BaseRenderer, JSONRenderer, YAMLRenderer, \ + XMLRenderer, JSONPRenderer, BrowsableAPIRenderer, UnicodeJSONRenderer +from rest_framework.parsers import YAMLParser, XMLParser +from rest_framework.settings import api_settings +from rest_framework.test import APIRequestFactory +import datetime +import pickle +import re + + +DUMMYSTATUS = status.HTTP_200_OK +DUMMYCONTENT = 'dummycontent' + +RENDERER_A_SERIALIZER = lambda x: ('Renderer A: %s' % x).encode('ascii') +RENDERER_B_SERIALIZER = lambda x: ('Renderer B: %s' % x).encode('ascii') + + +expected_results = [ + ((elem for elem in [1, 2, 3]), JSONRenderer, b'[1, 2, 3]') # Generator +] + + +class BasicRendererTests(TestCase): + def test_expected_results(self): + for value, renderer_cls, expected in expected_results: + output = renderer_cls().render(value) + self.assertEqual(output, expected) + + +class RendererA(BaseRenderer): + media_type = 'mock/renderera' + format = "formata" + + def render(self, data, media_type=None, renderer_context=None): + return RENDERER_A_SERIALIZER(data) + + +class RendererB(BaseRenderer): + media_type = 'mock/rendererb' + format = "formatb" + + def render(self, data, media_type=None, renderer_context=None): + return RENDERER_B_SERIALIZER(data) + + +class MockView(APIView): + renderer_classes = (RendererA, RendererB) + + def get(self, request, **kwargs): + response = Response(DUMMYCONTENT, status=DUMMYSTATUS) + return response + + +class MockGETView(APIView): + + def get(self, request, **kwargs): + return Response({'foo': ['bar', 'baz']}) + + +class HTMLView(APIView): + renderer_classes = (BrowsableAPIRenderer, ) + + def get(self, request, **kwargs): + return Response('text') + + +class HTMLView1(APIView): + renderer_classes = (BrowsableAPIRenderer, JSONRenderer) + + def get(self, request, **kwargs): + return Response('text') + +urlpatterns = patterns('', + url(r'^.*\.(?P<format>.+)$', MockView.as_view(renderer_classes=[RendererA, RendererB])), + url(r'^$', MockView.as_view(renderer_classes=[RendererA, RendererB])), + url(r'^cache$', MockGETView.as_view()), + url(r'^jsonp/jsonrenderer$', MockGETView.as_view(renderer_classes=[JSONRenderer, JSONPRenderer])), + url(r'^jsonp/nojsonrenderer$', MockGETView.as_view(renderer_classes=[JSONPRenderer])), + url(r'^html$', HTMLView.as_view()), + url(r'^html1$', HTMLView1.as_view()), + url(r'^api', include('rest_framework.urls', namespace='rest_framework')) +) + + +class POSTDeniedPermission(permissions.BasePermission): + def has_permission(self, request, view): + return request.method != 'POST' + + +class POSTDeniedView(APIView): + renderer_classes = (BrowsableAPIRenderer,) + permission_classes = (POSTDeniedPermission,) + + def get(self, request): + return Response() + + def post(self, request): + return Response() + + def put(self, request): + return Response() + + def patch(self, request): + return Response() + + +class DocumentingRendererTests(TestCase): + def test_only_permitted_forms_are_displayed(self): + view = POSTDeniedView.as_view() + request = APIRequestFactory().get('/') + response = view(request).render() + self.assertNotContains(response, '>POST<') + self.assertContains(response, '>PUT<') + self.assertContains(response, '>PATCH<') + + +class RendererEndToEndTests(TestCase): + """ + End-to-end testing of renderers using an RendererMixin on a generic view. + """ + + urls = 'rest_framework.tests.test_renderers' + + def test_default_renderer_serializes_content(self): + """If the Accept header is not set the default renderer should serialize the response.""" + resp = self.client.get('/') + self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_head_method_serializes_no_content(self): + """No response must be included in HEAD requests.""" + resp = self.client.head('/') + self.assertEqual(resp.status_code, DUMMYSTATUS) + self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') + self.assertEqual(resp.content, six.b('')) + + def test_default_renderer_serializes_content_on_accept_any(self): + """If the Accept header is set to */* the default renderer should serialize the response.""" + resp = self.client.get('/', HTTP_ACCEPT='*/*') + self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_specified_renderer_serializes_content_default_case(self): + """If the Accept header is set the specified renderer should serialize the response. + (In this case we check that works for the default renderer)""" + resp = self.client.get('/', HTTP_ACCEPT=RendererA.media_type) + self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_specified_renderer_serializes_content_non_default_case(self): + """If the Accept header is set the specified renderer should serialize the response. + (In this case we check that works for a non-default renderer)""" + resp = self.client.get('/', HTTP_ACCEPT=RendererB.media_type) + self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_specified_renderer_serializes_content_on_accept_query(self): + """The '_accept' query string should behave in the same way as the Accept header.""" + param = '?%s=%s' % ( + api_settings.URL_ACCEPT_OVERRIDE, + RendererB.media_type + ) + resp = self.client.get('/' + param) + self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_unsatisfiable_accept_header_on_request_returns_406_status(self): + """If the Accept header is unsatisfiable we should return a 406 Not Acceptable response.""" + resp = self.client.get('/', HTTP_ACCEPT='foo/bar') + self.assertEqual(resp.status_code, status.HTTP_406_NOT_ACCEPTABLE) + + def test_specified_renderer_serializes_content_on_format_query(self): + """If a 'format' query is specified, the renderer with the matching + format attribute should serialize the response.""" + param = '?%s=%s' % ( + api_settings.URL_FORMAT_OVERRIDE, + RendererB.format + ) + resp = self.client.get('/' + param) + self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_specified_renderer_serializes_content_on_format_kwargs(self): + """If a 'format' keyword arg is specified, the renderer with the matching + format attribute should serialize the response.""" + resp = self.client.get('/something.formatb') + self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_specified_renderer_is_used_on_format_query_with_matching_accept(self): + """If both a 'format' query and a matching Accept header specified, + the renderer with the matching format attribute should serialize the response.""" + param = '?%s=%s' % ( + api_settings.URL_FORMAT_OVERRIDE, + RendererB.format + ) + resp = self.client.get('/' + param, + HTTP_ACCEPT=RendererB.media_type) + self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + +_flat_repr = '{"foo": ["bar", "baz"]}' +_indented_repr = '{\n "foo": [\n "bar",\n "baz"\n ]\n}' + + +def strip_trailing_whitespace(content): + """ + Seems to be some inconsistencies re. trailing whitespace with + different versions of the json lib. + """ + return re.sub(' +\n', '\n', content) + + +class JSONRendererTests(TestCase): + """ + Tests specific to the JSON Renderer + """ + + def test_render_lazy_strings(self): + """ + JSONRenderer should deal with lazy translated strings. + """ + ret = JSONRenderer().render(_('test')) + self.assertEqual(ret, b'"test"') + + def test_without_content_type_args(self): + """ + Test basic JSON rendering. + """ + obj = {'foo': ['bar', 'baz']} + renderer = JSONRenderer() + content = renderer.render(obj, 'application/json') + # Fix failing test case which depends on version of JSON library. + self.assertEqual(content.decode('utf-8'), _flat_repr) + + def test_with_content_type_args(self): + """ + Test JSON rendering with additional content type arguments supplied. + """ + obj = {'foo': ['bar', 'baz']} + renderer = JSONRenderer() + content = renderer.render(obj, 'application/json; indent=2') + self.assertEqual(strip_trailing_whitespace(content.decode('utf-8')), _indented_repr) + + def test_check_ascii(self): + obj = {'countries': ['United Kingdom', 'France', 'España']} + renderer = JSONRenderer() + content = renderer.render(obj, 'application/json') + self.assertEqual(content, '{"countries": ["United Kingdom", "France", "Espa\\u00f1a"]}'.encode('utf-8')) + + +class UnicodeJSONRendererTests(TestCase): + """ + Tests specific for the Unicode JSON Renderer + """ + def test_proper_encoding(self): + obj = {'countries': ['United Kingdom', 'France', 'España']} + renderer = UnicodeJSONRenderer() + content = renderer.render(obj, 'application/json') + self.assertEqual(content, '{"countries": ["United Kingdom", "France", "España"]}'.encode('utf-8')) + + +class JSONPRendererTests(TestCase): + """ + Tests specific to the JSONP Renderer + """ + + urls = 'rest_framework.tests.test_renderers' + + def test_without_callback_with_json_renderer(self): + """ + Test JSONP rendering with View JSON Renderer. + """ + resp = self.client.get('/jsonp/jsonrenderer', + HTTP_ACCEPT='application/javascript') + self.assertEqual(resp.status_code, status.HTTP_200_OK) + self.assertEqual(resp['Content-Type'], 'application/javascript; charset=utf-8') + self.assertEqual(resp.content, + ('callback(%s);' % _flat_repr).encode('ascii')) + + def test_without_callback_without_json_renderer(self): + """ + Test JSONP rendering without View JSON Renderer. + """ + resp = self.client.get('/jsonp/nojsonrenderer', + HTTP_ACCEPT='application/javascript') + self.assertEqual(resp.status_code, status.HTTP_200_OK) + self.assertEqual(resp['Content-Type'], 'application/javascript; charset=utf-8') + self.assertEqual(resp.content, + ('callback(%s);' % _flat_repr).encode('ascii')) + + def test_with_callback(self): + """ + Test JSONP rendering with callback function name. + """ + callback_func = 'myjsonpcallback' + resp = self.client.get('/jsonp/nojsonrenderer?callback=' + callback_func, + HTTP_ACCEPT='application/javascript') + self.assertEqual(resp.status_code, status.HTTP_200_OK) + self.assertEqual(resp['Content-Type'], 'application/javascript; charset=utf-8') + self.assertEqual(resp.content, + ('%s(%s);' % (callback_func, _flat_repr)).encode('ascii')) + + +if yaml: + _yaml_repr = 'foo: [bar, baz]\n' + + class YAMLRendererTests(TestCase): + """ + Tests specific to the JSON Renderer + """ + + def test_render(self): + """ + Test basic YAML rendering. + """ + obj = {'foo': ['bar', 'baz']} + renderer = YAMLRenderer() + content = renderer.render(obj, 'application/yaml') + self.assertEqual(content, _yaml_repr) + + def test_render_and_parse(self): + """ + Test rendering and then parsing returns the original object. + IE obj -> render -> parse -> obj. + """ + obj = {'foo': ['bar', 'baz']} + + renderer = YAMLRenderer() + parser = YAMLParser() + + content = renderer.render(obj, 'application/yaml') + data = parser.parse(StringIO(content)) + self.assertEqual(obj, data) + + +class XMLRendererTestCase(TestCase): + """ + Tests specific to the XML Renderer + """ + + _complex_data = { + "creation_date": datetime.datetime(2011, 12, 25, 12, 45, 00), + "name": "name", + "sub_data_list": [ + { + "sub_id": 1, + "sub_name": "first" + }, + { + "sub_id": 2, + "sub_name": "second" + } + ] + } + + def test_render_string(self): + """ + Test XML rendering. + """ + renderer = XMLRenderer() + content = renderer.render({'field': 'astring'}, 'application/xml') + self.assertXMLContains(content, '<field>astring</field>') + + def test_render_integer(self): + """ + Test XML rendering. + """ + renderer = XMLRenderer() + content = renderer.render({'field': 111}, 'application/xml') + self.assertXMLContains(content, '<field>111</field>') + + def test_render_datetime(self): + """ + Test XML rendering. + """ + renderer = XMLRenderer() + content = renderer.render({ + 'field': datetime.datetime(2011, 12, 25, 12, 45, 00) + }, 'application/xml') + self.assertXMLContains(content, '<field>2011-12-25 12:45:00</field>') + + def test_render_float(self): + """ + Test XML rendering. + """ + renderer = XMLRenderer() + content = renderer.render({'field': 123.4}, 'application/xml') + self.assertXMLContains(content, '<field>123.4</field>') + + def test_render_decimal(self): + """ + Test XML rendering. + """ + renderer = XMLRenderer() + content = renderer.render({'field': Decimal('111.2')}, 'application/xml') + self.assertXMLContains(content, '<field>111.2</field>') + + def test_render_none(self): + """ + Test XML rendering. + """ + renderer = XMLRenderer() + content = renderer.render({'field': None}, 'application/xml') + self.assertXMLContains(content, '<field></field>') + + def test_render_complex_data(self): + """ + Test XML rendering. + """ + renderer = XMLRenderer() + content = renderer.render(self._complex_data, 'application/xml') + self.assertXMLContains(content, '<sub_name>first</sub_name>') + self.assertXMLContains(content, '<sub_name>second</sub_name>') + + @unittest.skipUnless(etree, 'defusedxml not installed') + def test_render_and_parse_complex_data(self): + """ + Test XML rendering. + """ + renderer = XMLRenderer() + content = StringIO(renderer.render(self._complex_data, 'application/xml')) + + parser = XMLParser() + complex_data_out = parser.parse(content) + error_msg = "complex data differs!IN:\n %s \n\n OUT:\n %s" % (repr(self._complex_data), repr(complex_data_out)) + self.assertEqual(self._complex_data, complex_data_out, error_msg) + + def assertXMLContains(self, xml, string): + self.assertTrue(xml.startswith('<?xml version="1.0" encoding="utf-8"?>\n<root>')) + self.assertTrue(xml.endswith('</root>')) + self.assertTrue(string in xml, '%r not in %r' % (string, xml)) + + +# Tests for caching issue, #346 +class CacheRenderTest(TestCase): + """ + Tests specific to caching responses + """ + + urls = 'rest_framework.tests.test_renderers' + + cache_key = 'just_a_cache_key' + + @classmethod + def _get_pickling_errors(cls, obj, seen=None): + """ Return any errors that would be raised if `obj' is pickled + Courtesy of koffie @ http://stackoverflow.com/a/7218986/109897 + """ + if seen == None: + seen = [] + try: + state = obj.__getstate__() + except AttributeError: + return + if state == None: + return + if isinstance(state, tuple): + if not isinstance(state[0], dict): + state = state[1] + else: + state = state[0].update(state[1]) + result = {} + for i in state: + try: + pickle.dumps(state[i], protocol=2) + except pickle.PicklingError: + if not state[i] in seen: + seen.append(state[i]) + result[i] = cls._get_pickling_errors(state[i], seen) + return result + + def http_resp(self, http_method, url): + """ + Simple wrapper for Client http requests + Removes the `client' and `request' attributes from as they are + added by django.test.client.Client and not part of caching + responses outside of tests. + """ + method = getattr(self.client, http_method) + resp = method(url) + del resp.client, resp.request + return resp + + def test_obj_pickling(self): + """ + Test that responses are properly pickled + """ + resp = self.http_resp('get', '/cache') + + # Make sure that no pickling errors occurred + self.assertEqual(self._get_pickling_errors(resp), {}) + + # Unfortunately LocMem backend doesn't raise PickleErrors but returns + # None instead. + cache.set(self.cache_key, resp) + self.assertTrue(cache.get(self.cache_key) is not None) + + def test_head_caching(self): + """ + Test caching of HEAD requests + """ + resp = self.http_resp('head', '/cache') + cache.set(self.cache_key, resp) + + cached_resp = cache.get(self.cache_key) + self.assertIsInstance(cached_resp, Response) + + def test_get_caching(self): + """ + Test caching of GET requests + """ + resp = self.http_resp('get', '/cache') + cache.set(self.cache_key, resp) + + cached_resp = cache.get(self.cache_key) + self.assertIsInstance(cached_resp, Response) + self.assertEqual(cached_resp.content, resp.content) diff --git a/vendor-local/lib/python/rest_framework/tests/test_request.py b/vendor-local/lib/python/rest_framework/tests/test_request.py new file mode 100644 index 00000000000..969d8024a9c --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_request.py @@ -0,0 +1,314 @@ +""" +Tests for content parsing, and form-overloaded content parsing. +""" +from __future__ import unicode_literals +from django.contrib.auth.models import User +from django.contrib.auth import authenticate, login, logout +from django.contrib.sessions.middleware import SessionMiddleware +from django.test import TestCase +from rest_framework import status +from rest_framework.authentication import SessionAuthentication +from rest_framework.compat import patterns +from rest_framework.parsers import ( + BaseParser, + FormParser, + MultiPartParser, + JSONParser +) +from rest_framework.request import Request +from rest_framework.response import Response +from rest_framework.settings import api_settings +from rest_framework.test import APIRequestFactory, APIClient +from rest_framework.views import APIView +from rest_framework.compat import six +import json + + +factory = APIRequestFactory() + + +class PlainTextParser(BaseParser): + media_type = 'text/plain' + + def parse(self, stream, media_type=None, parser_context=None): + """ + Returns a 2-tuple of `(data, files)`. + + `data` will simply be a string representing the body of the request. + `files` will always be `None`. + """ + return stream.read() + + +class TestMethodOverloading(TestCase): + def test_method(self): + """ + Request methods should be same as underlying request. + """ + request = Request(factory.get('/')) + self.assertEqual(request.method, 'GET') + request = Request(factory.post('/')) + self.assertEqual(request.method, 'POST') + + def test_overloaded_method(self): + """ + POST requests can be overloaded to another method by setting a + reserved form field + """ + request = Request(factory.post('/', {api_settings.FORM_METHOD_OVERRIDE: 'DELETE'})) + self.assertEqual(request.method, 'DELETE') + + def test_x_http_method_override_header(self): + """ + POST requests can also be overloaded to another method by setting + the X-HTTP-Method-Override header. + """ + request = Request(factory.post('/', {'foo': 'bar'}, HTTP_X_HTTP_METHOD_OVERRIDE='DELETE')) + self.assertEqual(request.method, 'DELETE') + + +class TestContentParsing(TestCase): + def test_standard_behaviour_determines_no_content_GET(self): + """ + Ensure request.DATA returns empty QueryDict for GET request. + """ + request = Request(factory.get('/')) + self.assertEqual(request.DATA, {}) + + def test_standard_behaviour_determines_no_content_HEAD(self): + """ + Ensure request.DATA returns empty QueryDict for HEAD request. + """ + request = Request(factory.head('/')) + self.assertEqual(request.DATA, {}) + + def test_request_DATA_with_form_content(self): + """ + Ensure request.DATA returns content for POST request with form content. + """ + data = {'qwerty': 'uiop'} + request = Request(factory.post('/', data)) + request.parsers = (FormParser(), MultiPartParser()) + self.assertEqual(list(request.DATA.items()), list(data.items())) + + def test_request_DATA_with_text_content(self): + """ + Ensure request.DATA returns content for POST request with + non-form content. + """ + content = six.b('qwerty') + content_type = 'text/plain' + request = Request(factory.post('/', content, content_type=content_type)) + request.parsers = (PlainTextParser(),) + self.assertEqual(request.DATA, content) + + def test_request_POST_with_form_content(self): + """ + Ensure request.POST returns content for POST request with form content. + """ + data = {'qwerty': 'uiop'} + request = Request(factory.post('/', data)) + request.parsers = (FormParser(), MultiPartParser()) + self.assertEqual(list(request.POST.items()), list(data.items())) + + def test_standard_behaviour_determines_form_content_PUT(self): + """ + Ensure request.DATA returns content for PUT request with form content. + """ + data = {'qwerty': 'uiop'} + request = Request(factory.put('/', data)) + request.parsers = (FormParser(), MultiPartParser()) + self.assertEqual(list(request.DATA.items()), list(data.items())) + + def test_standard_behaviour_determines_non_form_content_PUT(self): + """ + Ensure request.DATA returns content for PUT request with + non-form content. + """ + content = six.b('qwerty') + content_type = 'text/plain' + request = Request(factory.put('/', content, content_type=content_type)) + request.parsers = (PlainTextParser(), ) + self.assertEqual(request.DATA, content) + + def test_overloaded_behaviour_allows_content_tunnelling(self): + """ + Ensure request.DATA returns content for overloaded POST request. + """ + json_data = {'foobar': 'qwerty'} + content = json.dumps(json_data) + content_type = 'application/json' + form_data = { + api_settings.FORM_CONTENT_OVERRIDE: content, + api_settings.FORM_CONTENTTYPE_OVERRIDE: content_type + } + request = Request(factory.post('/', form_data)) + request.parsers = (JSONParser(), ) + self.assertEqual(request.DATA, json_data) + + # def test_accessing_post_after_data_form(self): + # """ + # Ensures request.POST can be accessed after request.DATA in + # form request. + # """ + # data = {'qwerty': 'uiop'} + # request = factory.post('/', data=data) + # self.assertEqual(request.DATA.items(), data.items()) + # self.assertEqual(request.POST.items(), data.items()) + + # def test_accessing_post_after_data_for_json(self): + # """ + # Ensures request.POST can be accessed after request.DATA in + # json request. + # """ + # data = {'qwerty': 'uiop'} + # content = json.dumps(data) + # content_type = 'application/json' + # parsers = (JSONParser, ) + + # request = factory.post('/', content, content_type=content_type, + # parsers=parsers) + # self.assertEqual(request.DATA.items(), data.items()) + # self.assertEqual(request.POST.items(), []) + + # def test_accessing_post_after_data_for_overloaded_json(self): + # """ + # Ensures request.POST can be accessed after request.DATA in overloaded + # json request. + # """ + # data = {'qwerty': 'uiop'} + # content = json.dumps(data) + # content_type = 'application/json' + # parsers = (JSONParser, ) + # form_data = {Request._CONTENT_PARAM: content, + # Request._CONTENTTYPE_PARAM: content_type} + + # request = factory.post('/', form_data, parsers=parsers) + # self.assertEqual(request.DATA.items(), data.items()) + # self.assertEqual(request.POST.items(), form_data.items()) + + # def test_accessing_data_after_post_form(self): + # """ + # Ensures request.DATA can be accessed after request.POST in + # form request. + # """ + # data = {'qwerty': 'uiop'} + # parsers = (FormParser, MultiPartParser) + # request = factory.post('/', data, parsers=parsers) + + # self.assertEqual(request.POST.items(), data.items()) + # self.assertEqual(request.DATA.items(), data.items()) + + # def test_accessing_data_after_post_for_json(self): + # """ + # Ensures request.DATA can be accessed after request.POST in + # json request. + # """ + # data = {'qwerty': 'uiop'} + # content = json.dumps(data) + # content_type = 'application/json' + # parsers = (JSONParser, ) + # request = factory.post('/', content, content_type=content_type, + # parsers=parsers) + # self.assertEqual(request.POST.items(), []) + # self.assertEqual(request.DATA.items(), data.items()) + + # def test_accessing_data_after_post_for_overloaded_json(self): + # """ + # Ensures request.DATA can be accessed after request.POST in overloaded + # json request + # """ + # data = {'qwerty': 'uiop'} + # content = json.dumps(data) + # content_type = 'application/json' + # parsers = (JSONParser, ) + # form_data = {Request._CONTENT_PARAM: content, + # Request._CONTENTTYPE_PARAM: content_type} + + # request = factory.post('/', form_data, parsers=parsers) + # self.assertEqual(request.POST.items(), form_data.items()) + # self.assertEqual(request.DATA.items(), data.items()) + + +class MockView(APIView): + authentication_classes = (SessionAuthentication,) + + def post(self, request): + if request.POST.get('example') is not None: + return Response(status=status.HTTP_200_OK) + + return Response(status=status.INTERNAL_SERVER_ERROR) + +urlpatterns = patterns('', + (r'^$', MockView.as_view()), +) + + +class TestContentParsingWithAuthentication(TestCase): + urls = 'rest_framework.tests.test_request' + + def setUp(self): + self.csrf_client = APIClient(enforce_csrf_checks=True) + self.username = 'john' + self.email = 'lennon@thebeatles.com' + self.password = 'password' + self.user = User.objects.create_user(self.username, self.email, self.password) + + def test_user_logged_in_authentication_has_POST_when_not_logged_in(self): + """ + Ensures request.POST exists after SessionAuthentication when user + doesn't log in. + """ + content = {'example': 'example'} + + response = self.client.post('/', content) + self.assertEqual(status.HTTP_200_OK, response.status_code) + + response = self.csrf_client.post('/', content) + self.assertEqual(status.HTTP_200_OK, response.status_code) + + # def test_user_logged_in_authentication_has_post_when_logged_in(self): + # """Ensures request.POST exists after UserLoggedInAuthentication when user does log in""" + # self.client.login(username='john', password='password') + # self.csrf_client.login(username='john', password='password') + # content = {'example': 'example'} + + # response = self.client.post('/', content) + # self.assertEqual(status.OK, response.status_code, "POST data is malformed") + + # response = self.csrf_client.post('/', content) + # self.assertEqual(status.OK, response.status_code, "POST data is malformed") + + +class TestUserSetter(TestCase): + + def setUp(self): + # Pass request object through session middleware so session is + # available to login and logout functions + self.request = Request(factory.get('/')) + SessionMiddleware().process_request(self.request) + + User.objects.create_user('ringo', 'starr@thebeatles.com', 'yellow') + self.user = authenticate(username='ringo', password='yellow') + + def test_user_can_be_set(self): + self.request.user = self.user + self.assertEqual(self.request.user, self.user) + + def test_user_can_login(self): + login(self.request, self.user) + self.assertEqual(self.request.user, self.user) + + def test_user_can_logout(self): + self.request.user = self.user + self.assertFalse(self.request.user.is_anonymous()) + logout(self.request) + self.assertTrue(self.request.user.is_anonymous()) + + +class TestAuthSetter(TestCase): + + def test_auth_can_be_set(self): + request = Request(factory.get('/')) + request.auth = 'DUMMY' + self.assertEqual(request.auth, 'DUMMY') diff --git a/vendor-local/lib/python/rest_framework/tests/test_response.py b/vendor-local/lib/python/rest_framework/tests/test_response.py new file mode 100644 index 00000000000..eea3c6418a5 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_response.py @@ -0,0 +1,278 @@ +from __future__ import unicode_literals +from django.test import TestCase +from rest_framework.tests.models import BasicModel, BasicModelSerializer +from rest_framework.compat import patterns, url, include +from rest_framework.response import Response +from rest_framework.views import APIView +from rest_framework import generics +from rest_framework import routers +from rest_framework import status +from rest_framework.renderers import ( + BaseRenderer, + JSONRenderer, + BrowsableAPIRenderer +) +from rest_framework import viewsets +from rest_framework.settings import api_settings +from rest_framework.compat import six + + +class MockPickleRenderer(BaseRenderer): + media_type = 'application/pickle' + + +class MockJsonRenderer(BaseRenderer): + media_type = 'application/json' + + +class MockTextMediaRenderer(BaseRenderer): + media_type = 'text/html' + +DUMMYSTATUS = status.HTTP_200_OK +DUMMYCONTENT = 'dummycontent' + +RENDERER_A_SERIALIZER = lambda x: ('Renderer A: %s' % x).encode('ascii') +RENDERER_B_SERIALIZER = lambda x: ('Renderer B: %s' % x).encode('ascii') + + +class RendererA(BaseRenderer): + media_type = 'mock/renderera' + format = "formata" + + def render(self, data, media_type=None, renderer_context=None): + return RENDERER_A_SERIALIZER(data) + + +class RendererB(BaseRenderer): + media_type = 'mock/rendererb' + format = "formatb" + + def render(self, data, media_type=None, renderer_context=None): + return RENDERER_B_SERIALIZER(data) + + +class RendererC(RendererB): + media_type = 'mock/rendererc' + format = 'formatc' + charset = "rendererc" + + +class MockView(APIView): + renderer_classes = (RendererA, RendererB, RendererC) + + def get(self, request, **kwargs): + return Response(DUMMYCONTENT, status=DUMMYSTATUS) + + +class MockViewSettingContentType(APIView): + renderer_classes = (RendererA, RendererB, RendererC) + + def get(self, request, **kwargs): + return Response(DUMMYCONTENT, status=DUMMYSTATUS, content_type='setbyview') + + +class HTMLView(APIView): + renderer_classes = (BrowsableAPIRenderer, ) + + def get(self, request, **kwargs): + return Response('text') + + +class HTMLView1(APIView): + renderer_classes = (BrowsableAPIRenderer, JSONRenderer) + + def get(self, request, **kwargs): + return Response('text') + + +class HTMLNewModelViewSet(viewsets.ModelViewSet): + model = BasicModel + + +class HTMLNewModelView(generics.ListCreateAPIView): + renderer_classes = (BrowsableAPIRenderer,) + permission_classes = [] + serializer_class = BasicModelSerializer + model = BasicModel + + +new_model_viewset_router = routers.DefaultRouter() +new_model_viewset_router.register(r'', HTMLNewModelViewSet) + + +urlpatterns = patterns('', + url(r'^setbyview$', MockViewSettingContentType.as_view(renderer_classes=[RendererA, RendererB, RendererC])), + url(r'^.*\.(?P<format>.+)$', MockView.as_view(renderer_classes=[RendererA, RendererB, RendererC])), + url(r'^$', MockView.as_view(renderer_classes=[RendererA, RendererB, RendererC])), + url(r'^html$', HTMLView.as_view()), + url(r'^html1$', HTMLView1.as_view()), + url(r'^html_new_model$', HTMLNewModelView.as_view()), + url(r'^html_new_model_viewset', include(new_model_viewset_router.urls)), + url(r'^restframework', include('rest_framework.urls', namespace='rest_framework')) +) + + +# TODO: Clean tests bellow - remove duplicates with above, better unit testing, ... +class RendererIntegrationTests(TestCase): + """ + End-to-end testing of renderers using an ResponseMixin on a generic view. + """ + + urls = 'rest_framework.tests.test_response' + + def test_default_renderer_serializes_content(self): + """If the Accept header is not set the default renderer should serialize the response.""" + resp = self.client.get('/') + self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_head_method_serializes_no_content(self): + """No response must be included in HEAD requests.""" + resp = self.client.head('/') + self.assertEqual(resp.status_code, DUMMYSTATUS) + self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') + self.assertEqual(resp.content, six.b('')) + + def test_default_renderer_serializes_content_on_accept_any(self): + """If the Accept header is set to */* the default renderer should serialize the response.""" + resp = self.client.get('/', HTTP_ACCEPT='*/*') + self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_specified_renderer_serializes_content_default_case(self): + """If the Accept header is set the specified renderer should serialize the response. + (In this case we check that works for the default renderer)""" + resp = self.client.get('/', HTTP_ACCEPT=RendererA.media_type) + self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_specified_renderer_serializes_content_non_default_case(self): + """If the Accept header is set the specified renderer should serialize the response. + (In this case we check that works for a non-default renderer)""" + resp = self.client.get('/', HTTP_ACCEPT=RendererB.media_type) + self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_specified_renderer_serializes_content_on_accept_query(self): + """The '_accept' query string should behave in the same way as the Accept header.""" + param = '?%s=%s' % ( + api_settings.URL_ACCEPT_OVERRIDE, + RendererB.media_type + ) + resp = self.client.get('/' + param) + self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_specified_renderer_serializes_content_on_format_query(self): + """If a 'format' query is specified, the renderer with the matching + format attribute should serialize the response.""" + resp = self.client.get('/?format=%s' % RendererB.format) + self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_specified_renderer_serializes_content_on_format_kwargs(self): + """If a 'format' keyword arg is specified, the renderer with the matching + format attribute should serialize the response.""" + resp = self.client.get('/something.formatb') + self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + def test_specified_renderer_is_used_on_format_query_with_matching_accept(self): + """If both a 'format' query and a matching Accept header specified, + the renderer with the matching format attribute should serialize the response.""" + resp = self.client.get('/?format=%s' % RendererB.format, + HTTP_ACCEPT=RendererB.media_type) + self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') + self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) + self.assertEqual(resp.status_code, DUMMYSTATUS) + + +class Issue122Tests(TestCase): + """ + Tests that covers #122. + """ + urls = 'rest_framework.tests.test_response' + + def test_only_html_renderer(self): + """ + Test if no infinite recursion occurs. + """ + self.client.get('/html') + + def test_html_renderer_is_first(self): + """ + Test if no infinite recursion occurs. + """ + self.client.get('/html1') + + +class Issue467Tests(TestCase): + """ + Tests for #467 + """ + + urls = 'rest_framework.tests.test_response' + + def test_form_has_label_and_help_text(self): + resp = self.client.get('/html_new_model') + self.assertEqual(resp['Content-Type'], 'text/html; charset=utf-8') + self.assertContains(resp, 'Text comes here') + self.assertContains(resp, 'Text description.') + + +class Issue807Tests(TestCase): + """ + Covers #807 + """ + + urls = 'rest_framework.tests.test_response' + + def test_does_not_append_charset_by_default(self): + """ + Renderers don't include a charset unless set explicitly. + """ + headers = {"HTTP_ACCEPT": RendererA.media_type} + resp = self.client.get('/', **headers) + expected = "{0}; charset={1}".format(RendererA.media_type, 'utf-8') + self.assertEqual(expected, resp['Content-Type']) + + def test_if_there_is_charset_specified_on_renderer_it_gets_appended(self): + """ + If renderer class has charset attribute declared, it gets appended + to Response's Content-Type + """ + headers = {"HTTP_ACCEPT": RendererC.media_type} + resp = self.client.get('/', **headers) + expected = "{0}; charset={1}".format(RendererC.media_type, RendererC.charset) + self.assertEqual(expected, resp['Content-Type']) + + def test_content_type_set_explictly_on_response(self): + """ + The content type may be set explictly on the response. + """ + headers = {"HTTP_ACCEPT": RendererC.media_type} + resp = self.client.get('/setbyview', **headers) + self.assertEqual('setbyview', resp['Content-Type']) + + def test_viewset_label_help_text(self): + param = '?%s=%s' % ( + api_settings.URL_ACCEPT_OVERRIDE, + 'text/html' + ) + resp = self.client.get('/html_new_model_viewset/' + param) + self.assertEqual(resp['Content-Type'], 'text/html; charset=utf-8') + self.assertContains(resp, 'Text comes here') + self.assertContains(resp, 'Text description.') + + def test_form_has_label_and_help_text(self): + resp = self.client.get('/html_new_model') + self.assertEqual(resp['Content-Type'], 'text/html; charset=utf-8') + self.assertContains(resp, 'Text comes here') + self.assertContains(resp, 'Text description.') diff --git a/vendor-local/lib/python/rest_framework/tests/test_reverse.py b/vendor-local/lib/python/rest_framework/tests/test_reverse.py new file mode 100644 index 00000000000..690a30b119d --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_reverse.py @@ -0,0 +1,27 @@ +from __future__ import unicode_literals +from django.test import TestCase +from rest_framework.compat import patterns, url +from rest_framework.reverse import reverse +from rest_framework.test import APIRequestFactory + +factory = APIRequestFactory() + + +def null_view(request): + pass + +urlpatterns = patterns('', + url(r'^view$', null_view, name='view'), +) + + +class ReverseTests(TestCase): + """ + Tests for fully qualified URLs when using `reverse`. + """ + urls = 'rest_framework.tests.test_reverse' + + def test_reversed_urls_are_fully_qualified(self): + request = factory.get('/view') + url = reverse('view', request=request) + self.assertEqual(url, 'http://testserver/view') diff --git a/vendor-local/lib/python/rest_framework/tests/test_routers.py b/vendor-local/lib/python/rest_framework/tests/test_routers.py new file mode 100644 index 00000000000..5fcccb74140 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_routers.py @@ -0,0 +1,216 @@ +from __future__ import unicode_literals +from django.db import models +from django.test import TestCase +from django.core.exceptions import ImproperlyConfigured +from rest_framework import serializers, viewsets, permissions +from rest_framework.compat import include, patterns, url +from rest_framework.decorators import link, action +from rest_framework.response import Response +from rest_framework.routers import SimpleRouter, DefaultRouter +from rest_framework.test import APIRequestFactory + +factory = APIRequestFactory() + +urlpatterns = patterns('',) + + +class BasicViewSet(viewsets.ViewSet): + def list(self, request, *args, **kwargs): + return Response({'method': 'list'}) + + @action() + def action1(self, request, *args, **kwargs): + return Response({'method': 'action1'}) + + @action() + def action2(self, request, *args, **kwargs): + return Response({'method': 'action2'}) + + @action(methods=['post', 'delete']) + def action3(self, request, *args, **kwargs): + return Response({'method': 'action2'}) + + @link() + def link1(self, request, *args, **kwargs): + return Response({'method': 'link1'}) + + @link() + def link2(self, request, *args, **kwargs): + return Response({'method': 'link2'}) + + +class TestSimpleRouter(TestCase): + def setUp(self): + self.router = SimpleRouter() + + def test_link_and_action_decorator(self): + routes = self.router.get_routes(BasicViewSet) + decorator_routes = routes[2:] + # Make sure all these endpoints exist and none have been clobbered + for i, endpoint in enumerate(['action1', 'action2', 'action3', 'link1', 'link2']): + route = decorator_routes[i] + # check url listing + self.assertEqual(route.url, + '^{{prefix}}/{{lookup}}/{0}{{trailing_slash}}$'.format(endpoint)) + # check method to function mapping + if endpoint == 'action3': + methods_map = ['post', 'delete'] + elif endpoint.startswith('action'): + methods_map = ['post'] + else: + methods_map = ['get'] + for method in methods_map: + self.assertEqual(route.mapping[method], endpoint) + + +class RouterTestModel(models.Model): + uuid = models.CharField(max_length=20) + text = models.CharField(max_length=200) + + +class TestCustomLookupFields(TestCase): + """ + Ensure that custom lookup fields are correctly routed. + """ + urls = 'rest_framework.tests.test_routers' + + def setUp(self): + class NoteSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = RouterTestModel + lookup_field = 'uuid' + fields = ('url', 'uuid', 'text') + + class NoteViewSet(viewsets.ModelViewSet): + queryset = RouterTestModel.objects.all() + serializer_class = NoteSerializer + lookup_field = 'uuid' + + RouterTestModel.objects.create(uuid='123', text='foo bar') + + self.router = SimpleRouter() + self.router.register(r'notes', NoteViewSet) + + from rest_framework.tests import test_routers + urls = getattr(test_routers, 'urlpatterns') + urls += patterns('', + url(r'^', include(self.router.urls)), + ) + + def test_custom_lookup_field_route(self): + detail_route = self.router.urls[-1] + detail_url_pattern = detail_route.regex.pattern + self.assertIn('<uuid>', detail_url_pattern) + + def test_retrieve_lookup_field_list_view(self): + response = self.client.get('/notes/') + self.assertEqual(response.data, + [{ + "url": "http://testserver/notes/123/", + "uuid": "123", "text": "foo bar" + }] + ) + + def test_retrieve_lookup_field_detail_view(self): + response = self.client.get('/notes/123/') + self.assertEqual(response.data, + { + "url": "http://testserver/notes/123/", + "uuid": "123", "text": "foo bar" + } + ) + + +class TestTrailingSlashIncluded(TestCase): + def setUp(self): + class NoteViewSet(viewsets.ModelViewSet): + model = RouterTestModel + + self.router = SimpleRouter() + self.router.register(r'notes', NoteViewSet) + self.urls = self.router.urls + + def test_urls_have_trailing_slash_by_default(self): + expected = ['^notes/$', '^notes/(?P<pk>[^/]+)/$'] + for idx in range(len(expected)): + self.assertEqual(expected[idx], self.urls[idx].regex.pattern) + + +class TestTrailingSlashRemoved(TestCase): + def setUp(self): + class NoteViewSet(viewsets.ModelViewSet): + model = RouterTestModel + + self.router = SimpleRouter(trailing_slash=False) + self.router.register(r'notes', NoteViewSet) + self.urls = self.router.urls + + def test_urls_can_have_trailing_slash_removed(self): + expected = ['^notes$', '^notes/(?P<pk>[^/]+)$'] + for idx in range(len(expected)): + self.assertEqual(expected[idx], self.urls[idx].regex.pattern) + + +class TestNameableRoot(TestCase): + def setUp(self): + class NoteViewSet(viewsets.ModelViewSet): + model = RouterTestModel + self.router = DefaultRouter() + self.router.root_view_name = 'nameable-root' + self.router.register(r'notes', NoteViewSet) + self.urls = self.router.urls + + def test_router_has_custom_name(self): + expected = 'nameable-root' + self.assertEqual(expected, self.urls[0].name) + + +class TestActionKeywordArgs(TestCase): + """ + Ensure keyword arguments passed in the `@action` decorator + are properly handled. Refs #940. + """ + + def setUp(self): + class TestViewSet(viewsets.ModelViewSet): + permission_classes = [] + + @action(permission_classes=[permissions.AllowAny]) + def custom(self, request, *args, **kwargs): + return Response({ + 'permission_classes': self.permission_classes + }) + + self.router = SimpleRouter() + self.router.register(r'test', TestViewSet, base_name='test') + self.view = self.router.urls[-1].callback + + def test_action_kwargs(self): + request = factory.post('/test/0/custom/') + response = self.view(request) + self.assertEqual( + response.data, + {'permission_classes': [permissions.AllowAny]} + ) + + +class TestActionAppliedToExistingRoute(TestCase): + """ + Ensure `@action` decorator raises an except when applied + to an existing route + """ + + def test_exception_raised_when_action_applied_to_existing_route(self): + class TestViewSet(viewsets.ModelViewSet): + + @action() + def retrieve(self, request, *args, **kwargs): + return Response({ + 'hello': 'world' + }) + + self.router = SimpleRouter() + self.router.register(r'test', TestViewSet, base_name='test') + + with self.assertRaises(ImproperlyConfigured): + self.router.urls diff --git a/vendor-local/lib/python/rest_framework/tests/test_serializer.py b/vendor-local/lib/python/rest_framework/tests/test_serializer.py new file mode 100644 index 00000000000..c24976603e7 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_serializer.py @@ -0,0 +1,1645 @@ +from __future__ import unicode_literals +from django.db import models +from django.db.models.fields import BLANK_CHOICE_DASH +from django.test import TestCase +from django.utils.datastructures import MultiValueDict +from django.utils.translation import ugettext_lazy as _ +from rest_framework import serializers, fields, relations +from rest_framework.tests.models import (HasPositiveIntegerAsChoice, Album, ActionItem, Anchor, BasicModel, + BlankFieldModel, BlogPost, BlogPostComment, Book, CallableDefaultValueModel, DefaultValueModel, + ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo, RESTFrameworkModel) +from rest_framework.tests.models import BasicModelSerializer +import datetime +import pickle + + +class SubComment(object): + def __init__(self, sub_comment): + self.sub_comment = sub_comment + + +class Comment(object): + def __init__(self, email, content, created): + self.email = email + self.content = content + self.created = created or datetime.datetime.now() + + def __eq__(self, other): + return all([getattr(self, attr) == getattr(other, attr) + for attr in ('email', 'content', 'created')]) + + def get_sub_comment(self): + sub_comment = SubComment('And Merry Christmas!') + return sub_comment + + +class CommentSerializer(serializers.Serializer): + email = serializers.EmailField() + content = serializers.CharField(max_length=1000) + created = serializers.DateTimeField() + sub_comment = serializers.Field(source='get_sub_comment.sub_comment') + + def restore_object(self, data, instance=None): + if instance is None: + return Comment(**data) + for key, val in data.items(): + setattr(instance, key, val) + return instance + + +class NamesSerializer(serializers.Serializer): + first = serializers.CharField() + last = serializers.CharField(required=False, default='') + initials = serializers.CharField(required=False, default='') + + +class PersonIdentifierSerializer(serializers.Serializer): + ssn = serializers.CharField() + names = NamesSerializer(source='names', required=False) + + +class BookSerializer(serializers.ModelSerializer): + isbn = serializers.RegexField(regex=r'^[0-9]{13}$', error_messages={'invalid': 'isbn has to be exact 13 numbers'}) + + class Meta: + model = Book + + +class ActionItemSerializer(serializers.ModelSerializer): + + class Meta: + model = ActionItem + + +class ActionItemSerializerCustomRestore(serializers.ModelSerializer): + + class Meta: + model = ActionItem + + def restore_object(self, data, instance=None): + if instance is None: + return ActionItem(**data) + for key, val in data.items(): + setattr(instance, key, val) + return instance + + +class PersonSerializer(serializers.ModelSerializer): + info = serializers.Field(source='info') + + class Meta: + model = Person + fields = ('name', 'age', 'info') + read_only_fields = ('age',) + + +class NestedSerializer(serializers.Serializer): + info = serializers.Field() + + +class ModelSerializerWithNestedSerializer(serializers.ModelSerializer): + nested = NestedSerializer(source='*') + + class Meta: + model = Person + + +class PersonSerializerInvalidReadOnly(serializers.ModelSerializer): + """ + Testing for #652. + """ + info = serializers.Field(source='info') + + class Meta: + model = Person + fields = ('name', 'age', 'info') + read_only_fields = ('age', 'info') + + +class AlbumsSerializer(serializers.ModelSerializer): + + class Meta: + model = Album + fields = ['title'] # lists are also valid options + + +class PositiveIntegerAsChoiceSerializer(serializers.ModelSerializer): + class Meta: + model = HasPositiveIntegerAsChoice + fields = ['some_integer'] + + +class BasicTests(TestCase): + def setUp(self): + self.comment = Comment( + 'tom@example.com', + 'Happy new year!', + datetime.datetime(2012, 1, 1) + ) + self.data = { + 'email': 'tom@example.com', + 'content': 'Happy new year!', + 'created': datetime.datetime(2012, 1, 1), + 'sub_comment': 'This wont change' + } + self.expected = { + 'email': 'tom@example.com', + 'content': 'Happy new year!', + 'created': datetime.datetime(2012, 1, 1), + 'sub_comment': 'And Merry Christmas!' + } + self.person_data = {'name': 'dwight', 'age': 35} + self.person = Person(**self.person_data) + self.person.save() + + def test_empty(self): + serializer = CommentSerializer() + expected = { + 'email': '', + 'content': '', + 'created': None, + 'sub_comment': '' + } + self.assertEqual(serializer.data, expected) + + def test_retrieve(self): + serializer = CommentSerializer(self.comment) + self.assertEqual(serializer.data, self.expected) + + def test_create(self): + serializer = CommentSerializer(data=self.data) + expected = self.comment + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.object, expected) + self.assertFalse(serializer.object is expected) + self.assertEqual(serializer.data['sub_comment'], 'And Merry Christmas!') + + def test_create_nested(self): + """Test a serializer with nested data.""" + names = {'first': 'John', 'last': 'Doe', 'initials': 'jd'} + data = {'ssn': '1234567890', 'names': names} + serializer = PersonIdentifierSerializer(data=data) + + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.object, data) + self.assertFalse(serializer.object is data) + self.assertEqual(serializer.data['names'], names) + + def test_create_partial_nested(self): + """Test a serializer with nested data which has missing fields.""" + names = {'first': 'John'} + data = {'ssn': '1234567890', 'names': names} + serializer = PersonIdentifierSerializer(data=data) + + expected_names = {'first': 'John', 'last': '', 'initials': ''} + data['names'] = expected_names + + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.object, data) + self.assertFalse(serializer.object is expected_names) + self.assertEqual(serializer.data['names'], expected_names) + + def test_null_nested(self): + """Test a serializer with a nonexistent nested field""" + data = {'ssn': '1234567890'} + serializer = PersonIdentifierSerializer(data=data) + + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.object, data) + self.assertFalse(serializer.object is data) + expected = {'ssn': '1234567890', 'names': None} + self.assertEqual(serializer.data, expected) + + def test_update(self): + serializer = CommentSerializer(self.comment, data=self.data) + expected = self.comment + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.object, expected) + self.assertTrue(serializer.object is expected) + self.assertEqual(serializer.data['sub_comment'], 'And Merry Christmas!') + + def test_partial_update(self): + msg = 'Merry New Year!' + partial_data = {'content': msg} + serializer = CommentSerializer(self.comment, data=partial_data) + self.assertEqual(serializer.is_valid(), False) + serializer = CommentSerializer(self.comment, data=partial_data, partial=True) + expected = self.comment + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.object, expected) + self.assertTrue(serializer.object is expected) + self.assertEqual(serializer.data['content'], msg) + + def test_model_fields_as_expected(self): + """ + Make sure that the fields returned are the same as defined + in the Meta data + """ + serializer = PersonSerializer(self.person) + self.assertEqual(set(serializer.data.keys()), + set(['name', 'age', 'info'])) + + def test_field_with_dictionary(self): + """ + Make sure that dictionaries from fields are left intact + """ + serializer = PersonSerializer(self.person) + expected = self.person_data + self.assertEqual(serializer.data['info'], expected) + + def test_read_only_fields(self): + """ + Attempting to update fields set as read_only should have no effect. + """ + serializer = PersonSerializer(self.person, data={'name': 'dwight', 'age': 99}) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(serializer.errors, {}) + # Assert age is unchanged (35) + self.assertEqual(instance.age, self.person_data['age']) + + def test_invalid_read_only_fields(self): + """ + Regression test for #652. + """ + self.assertRaises(AssertionError, PersonSerializerInvalidReadOnly, []) + + +class DictStyleSerializer(serializers.Serializer): + """ + Note that we don't have any `restore_object` method, so the default + case of simply returning a dict will apply. + """ + email = serializers.EmailField() + + +class DictStyleSerializerTests(TestCase): + def test_dict_style_deserialize(self): + """ + Ensure serializers can deserialize into a dict. + """ + data = {'email': 'foo@example.com'} + serializer = DictStyleSerializer(data=data) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.data, data) + + def test_dict_style_serialize(self): + """ + Ensure serializers can serialize dict objects. + """ + data = {'email': 'foo@example.com'} + serializer = DictStyleSerializer(data) + self.assertEqual(serializer.data, data) + + +class ValidationTests(TestCase): + def setUp(self): + self.comment = Comment( + 'tom@example.com', + 'Happy new year!', + datetime.datetime(2012, 1, 1) + ) + self.data = { + 'email': 'tom@example.com', + 'content': 'x' * 1001, + 'created': datetime.datetime(2012, 1, 1) + } + self.actionitem = ActionItem(title='Some to do item',) + + def test_create(self): + serializer = CommentSerializer(data=self.data) + self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.errors, {'content': ['Ensure this value has at most 1000 characters (it has 1001).']}) + + def test_update(self): + serializer = CommentSerializer(self.comment, data=self.data) + self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.errors, {'content': ['Ensure this value has at most 1000 characters (it has 1001).']}) + + def test_update_missing_field(self): + data = { + 'content': 'xxx', + 'created': datetime.datetime(2012, 1, 1) + } + serializer = CommentSerializer(self.comment, data=data) + self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.errors, {'email': ['This field is required.']}) + + def test_missing_bool_with_default(self): + """Make sure that a boolean value with a 'False' value is not + mistaken for not having a default.""" + data = { + 'title': 'Some action item', + #No 'done' value. + } + serializer = ActionItemSerializer(self.actionitem, data=data) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.errors, {}) + + def test_cross_field_validation(self): + + class CommentSerializerWithCrossFieldValidator(CommentSerializer): + + def validate(self, attrs): + if attrs["email"] not in attrs["content"]: + raise serializers.ValidationError("Email address not in content") + return attrs + + data = { + 'email': 'tom@example.com', + 'content': 'A comment from tom@example.com', + 'created': datetime.datetime(2012, 1, 1) + } + + serializer = CommentSerializerWithCrossFieldValidator(data=data) + self.assertTrue(serializer.is_valid()) + + data['content'] = 'A comment from foo@bar.com' + + serializer = CommentSerializerWithCrossFieldValidator(data=data) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'non_field_errors': ['Email address not in content']}) + + def test_null_is_true_fields(self): + """ + Omitting a value for null-field should validate. + """ + serializer = PersonSerializer(data={'name': 'marko'}) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.errors, {}) + + def test_modelserializer_max_length_exceeded(self): + data = { + 'title': 'x' * 201, + } + serializer = ActionItemSerializer(data=data) + self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.errors, {'title': ['Ensure this value has at most 200 characters (it has 201).']}) + + def test_modelserializer_max_length_exceeded_with_custom_restore(self): + """ + When overriding ModelSerializer.restore_object, validation tests should still apply. + Regression test for #623. + + https://github.com/tomchristie/django-rest-framework/pull/623 + """ + data = { + 'title': 'x' * 201, + } + serializer = ActionItemSerializerCustomRestore(data=data) + self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.errors, {'title': ['Ensure this value has at most 200 characters (it has 201).']}) + + def test_default_modelfield_max_length_exceeded(self): + data = { + 'title': 'Testing "info" field...', + 'info': 'x' * 13, + } + serializer = ActionItemSerializer(data=data) + self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.errors, {'info': ['Ensure this value has at most 12 characters (it has 13).']}) + + def test_datetime_validation_failure(self): + """ + Test DateTimeField validation errors on non-str values. + Regression test for #669. + + https://github.com/tomchristie/django-rest-framework/issues/669 + """ + data = self.data + data['created'] = 0 + + serializer = CommentSerializer(data=data) + self.assertEqual(serializer.is_valid(), False) + + self.assertIn('created', serializer.errors) + + def test_missing_model_field_exception_msg(self): + """ + Assert that a meaningful exception message is outputted when the model + field is missing (e.g. when mistyping ``model``). + """ + class BrokenModelSerializer(serializers.ModelSerializer): + class Meta: + fields = ['some_field'] + + try: + BrokenModelSerializer() + except AssertionError as e: + self.assertEqual(e.args[0], "Serializer class 'BrokenModelSerializer' is missing 'model' Meta option") + except: + self.fail('Wrong exception type thrown.') + + def test_writable_star_source_on_nested_serializer(self): + """ + Assert that a nested serializer instantiated with source='*' correctly + expands the data into the outer serializer. + """ + serializer = ModelSerializerWithNestedSerializer(data={ + 'name': 'marko', + 'nested': {'info': 'hi'}}, + ) + self.assertEqual(serializer.is_valid(), True) + + +class CustomValidationTests(TestCase): + class CommentSerializerWithFieldValidator(CommentSerializer): + + def validate_email(self, attrs, source): + attrs[source] + return attrs + + def validate_content(self, attrs, source): + value = attrs[source] + if "test" not in value: + raise serializers.ValidationError("Test not in value") + return attrs + + def test_field_validation(self): + data = { + 'email': 'tom@example.com', + 'content': 'A test comment', + 'created': datetime.datetime(2012, 1, 1) + } + + serializer = self.CommentSerializerWithFieldValidator(data=data) + self.assertTrue(serializer.is_valid()) + + data['content'] = 'This should not validate' + + serializer = self.CommentSerializerWithFieldValidator(data=data) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'content': ['Test not in value']}) + + def test_missing_data(self): + """ + Make sure that validate_content isn't called if the field is missing + """ + incomplete_data = { + 'email': 'tom@example.com', + 'created': datetime.datetime(2012, 1, 1) + } + serializer = self.CommentSerializerWithFieldValidator(data=incomplete_data) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'content': ['This field is required.']}) + + def test_wrong_data(self): + """ + Make sure that validate_content isn't called if the field input is wrong + """ + wrong_data = { + 'email': 'not an email', + 'content': 'A test comment', + 'created': datetime.datetime(2012, 1, 1) + } + serializer = self.CommentSerializerWithFieldValidator(data=wrong_data) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'email': ['Enter a valid email address.']}) + + +class PositiveIntegerAsChoiceTests(TestCase): + def test_positive_integer_in_json_is_correctly_parsed(self): + data = {'some_integer': 1} + serializer = PositiveIntegerAsChoiceSerializer(data=data) + self.assertEqual(serializer.is_valid(), True) + + +class ModelValidationTests(TestCase): + def test_validate_unique(self): + """ + Just check if serializers.ModelSerializer handles unique checks via .full_clean() + """ + serializer = AlbumsSerializer(data={'title': 'a'}) + serializer.is_valid() + serializer.save() + second_serializer = AlbumsSerializer(data={'title': 'a'}) + self.assertFalse(second_serializer.is_valid()) + self.assertEqual(second_serializer.errors, {'title': ['Album with this Title already exists.']}) + + def test_foreign_key_with_partial(self): + """ + Test ModelSerializer validation with partial=True + + Specifically test foreign key validation. + """ + + album = Album(title='test') + album.save() + + class PhotoSerializer(serializers.ModelSerializer): + class Meta: + model = Photo + + photo_serializer = PhotoSerializer(data={'description': 'test', 'album': album.pk}) + self.assertTrue(photo_serializer.is_valid()) + photo = photo_serializer.save() + + # Updating only the album (foreign key) + photo_serializer = PhotoSerializer(instance=photo, data={'album': album.pk}, partial=True) + self.assertTrue(photo_serializer.is_valid()) + self.assertTrue(photo_serializer.save()) + + # Updating only the description + photo_serializer = PhotoSerializer(instance=photo, + data={'description': 'new'}, + partial=True) + + self.assertTrue(photo_serializer.is_valid()) + self.assertTrue(photo_serializer.save()) + + +class RegexValidationTest(TestCase): + def test_create_failed(self): + serializer = BookSerializer(data={'isbn': '1234567890'}) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'isbn': ['isbn has to be exact 13 numbers']}) + + serializer = BookSerializer(data={'isbn': '12345678901234'}) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'isbn': ['isbn has to be exact 13 numbers']}) + + serializer = BookSerializer(data={'isbn': 'abcdefghijklm'}) + self.assertFalse(serializer.is_valid()) + self.assertEqual(serializer.errors, {'isbn': ['isbn has to be exact 13 numbers']}) + + def test_create_success(self): + serializer = BookSerializer(data={'isbn': '1234567890123'}) + self.assertTrue(serializer.is_valid()) + + +class MetadataTests(TestCase): + def test_empty(self): + serializer = CommentSerializer() + expected = { + 'email': serializers.CharField, + 'content': serializers.CharField, + 'created': serializers.DateTimeField + } + for field_name, field in expected.items(): + self.assertTrue(isinstance(serializer.data.fields[field_name], field)) + + +class ManyToManyTests(TestCase): + def setUp(self): + class ManyToManySerializer(serializers.ModelSerializer): + class Meta: + model = ManyToManyModel + + self.serializer_class = ManyToManySerializer + + # An anchor instance to use for the relationship + self.anchor = Anchor() + self.anchor.save() + + # A model instance with a many to many relationship to the anchor + self.instance = ManyToManyModel() + self.instance.save() + self.instance.rel.add(self.anchor) + + # A serialized representation of the model instance + self.data = {'id': 1, 'rel': [self.anchor.id]} + + def test_retrieve(self): + """ + Serialize an instance of a model with a ManyToMany relationship. + """ + serializer = self.serializer_class(instance=self.instance) + expected = self.data + self.assertEqual(serializer.data, expected) + + def test_create(self): + """ + Create an instance of a model with a ManyToMany relationship. + """ + data = {'rel': [self.anchor.id]} + serializer = self.serializer_class(data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(ManyToManyModel.objects.all()), 2) + self.assertEqual(instance.pk, 2) + self.assertEqual(list(instance.rel.all()), [self.anchor]) + + def test_update(self): + """ + Update an instance of a model with a ManyToMany relationship. + """ + new_anchor = Anchor() + new_anchor.save() + data = {'rel': [self.anchor.id, new_anchor.id]} + serializer = self.serializer_class(self.instance, data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(ManyToManyModel.objects.all()), 1) + self.assertEqual(instance.pk, 1) + self.assertEqual(list(instance.rel.all()), [self.anchor, new_anchor]) + + def test_create_empty_relationship(self): + """ + Create an instance of a model with a ManyToMany relationship, + containing no items. + """ + data = {'rel': []} + serializer = self.serializer_class(data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(ManyToManyModel.objects.all()), 2) + self.assertEqual(instance.pk, 2) + self.assertEqual(list(instance.rel.all()), []) + + def test_update_empty_relationship(self): + """ + Update an instance of a model with a ManyToMany relationship, + containing no items. + """ + new_anchor = Anchor() + new_anchor.save() + data = {'rel': []} + serializer = self.serializer_class(self.instance, data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(ManyToManyModel.objects.all()), 1) + self.assertEqual(instance.pk, 1) + self.assertEqual(list(instance.rel.all()), []) + + def test_create_empty_relationship_flat_data(self): + """ + Create an instance of a model with a ManyToMany relationship, + containing no items, using a representation that does not support + lists (eg form data). + """ + data = MultiValueDict() + data.setlist('rel', ['']) + serializer = self.serializer_class(data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(ManyToManyModel.objects.all()), 2) + self.assertEqual(instance.pk, 2) + self.assertEqual(list(instance.rel.all()), []) + + +class ReadOnlyManyToManyTests(TestCase): + def setUp(self): + class ReadOnlyManyToManySerializer(serializers.ModelSerializer): + rel = serializers.RelatedField(many=True, read_only=True) + + class Meta: + model = ReadOnlyManyToManyModel + + self.serializer_class = ReadOnlyManyToManySerializer + + # An anchor instance to use for the relationship + self.anchor = Anchor() + self.anchor.save() + + # A model instance with a many to many relationship to the anchor + self.instance = ReadOnlyManyToManyModel() + self.instance.save() + self.instance.rel.add(self.anchor) + + # A serialized representation of the model instance + self.data = {'rel': [self.anchor.id], 'id': 1, 'text': 'anchor'} + + def test_update(self): + """ + Attempt to update an instance of a model with a ManyToMany + relationship. Not updated due to read_only=True + """ + new_anchor = Anchor() + new_anchor.save() + data = {'rel': [self.anchor.id, new_anchor.id]} + serializer = self.serializer_class(self.instance, data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(ReadOnlyManyToManyModel.objects.all()), 1) + self.assertEqual(instance.pk, 1) + # rel is still as original (1 entry) + self.assertEqual(list(instance.rel.all()), [self.anchor]) + + def test_update_without_relationship(self): + """ + Attempt to update an instance of a model where many to ManyToMany + relationship is not supplied. Not updated due to read_only=True + """ + new_anchor = Anchor() + new_anchor.save() + data = {} + serializer = self.serializer_class(self.instance, data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(ReadOnlyManyToManyModel.objects.all()), 1) + self.assertEqual(instance.pk, 1) + # rel is still as original (1 entry) + self.assertEqual(list(instance.rel.all()), [self.anchor]) + + +class DefaultValueTests(TestCase): + def setUp(self): + class DefaultValueSerializer(serializers.ModelSerializer): + class Meta: + model = DefaultValueModel + + self.serializer_class = DefaultValueSerializer + self.objects = DefaultValueModel.objects + + def test_create_using_default(self): + data = {} + serializer = self.serializer_class(data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(self.objects.all()), 1) + self.assertEqual(instance.pk, 1) + self.assertEqual(instance.text, 'foobar') + + def test_create_overriding_default(self): + data = {'text': 'overridden'} + serializer = self.serializer_class(data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(self.objects.all()), 1) + self.assertEqual(instance.pk, 1) + self.assertEqual(instance.text, 'overridden') + + def test_partial_update_default(self): + """ Regression test for issue #532 """ + data = {'text': 'overridden'} + serializer = self.serializer_class(data=data, partial=True) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + + data = {'extra': 'extra_value'} + serializer = self.serializer_class(instance=instance, data=data, partial=True) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + + self.assertEqual(instance.extra, 'extra_value') + self.assertEqual(instance.text, 'overridden') + + +class CallableDefaultValueTests(TestCase): + def setUp(self): + class CallableDefaultValueSerializer(serializers.ModelSerializer): + class Meta: + model = CallableDefaultValueModel + + self.serializer_class = CallableDefaultValueSerializer + self.objects = CallableDefaultValueModel.objects + + def test_create_using_default(self): + data = {} + serializer = self.serializer_class(data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(self.objects.all()), 1) + self.assertEqual(instance.pk, 1) + self.assertEqual(instance.text, 'foobar') + + def test_create_overriding_default(self): + data = {'text': 'overridden'} + serializer = self.serializer_class(data=data) + self.assertEqual(serializer.is_valid(), True) + instance = serializer.save() + self.assertEqual(len(self.objects.all()), 1) + self.assertEqual(instance.pk, 1) + self.assertEqual(instance.text, 'overridden') + + +class ManyRelatedTests(TestCase): + def test_reverse_relations(self): + post = BlogPost.objects.create(title="Test blog post") + post.blogpostcomment_set.create(text="I hate this blog post") + post.blogpostcomment_set.create(text="I love this blog post") + + class BlogPostCommentSerializer(serializers.Serializer): + text = serializers.CharField() + + class BlogPostSerializer(serializers.Serializer): + title = serializers.CharField() + comments = BlogPostCommentSerializer(source='blogpostcomment_set') + + serializer = BlogPostSerializer(instance=post) + expected = { + 'title': 'Test blog post', + 'comments': [ + {'text': 'I hate this blog post'}, + {'text': 'I love this blog post'} + ] + } + + self.assertEqual(serializer.data, expected) + + def test_include_reverse_relations(self): + post = BlogPost.objects.create(title="Test blog post") + post.blogpostcomment_set.create(text="I hate this blog post") + post.blogpostcomment_set.create(text="I love this blog post") + + class BlogPostSerializer(serializers.ModelSerializer): + class Meta: + model = BlogPost + fields = ('id', 'title', 'blogpostcomment_set') + + serializer = BlogPostSerializer(instance=post) + expected = { + 'id': 1, 'title': 'Test blog post', 'blogpostcomment_set': [1, 2] + } + self.assertEqual(serializer.data, expected) + + def test_depth_include_reverse_relations(self): + post = BlogPost.objects.create(title="Test blog post") + post.blogpostcomment_set.create(text="I hate this blog post") + post.blogpostcomment_set.create(text="I love this blog post") + + class BlogPostSerializer(serializers.ModelSerializer): + class Meta: + model = BlogPost + fields = ('id', 'title', 'blogpostcomment_set') + depth = 1 + + serializer = BlogPostSerializer(instance=post) + expected = { + 'id': 1, 'title': 'Test blog post', + 'blogpostcomment_set': [ + {'id': 1, 'text': 'I hate this blog post', 'blog_post': 1}, + {'id': 2, 'text': 'I love this blog post', 'blog_post': 1} + ] + } + self.assertEqual(serializer.data, expected) + + def test_callable_source(self): + post = BlogPost.objects.create(title="Test blog post") + post.blogpostcomment_set.create(text="I love this blog post") + + class BlogPostCommentSerializer(serializers.Serializer): + text = serializers.CharField() + + class BlogPostSerializer(serializers.Serializer): + title = serializers.CharField() + first_comment = BlogPostCommentSerializer(source='get_first_comment') + + serializer = BlogPostSerializer(post) + + expected = { + 'title': 'Test blog post', + 'first_comment': {'text': 'I love this blog post'} + } + self.assertEqual(serializer.data, expected) + + +class RelatedTraversalTest(TestCase): + def test_nested_traversal(self): + """ + Source argument should support dotted.source notation. + """ + user = Person.objects.create(name="django") + post = BlogPost.objects.create(title="Test blog post", writer=user) + post.blogpostcomment_set.create(text="I love this blog post") + + class PersonSerializer(serializers.ModelSerializer): + class Meta: + model = Person + fields = ("name", "age") + + class BlogPostCommentSerializer(serializers.ModelSerializer): + class Meta: + model = BlogPostComment + fields = ("text", "post_owner") + + text = serializers.CharField() + post_owner = PersonSerializer(source='blog_post.writer') + + class BlogPostSerializer(serializers.Serializer): + title = serializers.CharField() + comments = BlogPostCommentSerializer(source='blogpostcomment_set') + + serializer = BlogPostSerializer(instance=post) + + expected = { + 'title': 'Test blog post', + 'comments': [{ + 'text': 'I love this blog post', + 'post_owner': { + "name": "django", + "age": None + } + }] + } + + self.assertEqual(serializer.data, expected) + + def test_nested_traversal_with_none(self): + """ + If a component of the dotted.source is None, return None for the field. + """ + from rest_framework.tests.models import NullableForeignKeySource + instance = NullableForeignKeySource.objects.create(name='Source with null FK') + + class NullableSourceSerializer(serializers.Serializer): + target_name = serializers.Field(source='target.name') + + serializer = NullableSourceSerializer(instance=instance) + + expected = { + 'target_name': None, + } + + self.assertEqual(serializer.data, expected) + + +class SerializerMethodFieldTests(TestCase): + def setUp(self): + + class BoopSerializer(serializers.Serializer): + beep = serializers.SerializerMethodField('get_beep') + boop = serializers.Field() + boop_count = serializers.SerializerMethodField('get_boop_count') + + def get_beep(self, obj): + return 'hello!' + + def get_boop_count(self, obj): + return len(obj.boop) + + self.serializer_class = BoopSerializer + + def test_serializer_method_field(self): + + class MyModel(object): + boop = ['a', 'b', 'c'] + + source_data = MyModel() + + serializer = self.serializer_class(source_data) + + expected = { + 'beep': 'hello!', + 'boop': ['a', 'b', 'c'], + 'boop_count': 3, + } + + self.assertEqual(serializer.data, expected) + + +# Test for issue #324 +class BlankFieldTests(TestCase): + def setUp(self): + + class BlankFieldModelSerializer(serializers.ModelSerializer): + class Meta: + model = BlankFieldModel + + class BlankFieldSerializer(serializers.Serializer): + title = serializers.CharField(required=False) + + class NotBlankFieldModelSerializer(serializers.ModelSerializer): + class Meta: + model = BasicModel + + class NotBlankFieldSerializer(serializers.Serializer): + title = serializers.CharField() + + self.model_serializer_class = BlankFieldModelSerializer + self.serializer_class = BlankFieldSerializer + self.not_blank_model_serializer_class = NotBlankFieldModelSerializer + self.not_blank_serializer_class = NotBlankFieldSerializer + self.data = {'title': ''} + + def test_create_blank_field(self): + serializer = self.serializer_class(data=self.data) + self.assertEqual(serializer.is_valid(), True) + + def test_create_model_blank_field(self): + serializer = self.model_serializer_class(data=self.data) + self.assertEqual(serializer.is_valid(), True) + + def test_create_model_null_field(self): + serializer = self.model_serializer_class(data={'title': None}) + self.assertEqual(serializer.is_valid(), True) + + def test_create_not_blank_field(self): + """ + Test to ensure blank data in a field not marked as blank=True + is considered invalid in a non-model serializer + """ + serializer = self.not_blank_serializer_class(data=self.data) + self.assertEqual(serializer.is_valid(), False) + + def test_create_model_not_blank_field(self): + """ + Test to ensure blank data in a field not marked as blank=True + is considered invalid in a model serializer + """ + serializer = self.not_blank_model_serializer_class(data=self.data) + self.assertEqual(serializer.is_valid(), False) + + def test_create_model_empty_field(self): + serializer = self.model_serializer_class(data={}) + self.assertEqual(serializer.is_valid(), True) + + +#test for issue #460 +class SerializerPickleTests(TestCase): + """ + Test pickleability of the output of Serializers + """ + def test_pickle_simple_model_serializer_data(self): + """ + Test simple serializer + """ + pickle.dumps(PersonSerializer(Person(name="Methusela", age=969)).data) + + def test_pickle_inner_serializer(self): + """ + Test pickling a serializer whose resulting .data (a SortedDictWithMetadata) will + have unpickleable meta data--in order to make sure metadata doesn't get pulled into the pickle. + See DictWithMetadata.__getstate__ + """ + class InnerPersonSerializer(serializers.ModelSerializer): + class Meta: + model = Person + fields = ('name', 'age') + pickle.dumps(InnerPersonSerializer(Person(name="Noah", age=950)).data, 0) + + def test_getstate_method_should_not_return_none(self): + """ + Regression test for #645. + """ + data = serializers.DictWithMetadata({1: 1}) + self.assertEqual(data.__getstate__(), serializers.SortedDict({1: 1})) + + def test_serializer_data_is_pickleable(self): + """ + Another regression test for #645. + """ + data = serializers.SortedDictWithMetadata({1: 1}) + repr(pickle.loads(pickle.dumps(data, 0))) + + +# test for issue #725 +class SeveralChoicesModel(models.Model): + color = models.CharField( + max_length=10, + choices=[('red', 'Red'), ('green', 'Green'), ('blue', 'Blue')], + blank=False + ) + drink = models.CharField( + max_length=10, + choices=[('beer', 'Beer'), ('wine', 'Wine'), ('cider', 'Cider')], + blank=False, + default='beer' + ) + os = models.CharField( + max_length=10, + choices=[('linux', 'Linux'), ('osx', 'OSX'), ('windows', 'Windows')], + blank=True + ) + music_genre = models.CharField( + max_length=10, + choices=[('rock', 'Rock'), ('metal', 'Metal'), ('grunge', 'Grunge')], + blank=True, + default='metal' + ) + + +class SerializerChoiceFields(TestCase): + + def setUp(self): + super(SerializerChoiceFields, self).setUp() + + class SeveralChoicesSerializer(serializers.ModelSerializer): + class Meta: + model = SeveralChoicesModel + fields = ('color', 'drink', 'os', 'music_genre') + + self.several_choices_serializer = SeveralChoicesSerializer + + def test_choices_blank_false_not_default(self): + serializer = self.several_choices_serializer() + self.assertEqual( + serializer.fields['color'].choices, + [('red', 'Red'), ('green', 'Green'), ('blue', 'Blue')] + ) + + def test_choices_blank_false_with_default(self): + serializer = self.several_choices_serializer() + self.assertEqual( + serializer.fields['drink'].choices, + [('beer', 'Beer'), ('wine', 'Wine'), ('cider', 'Cider')] + ) + + def test_choices_blank_true_not_default(self): + serializer = self.several_choices_serializer() + self.assertEqual( + serializer.fields['os'].choices, + BLANK_CHOICE_DASH + [('linux', 'Linux'), ('osx', 'OSX'), ('windows', 'Windows')] + ) + + def test_choices_blank_true_with_default(self): + serializer = self.several_choices_serializer() + self.assertEqual( + serializer.fields['music_genre'].choices, + BLANK_CHOICE_DASH + [('rock', 'Rock'), ('metal', 'Metal'), ('grunge', 'Grunge')] + ) + + +# Regression tests for #675 +class Ticket(models.Model): + assigned = models.ForeignKey( + Person, related_name='assigned_tickets') + reviewer = models.ForeignKey( + Person, blank=True, null=True, related_name='reviewed_tickets') + + +class SerializerRelatedChoicesTest(TestCase): + + def setUp(self): + super(SerializerRelatedChoicesTest, self).setUp() + + class RelatedChoicesSerializer(serializers.ModelSerializer): + class Meta: + model = Ticket + fields = ('assigned', 'reviewer') + + self.related_fields_serializer = RelatedChoicesSerializer + + def test_empty_queryset_required(self): + serializer = self.related_fields_serializer() + self.assertEqual(serializer.fields['assigned'].queryset.count(), 0) + self.assertEqual( + [x for x in serializer.fields['assigned'].widget.choices], + [] + ) + + def test_empty_queryset_not_required(self): + serializer = self.related_fields_serializer() + self.assertEqual(serializer.fields['reviewer'].queryset.count(), 0) + self.assertEqual( + [x for x in serializer.fields['reviewer'].widget.choices], + [('', '---------')] + ) + + def test_with_some_persons_required(self): + Person.objects.create(name="Lionel Messi") + Person.objects.create(name="Xavi Hernandez") + serializer = self.related_fields_serializer() + self.assertEqual(serializer.fields['assigned'].queryset.count(), 2) + self.assertEqual( + [x for x in serializer.fields['assigned'].widget.choices], + [(1, 'Person object - 1'), (2, 'Person object - 2')] + ) + + def test_with_some_persons_not_required(self): + Person.objects.create(name="Lionel Messi") + Person.objects.create(name="Xavi Hernandez") + serializer = self.related_fields_serializer() + self.assertEqual(serializer.fields['reviewer'].queryset.count(), 2) + self.assertEqual( + [x for x in serializer.fields['reviewer'].widget.choices], + [('', '---------'), (1, 'Person object - 1'), (2, 'Person object - 2')] + ) + + +class DepthTest(TestCase): + def test_implicit_nesting(self): + + writer = Person.objects.create(name="django", age=1) + post = BlogPost.objects.create(title="Test blog post", writer=writer) + comment = BlogPostComment.objects.create(text="Test blog post comment", blog_post=post) + + class BlogPostCommentSerializer(serializers.ModelSerializer): + class Meta: + model = BlogPostComment + depth = 2 + + serializer = BlogPostCommentSerializer(instance=comment) + expected = {'id': 1, 'text': 'Test blog post comment', 'blog_post': {'id': 1, 'title': 'Test blog post', + 'writer': {'id': 1, 'name': 'django', 'age': 1}}} + + self.assertEqual(serializer.data, expected) + + def test_explicit_nesting(self): + writer = Person.objects.create(name="django", age=1) + post = BlogPost.objects.create(title="Test blog post", writer=writer) + comment = BlogPostComment.objects.create(text="Test blog post comment", blog_post=post) + + class PersonSerializer(serializers.ModelSerializer): + class Meta: + model = Person + + class BlogPostSerializer(serializers.ModelSerializer): + writer = PersonSerializer() + + class Meta: + model = BlogPost + + class BlogPostCommentSerializer(serializers.ModelSerializer): + blog_post = BlogPostSerializer() + + class Meta: + model = BlogPostComment + + serializer = BlogPostCommentSerializer(instance=comment) + expected = {'id': 1, 'text': 'Test blog post comment', 'blog_post': {'id': 1, 'title': 'Test blog post', + 'writer': {'id': 1, 'name': 'django', 'age': 1}}} + + self.assertEqual(serializer.data, expected) + + +class NestedSerializerContextTests(TestCase): + + def test_nested_serializer_context(self): + """ + Regression for #497 + + https://github.com/tomchristie/django-rest-framework/issues/497 + """ + class PhotoSerializer(serializers.ModelSerializer): + class Meta: + model = Photo + fields = ("description", "callable") + + callable = serializers.SerializerMethodField('_callable') + + def _callable(self, instance): + if not 'context_item' in self.context: + raise RuntimeError("context isn't getting passed into 2nd level nested serializer") + return "success" + + class AlbumSerializer(serializers.ModelSerializer): + class Meta: + model = Album + fields = ("photo_set", "callable") + + photo_set = PhotoSerializer(source="photo_set") + callable = serializers.SerializerMethodField("_callable") + + def _callable(self, instance): + if not 'context_item' in self.context: + raise RuntimeError("context isn't getting passed into 1st level nested serializer") + return "success" + + class AlbumCollection(object): + albums = None + + class AlbumCollectionSerializer(serializers.Serializer): + albums = AlbumSerializer(source="albums") + + album1 = Album.objects.create(title="album 1") + album2 = Album.objects.create(title="album 2") + Photo.objects.create(description="Bigfoot", album=album1) + Photo.objects.create(description="Unicorn", album=album1) + Photo.objects.create(description="Yeti", album=album2) + Photo.objects.create(description="Sasquatch", album=album2) + album_collection = AlbumCollection() + album_collection.albums = [album1, album2] + + # This will raise RuntimeError if context doesn't get passed correctly to the nested Serializers + AlbumCollectionSerializer(album_collection, context={'context_item': 'album context'}).data + + +class DeserializeListTestCase(TestCase): + + def setUp(self): + self.data = { + 'email': 'nobody@nowhere.com', + 'content': 'This is some test content', + 'created': datetime.datetime(2013, 3, 7), + } + + def test_no_errors(self): + data = [self.data.copy() for x in range(0, 3)] + serializer = CommentSerializer(data=data, many=True) + self.assertTrue(serializer.is_valid()) + self.assertTrue(isinstance(serializer.object, list)) + self.assertTrue( + all((isinstance(item, Comment) for item in serializer.object)) + ) + + def test_errors_return_as_list(self): + invalid_item = self.data.copy() + invalid_item['email'] = '' + data = [self.data.copy(), invalid_item, self.data.copy()] + + serializer = CommentSerializer(data=data, many=True) + self.assertFalse(serializer.is_valid()) + expected = [{}, {'email': ['This field is required.']}, {}] + self.assertEqual(serializer.errors, expected) + + +# Test for issue 747 + +class LazyStringModel(object): + def __init__(self, lazystring): + self.lazystring = lazystring + + +class LazyStringSerializer(serializers.Serializer): + lazystring = serializers.Field() + + def restore_object(self, attrs, instance=None): + if instance is not None: + instance.lazystring = attrs.get('lazystring', instance.lazystring) + return instance + return LazyStringModel(**attrs) + + +class LazyStringsTestCase(TestCase): + def setUp(self): + self.model = LazyStringModel(lazystring=_('lazystring')) + + def test_lazy_strings_are_translated(self): + serializer = LazyStringSerializer(self.model) + self.assertEqual(type(serializer.data['lazystring']), + type('lazystring')) + + +# Test for issue #467 + +class FieldLabelTest(TestCase): + def setUp(self): + self.serializer_class = BasicModelSerializer + + def test_label_from_model(self): + """ + Validates that label and help_text are correctly copied from the model class. + """ + serializer = self.serializer_class() + text_field = serializer.fields['text'] + + self.assertEqual('Text comes here', text_field.label) + self.assertEqual('Text description.', text_field.help_text) + + def test_field_ctor(self): + """ + This is check that ctor supports both label and help_text. + """ + self.assertEqual('Label', fields.Field(label='Label', help_text='Help').label) + self.assertEqual('Help', fields.CharField(label='Label', help_text='Help').help_text) + self.assertEqual('Label', relations.HyperlinkedRelatedField(view_name='fake', label='Label', help_text='Help', many=True).label) + + +# Test for issue #961 + +class ManyFieldHelpTextTest(TestCase): + def test_help_text_no_hold_down_control_msg(self): + """ + Validate that help_text doesn't contain the 'Hold down "Control" ...' + message that Django appends to choice fields. + """ + rel_field = fields.Field(help_text=ManyToManyModel._meta.get_field('rel').help_text) + self.assertEqual('Some help text.', rel_field.help_text) + + +class AttributeMappingOnAutogeneratedFieldsTests(TestCase): + + def setUp(self): + class AMOAFModel(RESTFrameworkModel): + char_field = models.CharField(max_length=1024, blank=True) + comma_separated_integer_field = models.CommaSeparatedIntegerField(max_length=1024, blank=True) + decimal_field = models.DecimalField(max_digits=64, decimal_places=32, blank=True) + email_field = models.EmailField(max_length=1024, blank=True) + file_field = models.FileField(max_length=1024, blank=True) + image_field = models.ImageField(max_length=1024, blank=True) + slug_field = models.SlugField(max_length=1024, blank=True) + url_field = models.URLField(max_length=1024, blank=True) + + class AMOAFSerializer(serializers.ModelSerializer): + class Meta: + model = AMOAFModel + + self.serializer_class = AMOAFSerializer + self.fields_attributes = { + 'char_field': [ + ('max_length', 1024), + ], + 'comma_separated_integer_field': [ + ('max_length', 1024), + ], + 'decimal_field': [ + ('max_digits', 64), + ('decimal_places', 32), + ], + 'email_field': [ + ('max_length', 1024), + ], + 'file_field': [ + ('max_length', 1024), + ], + 'image_field': [ + ('max_length', 1024), + ], + 'slug_field': [ + ('max_length', 1024), + ], + 'url_field': [ + ('max_length', 1024), + ], + } + + def field_test(self, field): + serializer = self.serializer_class(data={}) + self.assertEqual(serializer.is_valid(), True) + + for attribute in self.fields_attributes[field]: + self.assertEqual( + getattr(serializer.fields[field], attribute[0]), + attribute[1] + ) + + def test_char_field(self): + self.field_test('char_field') + + def test_comma_separated_integer_field(self): + self.field_test('comma_separated_integer_field') + + def test_decimal_field(self): + self.field_test('decimal_field') + + def test_email_field(self): + self.field_test('email_field') + + def test_file_field(self): + self.field_test('file_field') + + def test_image_field(self): + self.field_test('image_field') + + def test_slug_field(self): + self.field_test('slug_field') + + def test_url_field(self): + self.field_test('url_field') + + +class DefaultValuesOnAutogeneratedFieldsTests(TestCase): + + def setUp(self): + class DVOAFModel(RESTFrameworkModel): + positive_integer_field = models.PositiveIntegerField(blank=True) + positive_small_integer_field = models.PositiveSmallIntegerField(blank=True) + email_field = models.EmailField(blank=True) + file_field = models.FileField(blank=True) + image_field = models.ImageField(blank=True) + slug_field = models.SlugField(blank=True) + url_field = models.URLField(blank=True) + + class DVOAFSerializer(serializers.ModelSerializer): + class Meta: + model = DVOAFModel + + self.serializer_class = DVOAFSerializer + self.fields_attributes = { + 'positive_integer_field': [ + ('min_value', 0), + ], + 'positive_small_integer_field': [ + ('min_value', 0), + ], + 'email_field': [ + ('max_length', 75), + ], + 'file_field': [ + ('max_length', 100), + ], + 'image_field': [ + ('max_length', 100), + ], + 'slug_field': [ + ('max_length', 50), + ], + 'url_field': [ + ('max_length', 200), + ], + } + + def field_test(self, field): + serializer = self.serializer_class(data={}) + self.assertEqual(serializer.is_valid(), True) + + for attribute in self.fields_attributes[field]: + self.assertEqual( + getattr(serializer.fields[field], attribute[0]), + attribute[1] + ) + + def test_positive_integer_field(self): + self.field_test('positive_integer_field') + + def test_positive_small_integer_field(self): + self.field_test('positive_small_integer_field') + + def test_email_field(self): + self.field_test('email_field') + + def test_file_field(self): + self.field_test('file_field') + + def test_image_field(self): + self.field_test('image_field') + + def test_slug_field(self): + self.field_test('slug_field') + + def test_url_field(self): + self.field_test('url_field') + + +class MetadataSerializer(serializers.Serializer): + field1 = serializers.CharField(3, required=True) + field2 = serializers.CharField(10, required=False) + + +class MetadataSerializerTestCase(TestCase): + def setUp(self): + self.serializer = MetadataSerializer() + + def test_serializer_metadata(self): + metadata = self.serializer.metadata() + expected = { + 'field1': { + 'required': True, + 'max_length': 3, + 'type': 'string', + 'read_only': False + }, + 'field2': { + 'required': False, + 'max_length': 10, + 'type': 'string', + 'read_only': False + } + } + self.assertEqual(expected, metadata) + + +### Regression test for #840 + +class SimpleModel(models.Model): + text = models.CharField(max_length=100) + + +class SimpleModelSerializer(serializers.ModelSerializer): + text = serializers.CharField() + other = serializers.CharField() + + class Meta: + model = SimpleModel + + def validate_other(self, attrs, source): + del attrs['other'] + return attrs + + +class FieldValidationRemovingAttr(TestCase): + def test_removing_non_model_field_in_validation(self): + """ + Removing an attr during field valiation should ensure that it is not + passed through when restoring the object. + + This allows additional non-model fields to be supported. + + Regression test for #840. + """ + serializer = SimpleModelSerializer(data={'text': 'foo', 'other': 'bar'}) + self.assertTrue(serializer.is_valid()) + serializer.save() + self.assertEqual(serializer.object.text, 'foo') + + +### Regression test for #878 + +class SimpleTargetModel(models.Model): + text = models.CharField(max_length=100) + + +class SimplePKSourceModelSerializer(serializers.Serializer): + targets = serializers.PrimaryKeyRelatedField(queryset=SimpleTargetModel.objects.all(), many=True) + text = serializers.CharField() + + +class SimpleSlugSourceModelSerializer(serializers.Serializer): + targets = serializers.SlugRelatedField(queryset=SimpleTargetModel.objects.all(), many=True, slug_field='pk') + text = serializers.CharField() + + +class SerializerSupportsManyRelationships(TestCase): + def setUp(self): + SimpleTargetModel.objects.create(text='foo') + SimpleTargetModel.objects.create(text='bar') + + def test_serializer_supports_pk_many_relationships(self): + """ + Regression test for #878. + + Note that pk behavior has a different code path to usual cases, + for performance reasons. + """ + serializer = SimplePKSourceModelSerializer(data={'text': 'foo', 'targets': [1, 2]}) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.data, {'text': 'foo', 'targets': [1, 2]}) + + def test_serializer_supports_slug_many_relationships(self): + """ + Regression test for #878. + """ + serializer = SimpleSlugSourceModelSerializer(data={'text': 'foo', 'targets': [1, 2]}) + self.assertTrue(serializer.is_valid()) + self.assertEqual(serializer.data, {'text': 'foo', 'targets': [1, 2]}) diff --git a/vendor-local/lib/python/rest_framework/tests/test_serializer_bulk_update.py b/vendor-local/lib/python/rest_framework/tests/test_serializer_bulk_update.py new file mode 100644 index 00000000000..8b0ded1a84f --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_serializer_bulk_update.py @@ -0,0 +1,278 @@ +""" +Tests to cover bulk create and update using serializers. +""" +from __future__ import unicode_literals +from django.test import TestCase +from rest_framework import serializers + + +class BulkCreateSerializerTests(TestCase): + """ + Creating multiple instances using serializers. + """ + + def setUp(self): + class BookSerializer(serializers.Serializer): + id = serializers.IntegerField() + title = serializers.CharField(max_length=100) + author = serializers.CharField(max_length=100) + + self.BookSerializer = BookSerializer + + def test_bulk_create_success(self): + """ + Correct bulk update serialization should return the input data. + """ + + data = [ + { + 'id': 0, + 'title': 'The electric kool-aid acid test', + 'author': 'Tom Wolfe' + }, { + 'id': 1, + 'title': 'If this is a man', + 'author': 'Primo Levi' + }, { + 'id': 2, + 'title': 'The wind-up bird chronicle', + 'author': 'Haruki Murakami' + } + ] + + serializer = self.BookSerializer(data=data, many=True) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.object, data) + + def test_bulk_create_errors(self): + """ + Correct bulk update serialization should return the input data. + """ + + data = [ + { + 'id': 0, + 'title': 'The electric kool-aid acid test', + 'author': 'Tom Wolfe' + }, { + 'id': 1, + 'title': 'If this is a man', + 'author': 'Primo Levi' + }, { + 'id': 'foo', + 'title': 'The wind-up bird chronicle', + 'author': 'Haruki Murakami' + } + ] + expected_errors = [ + {}, + {}, + {'id': ['Enter a whole number.']} + ] + + serializer = self.BookSerializer(data=data, many=True) + self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.errors, expected_errors) + + def test_invalid_list_datatype(self): + """ + Data containing list of incorrect data type should return errors. + """ + data = ['foo', 'bar', 'baz'] + serializer = self.BookSerializer(data=data, many=True) + self.assertEqual(serializer.is_valid(), False) + + expected_errors = [ + {'non_field_errors': ['Invalid data']}, + {'non_field_errors': ['Invalid data']}, + {'non_field_errors': ['Invalid data']} + ] + + self.assertEqual(serializer.errors, expected_errors) + + def test_invalid_single_datatype(self): + """ + Data containing a single incorrect data type should return errors. + """ + data = 123 + serializer = self.BookSerializer(data=data, many=True) + self.assertEqual(serializer.is_valid(), False) + + expected_errors = {'non_field_errors': ['Expected a list of items.']} + + self.assertEqual(serializer.errors, expected_errors) + + def test_invalid_single_object(self): + """ + Data containing only a single object, instead of a list of objects + should return errors. + """ + data = { + 'id': 0, + 'title': 'The electric kool-aid acid test', + 'author': 'Tom Wolfe' + } + serializer = self.BookSerializer(data=data, many=True) + self.assertEqual(serializer.is_valid(), False) + + expected_errors = {'non_field_errors': ['Expected a list of items.']} + + self.assertEqual(serializer.errors, expected_errors) + + +class BulkUpdateSerializerTests(TestCase): + """ + Updating multiple instances using serializers. + """ + + def setUp(self): + class Book(object): + """ + A data type that can be persisted to a mock storage backend + with `.save()` and `.delete()`. + """ + object_map = {} + + def __init__(self, id, title, author): + self.id = id + self.title = title + self.author = author + + def save(self): + Book.object_map[self.id] = self + + def delete(self): + del Book.object_map[self.id] + + class BookSerializer(serializers.Serializer): + id = serializers.IntegerField() + title = serializers.CharField(max_length=100) + author = serializers.CharField(max_length=100) + + def restore_object(self, attrs, instance=None): + if instance: + instance.id = attrs['id'] + instance.title = attrs['title'] + instance.author = attrs['author'] + return instance + return Book(**attrs) + + self.Book = Book + self.BookSerializer = BookSerializer + + data = [ + { + 'id': 0, + 'title': 'The electric kool-aid acid test', + 'author': 'Tom Wolfe' + }, { + 'id': 1, + 'title': 'If this is a man', + 'author': 'Primo Levi' + }, { + 'id': 2, + 'title': 'The wind-up bird chronicle', + 'author': 'Haruki Murakami' + } + ] + + for item in data: + book = Book(item['id'], item['title'], item['author']) + book.save() + + def books(self): + """ + Return all the objects in the mock storage backend. + """ + return self.Book.object_map.values() + + def test_bulk_update_success(self): + """ + Correct bulk update serialization should return the input data. + """ + data = [ + { + 'id': 0, + 'title': 'The electric kool-aid acid test', + 'author': 'Tom Wolfe' + }, { + 'id': 2, + 'title': 'Kafka on the shore', + 'author': 'Haruki Murakami' + } + ] + serializer = self.BookSerializer(self.books(), data=data, many=True, allow_add_remove=True) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.data, data) + serializer.save() + new_data = self.BookSerializer(self.books(), many=True).data + + self.assertEqual(data, new_data) + + def test_bulk_update_and_create(self): + """ + Bulk update serialization may also include created items. + """ + data = [ + { + 'id': 0, + 'title': 'The electric kool-aid acid test', + 'author': 'Tom Wolfe' + }, { + 'id': 3, + 'title': 'Kafka on the shore', + 'author': 'Haruki Murakami' + } + ] + serializer = self.BookSerializer(self.books(), data=data, many=True, allow_add_remove=True) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.data, data) + serializer.save() + new_data = self.BookSerializer(self.books(), many=True).data + self.assertEqual(data, new_data) + + def test_bulk_update_invalid_create(self): + """ + Bulk update serialization without allow_add_remove may not create items. + """ + data = [ + { + 'id': 0, + 'title': 'The electric kool-aid acid test', + 'author': 'Tom Wolfe' + }, { + 'id': 3, + 'title': 'Kafka on the shore', + 'author': 'Haruki Murakami' + } + ] + expected_errors = [ + {}, + {'non_field_errors': ['Cannot create a new item, only existing items may be updated.']} + ] + serializer = self.BookSerializer(self.books(), data=data, many=True) + self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.errors, expected_errors) + + def test_bulk_update_error(self): + """ + Incorrect bulk update serialization should return error data. + """ + data = [ + { + 'id': 0, + 'title': 'The electric kool-aid acid test', + 'author': 'Tom Wolfe' + }, { + 'id': 'foo', + 'title': 'Kafka on the shore', + 'author': 'Haruki Murakami' + } + ] + expected_errors = [ + {}, + {'id': ['Enter a whole number.']} + ] + serializer = self.BookSerializer(self.books(), data=data, many=True, allow_add_remove=True) + self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.errors, expected_errors) diff --git a/vendor-local/lib/python/rest_framework/tests/test_serializer_nested.py b/vendor-local/lib/python/rest_framework/tests/test_serializer_nested.py new file mode 100644 index 00000000000..71d0e24b518 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_serializer_nested.py @@ -0,0 +1,246 @@ +""" +Tests to cover nested serializers. + +Doesn't cover model serializers. +""" +from __future__ import unicode_literals +from django.test import TestCase +from rest_framework import serializers + + +class WritableNestedSerializerBasicTests(TestCase): + """ + Tests for deserializing nested entities. + Basic tests that use serializers that simply restore to dicts. + """ + + def setUp(self): + class TrackSerializer(serializers.Serializer): + order = serializers.IntegerField() + title = serializers.CharField(max_length=100) + duration = serializers.IntegerField() + + class AlbumSerializer(serializers.Serializer): + album_name = serializers.CharField(max_length=100) + artist = serializers.CharField(max_length=100) + tracks = TrackSerializer(many=True) + + self.AlbumSerializer = AlbumSerializer + + def test_nested_validation_success(self): + """ + Correct nested serialization should return the input data. + """ + + data = { + 'album_name': 'Discovery', + 'artist': 'Daft Punk', + 'tracks': [ + {'order': 1, 'title': 'One More Time', 'duration': 235}, + {'order': 2, 'title': 'Aerodynamic', 'duration': 184}, + {'order': 3, 'title': 'Digital Love', 'duration': 239} + ] + } + + serializer = self.AlbumSerializer(data=data) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.object, data) + + def test_nested_validation_error(self): + """ + Incorrect nested serialization should return appropriate error data. + """ + + data = { + 'album_name': 'Discovery', + 'artist': 'Daft Punk', + 'tracks': [ + {'order': 1, 'title': 'One More Time', 'duration': 235}, + {'order': 2, 'title': 'Aerodynamic', 'duration': 184}, + {'order': 3, 'title': 'Digital Love', 'duration': 'foobar'} + ] + } + expected_errors = { + 'tracks': [ + {}, + {}, + {'duration': ['Enter a whole number.']} + ] + } + + serializer = self.AlbumSerializer(data=data) + self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.errors, expected_errors) + + def test_many_nested_validation_error(self): + """ + Incorrect nested serialization should return appropriate error data + when multiple entities are being deserialized. + """ + + data = [ + { + 'album_name': 'Russian Red', + 'artist': 'I Love Your Glasses', + 'tracks': [ + {'order': 1, 'title': 'Cigarettes', 'duration': 121}, + {'order': 2, 'title': 'No Past Land', 'duration': 198}, + {'order': 3, 'title': 'They Don\'t Believe', 'duration': 191} + ] + }, + { + 'album_name': 'Discovery', + 'artist': 'Daft Punk', + 'tracks': [ + {'order': 1, 'title': 'One More Time', 'duration': 235}, + {'order': 2, 'title': 'Aerodynamic', 'duration': 184}, + {'order': 3, 'title': 'Digital Love', 'duration': 'foobar'} + ] + } + ] + expected_errors = [ + {}, + { + 'tracks': [ + {}, + {}, + {'duration': ['Enter a whole number.']} + ] + } + ] + + serializer = self.AlbumSerializer(data=data, many=True) + self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.errors, expected_errors) + + +class WritableNestedSerializerObjectTests(TestCase): + """ + Tests for deserializing nested entities. + These tests use serializers that restore to concrete objects. + """ + + def setUp(self): + # Couple of concrete objects that we're going to deserialize into + class Track(object): + def __init__(self, order, title, duration): + self.order, self.title, self.duration = order, title, duration + + def __eq__(self, other): + return ( + self.order == other.order and + self.title == other.title and + self.duration == other.duration + ) + + class Album(object): + def __init__(self, album_name, artist, tracks): + self.album_name, self.artist, self.tracks = album_name, artist, tracks + + def __eq__(self, other): + return ( + self.album_name == other.album_name and + self.artist == other.artist and + self.tracks == other.tracks + ) + + # And their corresponding serializers + class TrackSerializer(serializers.Serializer): + order = serializers.IntegerField() + title = serializers.CharField(max_length=100) + duration = serializers.IntegerField() + + def restore_object(self, attrs, instance=None): + return Track(attrs['order'], attrs['title'], attrs['duration']) + + class AlbumSerializer(serializers.Serializer): + album_name = serializers.CharField(max_length=100) + artist = serializers.CharField(max_length=100) + tracks = TrackSerializer(many=True) + + def restore_object(self, attrs, instance=None): + return Album(attrs['album_name'], attrs['artist'], attrs['tracks']) + + self.Album, self.Track = Album, Track + self.AlbumSerializer = AlbumSerializer + + def test_nested_validation_success(self): + """ + Correct nested serialization should return a restored object + that corresponds to the input data. + """ + + data = { + 'album_name': 'Discovery', + 'artist': 'Daft Punk', + 'tracks': [ + {'order': 1, 'title': 'One More Time', 'duration': 235}, + {'order': 2, 'title': 'Aerodynamic', 'duration': 184}, + {'order': 3, 'title': 'Digital Love', 'duration': 239} + ] + } + expected_object = self.Album( + album_name='Discovery', + artist='Daft Punk', + tracks=[ + self.Track(order=1, title='One More Time', duration=235), + self.Track(order=2, title='Aerodynamic', duration=184), + self.Track(order=3, title='Digital Love', duration=239), + ] + ) + + serializer = self.AlbumSerializer(data=data) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.object, expected_object) + + def test_many_nested_validation_success(self): + """ + Correct nested serialization should return multiple restored objects + that corresponds to the input data when multiple objects are + being deserialized. + """ + + data = [ + { + 'album_name': 'Russian Red', + 'artist': 'I Love Your Glasses', + 'tracks': [ + {'order': 1, 'title': 'Cigarettes', 'duration': 121}, + {'order': 2, 'title': 'No Past Land', 'duration': 198}, + {'order': 3, 'title': 'They Don\'t Believe', 'duration': 191} + ] + }, + { + 'album_name': 'Discovery', + 'artist': 'Daft Punk', + 'tracks': [ + {'order': 1, 'title': 'One More Time', 'duration': 235}, + {'order': 2, 'title': 'Aerodynamic', 'duration': 184}, + {'order': 3, 'title': 'Digital Love', 'duration': 239} + ] + } + ] + expected_object = [ + self.Album( + album_name='Russian Red', + artist='I Love Your Glasses', + tracks=[ + self.Track(order=1, title='Cigarettes', duration=121), + self.Track(order=2, title='No Past Land', duration=198), + self.Track(order=3, title='They Don\'t Believe', duration=191), + ] + ), + self.Album( + album_name='Discovery', + artist='Daft Punk', + tracks=[ + self.Track(order=1, title='One More Time', duration=235), + self.Track(order=2, title='Aerodynamic', duration=184), + self.Track(order=3, title='Digital Love', duration=239), + ] + ) + ] + + serializer = self.AlbumSerializer(data=data, many=True) + self.assertEqual(serializer.is_valid(), True) + self.assertEqual(serializer.object, expected_object) diff --git a/vendor-local/lib/python/rest_framework/tests/test_settings.py b/vendor-local/lib/python/rest_framework/tests/test_settings.py new file mode 100644 index 00000000000..857375c212c --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_settings.py @@ -0,0 +1,22 @@ +"""Tests for the settings module""" +from __future__ import unicode_literals +from django.test import TestCase + +from rest_framework.settings import APISettings, DEFAULTS, IMPORT_STRINGS + + +class TestSettings(TestCase): + """Tests relating to the api settings""" + + def test_non_import_errors(self): + """Make sure other errors aren't suppressed.""" + settings = APISettings({'DEFAULT_MODEL_SERIALIZER_CLASS': 'rest_framework.tests.extras.bad_import.ModelSerializer'}, DEFAULTS, IMPORT_STRINGS) + with self.assertRaises(ValueError): + settings.DEFAULT_MODEL_SERIALIZER_CLASS + + def test_import_error_message_maintained(self): + """Make sure real import errors are captured and raised sensibly.""" + settings = APISettings({'DEFAULT_MODEL_SERIALIZER_CLASS': 'rest_framework.tests.extras.not_here.ModelSerializer'}, DEFAULTS, IMPORT_STRINGS) + with self.assertRaises(ImportError) as cm: + settings.DEFAULT_MODEL_SERIALIZER_CLASS + self.assertTrue('ImportError' in str(cm.exception)) diff --git a/vendor-local/lib/python/rest_framework/tests/test_testing.py b/vendor-local/lib/python/rest_framework/tests/test_testing.py new file mode 100644 index 00000000000..49d45fc2927 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_testing.py @@ -0,0 +1,115 @@ +# -- coding: utf-8 -- + +from __future__ import unicode_literals +from django.contrib.auth.models import User +from django.test import TestCase +from rest_framework.compat import patterns, url +from rest_framework.decorators import api_view +from rest_framework.response import Response +from rest_framework.test import APIClient, APIRequestFactory, force_authenticate + + +@api_view(['GET', 'POST']) +def view(request): + return Response({ + 'auth': request.META.get('HTTP_AUTHORIZATION', b''), + 'user': request.user.username + }) + + +urlpatterns = patterns('', + url(r'^view/$', view), +) + + +class TestAPITestClient(TestCase): + urls = 'rest_framework.tests.test_testing' + + def setUp(self): + self.client = APIClient() + + def test_credentials(self): + """ + Setting `.credentials()` adds the required headers to each request. + """ + self.client.credentials(HTTP_AUTHORIZATION='example') + for _ in range(0, 3): + response = self.client.get('/view/') + self.assertEqual(response.data['auth'], 'example') + + def test_force_authenticate(self): + """ + Setting `.force_authenticate()` forcibly authenticates each request. + """ + user = User.objects.create_user('example', 'example@example.com') + self.client.force_authenticate(user) + response = self.client.get('/view/') + self.assertEqual(response.data['user'], 'example') + + def test_csrf_exempt_by_default(self): + """ + By default, the test client is CSRF exempt. + """ + User.objects.create_user('example', 'example@example.com', 'password') + self.client.login(username='example', password='password') + response = self.client.post('/view/') + self.assertEqual(response.status_code, 200) + + def test_explicitly_enforce_csrf_checks(self): + """ + The test client can enforce CSRF checks. + """ + client = APIClient(enforce_csrf_checks=True) + User.objects.create_user('example', 'example@example.com', 'password') + client.login(username='example', password='password') + response = client.post('/view/') + expected = {'detail': 'CSRF Failed: CSRF cookie not set.'} + self.assertEqual(response.status_code, 403) + self.assertEqual(response.data, expected) + + +class TestAPIRequestFactory(TestCase): + def test_csrf_exempt_by_default(self): + """ + By default, the test client is CSRF exempt. + """ + user = User.objects.create_user('example', 'example@example.com', 'password') + factory = APIRequestFactory() + request = factory.post('/view/') + request.user = user + response = view(request) + self.assertEqual(response.status_code, 200) + + def test_explicitly_enforce_csrf_checks(self): + """ + The test client can enforce CSRF checks. + """ + user = User.objects.create_user('example', 'example@example.com', 'password') + factory = APIRequestFactory(enforce_csrf_checks=True) + request = factory.post('/view/') + request.user = user + response = view(request) + expected = {'detail': 'CSRF Failed: CSRF cookie not set.'} + self.assertEqual(response.status_code, 403) + self.assertEqual(response.data, expected) + + def test_invalid_format(self): + """ + Attempting to use a format that is not configured will raise an + assertion error. + """ + factory = APIRequestFactory() + self.assertRaises(AssertionError, factory.post, + path='/view/', data={'example': 1}, format='xml' + ) + + def test_force_authenticate(self): + """ + Setting `force_authenticate()` forcibly authenticates the request. + """ + user = User.objects.create_user('example', 'example@example.com') + factory = APIRequestFactory() + request = factory.get('/view') + force_authenticate(request, user=user) + response = view(request) + self.assertEqual(response.data['user'], 'example') diff --git a/vendor-local/lib/python/rest_framework/tests/test_throttling.py b/vendor-local/lib/python/rest_framework/tests/test_throttling.py new file mode 100644 index 00000000000..41bff6926a2 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_throttling.py @@ -0,0 +1,277 @@ +""" +Tests for the throttling implementations in the permissions module. +""" +from __future__ import unicode_literals +from django.test import TestCase +from django.contrib.auth.models import User +from django.core.cache import cache +from rest_framework.test import APIRequestFactory +from rest_framework.views import APIView +from rest_framework.throttling import BaseThrottle, UserRateThrottle, ScopedRateThrottle +from rest_framework.response import Response + + +class User3SecRateThrottle(UserRateThrottle): + rate = '3/sec' + scope = 'seconds' + + +class User3MinRateThrottle(UserRateThrottle): + rate = '3/min' + scope = 'minutes' + + +class NonTimeThrottle(BaseThrottle): + def allow_request(self, request, view): + if not hasattr(self.__class__, 'called'): + self.__class__.called = True + return True + return False + + +class MockView(APIView): + throttle_classes = (User3SecRateThrottle,) + + def get(self, request): + return Response('foo') + + +class MockView_MinuteThrottling(APIView): + throttle_classes = (User3MinRateThrottle,) + + def get(self, request): + return Response('foo') + + +class MockView_NonTimeThrottling(APIView): + throttle_classes = (NonTimeThrottle,) + + def get(self, request): + return Response('foo') + + +class ThrottlingTests(TestCase): + def setUp(self): + """ + Reset the cache so that no throttles will be active + """ + cache.clear() + self.factory = APIRequestFactory() + + def test_requests_are_throttled(self): + """ + Ensure request rate is limited + """ + request = self.factory.get('/') + for dummy in range(4): + response = MockView.as_view()(request) + self.assertEqual(429, response.status_code) + + def set_throttle_timer(self, view, value): + """ + Explicitly set the timer, overriding time.time() + """ + view.throttle_classes[0].timer = lambda self: value + + def test_request_throttling_expires(self): + """ + Ensure request rate is limited for a limited duration only + """ + self.set_throttle_timer(MockView, 0) + + request = self.factory.get('/') + for dummy in range(4): + response = MockView.as_view()(request) + self.assertEqual(429, response.status_code) + + # Advance the timer by one second + self.set_throttle_timer(MockView, 1) + + response = MockView.as_view()(request) + self.assertEqual(200, response.status_code) + + def ensure_is_throttled(self, view, expect): + request = self.factory.get('/') + request.user = User.objects.create(username='a') + for dummy in range(3): + view.as_view()(request) + request.user = User.objects.create(username='b') + response = view.as_view()(request) + self.assertEqual(expect, response.status_code) + + def test_request_throttling_is_per_user(self): + """ + Ensure request rate is only limited per user, not globally for + PerUserThrottles + """ + self.ensure_is_throttled(MockView, 200) + + def ensure_response_header_contains_proper_throttle_field(self, view, expected_headers): + """ + Ensure the response returns an X-Throttle field with status and next attributes + set properly. + """ + request = self.factory.get('/') + for timer, expect in expected_headers: + self.set_throttle_timer(view, timer) + response = view.as_view()(request) + if expect is not None: + self.assertEqual(response['X-Throttle-Wait-Seconds'], expect) + else: + self.assertFalse('X-Throttle-Wait-Seconds' in response) + + def test_seconds_fields(self): + """ + Ensure for second based throttles. + """ + self.ensure_response_header_contains_proper_throttle_field(MockView, + ((0, None), + (0, None), + (0, None), + (0, '1') + )) + + def test_minutes_fields(self): + """ + Ensure for minute based throttles. + """ + self.ensure_response_header_contains_proper_throttle_field(MockView_MinuteThrottling, + ((0, None), + (0, None), + (0, None), + (0, '60') + )) + + def test_next_rate_remains_constant_if_followed(self): + """ + If a client follows the recommended next request rate, + the throttling rate should stay constant. + """ + self.ensure_response_header_contains_proper_throttle_field(MockView_MinuteThrottling, + ((0, None), + (20, None), + (40, None), + (60, None), + (80, None) + )) + + def test_non_time_throttle(self): + """ + Ensure for second based throttles. + """ + request = self.factory.get('/') + + self.assertFalse(hasattr(MockView_NonTimeThrottling.throttle_classes[0], 'called')) + + response = MockView_NonTimeThrottling.as_view()(request) + self.assertFalse('X-Throttle-Wait-Seconds' in response) + + self.assertTrue(MockView_NonTimeThrottling.throttle_classes[0].called) + + response = MockView_NonTimeThrottling.as_view()(request) + self.assertFalse('X-Throttle-Wait-Seconds' in response) + + +class ScopedRateThrottleTests(TestCase): + """ + Tests for ScopedRateThrottle. + """ + + def setUp(self): + class XYScopedRateThrottle(ScopedRateThrottle): + TIMER_SECONDS = 0 + THROTTLE_RATES = {'x': '3/min', 'y': '1/min'} + timer = lambda self: self.TIMER_SECONDS + + class XView(APIView): + throttle_classes = (XYScopedRateThrottle,) + throttle_scope = 'x' + + def get(self, request): + return Response('x') + + class YView(APIView): + throttle_classes = (XYScopedRateThrottle,) + throttle_scope = 'y' + + def get(self, request): + return Response('y') + + class UnscopedView(APIView): + throttle_classes = (XYScopedRateThrottle,) + + def get(self, request): + return Response('y') + + self.throttle_class = XYScopedRateThrottle + self.factory = APIRequestFactory() + self.x_view = XView.as_view() + self.y_view = YView.as_view() + self.unscoped_view = UnscopedView.as_view() + + def increment_timer(self, seconds=1): + self.throttle_class.TIMER_SECONDS += seconds + + def test_scoped_rate_throttle(self): + request = self.factory.get('/') + + # Should be able to hit x view 3 times per minute. + response = self.x_view(request) + self.assertEqual(200, response.status_code) + + self.increment_timer() + response = self.x_view(request) + self.assertEqual(200, response.status_code) + + self.increment_timer() + response = self.x_view(request) + self.assertEqual(200, response.status_code) + + self.increment_timer() + response = self.x_view(request) + self.assertEqual(429, response.status_code) + + # Should be able to hit y view 1 time per minute. + self.increment_timer() + response = self.y_view(request) + self.assertEqual(200, response.status_code) + + self.increment_timer() + response = self.y_view(request) + self.assertEqual(429, response.status_code) + + # Ensure throttles properly reset by advancing the rest of the minute + self.increment_timer(55) + + # Should still be able to hit x view 3 times per minute. + response = self.x_view(request) + self.assertEqual(200, response.status_code) + + self.increment_timer() + response = self.x_view(request) + self.assertEqual(200, response.status_code) + + self.increment_timer() + response = self.x_view(request) + self.assertEqual(200, response.status_code) + + self.increment_timer() + response = self.x_view(request) + self.assertEqual(429, response.status_code) + + # Should still be able to hit y view 1 time per minute. + self.increment_timer() + response = self.y_view(request) + self.assertEqual(200, response.status_code) + + self.increment_timer() + response = self.y_view(request) + self.assertEqual(429, response.status_code) + + def test_unscoped_view_not_throttled(self): + request = self.factory.get('/') + + for idx in range(10): + self.increment_timer() + response = self.unscoped_view(request) + self.assertEqual(200, response.status_code) diff --git a/vendor-local/lib/python/rest_framework/tests/test_urlpatterns.py b/vendor-local/lib/python/rest_framework/tests/test_urlpatterns.py new file mode 100644 index 00000000000..8132ec4c8e6 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_urlpatterns.py @@ -0,0 +1,76 @@ +from __future__ import unicode_literals +from collections import namedtuple +from django.core import urlresolvers +from django.test import TestCase +from rest_framework.test import APIRequestFactory +from rest_framework.compat import patterns, url, include +from rest_framework.urlpatterns import format_suffix_patterns + + +# A container class for test paths for the test case +URLTestPath = namedtuple('URLTestPath', ['path', 'args', 'kwargs']) + + +def dummy_view(request, *args, **kwargs): + pass + + +class FormatSuffixTests(TestCase): + """ + Tests `format_suffix_patterns` against different URLPatterns to ensure the URLs still resolve properly, including any captured parameters. + """ + def _resolve_urlpatterns(self, urlpatterns, test_paths): + factory = APIRequestFactory() + try: + urlpatterns = format_suffix_patterns(urlpatterns) + except Exception: + self.fail("Failed to apply `format_suffix_patterns` on the supplied urlpatterns") + resolver = urlresolvers.RegexURLResolver(r'^/', urlpatterns) + for test_path in test_paths: + request = factory.get(test_path.path) + try: + callback, callback_args, callback_kwargs = resolver.resolve(request.path_info) + except Exception: + self.fail("Failed to resolve URL: %s" % request.path_info) + self.assertEqual(callback_args, test_path.args) + self.assertEqual(callback_kwargs, test_path.kwargs) + + def test_format_suffix(self): + urlpatterns = patterns( + '', + url(r'^test$', dummy_view), + ) + test_paths = [ + URLTestPath('/test', (), {}), + URLTestPath('/test.api', (), {'format': 'api'}), + URLTestPath('/test.asdf', (), {'format': 'asdf'}), + ] + self._resolve_urlpatterns(urlpatterns, test_paths) + + def test_default_args(self): + urlpatterns = patterns( + '', + url(r'^test$', dummy_view, {'foo': 'bar'}), + ) + test_paths = [ + URLTestPath('/test', (), {'foo': 'bar', }), + URLTestPath('/test.api', (), {'foo': 'bar', 'format': 'api'}), + URLTestPath('/test.asdf', (), {'foo': 'bar', 'format': 'asdf'}), + ] + self._resolve_urlpatterns(urlpatterns, test_paths) + + def test_included_urls(self): + nested_patterns = patterns( + '', + url(r'^path$', dummy_view) + ) + urlpatterns = patterns( + '', + url(r'^test/', include(nested_patterns), {'foo': 'bar'}), + ) + test_paths = [ + URLTestPath('/test/path', (), {'foo': 'bar', }), + URLTestPath('/test/path.api', (), {'foo': 'bar', 'format': 'api'}), + URLTestPath('/test/path.asdf', (), {'foo': 'bar', 'format': 'asdf'}), + ] + self._resolve_urlpatterns(urlpatterns, test_paths) diff --git a/vendor-local/lib/python/rest_framework/tests/test_validation.py b/vendor-local/lib/python/rest_framework/tests/test_validation.py new file mode 100644 index 00000000000..ebfdff9cd18 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_validation.py @@ -0,0 +1,85 @@ +from __future__ import unicode_literals +from django.db import models +from django.test import TestCase +from rest_framework import generics, serializers, status +from rest_framework.test import APIRequestFactory + +factory = APIRequestFactory() + + +# Regression for #666 + +class ValidationModel(models.Model): + blank_validated_field = models.CharField(max_length=255) + + +class ValidationModelSerializer(serializers.ModelSerializer): + class Meta: + model = ValidationModel + fields = ('blank_validated_field',) + read_only_fields = ('blank_validated_field',) + + +class UpdateValidationModel(generics.RetrieveUpdateDestroyAPIView): + model = ValidationModel + serializer_class = ValidationModelSerializer + + +class TestPreSaveValidationExclusions(TestCase): + def test_pre_save_validation_exclusions(self): + """ + Somewhat weird test case to ensure that we don't perform model + validation on read only fields. + """ + obj = ValidationModel.objects.create(blank_validated_field='') + request = factory.put('/', {}, format='json') + view = UpdateValidationModel().as_view() + response = view(request, pk=obj.pk).render() + self.assertEqual(response.status_code, status.HTTP_200_OK) + + +# Regression for #653 + +class ShouldValidateModel(models.Model): + should_validate_field = models.CharField(max_length=255) + + +class ShouldValidateModelSerializer(serializers.ModelSerializer): + renamed = serializers.CharField(source='should_validate_field', required=False) + + class Meta: + model = ShouldValidateModel + fields = ('renamed',) + + +class TestPreSaveValidationExclusions(TestCase): + def test_renamed_fields_are_model_validated(self): + """ + Ensure fields with 'source' applied do get still get model validation. + """ + # We've set `required=False` on the serializer, but the model + # does not have `blank=True`, so this serializer should not validate. + serializer = ShouldValidateModelSerializer(data={'renamed': ''}) + self.assertEqual(serializer.is_valid(), False) + + +class ValidationSerializer(serializers.Serializer): + foo = serializers.CharField() + + def validate_foo(self, attrs, source): + raise serializers.ValidationError("foo invalid") + + def validate(self, attrs): + raise serializers.ValidationError("serializer invalid") + + +class TestAvoidValidation(TestCase): + """ + If serializer was initialized with invalid data (None or non dict-like), it + should avoid validation layer (validate_<field> and validate methods) + """ + def test_serializer_errors_has_only_invalid_data_error(self): + serializer = ValidationSerializer(data='invalid data') + self.assertFalse(serializer.is_valid()) + self.assertDictEqual(serializer.errors, + {'non_field_errors': ['Invalid data']}) diff --git a/vendor-local/lib/python/rest_framework/tests/test_views.py b/vendor-local/lib/python/rest_framework/tests/test_views.py new file mode 100644 index 00000000000..c0bec5aed15 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/test_views.py @@ -0,0 +1,101 @@ +from __future__ import unicode_literals + +import copy +from django.test import TestCase +from rest_framework import status +from rest_framework.decorators import api_view +from rest_framework.response import Response +from rest_framework.settings import api_settings +from rest_framework.test import APIRequestFactory +from rest_framework.views import APIView + +factory = APIRequestFactory() + + +class BasicView(APIView): + def get(self, request, *args, **kwargs): + return Response({'method': 'GET'}) + + def post(self, request, *args, **kwargs): + return Response({'method': 'POST', 'data': request.DATA}) + + +@api_view(['GET', 'POST', 'PUT', 'PATCH']) +def basic_view(request): + if request.method == 'GET': + return {'method': 'GET'} + elif request.method == 'POST': + return {'method': 'POST', 'data': request.DATA} + elif request.method == 'PUT': + return {'method': 'PUT', 'data': request.DATA} + elif request.method == 'PATCH': + return {'method': 'PATCH', 'data': request.DATA} + + +def sanitise_json_error(error_dict): + """ + Exact contents of JSON error messages depend on the installed version + of json. + """ + ret = copy.copy(error_dict) + chop = len('JSON parse error - No JSON object could be decoded') + ret['detail'] = ret['detail'][:chop] + return ret + + +class ClassBasedViewIntegrationTests(TestCase): + def setUp(self): + self.view = BasicView.as_view() + + def test_400_parse_error(self): + request = factory.post('/', 'f00bar', content_type='application/json') + response = self.view(request) + expected = { + 'detail': 'JSON parse error - No JSON object could be decoded' + } + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertEqual(sanitise_json_error(response.data), expected) + + def test_400_parse_error_tunneled_content(self): + content = 'f00bar' + content_type = 'application/json' + form_data = { + api_settings.FORM_CONTENT_OVERRIDE: content, + api_settings.FORM_CONTENTTYPE_OVERRIDE: content_type + } + request = factory.post('/', form_data) + response = self.view(request) + expected = { + 'detail': 'JSON parse error - No JSON object could be decoded' + } + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertEqual(sanitise_json_error(response.data), expected) + + +class FunctionBasedViewIntegrationTests(TestCase): + def setUp(self): + self.view = basic_view + + def test_400_parse_error(self): + request = factory.post('/', 'f00bar', content_type='application/json') + response = self.view(request) + expected = { + 'detail': 'JSON parse error - No JSON object could be decoded' + } + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertEqual(sanitise_json_error(response.data), expected) + + def test_400_parse_error_tunneled_content(self): + content = 'f00bar' + content_type = 'application/json' + form_data = { + api_settings.FORM_CONTENT_OVERRIDE: content, + api_settings.FORM_CONTENTTYPE_OVERRIDE: content_type + } + request = factory.post('/', form_data) + response = self.view(request) + expected = { + 'detail': 'JSON parse error - No JSON object could be decoded' + } + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertEqual(sanitise_json_error(response.data), expected) diff --git a/vendor-local/lib/python/rest_framework/tests/tests.py b/vendor-local/lib/python/rest_framework/tests/tests.py new file mode 100644 index 00000000000..554ebd1ad21 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/tests/tests.py @@ -0,0 +1,16 @@ +""" +Force import of all modules in this package in order to get the standard test +runner to pick up the tests. Yowzers. +""" +from __future__ import unicode_literals +import os +import django + +modules = [filename.rsplit('.', 1)[0] + for filename in os.listdir(os.path.dirname(__file__)) + if filename.endswith('.py') and not filename.startswith('_')] +__test__ = dict() + +if django.VERSION < (1, 6): + for module in modules: + exec("from rest_framework.tests.%s import *" % module) diff --git a/vendor-local/lib/python/rest_framework/throttling.py b/vendor-local/lib/python/rest_framework/throttling.py new file mode 100644 index 00000000000..65b4559307c --- /dev/null +++ b/vendor-local/lib/python/rest_framework/throttling.py @@ -0,0 +1,229 @@ +""" +Provides various throttling policies. +""" +from __future__ import unicode_literals +from django.core.cache import cache +from django.core.exceptions import ImproperlyConfigured +from rest_framework.settings import api_settings +import time + + +class BaseThrottle(object): + """ + Rate throttling of requests. + """ + def allow_request(self, request, view): + """ + Return `True` if the request should be allowed, `False` otherwise. + """ + raise NotImplementedError('.allow_request() must be overridden') + + def wait(self): + """ + Optionally, return a recommended number of seconds to wait before + the next request. + """ + return None + + +class SimpleRateThrottle(BaseThrottle): + """ + A simple cache implementation, that only requires `.get_cache_key()` + to be overridden. + + The rate (requests / seconds) is set by a `throttle` attribute on the View + class. The attribute is a string of the form 'number_of_requests/period'. + + Period should be one of: ('s', 'sec', 'm', 'min', 'h', 'hour', 'd', 'day') + + Previous request information used for throttling is stored in the cache. + """ + + timer = time.time + cache_format = 'throtte_%(scope)s_%(ident)s' + scope = None + THROTTLE_RATES = api_settings.DEFAULT_THROTTLE_RATES + + def __init__(self): + if not getattr(self, 'rate', None): + self.rate = self.get_rate() + self.num_requests, self.duration = self.parse_rate(self.rate) + + def get_cache_key(self, request, view): + """ + Should return a unique cache-key which can be used for throttling. + Must be overridden. + + May return `None` if the request should not be throttled. + """ + raise NotImplementedError('.get_cache_key() must be overridden') + + def get_rate(self): + """ + Determine the string representation of the allowed request rate. + """ + if not getattr(self, 'scope', None): + msg = ("You must set either `.scope` or `.rate` for '%s' throttle" % + self.__class__.__name__) + raise ImproperlyConfigured(msg) + + try: + return self.THROTTLE_RATES[self.scope] + except KeyError: + msg = "No default throttle rate set for '%s' scope" % self.scope + raise ImproperlyConfigured(msg) + + def parse_rate(self, rate): + """ + Given the request rate string, return a two tuple of: + <allowed number of requests>, <period of time in seconds> + """ + if rate is None: + return (None, None) + num, period = rate.split('/') + num_requests = int(num) + duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}[period[0]] + return (num_requests, duration) + + def allow_request(self, request, view): + """ + Implement the check to see if the request should be throttled. + + On success calls `throttle_success`. + On failure calls `throttle_failure`. + """ + if self.rate is None: + return True + + self.key = self.get_cache_key(request, view) + if self.key is None: + return True + + self.history = cache.get(self.key, []) + self.now = self.timer() + + # Drop any requests from the history which have now passed the + # throttle duration + while self.history and self.history[-1] <= self.now - self.duration: + self.history.pop() + if len(self.history) >= self.num_requests: + return self.throttle_failure() + return self.throttle_success() + + def throttle_success(self): + """ + Inserts the current request's timestamp along with the key + into the cache. + """ + self.history.insert(0, self.now) + cache.set(self.key, self.history, self.duration) + return True + + def throttle_failure(self): + """ + Called when a request to the API has failed due to throttling. + """ + return False + + def wait(self): + """ + Returns the recommended next request time in seconds. + """ + if self.history: + remaining_duration = self.duration - (self.now - self.history[-1]) + else: + remaining_duration = self.duration + + available_requests = self.num_requests - len(self.history) + 1 + + return remaining_duration / float(available_requests) + + +class AnonRateThrottle(SimpleRateThrottle): + """ + Limits the rate of API calls that may be made by a anonymous users. + + The IP address of the request will be used as the unique cache key. + """ + scope = 'anon' + + def get_cache_key(self, request, view): + if request.user.is_authenticated(): + return None # Only throttle unauthenticated requests. + + ident = request.META.get('REMOTE_ADDR', None) + + return self.cache_format % { + 'scope': self.scope, + 'ident': ident + } + + +class UserRateThrottle(SimpleRateThrottle): + """ + Limits the rate of API calls that may be made by a given user. + + The user id will be used as a unique cache key if the user is + authenticated. For anonymous requests, the IP address of the request will + be used. + """ + scope = 'user' + + def get_cache_key(self, request, view): + if request.user.is_authenticated(): + ident = request.user.id + else: + ident = request.META.get('REMOTE_ADDR', None) + + return self.cache_format % { + 'scope': self.scope, + 'ident': ident + } + + +class ScopedRateThrottle(SimpleRateThrottle): + """ + Limits the rate of API calls by different amounts for various parts of + the API. Any view that has the `throttle_scope` property set will be + throttled. The unique cache key will be generated by concatenating the + user id of the request, and the scope of the view being accessed. + """ + scope_attr = 'throttle_scope' + + def __init__(self): + # Override the usual SimpleRateThrottle, because we can't determine + # the rate until called by the view. + pass + + def allow_request(self, request, view): + # We can only determine the scope once we're called by the view. + self.scope = getattr(view, self.scope_attr, None) + + # If a view does not have a `throttle_scope` always allow the request + if not self.scope: + return True + + # Determine the allowed request rate as we normally would during + # the `__init__` call. + self.rate = self.get_rate() + self.num_requests, self.duration = self.parse_rate(self.rate) + + # We can now proceed as normal. + return super(ScopedRateThrottle, self).allow_request(request, view) + + def get_cache_key(self, request, view): + """ + If `view.throttle_scope` is not set, don't apply this throttle. + + Otherwise generate the unique cache key by concatenating the user id + with the '.throttle_scope` property of the view. + """ + if request.user.is_authenticated(): + ident = request.user.id + else: + ident = request.META.get('REMOTE_ADDR', None) + + return self.cache_format % { + 'scope': self.scope, + 'ident': ident + } diff --git a/vendor-local/lib/python/rest_framework/urlpatterns.py b/vendor-local/lib/python/rest_framework/urlpatterns.py new file mode 100644 index 00000000000..d9143bb4c91 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/urlpatterns.py @@ -0,0 +1,62 @@ +from __future__ import unicode_literals +from django.core.urlresolvers import RegexURLResolver +from rest_framework.compat import url, include +from rest_framework.settings import api_settings + + +def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required): + ret = [] + for urlpattern in urlpatterns: + if isinstance(urlpattern, RegexURLResolver): + # Set of included URL patterns + regex = urlpattern.regex.pattern + namespace = urlpattern.namespace + app_name = urlpattern.app_name + kwargs = urlpattern.default_kwargs + # Add in the included patterns, after applying the suffixes + patterns = apply_suffix_patterns(urlpattern.url_patterns, + suffix_pattern, + suffix_required) + ret.append(url(regex, include(patterns, namespace, app_name), kwargs)) + + else: + # Regular URL pattern + regex = urlpattern.regex.pattern.rstrip('$') + suffix_pattern + view = urlpattern._callback or urlpattern._callback_str + kwargs = urlpattern.default_args + name = urlpattern.name + # Add in both the existing and the new urlpattern + if not suffix_required: + ret.append(urlpattern) + ret.append(url(regex, view, kwargs, name)) + + return ret + + +def format_suffix_patterns(urlpatterns, suffix_required=False, allowed=None): + """ + Supplement existing urlpatterns with corresponding patterns that also + include a '.format' suffix. Retains urlpattern ordering. + + urlpatterns: + A list of URL patterns. + + suffix_required: + If `True`, only suffixed URLs will be generated, and non-suffixed + URLs will not be used. Defaults to `False`. + + allowed: + An optional tuple/list of allowed suffixes. eg ['json', 'api'] + Defaults to `None`, which allows any suffix. + """ + suffix_kwarg = api_settings.FORMAT_SUFFIX_KWARG + if allowed: + if len(allowed) == 1: + allowed_pattern = allowed[0] + else: + allowed_pattern = '(%s)' % '|'.join(allowed) + suffix_pattern = r'\.(?P<%s>%s)$' % (suffix_kwarg, allowed_pattern) + else: + suffix_pattern = r'\.(?P<%s>[a-z]+)$' % suffix_kwarg + + return apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required) diff --git a/vendor-local/lib/python/rest_framework/urls.py b/vendor-local/lib/python/rest_framework/urls.py new file mode 100644 index 00000000000..9c4719f1d45 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/urls.py @@ -0,0 +1,24 @@ +""" +Login and logout views for the browsable API. + +Add these to your root URLconf if you're using the browsable API and +your API requires authentication. + +The urls must be namespaced as 'rest_framework', and you should make sure +your authentication settings include `SessionAuthentication`. + + urlpatterns = patterns('', + ... + url(r'^auth', include('rest_framework.urls', namespace='rest_framework')) + ) +""" +from __future__ import unicode_literals +from rest_framework.compat import patterns, url + + +template_name = {'template_name': 'rest_framework/login.html'} + +urlpatterns = patterns('django.contrib.auth.views', + url(r'^login/$', 'login', template_name, name='login'), + url(r'^logout/$', 'logout', template_name, name='logout'), +) diff --git a/vendor-local/lib/python/rest_framework/utils/__init__.py b/vendor-local/lib/python/rest_framework/utils/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/vendor-local/lib/python/rest_framework/utils/breadcrumbs.py b/vendor-local/lib/python/rest_framework/utils/breadcrumbs.py new file mode 100644 index 00000000000..d51374b0a87 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/utils/breadcrumbs.py @@ -0,0 +1,54 @@ +from __future__ import unicode_literals +from django.core.urlresolvers import resolve, get_script_prefix +from rest_framework.utils.formatting import get_view_name + + +def get_breadcrumbs(url): + """ + Given a url returns a list of breadcrumbs, which are each a + tuple of (name, url). + """ + + from rest_framework.views import APIView + + def breadcrumbs_recursive(url, breadcrumbs_list, prefix, seen): + """ + Add tuples of (name, url) to the breadcrumbs list, + progressively chomping off parts of the url. + """ + + try: + (view, unused_args, unused_kwargs) = resolve(url) + except Exception: + pass + else: + # Check if this is a REST framework view, + # and if so add it to the breadcrumbs + cls = getattr(view, 'cls', None) + if cls is not None and issubclass(cls, APIView): + # Don't list the same view twice in a row. + # Probably an optional trailing slash. + if not seen or seen[-1] != view: + suffix = getattr(view, 'suffix', None) + name = get_view_name(view.cls, suffix) + breadcrumbs_list.insert(0, (name, prefix + url)) + seen.append(view) + + if url == '': + # All done + return breadcrumbs_list + + elif url.endswith('/'): + # Drop trailing slash off the end and continue to try to + # resolve more breadcrumbs + url = url.rstrip('/') + return breadcrumbs_recursive(url, breadcrumbs_list, prefix, seen) + + # Drop trailing non-slash off the end and continue to try to + # resolve more breadcrumbs + url = url[:url.rfind('/') + 1] + return breadcrumbs_recursive(url, breadcrumbs_list, prefix, seen) + + prefix = get_script_prefix().rstrip('/') + url = url[len(prefix):] + return breadcrumbs_recursive(url, [], prefix, []) diff --git a/vendor-local/lib/python/rest_framework/utils/encoders.py b/vendor-local/lib/python/rest_framework/utils/encoders.py new file mode 100644 index 00000000000..b26a2085a82 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/utils/encoders.py @@ -0,0 +1,97 @@ +""" +Helper classes for parsers. +""" +from __future__ import unicode_literals +from django.utils.datastructures import SortedDict +from django.utils.functional import Promise +from rest_framework.compat import timezone, force_text +from rest_framework.serializers import DictWithMetadata, SortedDictWithMetadata +import datetime +import decimal +import types +import json + + +class JSONEncoder(json.JSONEncoder): + """ + JSONEncoder subclass that knows how to encode date/time/timedelta, + decimal types, and generators. + """ + def default(self, o): + # For Date Time string spec, see ECMA 262 + # http://ecma-international.org/ecma-262/5.1/#sec-15.9.1.15 + if isinstance(o, Promise): + return force_text(o) + elif isinstance(o, datetime.datetime): + r = o.isoformat() + if o.microsecond: + r = r[:23] + r[26:] + if r.endswith('+00:00'): + r = r[:-6] + 'Z' + return r + elif isinstance(o, datetime.date): + return o.isoformat() + elif isinstance(o, datetime.time): + if timezone and timezone.is_aware(o): + raise ValueError("JSON can't represent timezone-aware times.") + r = o.isoformat() + if o.microsecond: + r = r[:12] + return r + elif isinstance(o, datetime.timedelta): + return str(o.total_seconds()) + elif isinstance(o, decimal.Decimal): + return str(o) + elif hasattr(o, '__iter__'): + return [i for i in o] + return super(JSONEncoder, self).default(o) + + +try: + import yaml +except ImportError: + SafeDumper = None +else: + # Adapted from http://pyyaml.org/attachment/ticket/161/use_ordered_dict.py + class SafeDumper(yaml.SafeDumper): + """ + Handles decimals as strings. + Handles SortedDicts as usual dicts, but preserves field order, rather + than the usual behaviour of sorting the keys. + """ + def represent_decimal(self, data): + return self.represent_scalar('tag:yaml.org,2002:str', str(data)) + + def represent_mapping(self, tag, mapping, flow_style=None): + value = [] + node = yaml.MappingNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + if hasattr(mapping, 'items'): + mapping = list(mapping.items()) + if not isinstance(mapping, SortedDict): + mapping.sort() + for item_key, item_value in mapping: + node_key = self.represent_data(item_key) + node_value = self.represent_data(item_value) + if not (isinstance(node_key, yaml.ScalarNode) and not node_key.style): + best_style = False + if not (isinstance(node_value, yaml.ScalarNode) and not node_value.style): + best_style = False + value.append((node_key, node_value)) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + SafeDumper.add_representer(SortedDict, + yaml.representer.SafeRepresenter.represent_dict) + SafeDumper.add_representer(DictWithMetadata, + yaml.representer.SafeRepresenter.represent_dict) + SafeDumper.add_representer(SortedDictWithMetadata, + yaml.representer.SafeRepresenter.represent_dict) + SafeDumper.add_representer(types.GeneratorType, + yaml.representer.SafeRepresenter.represent_list) diff --git a/vendor-local/lib/python/rest_framework/utils/formatting.py b/vendor-local/lib/python/rest_framework/utils/formatting.py new file mode 100644 index 00000000000..4bec838776f --- /dev/null +++ b/vendor-local/lib/python/rest_framework/utils/formatting.py @@ -0,0 +1,80 @@ +""" +Utility functions to return a formatted name and description for a given view. +""" +from __future__ import unicode_literals + +from django.utils.html import escape +from django.utils.safestring import mark_safe +from rest_framework.compat import apply_markdown, smart_text +import re + + +def _remove_trailing_string(content, trailing): + """ + Strip trailing component `trailing` from `content` if it exists. + Used when generating names from view classes. + """ + if content.endswith(trailing) and content != trailing: + return content[:-len(trailing)] + return content + + +def _remove_leading_indent(content): + """ + Remove leading indent from a block of text. + Used when generating descriptions from docstrings. + """ + whitespace_counts = [len(line) - len(line.lstrip(' ')) + for line in content.splitlines()[1:] if line.lstrip()] + + # unindent the content if needed + if whitespace_counts: + whitespace_pattern = '^' + (' ' * min(whitespace_counts)) + content = re.sub(re.compile(whitespace_pattern, re.MULTILINE), '', content) + content = content.strip('\n') + return content + + +def _camelcase_to_spaces(content): + """ + Translate 'CamelCaseNames' to 'Camel Case Names'. + Used when generating names from view classes. + """ + camelcase_boundry = '(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))' + content = re.sub(camelcase_boundry, ' \\1', content).strip() + return ' '.join(content.split('_')).title() + + +def get_view_name(cls, suffix=None): + """ + Return a formatted name for an `APIView` class or `@api_view` function. + """ + name = cls.__name__ + name = _remove_trailing_string(name, 'View') + name = _remove_trailing_string(name, 'ViewSet') + name = _camelcase_to_spaces(name) + if suffix: + name += ' ' + suffix + return name + + +def get_view_description(cls, html=False): + """ + Return a description for an `APIView` class or `@api_view` function. + """ + description = cls.__doc__ or '' + description = _remove_leading_indent(smart_text(description)) + if html: + return markup_description(description) + return description + + +def markup_description(description): + """ + Apply HTML markup to the given description. + """ + if apply_markdown: + description = apply_markdown(description) + else: + description = escape(description).replace('\n', '<br />') + return mark_safe(description) diff --git a/vendor-local/lib/python/rest_framework/utils/mediatypes.py b/vendor-local/lib/python/rest_framework/utils/mediatypes.py new file mode 100644 index 00000000000..c09c29338ea --- /dev/null +++ b/vendor-local/lib/python/rest_framework/utils/mediatypes.py @@ -0,0 +1,88 @@ +""" +Handling of media types, as found in HTTP Content-Type and Accept headers. + +See http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7 +""" +from __future__ import unicode_literals +from django.http.multipartparser import parse_header +from rest_framework import HTTP_HEADER_ENCODING + + +def media_type_matches(lhs, rhs): + """ + Returns ``True`` if the media type in the first argument <= the + media type in the second argument. The media types are strings + as described by the HTTP spec. + + Valid media type strings include: + + 'application/json; indent=4' + 'application/json' + 'text/*' + '*/*' + """ + lhs = _MediaType(lhs) + rhs = _MediaType(rhs) + return lhs.match(rhs) + + +def order_by_precedence(media_type_lst): + """ + Returns a list of sets of media type strings, ordered by precedence. + Precedence is determined by how specific a media type is: + + 3. 'type/subtype; param=val' + 2. 'type/subtype' + 1. 'type/*' + 0. '*/*' + """ + ret = [set(), set(), set(), set()] + for media_type in media_type_lst: + precedence = _MediaType(media_type).precedence + ret[3 - precedence].add(media_type) + return [media_types for media_types in ret if media_types] + + +class _MediaType(object): + def __init__(self, media_type_str): + if media_type_str is None: + media_type_str = '' + self.orig = media_type_str + self.full_type, self.params = parse_header(media_type_str.encode(HTTP_HEADER_ENCODING)) + self.main_type, sep, self.sub_type = self.full_type.partition('/') + + def match(self, other): + """Return true if this MediaType satisfies the given MediaType.""" + for key in self.params.keys(): + if key != 'q' and other.params.get(key, None) != self.params.get(key, None): + return False + + if self.sub_type != '*' and other.sub_type != '*' and other.sub_type != self.sub_type: + return False + + if self.main_type != '*' and other.main_type != '*' and other.main_type != self.main_type: + return False + + return True + + @property + def precedence(self): + """ + Return a precedence level from 0-3 for the media type given how specific it is. + """ + if self.main_type == '*': + return 0 + elif self.sub_type == '*': + return 1 + elif not self.params or self.params.keys() == ['q']: + return 2 + return 3 + + def __str__(self): + return unicode(self).encode('utf-8') + + def __unicode__(self): + ret = "%s/%s" % (self.main_type, self.sub_type) + for key, val in self.params.items(): + ret += "; %s=%s" % (key, val) + return ret diff --git a/vendor-local/lib/python/rest_framework/views.py b/vendor-local/lib/python/rest_framework/views.py new file mode 100644 index 00000000000..d51233a9327 --- /dev/null +++ b/vendor-local/lib/python/rest_framework/views.py @@ -0,0 +1,357 @@ +""" +Provides an APIView class that is the base of all views in REST framework. +""" +from __future__ import unicode_literals + +from django.core.exceptions import PermissionDenied +from django.http import Http404 +from django.utils.datastructures import SortedDict +from django.views.decorators.csrf import csrf_exempt +from rest_framework import status, exceptions +from rest_framework.compat import View, HttpResponseBase +from rest_framework.request import Request +from rest_framework.response import Response +from rest_framework.settings import api_settings +from rest_framework.utils.formatting import get_view_name, get_view_description + + +class APIView(View): + settings = api_settings + + renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES + parser_classes = api_settings.DEFAULT_PARSER_CLASSES + authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES + throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES + permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES + content_negotiation_class = api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS + + @classmethod + def as_view(cls, **initkwargs): + """ + Store the original class on the view function. + + This allows us to discover information about the view when we do URL + reverse lookups. Used for breadcrumb generation. + """ + view = super(APIView, cls).as_view(**initkwargs) + view.cls = cls + return view + + @property + def allowed_methods(self): + """ + Wrap Django's private `_allowed_methods` interface in a public property. + """ + return self._allowed_methods() + + @property + def default_response_headers(self): + # TODO: deprecate? + # TODO: Only vary by accept if multiple renderers + return { + 'Allow': ', '.join(self.allowed_methods), + 'Vary': 'Accept' + } + + def http_method_not_allowed(self, request, *args, **kwargs): + """ + If `request.method` does not correspond to a handler method, + determine what kind of exception to raise. + """ + raise exceptions.MethodNotAllowed(request.method) + + def permission_denied(self, request): + """ + If request is not permitted, determine what kind of exception to raise. + """ + if not self.request.successful_authenticator: + raise exceptions.NotAuthenticated() + raise exceptions.PermissionDenied() + + def throttled(self, request, wait): + """ + If request is throttled, determine what kind of exception to raise. + """ + raise exceptions.Throttled(wait) + + def get_authenticate_header(self, request): + """ + If a request is unauthenticated, determine the WWW-Authenticate + header to use for 401 responses, if any. + """ + authenticators = self.get_authenticators() + if authenticators: + return authenticators[0].authenticate_header(request) + + def get_parser_context(self, http_request): + """ + Returns a dict that is passed through to Parser.parse(), + as the `parser_context` keyword argument. + """ + # Note: Additionally `request` will also be added to the context + # by the Request object. + return { + 'view': self, + 'args': getattr(self, 'args', ()), + 'kwargs': getattr(self, 'kwargs', {}) + } + + def get_renderer_context(self): + """ + Returns a dict that is passed through to Renderer.render(), + as the `renderer_context` keyword argument. + """ + # Note: Additionally 'response' will also be added to the context, + # by the Response object. + return { + 'view': self, + 'args': getattr(self, 'args', ()), + 'kwargs': getattr(self, 'kwargs', {}), + 'request': getattr(self, 'request', None) + } + + # API policy instantiation methods + + def get_format_suffix(self, **kwargs): + """ + Determine if the request includes a '.json' style format suffix + """ + if self.settings.FORMAT_SUFFIX_KWARG: + return kwargs.get(self.settings.FORMAT_SUFFIX_KWARG) + + def get_renderers(self): + """ + Instantiates and returns the list of renderers that this view can use. + """ + return [renderer() for renderer in self.renderer_classes] + + def get_parsers(self): + """ + Instantiates and returns the list of parsers that this view can use. + """ + return [parser() for parser in self.parser_classes] + + def get_authenticators(self): + """ + Instantiates and returns the list of authenticators that this view can use. + """ + return [auth() for auth in self.authentication_classes] + + def get_permissions(self): + """ + Instantiates and returns the list of permissions that this view requires. + """ + return [permission() for permission in self.permission_classes] + + def get_throttles(self): + """ + Instantiates and returns the list of throttles that this view uses. + """ + return [throttle() for throttle in self.throttle_classes] + + def get_content_negotiator(self): + """ + Instantiate and return the content negotiation class to use. + """ + if not getattr(self, '_negotiator', None): + self._negotiator = self.content_negotiation_class() + return self._negotiator + + # API policy implementation methods + + def perform_content_negotiation(self, request, force=False): + """ + Determine which renderer and media type to use render the response. + """ + renderers = self.get_renderers() + conneg = self.get_content_negotiator() + + try: + return conneg.select_renderer(request, renderers, self.format_kwarg) + except Exception: + if force: + return (renderers[0], renderers[0].media_type) + raise + + def perform_authentication(self, request): + """ + Perform authentication on the incoming request. + + Note that if you override this and simply 'pass', then authentication + will instead be performed lazily, the first time either + `request.user` or `request.auth` is accessed. + """ + request.user + + def check_permissions(self, request): + """ + Check if the request should be permitted. + Raises an appropriate exception if the request is not permitted. + """ + for permission in self.get_permissions(): + if not permission.has_permission(request, self): + self.permission_denied(request) + + def check_object_permissions(self, request, obj): + """ + Check if the request should be permitted for a given object. + Raises an appropriate exception if the request is not permitted. + """ + for permission in self.get_permissions(): + if not permission.has_object_permission(request, self, obj): + self.permission_denied(request) + + def check_throttles(self, request): + """ + Check if request should be throttled. + Raises an appropriate exception if the request is throttled. + """ + for throttle in self.get_throttles(): + if not throttle.allow_request(request, self): + self.throttled(request, throttle.wait()) + + # Dispatch methods + + def initialize_request(self, request, *args, **kargs): + """ + Returns the initial request object. + """ + parser_context = self.get_parser_context(request) + + return Request(request, + parsers=self.get_parsers(), + authenticators=self.get_authenticators(), + negotiator=self.get_content_negotiator(), + parser_context=parser_context) + + def initial(self, request, *args, **kwargs): + """ + Runs anything that needs to occur prior to calling the method handler. + """ + self.format_kwarg = self.get_format_suffix(**kwargs) + + # Ensure that the incoming request is permitted + self.perform_authentication(request) + self.check_permissions(request) + self.check_throttles(request) + + # Perform content negotiation and store the accepted info on the request + neg = self.perform_content_negotiation(request) + request.accepted_renderer, request.accepted_media_type = neg + + def finalize_response(self, request, response, *args, **kwargs): + """ + Returns the final response object. + """ + # Make the error obvious if a proper response is not returned + assert isinstance(response, HttpResponseBase), ( + 'Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` ' + 'to be returned from the view, but received a `%s`' + % type(response) + ) + + if isinstance(response, Response): + if not getattr(request, 'accepted_renderer', None): + neg = self.perform_content_negotiation(request, force=True) + request.accepted_renderer, request.accepted_media_type = neg + + response.accepted_renderer = request.accepted_renderer + response.accepted_media_type = request.accepted_media_type + response.renderer_context = self.get_renderer_context() + + for key, value in self.headers.items(): + response[key] = value + + return response + + def handle_exception(self, exc): + """ + Handle any exception that occurs, by returning an appropriate response, + or re-raising the error. + """ + if isinstance(exc, exceptions.Throttled) and exc.wait is not None: + # Throttle wait header + self.headers['X-Throttle-Wait-Seconds'] = '%d' % exc.wait + + if isinstance(exc, (exceptions.NotAuthenticated, + exceptions.AuthenticationFailed)): + # WWW-Authenticate header for 401 responses, else coerce to 403 + auth_header = self.get_authenticate_header(self.request) + + if auth_header: + self.headers['WWW-Authenticate'] = auth_header + else: + exc.status_code = status.HTTP_403_FORBIDDEN + + if isinstance(exc, exceptions.APIException): + return Response({'detail': exc.detail}, + status=exc.status_code, + exception=True) + elif isinstance(exc, Http404): + return Response({'detail': 'Not found'}, + status=status.HTTP_404_NOT_FOUND, + exception=True) + elif isinstance(exc, PermissionDenied): + return Response({'detail': 'Permission denied'}, + status=status.HTTP_403_FORBIDDEN, + exception=True) + raise + + # Note: session based authentication is explicitly CSRF validated, + # all other authentication is CSRF exempt. + @csrf_exempt + def dispatch(self, request, *args, **kwargs): + """ + `.dispatch()` is pretty much the same as Django's regular dispatch, + but with extra hooks for startup, finalize, and exception handling. + """ + self.args = args + self.kwargs = kwargs + request = self.initialize_request(request, *args, **kwargs) + self.request = request + self.headers = self.default_response_headers # deprecate? + + try: + self.initial(request, *args, **kwargs) + + # Get the appropriate handler method + if request.method.lower() in self.http_method_names: + handler = getattr(self, request.method.lower(), + self.http_method_not_allowed) + else: + handler = self.http_method_not_allowed + + response = handler(request, *args, **kwargs) + + except Exception as exc: + response = self.handle_exception(exc) + + self.response = self.finalize_response(request, response, *args, **kwargs) + return self.response + + def options(self, request, *args, **kwargs): + """ + Handler method for HTTP 'OPTIONS' request. + We may as well implement this as Django will otherwise provide + a less useful default implementation. + """ + return Response(self.metadata(request), status=status.HTTP_200_OK) + + def metadata(self, request): + """ + Return a dictionary of metadata about the view. + Used to return responses for OPTIONS requests. + """ + + # This is used by ViewSets to disambiguate instance vs list views + view_name_suffix = getattr(self, 'suffix', None) + + # By default we can't provide any form-like information, however the + # generic views override this implementation and add additional + # information for POST and PUT methods, based on the serializer. + ret = SortedDict() + ret['name'] = get_view_name(self.__class__, view_name_suffix) + ret['description'] = get_view_description(self.__class__) + ret['renders'] = [renderer.media_type for renderer in self.renderer_classes] + ret['parses'] = [parser.media_type for parser in self.parser_classes] + return ret diff --git a/vendor-local/lib/python/rest_framework/viewsets.py b/vendor-local/lib/python/rest_framework/viewsets.py new file mode 100644 index 00000000000..d91323f22df --- /dev/null +++ b/vendor-local/lib/python/rest_framework/viewsets.py @@ -0,0 +1,139 @@ +""" +ViewSets are essentially just a type of class based view, that doesn't provide +any method handlers, such as `get()`, `post()`, etc... but instead has actions, +such as `list()`, `retrieve()`, `create()`, etc... + +Actions are only bound to methods at the point of instantiating the views. + + user_list = UserViewSet.as_view({'get': 'list'}) + user_detail = UserViewSet.as_view({'get': 'retrieve'}) + +Typically, rather than instantiate views from viewsets directly, you'll +regsiter the viewset with a router and let the URL conf be determined +automatically. + + router = DefaultRouter() + router.register(r'users', UserViewSet, 'user') + urlpatterns = router.urls +""" +from __future__ import unicode_literals + +from functools import update_wrapper +from django.utils.decorators import classonlymethod +from rest_framework import views, generics, mixins + + +class ViewSetMixin(object): + """ + This is the magic. + + Overrides `.as_view()` so that it takes an `actions` keyword that performs + the binding of HTTP methods to actions on the Resource. + + For example, to create a concrete view binding the 'GET' and 'POST' methods + to the 'list' and 'create' actions... + + view = MyViewSet.as_view({'get': 'list', 'post': 'create'}) + """ + + @classonlymethod + def as_view(cls, actions=None, **initkwargs): + """ + Because of the way class based views create a closure around the + instantiated view, we need to totally reimplement `.as_view`, + and slightly modify the view function that is created and returned. + """ + # The suffix initkwarg is reserved for identifing the viewset type + # eg. 'List' or 'Instance'. + cls.suffix = None + + # sanitize keyword arguments + for key in initkwargs: + if key in cls.http_method_names: + raise TypeError("You tried to pass in the %s method name as a " + "keyword argument to %s(). Don't do that." + % (key, cls.__name__)) + if not hasattr(cls, key): + raise TypeError("%s() received an invalid keyword %r" % ( + cls.__name__, key)) + + def view(request, *args, **kwargs): + self = cls(**initkwargs) + # We also store the mapping of request methods to actions, + # so that we can later set the action attribute. + # eg. `self.action = 'list'` on an incoming GET request. + self.action_map = actions + + # Bind methods to actions + # This is the bit that's different to a standard view + for method, action in actions.items(): + handler = getattr(self, action) + setattr(self, method, handler) + + # Patch this in as it's otherwise only present from 1.5 onwards + if hasattr(self, 'get') and not hasattr(self, 'head'): + self.head = self.get + + # And continue as usual + return self.dispatch(request, *args, **kwargs) + + # take name and docstring from class + update_wrapper(view, cls, updated=()) + + # and possible attributes set by decorators + # like csrf_exempt from dispatch + update_wrapper(view, cls.dispatch, assigned=()) + + # We need to set these on the view function, so that breadcrumb + # generation can pick out these bits of information from a + # resolved URL. + view.cls = cls + view.suffix = initkwargs.get('suffix', None) + return view + + def initialize_request(self, request, *args, **kargs): + """ + Set the `.action` attribute on the view, + depending on the request method. + """ + request = super(ViewSetMixin, self).initialize_request(request, *args, **kargs) + self.action = self.action_map.get(request.method.lower()) + return request + + +class ViewSet(ViewSetMixin, views.APIView): + """ + The base ViewSet class does not provide any actions by default. + """ + pass + + +class GenericViewSet(ViewSetMixin, generics.GenericAPIView): + """ + The GenericViewSet class does not provide any actions by default, + but does include the base set of generic view behavior, such as + the `get_object` and `get_queryset` methods. + """ + pass + + +class ReadOnlyModelViewSet(mixins.RetrieveModelMixin, + mixins.ListModelMixin, + GenericViewSet): + """ + A viewset that provides default `list()` and `retrieve()` actions. + """ + pass + + +class ModelViewSet(mixins.CreateModelMixin, + mixins.RetrieveModelMixin, + mixins.UpdateModelMixin, + mixins.DestroyModelMixin, + mixins.ListModelMixin, + GenericViewSet): + """ + A viewset that provides default `create()`, `retrieve()`, `update()`, + `partial_update()`, `destroy()` and `list()` actions. + """ + pass diff --git a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/PKG-INFO b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/PKG-INFO new file mode 100644 index 00000000000..a1fcdc0331b --- /dev/null +++ b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/PKG-INFO @@ -0,0 +1,15 @@ +Metadata-Version: 1.1 +Name: rna +Version: 0.0.1 +Summary: UNKNOWN +Home-page: UNKNOWN +Author: Josh Mize +Author-email: jmize@mozilla.com +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN +Classifier: Development Status :: 2 - Pre-Alpha +Classifier: Environment :: Web Environment +Classifier: Framework :: Django +Classifier: Intended Audience :: Developers +Classifier: Programming Language :: Python diff --git a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/SOURCES.txt b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/SOURCES.txt new file mode 100644 index 00000000000..061f3bb9c32 --- /dev/null +++ b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/SOURCES.txt @@ -0,0 +1,22 @@ +setup.cfg +rna/__init__.py +rna/admin.py +rna/clients.py +rna/fields.py +rna/filters.py +rna/models.py +rna/serializers.py +rna/tests.py +rna/urls.py +rna/views.py +rna.egg-info/PKG-INFO +rna.egg-info/SOURCES.txt +rna.egg-info/dependency_links.txt +rna.egg-info/requires.txt +rna.egg-info/top_level.txt +rna/management/__init__.py +rna/management/commands/__init__.py +rna/management/commands/rnasync.py +rna/migrations/0001_initial.py +rna/migrations/0002_auto__add_release.py +rna/migrations/__init__.py \ No newline at end of file diff --git a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/dependency_links.txt b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/dependency_links.txt new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/installed-files.txt b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/installed-files.txt new file mode 100644 index 00000000000..dc462448fa4 --- /dev/null +++ b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/installed-files.txt @@ -0,0 +1,38 @@ +../rna/__init__.py +../rna/admin.py +../rna/clients.py +../rna/fields.py +../rna/filters.py +../rna/models.py +../rna/serializers.py +../rna/tests.py +../rna/urls.py +../rna/views.py +../rna/migrations/0001_initial.py +../rna/migrations/0002_auto__add_release.py +../rna/migrations/__init__.py +../rna/management/__init__.py +../rna/management/commands/__init__.py +../rna/management/commands/rnasync.py +../rna/__init__.pyc +../rna/admin.pyc +../rna/clients.pyc +../rna/fields.pyc +../rna/filters.pyc +../rna/models.pyc +../rna/serializers.pyc +../rna/tests.pyc +../rna/urls.pyc +../rna/views.pyc +../rna/migrations/0001_initial.pyc +../rna/migrations/0002_auto__add_release.pyc +../rna/migrations/__init__.pyc +../rna/management/__init__.pyc +../rna/management/commands/__init__.pyc +../rna/management/commands/rnasync.pyc +./ +dependency_links.txt +PKG-INFO +requires.txt +SOURCES.txt +top_level.txt diff --git a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/requires.txt b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/requires.txt new file mode 100644 index 00000000000..e1824861857 --- /dev/null +++ b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/requires.txt @@ -0,0 +1,4 @@ +South +Django>=1.4.9 +djangorestframework==2.3.7 +django-extensions==1.2.0 \ No newline at end of file diff --git a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/top_level.txt b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/top_level.txt new file mode 100644 index 00000000000..369c97b76f5 --- /dev/null +++ b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/top_level.txt @@ -0,0 +1 @@ +rna diff --git a/vendor-local/lib/python/rna/__init__.py b/vendor-local/lib/python/rna/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/vendor-local/lib/python/rna/admin.py b/vendor-local/lib/python/rna/admin.py new file mode 100644 index 00000000000..df1a7f72e89 --- /dev/null +++ b/vendor-local/lib/python/rna/admin.py @@ -0,0 +1,13 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from django.contrib import admin + +from . import models + + +admin.site.register(models.Channel) +admin.site.register(models.Product) +admin.site.register(models.Tag) +admin.site.register(models.Note) diff --git a/vendor-local/lib/python/rna/clients.py b/vendor-local/lib/python/rna/clients.py new file mode 100644 index 00000000000..5a88b993345 --- /dev/null +++ b/vendor-local/lib/python/rna/clients.py @@ -0,0 +1,151 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import re + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +import requests + +from . import models, serializers + + +class RestClient(object): + full_url_regex = re.compile('^https?://.*') + + def __init__(self, base_url='', token='', cache=None): + """Initialize a RestClient instance. + + Args: + base_url (str): The full URL which all requests will + be relative to. + Defaults to settings.RNA['BASE_URL'] + token (str): Token to add to Authorization HTTP header. + Defaults to settings.RNA.get('TOKEN', '') + cache (dict): Defaults to empty dict + """ + self.base_url = base_url or settings.RNA['BASE_URL'] + self.cache = cache or {} + self.token = token or settings.RNA.get('TOKEN', '') + + def request(self, method, url, **kwargs): + if self.base_url and not self.full_url_regex.match(url): + url = self.base_url + url + if self.token: + kwargs.setdefault('headers', {}) + kwargs['headers'].setdefault( + 'Authorization', 'Token ' + self.token) + return requests.request(method, url, **kwargs) + + def delete(self, url='', **kwargs): + self.cache.pop(url, None) + return self.request('delete', url, **kwargs) + + def get(self, url='', **kwargs): + if kwargs.get('params', None): + return self.request('get', url, **kwargs) + response = self.cache.get(url) + if not response: + response = self.request('get', url, **kwargs) + if response.status_code == 200: + self.cache[url] = response + return response + + def options(self, url='', **kwargs): + self.cache.setdefault('OPTIONS', {}) + if url not in self.cache['OPTIONS']: + self.cache['OPTIONS'][url] = self.request('options', url, **kwargs) + return self.cache['OPTIONS'][url] + + def post(self, url='', data=None, **kwargs): + self.cache.pop(url, None) + return self.request('post', url, data=data, **kwargs) + + def put(self, url='', data=None, **kwargs): + self.cache.pop(url, None) + return self.request('put', url, data=data, **kwargs) + + +class RestModelClient(RestClient): + model_map = {} + + def __init__(self, base_url='', token='', cache=None, model_class=None): + self.model_class = model_class + super(RestModelClient, self).__init__(base_url=base_url, token=token, + cache=cache) + + def model(self, model_class=None, save=False, modified=False, **kwargs): + data = self.get(**kwargs).json() + serializer = self.serializer(model_class or self.model_class) + if isinstance(data, list): + return [self.restore(serializer, d, save, modified) for d in data] + else: + return self.restore(serializer, data, save, modified) + + def restore(self, serializer, data, save=False, modified=False): + data.pop('url', None) + for field in serializer.Meta.model._meta.fields: + if isinstance(field, models.models.ForeignKey): + url = data.pop(field.name, None) + if url: + data[field.name] = self.hypermodel(url, field.rel.to, save) + instance = serializer.restore_object(data) + if save: + serializer.save_object(instance, modified=modified) + return instance + + def model_client(self, url_name='', model_class=None, **kwargs): + #TODO: decide appropriate level of error handling for this method + if url_name and not model_class: + kwargs.setdefault('base_url', self.get().json()[url_name]) + model_class = self.model_map[url_name] + model_class = model_class or self.model_class + self.model_map.setdefault( + model_class, + self.__class__(model_class=model_class, **kwargs)) + return self.model_map[model_class] + + def post_instance(self, instance, url='', **kwargs): + return self.post(url, self.serialize(instance), **kwargs) + + def put_instance(self, instance, url='', data=None, **kwargs): + return self.put(url, self.serialize(instance), **kwargs) + + def serialize(self, instance): + return self.serializer(instance=instance).data + + def serializer(self, model_class=None, instance=None): + model_class = model_class or self.model_class + return serializers.get_client_serializer_class(model_class)( + instance=instance) + + def hypermodel(self, url, model_class, save): + # assumes url ends in / -- probably want to make this more robust + base_url, pk, _ = url.rsplit('/', 2) + try: + instance = model_class.objects.get(pk=pk) + except ObjectDoesNotExist: + instance = self.model_client( + base_url=base_url + '/', model_class=model_class, + token=self.token).model(url='%s/' % pk, save=save) + return instance + + +class RNAModelClient(RestModelClient): + model_map = { + 'channels': models.Channel, + 'notes': models.Note, + 'products': models.Product, + 'releases': models.Release, + 'tags': models.Tag} + + +class LegacyRNAModelClient(RNAModelClient): + field_map = {models.Note: {'bug_num': 'bug', 'description': 'html'}} + + def restore(self, serializer, data, save=False, modified=True): + for legacy, f in self.field_map.get(serializer.Meta.model, {}).items(): + data[f] = data.pop(legacy, None) + return super(LegacyRNAModelClient, self).restore( + serializer, data, save=save, modified=True) diff --git a/vendor-local/lib/python/rna/fields.py b/vendor-local/lib/python/rna/fields.py new file mode 100644 index 00000000000..bcb48f6fa97 --- /dev/null +++ b/vendor-local/lib/python/rna/fields.py @@ -0,0 +1,8 @@ +from django import forms + +from rest_framework.compat import parse_datetime + + +class ISO8601DateTimeField(forms.DateTimeField): + def strptime(self, value, format): + return parse_datetime(value) diff --git a/vendor-local/lib/python/rna/filters.py b/vendor-local/lib/python/rna/filters.py new file mode 100644 index 00000000000..1d488a94c95 --- /dev/null +++ b/vendor-local/lib/python/rna/filters.py @@ -0,0 +1,46 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from rest_framework.filters import DjangoFilterBackend +import django_filters + +from . import fields, models + + +class ISO8601DateTimeFilter(django_filters.DateTimeFilter): + field_class = fields.ISO8601DateTimeField + + +class TimestampedFilterBackend(DjangoFilterBackend): + def get_filter_class(self, view, queryset=None): + filter_class = getattr(view, 'filter_class', None) + filter_fields = getattr(view, 'filter_fields', None) + filter_fields_exclude = getattr(view, 'filter_fields_exclude', ()) + + if filter_class or filter_fields: + return super(TimestampedFilterBackend, self).get_filter_class( + view, queryset=queryset) + + elif queryset and issubclass(queryset.model, models.TimeStampedModel): + class AutoFilterSet(self.default_filter_set): + created_before = ISO8601DateTimeFilter( + name='created', lookup_type='lt') + created_after = ISO8601DateTimeFilter( + name='created', lookup_type='gte') + + modified_before = ISO8601DateTimeFilter( + name='modified', lookup_type='lt') + modified_after = ISO8601DateTimeFilter( + name='modified', lookup_type='gte') + + class Meta: + model = queryset.model + fields = ['created_before', 'created_after', + 'modified_before', 'modified_after'] + fields.extend(f.name for f in model._meta.fields + if f.name not in ('created', 'modified')) + fields = [f for f in fields + if f not in filter_fields_exclude] + order_by = True + return AutoFilterSet diff --git a/vendor-local/lib/python/rna/management/__init__.py b/vendor-local/lib/python/rna/management/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/vendor-local/lib/python/rna/management/commands/__init__.py b/vendor-local/lib/python/rna/management/commands/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/vendor-local/lib/python/rna/management/commands/rnasync.py b/vendor-local/lib/python/rna/management/commands/rnasync.py new file mode 100644 index 00000000000..26030a627ac --- /dev/null +++ b/vendor-local/lib/python/rna/management/commands/rnasync.py @@ -0,0 +1,35 @@ +from django.conf import settings +from django.core.management.base import BaseCommand +from django.core.exceptions import ObjectDoesNotExist + +from ... import clients + + +class Command(BaseCommand): + # TODO: args, help, docstrings + + def rna_client(self, legacy_api=False): + if legacy_api: + return clients.LegacyRNAModelClient() + else: + return clients.RNAModelClient() + + def model_params(self, models, legacy_api=False): + params = dict((m, {}) for m in models) + if not legacy_api: + for m in models: + try: + latest = m.objects.latest('modified') + except ObjectDoesNotExist: + pass + else: + params[m]['modified_after'] = latest.modified.isoformat() + return params + + def handle(self, *args, **options): + legacy_api = settings.RNA.get('LEGACY_API', False) + rc = self.rna_client(legacy_api) + model_params = self.model_params(rc.model_map.values(), legacy_api) + for url_name, model_class in rc.model_map.items(): + params = model_params[model_class] + rc.model_client(url_name).model(save=True, params=params) diff --git a/vendor-local/lib/python/rna/migrations/0001_initial.py b/vendor-local/lib/python/rna/migrations/0001_initial.py new file mode 100644 index 00000000000..42e0933b485 --- /dev/null +++ b/vendor-local/lib/python/rna/migrations/0001_initial.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Channel' + db.create_table('rna_channel', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(db_index=True, blank=True)), + ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)), + )) + db.send_create_signal('rna', ['Channel']) + + # Adding model 'Product' + db.create_table('rna_product', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(db_index=True, blank=True)), + ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)), + ('text', self.gf('django.db.models.fields.TextField')(blank=True)), + )) + db.send_create_signal('rna', ['Product']) + + # Adding model 'Tag' + db.create_table('rna_tag', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(db_index=True, blank=True)), + ('text', self.gf('django.db.models.fields.TextField')()), + ('sort_num', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + )) + db.send_create_signal('rna', ['Tag']) + + # Adding model 'Note' + db.create_table('rna_note', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(db_index=True, blank=True)), + ('bug', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('html', self.gf('django.db.models.fields.TextField')(blank=True)), + ('first_version', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('first_channel', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='first_channel_notes', null=True, to=orm['rna.Channel'])), + ('fixed_in_version', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('fixed_in_channel', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='fixed_in_channel_notes', null=True, to=orm['rna.Channel'])), + ('tag', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rna.Tag'], null=True, blank=True)), + ('product', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rna.Product'], null=True, blank=True)), + ('sort_num', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('fixed_in_subversion', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + )) + db.send_create_signal('rna', ['Note']) + + + def backwards(self, orm): + # Deleting model 'Channel' + db.delete_table('rna_channel') + + # Deleting model 'Product' + db.delete_table('rna_product') + + # Deleting model 'Tag' + db.delete_table('rna_tag') + + # Deleting model 'Note' + db.delete_table('rna_note') + + + models = { + 'rna.channel': { + 'Meta': {'object_name': 'Channel'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + }, + 'rna.note': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, + 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'first_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'first_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), + 'first_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'fixed_in_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'fixed_in_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), + 'fixed_in_subversion': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'fixed_in_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']", 'null': 'True', 'blank': 'True'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Tag']", 'null': 'True', 'blank': 'True'}) + }, + 'rna.product': { + 'Meta': {'object_name': 'Product'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'rna.tag': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Tag'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}) + } + } + + complete_apps = ['rna'] \ No newline at end of file diff --git a/vendor-local/lib/python/rna/migrations/0002_auto__add_release.py b/vendor-local/lib/python/rna/migrations/0002_auto__add_release.py new file mode 100644 index 00000000000..4222dc9c1b3 --- /dev/null +++ b/vendor-local/lib/python/rna/migrations/0002_auto__add_release.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Release' + db.create_table('rna_release', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(db_index=True, blank=True)), + ('product', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rna.Product'])), + ('channel', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rna.Channel'])), + ('version', self.gf('django.db.models.fields.IntegerField')()), + ('sub_version', self.gf('django.db.models.fields.IntegerField')()), + ('release_date', self.gf('django.db.models.fields.DateTimeField')()), + ('text', self.gf('django.db.models.fields.TextField')(blank=True)), + )) + db.send_create_signal('rna', ['Release']) + + + def backwards(self, orm): + # Deleting model 'Release' + db.delete_table('rna_release') + + + models = { + 'rna.channel': { + 'Meta': {'object_name': 'Channel'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + }, + 'rna.note': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, + 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'first_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'first_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), + 'first_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'fixed_in_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'fixed_in_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), + 'fixed_in_subversion': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'fixed_in_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']", 'null': 'True', 'blank': 'True'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Tag']", 'null': 'True', 'blank': 'True'}) + }, + 'rna.product': { + 'Meta': {'object_name': 'Product'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'rna.release': { + 'Meta': {'object_name': 'Release'}, + 'channel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Channel']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']"}), + 'release_date': ('django.db.models.fields.DateTimeField', [], {}), + 'sub_version': ('django.db.models.fields.IntegerField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'version': ('django.db.models.fields.IntegerField', [], {}) + }, + 'rna.tag': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Tag'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}) + } + } + + complete_apps = ['rna'] \ No newline at end of file diff --git a/vendor-local/lib/python/rna/migrations/__init__.py b/vendor-local/lib/python/rna/migrations/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/vendor-local/lib/python/rna/models.py b/vendor-local/lib/python/rna/models.py new file mode 100644 index 00000000000..0435162d8ea --- /dev/null +++ b/vendor-local/lib/python/rna/models.py @@ -0,0 +1,86 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from datetime import datetime + +from django.db import models +from django_extensions.db.fields import CreationDateTimeField + + +class TimeStampedModel(models.Model): + """ + Replacement for django_extensions.db.models.TimeStampedModel + that updates the modified timestamp by default, but allows + that behavior to be overridden by passing a modified=False + parameter to the save method + """ + created = CreationDateTimeField() + modified = models.DateTimeField(editable=False, blank=True, db_index=True) + + class Meta: + abstract = True + + def save(self, *args, **kwargs): + if kwargs.pop('modified', True): + self.modified = datetime.now() + super(TimeStampedModel, self).save(*args, **kwargs) + + +class Channel(TimeStampedModel): + name = models.CharField(unique=True, max_length=255) + + def __unicode__(self): + return self.name + + +class Product(TimeStampedModel): + name = models.CharField(unique=True, max_length=255) + text = models.TextField(blank=True) + + def __unicode__(self): + return self.name + + +class Tag(TimeStampedModel): + text = models.TextField() + sort_num = models.IntegerField(null=True, blank=True) + + class Meta: + ordering = ('sort_num',) + + def __unicode__(self): + return self.text + + +class Note(TimeStampedModel): + bug = models.IntegerField(null=True, blank=True) + html = models.TextField(blank=True) + first_version = models.IntegerField(null=True, blank=True) + first_channel = models.ForeignKey( + Channel, null=True, blank=True, related_name='first_channel_notes') + fixed_in_version = models.IntegerField(null=True, blank=True) + fixed_in_channel = models.ForeignKey( + Channel, null=True, blank=True, related_name='fixed_in_channel_notes') + tag = models.ForeignKey(Tag, null=True, blank=True) + product = models.ForeignKey(Product, null=True, blank=True) + sort_num = models.IntegerField(null=True, blank=True) + fixed_in_subversion = models.IntegerField(null=True, blank=True) + + class Meta: + ordering = ('sort_num',) + + def __unicode__(self): + return self.html + + +class Release(TimeStampedModel): + product = models.ForeignKey(Product) + channel = models.ForeignKey(Channel) + version = models.IntegerField() + sub_version = models.IntegerField() + release_date = models.DateTimeField() + text = models.TextField(blank=True) + + def __unicode__(self): + return self.text diff --git a/vendor-local/lib/python/rna/serializers.py b/vendor-local/lib/python/rna/serializers.py new file mode 100644 index 00000000000..804d123d7d7 --- /dev/null +++ b/vendor-local/lib/python/rna/serializers.py @@ -0,0 +1,48 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from django.conf import settings + +from rest_framework import serializers +from rest_framework.compat import parse_datetime + + +def get_client_serializer_class(model_class): + if settings.RNA.get('LEGACY_API', False): + Serializer = serializers.ModelSerializer + else: + Serializer = UnmodifiedTimestampSerializer + + class ClientSerializer(Serializer): + class Meta: + model = model_class + + return ClientSerializer + + +class HyperlinkedModelSerializerWithPkField( + serializers.HyperlinkedModelSerializer): + + def get_pk_field(self, model_field): + """ + Returns a default instance of the pk field, unlike + the parent class, which omits the pk field. + """ + return self.get_field(model_field) + + +class UnmodifiedTimestampSerializer(serializers.ModelSerializer): + def restore_object(self, attrs, instance=None): + obj = super(UnmodifiedTimestampSerializer, self).restore_object( + attrs, instance=instance) + for attr in ('created', 'modified'): # TODO: dynamic attr list + value = getattr(obj, attr, None) + if value and isinstance(value, basestring): + setattr(obj, attr, parse_datetime(value)) + return obj + + def save_object(self, obj, **kwargs): + kwargs['modified'] = False + return super(UnmodifiedTimestampSerializer, self).save_object( + obj, **kwargs) diff --git a/vendor-local/lib/python/rna/tests.py b/vendor-local/lib/python/rna/tests.py new file mode 100644 index 00000000000..7add0895d98 --- /dev/null +++ b/vendor-local/lib/python/rna/tests.py @@ -0,0 +1,730 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from datetime import datetime + +from django.core.exceptions import ObjectDoesNotExist +from django.test import TestCase +from django.test.utils import override_settings +from mock import Mock, patch +from nose.tools import eq_, ok_ + +from . import clients, fields, filters, models, serializers, views +from .management.commands import rnasync + + +class AdminTest(TestCase): + @patch('django.contrib.admin.site.register') + def test_register(self, mock_register): + import rna.rna.admin # NOQA + mock_register.assert_any_call(models.Channel) + mock_register.assert_any_call(models.Product) + mock_register.assert_any_call(models.Tag) + mock_register.assert_any_call(models.Note) + + +class TimeStampedModelTest(TestCase): + @patch('rna.rna.models.models.Model.save') + def test_default_modified(self, mock_super_save): + start = datetime.now() + model = models.TimeStampedModel() + model.save(db='test') + ok_(model.modified > start) + mock_super_save.assert_called_once_with(db='test') + + @patch('rna.rna.models.models.Model.save') + def test_unmodified(self, mock_super_save): + model = models.TimeStampedModel() + model.modified = space_odyssey = datetime(2001, 1, 1) + model.save(modified=False, db='test') + eq_(model.modified, space_odyssey) + mock_super_save.assert_called_once_with(db='test') + + +class ChannelTest(TestCase): + def test_unicode(self): + """ + Should equal name + """ + channel = models.Channel(name='test') + eq_(unicode(channel), 'test') + + +class ProductTest(TestCase): + def test_unicode(self): + """ + Should equal name + """ + product = models.Product(name='test') + eq_(unicode(product), 'test') + + +class NoteTest(TestCase): + def test_unicode(self): + """ + Should equal description + """ + note = models.Note(html='test') + eq_(unicode(note), 'test') + + +class TagTest(TestCase): + def test_unicode(self): + """ + Should equal text + """ + tag = models.Tag(text='test') + eq_(unicode(tag), 'test') + + +class ReleaseTest(TestCase): + def test_unicode(self): + """ + Should equal name + """ + release = models.Release(text='test') + eq_(unicode(release), 'test') + + +class ISO8601DateTimeFieldTest(TestCase): + @patch('rna.rna.fields.parse_datetime') + def test_strptime(self, mock_parse_datetime): + """ + Should equal expected_date returned by mock_parse_datetime + """ + expected_date = datetime(2001, 1, 1) + mock_parse_datetime.return_value = expected_date + field = fields.ISO8601DateTimeField() + eq_(field.strptime('value', 'format'), expected_date) + + +class TimeStampedModelSubclass(models.TimeStampedModel): + test = models.models.BooleanField(default=True) + + +class TimestampedFilterBackendTest(TestCase): + @patch('rna.rna.filters.DjangoFilterBackend.get_filter_class', + return_value='The Dude') + def test_filter_class(self, mock_super_get_filter_class): + """ + Should return super call if view has filter_class attr + """ + mock_view = Mock(filter_class='abides') + filter_backend = filters.TimestampedFilterBackend() + eq_(filter_backend.get_filter_class(mock_view), 'The Dude') + + @patch('rna.rna.filters.DjangoFilterBackend.get_filter_class', + return_value='The Dude') + def test_filter_fields(self, mock_super_get_filter_class): + """ + Should return super call if view has filter_fields attr + """ + mock_view = Mock(filter_fields='abides') + filter_backend = filters.TimestampedFilterBackend() + eq_(filter_backend.get_filter_class(mock_view), 'The Dude') + + @patch('rna.rna.filters.DjangoFilterBackend.get_filter_class') + def test_no_queryset(self, mock_super_get_filter_class): + """ + Should return None if queryset is None (the default) + """ + view = 'nice' + filter_backend = filters.TimestampedFilterBackend() + eq_(filter_backend.get_filter_class(view), None) + ok_(not mock_super_get_filter_class.called) + + @patch('rna.rna.filters.DjangoFilterBackend.get_filter_class') + def test_non_timestampedmodel(self, mock_super_get_filter_class): + """ + Should return None if queryset.model is not a subclass of + models.TimeStampedModel + """ + view = 'nice' + queryset = Mock(model=models.models.Model) # model + filter_backend = filters.TimestampedFilterBackend() + eq_(filter_backend.get_filter_class(view, queryset=queryset), None) + ok_(not mock_super_get_filter_class.called) + + @patch('rna.rna.filters.DjangoFilterBackend.get_filter_class') + def test_default(self, mock_super_get_filter_class): + """ + Should return a subclass of the default_filter_set instance + attr with the inner Meta class model attr equal to the queryset + model and fields equal to all of the model fields except + created and modified, and in addition the created_before, + created_after, modified_before, and modified_after fields + """ + view = 'nice' + queryset = Mock(model=TimeStampedModelSubclass) + filter_backend = filters.TimestampedFilterBackend() + filter_class = filter_backend.get_filter_class(view, queryset=queryset) + eq_(filter_class.Meta.model, TimeStampedModelSubclass) + eq_(filter_class.Meta.fields, + ['created_before', 'created_after', 'modified_before', + 'modified_after', 'id', 'test']) + ok_(not mock_super_get_filter_class.called) + + @patch('rna.rna.filters.DjangoFilterBackend.get_filter_class') + def test_exclude_fields(self, mock_super_get_filter_class): + """ + Should not include fields named in the view. + """ + mock_view = Mock( + filter_class=None, filter_fields=None, + filter_fields_exclude=('created_before', 'id')) + queryset = Mock(model=TimeStampedModelSubclass) + filter_backend = filters.TimestampedFilterBackend() + filter_class = filter_backend.get_filter_class( + mock_view, queryset=queryset) + eq_(filter_class.Meta.model, TimeStampedModelSubclass) + eq_(filter_class.Meta.fields, + ['created_after', 'modified_before', 'modified_after', 'test']) + eq_(mock_super_get_filter_class.called, 0) + + +class RestClientTest(TestCase): + def test_init_kwargs(self): + """ + Should set base_url and token attr from kwargs + """ + rc = clients.RestClient(base_url='http://thedu.de', token='midnight') + eq_(rc.base_url, 'http://thedu.de') + eq_(rc.token, 'midnight') + + @override_settings(RNA={'TOKEN': 'midnight', + 'BASE_URL': 'http://thedu.de'}) + def test_init_settings(self): + """ + Should set base_url and token attrs from settings + """ + rc = clients.RestClient() + eq_(rc.base_url, 'http://thedu.de') + eq_(rc.token, 'midnight') + + @patch('rna.rna.clients.requests.request') + def test_request_base_url_concat(self, mock_request): + """ + Should concatenate base_url and url + """ + + rc = clients.RestClient(base_url='http://thedu.de') + mock_request.return_value = 'response' + response = rc.request('get', '/abides') + mock_request.assert_called_once_with('get', 'http://thedu.de/abides') + eq_(response, 'response') + + @patch('rna.rna.clients.requests.request') + def test_request_redundant_url(self, mock_request): + """ + Should not concatenate base_url if url starts with it + """ + + rc = clients.RestClient(base_url='http://thedu.de') + mock_request.return_value = Mock(content='{"aggression": "not stand"}') + response = rc.request('get', 'http://thedu.de/abides') + eq_(response.content, '{"aggression": "not stand"}') + mock_request.assert_called_once_with('get', 'http://thedu.de/abides') + + @patch('rna.rna.clients.requests.request') + def test_request_token(self, mock_request): + """ + Should set Authorization header to expected format + """ + mock_request.return_value = 'this aggression will not stand!' + rc = clients.RestClient(base_url='http://thedu.de', token='midnight') + response = rc.request('get', '') + mock_request.assert_called_once_with( + 'get', 'http://thedu.de', + headers={'Authorization': 'Token midnight'}) + eq_(response, 'this aggression will not stand!') + + @patch('rna.rna.clients.requests.request') + def test_request_token_preserves_headers(self, mock_request): + """ + Should set Authorization header to expected format without removing + other headers + """ + + mock_request.return_value = 'this aggression will not stand!' + rc = clients.RestClient(base_url='http://thedu.de', token='midnight') + + response = rc.request('get', '', headers={'White': 'Russian'}) + mock_request.assert_called_once_with( + 'get', 'http://thedu.de', + headers={'Authorization': 'Token midnight', 'White': 'Russian'}) + eq_(response, 'this aggression will not stand!') + + @patch('rna.rna.clients.requests.request') + def test_request_delete(self, mock_request): + """ + Should return unmodified response from requests.request + """ + rc = clients.RestClient(base_url='http://th.is') + mock_request.return_value = Mock(status_code=204) + response = rc.request('delete', '/aggression') + mock_request.assert_called_once_with( + 'delete', 'http://th.is/aggression') + eq_(response.status_code, 204) + + @patch('rna.rna.clients.RestClient.request') + def test_delete(self, mock_request): + """ + Should pass through kwargs and return unmodified response from + self.request + """ + rc = clients.RestClient(base_url='http://th.is') + mock_request.return_value = Mock(status_code=204) + response = rc.delete('/aggression', params={'will': 'not stand'}) + mock_request.assert_called_once_with( + 'delete', '/aggression', params={'will': 'not stand'}) + eq_(response.status_code, 204) + + @patch('rna.rna.clients.RestClient.request') + def test_get_params(self, mock_request): + """ + Should pass through kwargs and return unmodified response from + self.request + """ + rc = clients.RestClient(base_url='http://thedu.de') + mock_request.return_value = 'abides' + response = rc.get('', params={'white': 'russian'}) + mock_request.assert_called_once_with( + 'get', '', params={'white': 'russian'}) + eq_(response, 'abides') + + @patch('rna.rna.clients.RestClient.request') + def test_get_cached(self, mock_request): + """ + Should return cached response without calling self.request + """ + rc = clients.RestClient(base_url='http://thedu.de') + rc.cache = {'': 'abides'} + response = rc.get() + eq_(response, 'abides') + ok_(not mock_request.called) + + @patch('rna.rna.clients.RestClient.request') + def test_get_cache_miss_200(self, mock_request): + """ + Should cache and return response + """ + mock_request.return_value = Mock(status_code=200) + rc = clients.RestClient() + response = rc.get() + mock_request.assert_called_once_with('get', '') + eq_(response.status_code, 200) + eq_(rc.cache[''].status_code, 200) + + @patch('rna.rna.clients.RestClient.request') + def test_get_cache_miss_500(self, mock_request): + """ + Should return response without caching + """ + mock_request.return_value = Mock(status_code=500) + rc = clients.RestClient() + response = rc.get() + eq_(response.status_code, 500) + mock_request.assert_called_once_with('get', '') + eq_(rc.cache, {}) + + @patch('rna.rna.clients.RestClient.request') + def test_options(self, mock_request): + """ + Should pass through kwargs and return unmodified response from + self.request + """ + rc = clients.RestClient(base_url='http://thedu.de') + mock_request.return_value = {'white': 'russians'} + response = rc.options('/drinks') + mock_request.assert_called_once_with('options', '/drinks') + eq_(response, {'white': 'russians'}) + + @patch('rna.rna.clients.RestClient.request') + def test_options_cached(self, mock_request): + """ + Should return cached value without calling self.request + """ + rc = clients.RestClient(base_url='http://thedu.de') + rc.cache['OPTIONS'] = {'/drinks': {'white': 'russians'}} + response = rc.options('/drinks') + eq_(mock_request.called, 0) + eq_(response, {'white': 'russians'}) + + @patch('rna.rna.clients.RestClient.request') + def test_post(self, mock_request): + """ + Should pass through data to, and return unmodified response + from, self.request + """ + rc = clients.RestClient(base_url='http://walt.er') + mock_request.return_value = Mock( + content='Is this your homework, Larry?') + response = rc.post('/larry', data={'world': 'of pain'}) + mock_request.assert_called_once_with( + 'post', '/larry', data={'world': 'of pain'}) + eq_(response.content, 'Is this your homework, Larry?') + + @patch('rna.rna.clients.RestClient.request') + def test_put(self, mock_request): + """ + Should pass through data to, and return unmodified response + from, self.request + """ + rc = clients.RestClient(base_url='http://walt.er') + mock_request.return_value = Mock( + content='Is this your homework, Larry?') + response = rc.put('/larry', data={'world': 'of pain'}) + mock_request.assert_called_once_with( + 'put', '/larry', data={'world': 'of pain'}) + eq_(response.content, 'Is this your homework, Larry?') + + +class RestModelClientTest(TestCase): + @patch('rna.rna.clients.RestClient.__init__') + def test_init_kwargs(self, mock_super_init): + """ + Should set model_class from model_class kwarg + """ + rc = clients.RestModelClient( + base_url='http://thedu.de', token='midnight', model_class='super') + eq_(rc.model_class, 'super') + mock_super_init.assert_called_once_with( + base_url='http://thedu.de', cache=None, token='midnight') + + @patch('rna.rna.clients.RestModelClient.serializer') + @patch('rna.rna.clients.RestModelClient.restore') + @patch('rna.rna.clients.RestModelClient.get') + def test_model(self, mock_get, mock_restore, mock_serializer): + """ + Should pass data from super get to restore method and return instance + """ + data = {'rank': 'lieutenant commander'} + mock_get.return_value = Mock(json=lambda: data) + mock_serializer.return_value = 'mock serializer' + mock_restore.return_value = 'instance' + rc = clients.RestModelClient() + instance = rc.model(model_class='super') + eq_(instance, 'instance') + mock_serializer.assert_called_once_with('super') + mock_restore.assert_called_once_with( + 'mock serializer', data, False, False) + + @patch('rna.rna.clients.RestModelClient.serializer') + @patch('rna.rna.clients.RestModelClient.restore') + @patch('rna.rna.clients.RestModelClient.get') + def test_models(self, mock_get, mock_restore, mock_serializer): + """ + Should return list of model instances if data from get is a list + """ + data = [{'rank': 'lieutenant commander'}, {'eyes': 'yellow'}] + mock_get.return_value = Mock(json=lambda: data) + mock_serializer.return_value = 'mock serializer' + rc = clients.RestModelClient() + rc.model(model_class='super') + mock_serializer.assert_called_once_with('super') + mock_restore.assert_any_call( + 'mock serializer', data[0], False, False) + mock_restore.assert_any_call( + 'mock serializer', data[1], False, False) + + @patch('rna.rna.clients.RestModelClient.hypermodel') + def test_restore(self, mock_hypermodel): + """ + Should return instance from serializer.restore_object + Should remove url field from data + Should use hypermodel method on FK fields + """ + mock_fk_field = Mock(spec=models.models.ForeignKey) + mock_fk_field.name = 'fk' + mock_fk_field.rel = Mock(to='to') + mock_fk_field_not_in_data = Mock(spec=models.models.ForeignKey) + mock_fk_field_not_in_data.name = 'no data' + fields = [mock_fk_field, 'non_fk_field', mock_fk_field_not_in_data] + mock_serializer = Mock() + mock_serializer.Meta.model._meta.fields = fields + data = {'url': 'http://remove.me', 'fk': 'http://thedu.de'} + + rc = clients.RestModelClient() + instance = rc.restore(mock_serializer, data) + eq_(instance, mock_serializer.restore_object.return_value) + mock_hypermodel.assert_called_once_with('http://thedu.de', 'to', False) + mock_serializer.restore_object.assert_called_once_with( + {'fk': mock_hypermodel.return_value}) + eq_(mock_serializer.save_object.called, 0) + + @patch('rna.rna.clients.RestModelClient.hypermodel') + def test_restore_save_modified(self, mock_hypermodel): + """ + Should pass instance to serializer.save_object + """ + mock_serializer = Mock() + mock_serializer.Meta.model._meta.fields = [] + + rc = clients.RestModelClient() + instance = rc.restore(mock_serializer, {}, save=True, modified=True) + eq_(instance, mock_serializer.restore_object.return_value) + mock_serializer.restore_object.assert_called_once_with({}) + mock_serializer.save_object.assert_called_once_with(instance, modified=True) + eq_(mock_hypermodel.called, 0) + + @patch('rna.rna.clients.RestModelClient.serialize') + @patch('rna.rna.clients.RestModelClient.post') + def test_post_instance(self, mock_post, mock_serialize): + """ + Should pass serialized data to post method + """ + instance = 'instance' + rc = clients.RestModelClient() + response = rc.post_instance(instance, 'http://positronic.net') + eq_(response, mock_post.return_value) + mock_post.assert_called_once_with( + 'http://positronic.net', mock_serialize.return_value) + mock_serialize.assert_called_once_with(instance) + + @patch('rna.rna.clients.RestModelClient.serialize') + @patch('rna.rna.clients.RestModelClient.put') + def test_put_instance(self, mock_put, mock_serialize): + """ + Should pass serialized data to put method + """ + instance = 'instance' + rc = clients.RestModelClient() + response = rc.put_instance(instance, 'http://positronic.net') + eq_(response, mock_put.return_value) + mock_put.assert_called_once_with( + 'http://positronic.net', mock_serialize.return_value) + mock_serialize.assert_called_once_with(instance) + + @patch('rna.rna.clients.RestClient.__init__') + @patch('rna.rna.clients.RestModelClient.serializer') + def test_serialize(self, mock_serializer, mock_super_init): + """ + Should pass instance through to serializer and return data attr + """ + serialized_data = '{"eyes": "yellow"}' + mock_serializer.return_value = Mock(data=serialized_data) + mock_instance = Mock(eyes='yellow') + rc = clients.RestModelClient() + serialized = rc.serialize(instance=mock_instance) + eq_(serialized, serialized_data) + mock_serializer.assert_called_once_with(instance=mock_instance) + + def test_model_client_default(self): + rc = clients.RestModelClient(model_class='super') + model_client = rc.model_client(model_class='amateur') + ok_(isinstance(model_client, clients.RestModelClient)) + eq_(model_client.model_class, 'amateur') + eq_(rc.model_map['amateur'], model_client) + + @patch('rna.rna.clients.RestModelClient.get', + return_value=Mock(json=lambda: {'the_dude': 'http://abid.es'})) + def test_model_client_url_name(self, mock_get): + rc = clients.RestModelClient() + rc.model_map['the_dude'] = 'abides' + model_client = rc.model_client(url_name='the_dude') + eq_(model_client.base_url, 'http://abid.es') + eq_(model_client.model_class, 'abides') + eq_(rc.model_map['abides'], model_client) + mock_get.assert_called_once_with() + + @patch('rna.rna.serializers.get_client_serializer_class') + def test_serializer(self, mock_get_client_serializer_class): + mock_serializer_class = Mock(return_value='mock serializer') + mock_get_client_serializer_class.return_value = mock_serializer_class + rc = clients.RestModelClient() + serializer = rc.serializer(model_class='super', instance='this') + eq_(serializer, 'mock serializer') + mock_get_client_serializer_class.assert_called_once_with('super') + mock_serializer_class.assert_called_once_with(instance='this') + + def test_hypermodel_exists(self): + mock_model_class = Mock() + + rc = clients.RestModelClient() + instance = rc.hypermodel('http://the.answ.er/is/42/', mock_model_class, + False) + eq_(instance, mock_model_class.objects.get.return_value) + mock_model_class.objects.get.assert_called_once_with(pk='42') + + @patch('rna.rna.clients.RestModelClient.model_client') + def test_hypermodel_does_not_exist(self, mock_model_client): + mock_model_class = Mock() + mock_model_class.objects.get.side_effect = ObjectDoesNotExist + + mock_model = Mock(return_value='what was the question?') + mock_model_client.return_value = Mock(model=mock_model) + + rc = clients.RestModelClient(token='midnight') + instance = rc.hypermodel('http://the.answ.er/is/42/', mock_model_class, + False) + + eq_(instance, 'what was the question?') + mock_model_class.objects.get.assert_called_once_with(pk='42') + mock_model_client.assert_called_once_with( + base_url='http://the.answ.er/is/', model_class=mock_model_class, + token='midnight') + mock_model.assert_called_once_with(url='42/', save=False) + + +class RNASyncCommandTest(TestCase): + @patch('rna.rna.clients.LegacyRNAModelClient.__init__') + def test_rna_client_legacy_api(self, mock_init): + """ + Should return a LegacyRNAModelClient instance + """ + mock_init.return_value = None + instance = rnasync.Command().rna_client(True) + ok_(isinstance(instance, clients.LegacyRNAModelClient)) + mock_init.assert_called_once_with() + + @patch('rna.rna.clients.RNAModelClient.__init__') + def test_rna_client_non_legacy_api(self, mock_init): + """ + Should return an RNAModelClient instance + """ + mock_init.return_value = None + instance = rnasync.Command().rna_client(False) + ok_(isinstance(instance, clients.RNAModelClient)) + mock_init.assert_called_once_with() + + def test_model_params_legacy_api(self): + """ + Should return mapping of models to empty dicts + """ + models = ['model1', 'model2'] + params = rnasync.Command().model_params(models, legacy_api=True) + eq_(params, {'model1': {}, 'model2': {}}) + + def test_model_params_non_legacy_api_no_latest(self): + """ + Should return mapping of mock_model to empty dict + """ + legacy_api = False + latest = Mock(side_effect=ObjectDoesNotExist) + mock_model = Mock(objects=Mock(latest=latest)) + + params = rnasync.Command().model_params([mock_model], legacy_api) + + eq_(params, {mock_model: {}}) + latest.assert_called_once_with('modified') + + def test_model_params_non_legacy_api_with_latest(self): + """ + Should return mapping of model to query params dict with a + 'modified_after' key and a value of the latest modified datetime + in ISO 8601 format + """ + legacy_api = False + mock_isoformat = lambda: '2013-10-22T22:29:03.718815' + mock_instance = Mock(modified=Mock(isoformat=mock_isoformat)) + latest = Mock(return_value=mock_instance) + mock_model = Mock(objects=Mock(latest=latest)) + + params = rnasync.Command().model_params([mock_model], legacy_api) + + eq_(params, {mock_model: {'modified_after': mock_isoformat()}}) + latest.assert_called_once_with('modified') + + @override_settings(RNA={'LEGACY_API': True}) + @patch('rna.rna.management.commands.rnasync.Command.rna_client') + @patch('rna.rna.management.commands.rnasync.Command.model_params') + def test_handle(self, mock_model_params, mock_rna_client): + mock_model = Mock() + mock_model_client = Mock(return_value=Mock(model=mock_model)) + mock_rna_client.return_value = Mock( + model_map={'mock_url_name': 'mock_model'}, + model_client=mock_model_client) + params = {'modified_after': '2013-10-22T22:29:03.718815'} + mock_model_params.return_value = {'mock_model': params} + + rnasync.Command().handle() + + mock_rna_client.assert_called_once_with(True) + mock_model_params.assert_called_once_with(['mock_model'], True) + mock_model_client.assert_called_once_with('mock_url_name') + mock_model.assert_called_once_with(save=True, params=params) + + +class GetClientSerializerClassTest(TestCase): + @override_settings(RNA={'LEGACY_API': False}) + def test_get_client_serializer_class(self): + ClientSerializer = serializers.get_client_serializer_class( + 'mock_model_class') + ok_(issubclass(ClientSerializer, + serializers.UnmodifiedTimestampSerializer)) + eq_(ClientSerializer.Meta.model, 'mock_model_class') + + @override_settings(RNA={'LEGACY_API': True}) + def test_get_legacy_client_serializer_class(self): + ClientSerializer = serializers.get_client_serializer_class( + 'mock_model_class') + ok_(issubclass(ClientSerializer, + serializers.serializers.ModelSerializer)) + eq_(ClientSerializer.Meta.model, 'mock_model_class') + + +class HyperlinkedModelSerializerWithPkFieldTest(TestCase): + @patch('rna.rna.serializers.HyperlinkedModelSerializerWithPkField' + '.get_field', return_value='mock field') + @patch('rna.rna.serializers.HyperlinkedModelSerializerWithPkField' + '.__init__', return_value=None) + def test_get_pk_field(self, mock_init, mock_get_field): + serializer = serializers.HyperlinkedModelSerializerWithPkField() + eq_(serializer.get_pk_field('model_field'), 'mock field') + mock_get_field.assert_called_once_with('model_field') + + +class UnmodifiedTimestampSerializerTest(TestCase): + @patch('rna.rna.serializers.serializers.ModelSerializer.restore_object', + return_value=Mock(created='mock datetime str')) + @patch('rna.rna.serializers.parse_datetime', + return_value='mock parsed datetime') + @patch('rna.rna.serializers.UnmodifiedTimestampSerializer.__init__', + return_value=None) + def test_restore_object(self, mock_init, mock_parse_datetime, + mock_super_restore_object): + serializer = serializers.UnmodifiedTimestampSerializer() + obj = serializer.restore_object('attrs') + eq_(obj.created, 'mock parsed datetime') + mock_super_restore_object.assert_called_once_with( + 'attrs', instance=None) + mock_parse_datetime.assert_called_once_with('mock datetime str') + + @patch('rna.rna.serializers.serializers.ModelSerializer.save_object', + return_value='abides') + @patch('rna.rna.serializers.UnmodifiedTimestampSerializer.__init__', + return_value=None) + def test_save_object(self, mock_init, mock_super_save_object): + serializer = serializers.UnmodifiedTimestampSerializer() + the_dude = serializer.save_object('the dude', modified=True) + eq_(the_dude, 'abides') + mock_super_save_object.assert_called_once_with( + 'the dude', modified=False) + + +class URLsTest(TestCase): + @patch('rest_framework.routers.DefaultRouter.register') + @patch('rest_framework.routers.DefaultRouter.urls') + def test_urls(self, mock_urls, mock_register): + from . import urls + mock_register.assert_any_call('channels', views.ChannelViewSet) + mock_register.assert_any_call('notes', views.NoteViewSet) + mock_register.assert_any_call('products', views.ProductViewSet) + mock_register.assert_any_call('releases', views.ReleaseViewSet) + mock_register.assert_any_call('tags', views.TagViewSet) + eq_(urls.urlpatterns, mock_urls) + + +class LegacyRNAModelTest(TestCase): + @patch('rna.rna.clients.RNAModelClient.restore', + return_value='restored') + def test_restore(self, mock_super_restore): + data = {'bug_num': 42, 'description': 'arthur dent'} + lc = clients.LegacyRNAModelClient() + serializer = Mock(Meta=Mock(model=models.Note)) + restored = lc.restore(serializer, data=data) + eq_(restored, 'restored') + mock_super_restore.assert_called_once_with( + serializer, {'bug': 42, 'html': 'arthur dent'}, save=False, + modified=True) diff --git a/vendor-local/lib/python/rna/urls.py b/vendor-local/lib/python/rna/urls.py new file mode 100644 index 00000000000..dc78428a694 --- /dev/null +++ b/vendor-local/lib/python/rna/urls.py @@ -0,0 +1,17 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from rest_framework import routers + +from . import views + + +router = routers.DefaultRouter() +router.register('channels', views.ChannelViewSet) +router.register('notes', views.NoteViewSet) +router.register('products', views.ProductViewSet) +router.register('releases', views.ReleaseViewSet) +router.register('tags', views.TagViewSet) + +urlpatterns = router.urls diff --git a/vendor-local/lib/python/rna/views.py b/vendor-local/lib/python/rna/views.py new file mode 100644 index 00000000000..609faf22053 --- /dev/null +++ b/vendor-local/lib/python/rna/views.py @@ -0,0 +1,27 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from rest_framework.viewsets import ModelViewSet + +from . import models + + +class ChannelViewSet(ModelViewSet): + model = models.Channel + + +class ProductViewSet(ModelViewSet): + model = models.Product + + +class TagViewSet(ModelViewSet): + model = models.Tag + + +class NoteViewSet(ModelViewSet): + model = models.Note + + +class ReleaseViewSet(ModelViewSet): + model = models.Release diff --git a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/PKG-INFO b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/PKG-INFO new file mode 100644 index 00000000000..efb87374abe --- /dev/null +++ b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/PKG-INFO @@ -0,0 +1,32 @@ +Metadata-Version: 1.1 +Name: six +Version: 1.4.1 +Summary: Python 2 and 3 compatibility utilities +Home-page: http://pypi.python.org/pypi/six/ +Author: Benjamin Peterson +Author-email: benjamin@python.org +License: UNKNOWN +Description: Six is a Python 2 and 3 compatibility library. It provides utility functions + for smoothing over the differences between the Python versions with the goal of + writing Python code that is compatible on both Python versions. See the + documentation for more information on what is provided. + + Six supports every Python version since 2.4. It is contained in only one Python + file, so it can be easily copied into your project. (The copyright and license + notice must be retained.) + + Online documentation is at http://pythonhosted.org/six/. + + Bugs can be reported to http://bitbucket.org/gutworth/six. The code can also be + found there. + + For questions about six or porting in general, email the python-porting mailing + list: http://mail.python.org/mailman/listinfo/python-porting + +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities diff --git a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/SOURCES.txt b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/SOURCES.txt new file mode 100644 index 00000000000..b08d0832df5 --- /dev/null +++ b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/SOURCES.txt @@ -0,0 +1,6 @@ +README +six.py +six.egg-info/PKG-INFO +six.egg-info/SOURCES.txt +six.egg-info/dependency_links.txt +six.egg-info/top_level.txt \ No newline at end of file diff --git a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/dependency_links.txt b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/dependency_links.txt new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/installed-files.txt b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/installed-files.txt new file mode 100644 index 00000000000..3873de50351 --- /dev/null +++ b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/installed-files.txt @@ -0,0 +1,7 @@ +../six.py +../six.pyc +./ +dependency_links.txt +PKG-INFO +SOURCES.txt +top_level.txt diff --git a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/top_level.txt b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/top_level.txt new file mode 100644 index 00000000000..ffe2fce4989 --- /dev/null +++ b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/top_level.txt @@ -0,0 +1 @@ +six diff --git a/vendor-local/lib/python/six.py b/vendor-local/lib/python/six.py new file mode 100644 index 00000000000..85898ec7127 --- /dev/null +++ b/vendor-local/lib/python/six.py @@ -0,0 +1,577 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2013 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.4.1" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) + # This is a bit ugly, but it avoids running this again. + delattr(tp, self.name) + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + + +class _MovedItems(types.ModuleType): + """Lazy loading of moved objects""" + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("winreg", "_winreg"), +] +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) +del attr + +moves = sys.modules[__name__ + ".moves"] = _MovedItems(__name__ + ".moves") + + + +class Module_six_moves_urllib_parse(types.ModuleType): + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +sys.modules[__name__ + ".moves.urllib_parse"] = Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse") +sys.modules[__name__ + ".moves.urllib.parse"] = Module_six_moves_urllib_parse(__name__ + ".moves.urllib.parse") + + +class Module_six_moves_urllib_error(types.ModuleType): + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +sys.modules[__name__ + ".moves.urllib_error"] = Module_six_moves_urllib_error(__name__ + ".moves.urllib_error") +sys.modules[__name__ + ".moves.urllib.error"] = Module_six_moves_urllib_error(__name__ + ".moves.urllib.error") + + +class Module_six_moves_urllib_request(types.ModuleType): + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +sys.modules[__name__ + ".moves.urllib_request"] = Module_six_moves_urllib_request(__name__ + ".moves.urllib_request") +sys.modules[__name__ + ".moves.urllib.request"] = Module_six_moves_urllib_request(__name__ + ".moves.urllib.request") + + +class Module_six_moves_urllib_response(types.ModuleType): + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +sys.modules[__name__ + ".moves.urllib_response"] = Module_six_moves_urllib_response(__name__ + ".moves.urllib_response") +sys.modules[__name__ + ".moves.urllib.response"] = Module_six_moves_urllib_response(__name__ + ".moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(types.ModuleType): + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +sys.modules[__name__ + ".moves.urllib_robotparser"] = Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib_robotparser") +sys.modules[__name__ + ".moves.urllib.robotparser"] = Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + parse = sys.modules[__name__ + ".moves.urllib_parse"] + error = sys.modules[__name__ + ".moves.urllib_error"] + request = sys.modules[__name__ + ".moves.urllib_request"] + response = sys.modules[__name__ + ".moves.urllib_response"] + robotparser = sys.modules[__name__ + ".moves.urllib_robotparser"] + + +sys.modules[__name__ + ".moves.urllib"] = Module_six_moves_urllib(__name__ + ".moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" + + _iterkeys = "keys" + _itervalues = "values" + _iteritems = "items" + _iterlists = "lists" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + _iterkeys = "iterkeys" + _itervalues = "itervalues" + _iteritems = "iteritems" + _iterlists = "iterlists" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +def iterkeys(d, **kw): + """Return an iterator over the keys of a dictionary.""" + return iter(getattr(d, _iterkeys)(**kw)) + +def itervalues(d, **kw): + """Return an iterator over the values of a dictionary.""" + return iter(getattr(d, _itervalues)(**kw)) + +def iteritems(d, **kw): + """Return an iterator over the (key, value) pairs of a dictionary.""" + return iter(getattr(d, _iteritems)(**kw)) + +def iterlists(d, **kw): + """Return an iterator over the (key, [values]) pairs of a dictionary.""" + return iter(getattr(d, _iterlists)(**kw)) + + +if PY3: + def b(s): + return s.encode("latin-1") + def u(s): + return s + unichr = chr + if sys.version_info[1] <= 1: + def int2byte(i): + return bytes((i,)) + else: + # This is about 2x faster than the implementation above on 3.2+ + int2byte = operator.methodcaller("to_bytes", 1, "big") + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO +else: + def b(s): + return s + def u(s): + return unicode(s, "unicode_escape") + unichr = unichr + int2byte = chr + def byte2int(bs): + return ord(bs[0]) + def indexbytes(buf, i): + return ord(buf[i]) + def iterbytes(buf): + return (ord(byte) for byte in buf) + import StringIO + StringIO = BytesIO = StringIO.StringIO +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +if PY3: + import builtins + exec_ = getattr(builtins, "exec") + + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + + + print_ = getattr(builtins, "print") + del builtins + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + + def print_(*args, **kwargs): + """The new-style print function.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + def write(data): + if not isinstance(data, basestring): + data = str(data) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) + +_add_doc(reraise, """Reraise an exception.""") + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + return meta("NewBase", bases, {}) + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + for slots_var in orig_vars.get('__slots__', ()): + orig_vars.pop(slots_var) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper diff --git a/vendor-local/packages/requests/HISTORY.rst b/vendor-local/packages/requests/HISTORY.rst deleted file mode 100644 index d6b8f496902..00000000000 --- a/vendor-local/packages/requests/HISTORY.rst +++ /dev/null @@ -1,390 +0,0 @@ -History -------- - -0.10.4 (2012-02-20) -+++++++++++++++++++ - -* Honor netrc. - -0.10.3 (2012-02-20) -+++++++++++++++++++ - -* HEAD requests don't follow redirects anymore. -* raise_for_status() doesn't raise for 3xx anymore. -* Make Session objects picklable. -* ValueError for invalid schema URLs. - -0.10.2 (2012-01-15) -+++++++++++++++++++ - -* Vastly improved URL quoting. -* Additional allowed cookie key values. -* Attempted fix for "Too many open files" Error -* Replace unicode errors on first pass, no need for second pass. -* Append '/' to bare-domain urls before query insertion. -* Exceptions now inherit from RuntimeError. -* Binary uploads + auth fix. -* Bugfixes. - - -0.10.1 (2012-01-23) -+++++++++++++++++++ - -* PYTHON 3 SUPPORT! -* Dropped 2.5 Support. (*Backwards Incompatible*) - -0.10.0 (2012-01-21) -+++++++++++++++++++ - -* ``Response.content`` is now bytes-only. (*Backwards Incompatible*) -* New ``Response.text`` is unicode-only. -* If no ``Response.encoding`` is specified and ``chardet`` is available, ``Respoonse.text`` will guess an encoding. -* Default to ISO-8859-1 (Western) encoding for "text" subtypes. -* Removal of `decode_unicode`. (*Backwards Incompatible*) -* New multiple-hooks system. -* New ``Response.register_hook`` for registering hooks within the pipeline. -* ``Response.url`` is now Unicode. - -0.9.3 (2012-01-18) -++++++++++++++++++ - -* SSL verify=False bugfix (apparent on windows machines). - -0.9.2 (2012-01-18) -++++++++++++++++++ - -* Asynchronous async.send method. -* Support for proper chunk streams with boundaries. -* session argument for Session classes. -* Print entire hook tracebacks, not just exception instance. -* Fix response.iter_lines from pending next line. -* Fix but in HTTP-digest auth w/ URI having query strings. -* Fix in Event Hooks section. -* Urllib3 update. - - -0.9.1 (2012-01-06) -++++++++++++++++++ - -* danger_mode for automatic Response.raise_for_status() -* Response.iter_lines refactor - -0.9.0 (2011-12-28) -++++++++++++++++++ - -* verify ssl is default. - - -0.8.9 (2011-12-28) -++++++++++++++++++ - -* Packaging fix. - - -0.8.8 (2011-12-28) -++++++++++++++++++ - -* SSL CERT VERIFICATION! -* Release of Cerifi: Mozilla's cert list. -* New 'verify' argument for SSL requests. -* Urllib3 update. - -0.8.7 (2011-12-24) -++++++++++++++++++ - -* iter_lines last-line truncation fix -* Force safe_mode for async requests -* Handle safe_mode exceptions more consistently -* Fix iteration on null responses in safe_mode - -0.8.6 (2011-12-18) -++++++++++++++++++ - -* Socket timeout fixes. -* Proxy Authorization support. - -0.8.5 (2011-12-14) -++++++++++++++++++ - -* Response.iter_lines! - -0.8.4 (2011-12-11) -++++++++++++++++++ - -* Prefetch bugfix. -* Added license to installed version. - -0.8.3 (2011-11-27) -++++++++++++++++++ - -* Converted auth system to use simpler callable objects. -* New session parameter to API methods. -* Display full URL while logging. - -0.8.2 (2011-11-19) -++++++++++++++++++ - -* New Unicode decoding system, based on over-ridable `Response.encoding`. -* Proper URL slash-quote handling. -* Cookies with ``[``, ``]``, and ``_`` allowed. - -0.8.1 (2011-11-15) -++++++++++++++++++ - -* URL Request path fix -* Proxy fix. -* Timeouts fix. - -0.8.0 (2011-11-13) -++++++++++++++++++ - -* Keep-alive support! -* Complete removal of Urllib2 -* Complete removal of Poster -* Complete removal of CookieJars -* New ConnectionError raising -* Safe_mode for error catching -* prefetch parameter for request methods -* OPTION method -* Async pool size throttling -* File uploads send real names -* Vendored in urllib3 - -0.7.6 (2011-11-07) -++++++++++++++++++ - -* Digest authentication bugfix (attach query data to path) - -0.7.5 (2011-11-04) -++++++++++++++++++ - -* Response.content = None if there was an invalid repsonse. -* Redirection auth handling. - -0.7.4 (2011-10-26) -++++++++++++++++++ - -* Session Hooks fix. - -0.7.3 (2011-10-23) -++++++++++++++++++ - -* Digest Auth fix. - - -0.7.2 (2011-10-23) -++++++++++++++++++ - -* PATCH Fix. - - -0.7.1 (2011-10-23) -++++++++++++++++++ - -* Move away from urllib2 authentication handling. -* Fully Remove AuthManager, AuthObject, &c. -* New tuple-based auth system with handler callbacks. - - -0.7.0 (2011-10-22) -++++++++++++++++++ - -* Sessions are now the primary interface. -* Deprecated InvalidMethodException. -* PATCH fix. -* New config system (no more global settings). - - -0.6.6 (2011-10-19) -++++++++++++++++++ - -* Session parameter bugfix (params merging). - - -0.6.5 (2011-10-18) -++++++++++++++++++ - -* Offline (fast) test suite. -* Session dictionary argument merging. - - -0.6.4 (2011-10-13) -++++++++++++++++++ - -* Automatic decoding of unicode, based on HTTP Headers. -* New ``decode_unicode`` setting. -* Removal of ``r.read/close`` methods. -* New ``r.faw`` interface for advanced response usage.* -* Automatic expansion of parameterized headers. - - -0.6.3 (2011-10-13) -++++++++++++++++++ - -* Beautiful ``requests.async`` module, for making async requests w/ gevent. - - -0.6.2 (2011-10-09) -++++++++++++++++++ - -* GET/HEAD obeys allow_redirects=False. - - -0.6.1 (2011-08-20) -++++++++++++++++++ - -* Enhanced status codes experience ``\o/`` -* Set a maximum number of redirects (``settings.max_redirects``) -* Full Unicode URL support -* Support for protocol-less redirects. -* Allow for arbitrary request types. -* Bugfixes - - -0.6.0 (2011-08-17) -++++++++++++++++++ - -* New callback hook system -* New persistient sessions object and context manager -* Transparent Dict-cookie handling -* Status code reference object -* Removed Response.cached -* Added Response.request -* All args are kwargs -* Relative redirect support -* HTTPError handling improvements -* Improved https testing -* Bugfixes - - -0.5.1 (2011-07-23) -++++++++++++++++++ - -* International Domain Name Support! -* Access headers without fetching entire body (``read()``) -* Use lists as dicts for parameters -* Add Forced Basic Authentication -* Forced Basic is default authentication type -* ``python-requests.org`` default User-Agent header -* CaseInsensitiveDict lower-case caching -* Response.history bugfix - - -0.5.0 (2011-06-21) -++++++++++++++++++ - -* PATCH Support -* Support for Proxies -* HTTPBin Test Suite -* Redirect Fixes -* settings.verbose stream writing -* Querystrings for all methods -* URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicity raised - ``r.requests.get('hwe://blah'); r.raise_for_status()`` - - -0.4.1 (2011-05-22) -++++++++++++++++++ - -* Improved Redirection Handling -* New 'allow_redirects' param for following non-GET/HEAD Redirects -* Settings module refactoring - - -0.4.0 (2011-05-15) -++++++++++++++++++ - -* Response.history: list of redirected responses -* Case-Insensitive Header Dictionaries! -* Unicode URLs - - -0.3.4 (2011-05-14) -++++++++++++++++++ - -* Urllib2 HTTPAuthentication Recursion fix (Basic/Digest) -* Internal Refactor -* Bytes data upload Bugfix - - - -0.3.3 (2011-05-12) -++++++++++++++++++ - -* Request timeouts -* Unicode url-encoded data -* Settings context manager and module - - -0.3.2 (2011-04-15) -++++++++++++++++++ - -* Automatic Decompression of GZip Encoded Content -* AutoAuth Support for Tupled HTTP Auth - - -0.3.1 (2011-04-01) -++++++++++++++++++ - -* Cookie Changes -* Response.read() -* Poster fix - - -0.3.0 (2011-02-25) -++++++++++++++++++ - -* Automatic Authentication API Change -* Smarter Query URL Parameterization -* Allow file uploads and POST data together -* New Authentication Manager System - - Simpler Basic HTTP System - - Supports all build-in urllib2 Auths - - Allows for custom Auth Handlers - - -0.2.4 (2011-02-19) -++++++++++++++++++ - -* Python 2.5 Support -* PyPy-c v1.4 Support -* Auto-Authentication tests -* Improved Request object constructor - -0.2.3 (2011-02-15) -++++++++++++++++++ - -* New HTTPHandling Methods - - Reponse.__nonzero__ (false if bad HTTP Status) - - Response.ok (True if expected HTTP Status) - - Response.error (Logged HTTPError if bad HTTP Status) - - Reponse.raise_for_status() (Raises stored HTTPError) - - -0.2.2 (2011-02-14) -++++++++++++++++++ - -* Still handles request in the event of an HTTPError. (Issue #2) -* Eventlet and Gevent Monkeypatch support. -* Cookie Support (Issue #1) - - -0.2.1 (2011-02-14) -++++++++++++++++++ - -* Added file attribute to POST and PUT requests for multipart-encode file uploads. -* Added Request.url attribute for context and redirects - - -0.2.0 (2011-02-14) -++++++++++++++++++ - -* Birth! - - -0.0.1 (2011-02-13) -++++++++++++++++++ - -* Frustration -* Conception - diff --git a/vendor-local/packages/requests/LICENSE b/vendor-local/packages/requests/LICENSE deleted file mode 100644 index e79211cd461..00000000000 --- a/vendor-local/packages/requests/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (c) 2012 Kenneth Reitz. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/vendor-local/packages/requests/MANIFEST.in b/vendor-local/packages/requests/MANIFEST.in deleted file mode 100644 index ef350d0c067..00000000000 --- a/vendor-local/packages/requests/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -include README.rst LICENSE NOTICE HISTORY.rst test_requests.py diff --git a/vendor-local/packages/requests/NOTICE b/vendor-local/packages/requests/NOTICE deleted file mode 100644 index 41b5d20658f..00000000000 --- a/vendor-local/packages/requests/NOTICE +++ /dev/null @@ -1,25 +0,0 @@ -Request includes some vendorized python libraries to ease installation. - -Urllib3 License -=============== - -This is the MIT license: http://www.opensource.org/licenses/mit-license.php - -Copyright 2008-2011 Andrey Petrov and contributors (see CONTRIBUTORS.txt), -Modifications copyright 2022 Kenneth Reitz. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this -software and associated documentation files (the "Software"), to deal in the Software -without restriction, including without limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons -to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or -substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE -FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/vendor-local/packages/requests/PKG-INFO b/vendor-local/packages/requests/PKG-INFO deleted file mode 100644 index 04ef2f7eedd..00000000000 --- a/vendor-local/packages/requests/PKG-INFO +++ /dev/null @@ -1,486 +0,0 @@ -Metadata-Version: 1.0 -Name: requests -Version: 0.10.4 -Summary: Python HTTP for Humans. -Home-page: http://python-requests.org -Author: Kenneth Reitz -Author-email: me@kennethreitz.com -License: ISC -Description: Requests: HTTP for Humans - ========================= - - Requests is an ISC Licensed HTTP library, written in Python, for human - beings. - - Most existing Python modules for sending HTTP requests are extremely - verbose and cumbersome. Python's builtin urllib2 module provides most of - the HTTP capabilities you should need, but the api is thoroughly broken. - It requires an enormous amount of work (even method overrides) to - perform the simplest of tasks. - - Things shouldn't be this way. Not in Python. - - :: - - >>> r = requests.get('https://api.github.com', auth=('user', 'pass')) - >>> r.status_code - 204 - >>> r.headers['content-type'] - 'application/json' - >>> r.text - ... - - See `the same code, without Requests <https://gist.github.com/973705>`_. - - Requests allow you to send **HEAD**, **GET**, **POST**, **PUT**, - **PATCH**, and **DELETE** HTTP requests. You can add headers, form data, - multipart files, and parameters with simple Python dictionaries, and access the - response data in the same way. It's powered by httplib and `urllib3 - <https://github.com/shazow/urllib3>`_, but it does all the hard work and crazy - hacks for you. - - - Features - -------- - - - International Domains and URLs - - Keep-Alive & Connection Pooling - - Sessions with Cookie Persistence - - Browser-style SSL Verification - - Basic/Digest Authentication - - Elegant Key/Value Cookies - - Automatic Decompression - - Unicode Response Bodies - - Multipart File Uploads - - Connection Timeouts - - - Installation - ------------ - - To install requests, simply: :: - - $ pip install requests - - Or, if you absolutely must: :: - - $ easy_install requests - - But, you really shouldn't do that. - - - - Contribute - ---------- - - #. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a Contributor Friendly tag for issues that should be ideal for people who are not very familiar with the codebase yet. - #. Fork `the repository`_ on Github to start making your changes to the **develop** branch (or branch off of it). - #. Write a test which shows that the bug was fixed or that the feature works as expected. - #. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_. - - .. _`the repository`: http://github.com/kennethreitz/requests - .. _AUTHORS: http://github.com/kennethreitz/requests/blob/master/AUTHORS - - - History - ------- - - 0.10.4 (2012-02-20) - +++++++++++++++++++ - - * Honor netrc. - - 0.10.3 (2012-02-20) - +++++++++++++++++++ - - * HEAD requests don't follow redirects anymore. - * raise_for_status() doesn't raise for 3xx anymore. - * Make Session objects picklable. - * ValueError for invalid schema URLs. - - 0.10.2 (2012-01-15) - +++++++++++++++++++ - - * Vastly improved URL quoting. - * Additional allowed cookie key values. - * Attempted fix for "Too many open files" Error - * Replace unicode errors on first pass, no need for second pass. - * Append '/' to bare-domain urls before query insertion. - * Exceptions now inherit from RuntimeError. - * Binary uploads + auth fix. - * Bugfixes. - - - 0.10.1 (2012-01-23) - +++++++++++++++++++ - - * PYTHON 3 SUPPORT! - * Dropped 2.5 Support. (*Backwards Incompatible*) - - 0.10.0 (2012-01-21) - +++++++++++++++++++ - - * ``Response.content`` is now bytes-only. (*Backwards Incompatible*) - * New ``Response.text`` is unicode-only. - * If no ``Response.encoding`` is specified and ``chardet`` is available, ``Respoonse.text`` will guess an encoding. - * Default to ISO-8859-1 (Western) encoding for "text" subtypes. - * Removal of `decode_unicode`. (*Backwards Incompatible*) - * New multiple-hooks system. - * New ``Response.register_hook`` for registering hooks within the pipeline. - * ``Response.url`` is now Unicode. - - 0.9.3 (2012-01-18) - ++++++++++++++++++ - - * SSL verify=False bugfix (apparent on windows machines). - - 0.9.2 (2012-01-18) - ++++++++++++++++++ - - * Asynchronous async.send method. - * Support for proper chunk streams with boundaries. - * session argument for Session classes. - * Print entire hook tracebacks, not just exception instance. - * Fix response.iter_lines from pending next line. - * Fix but in HTTP-digest auth w/ URI having query strings. - * Fix in Event Hooks section. - * Urllib3 update. - - - 0.9.1 (2012-01-06) - ++++++++++++++++++ - - * danger_mode for automatic Response.raise_for_status() - * Response.iter_lines refactor - - 0.9.0 (2011-12-28) - ++++++++++++++++++ - - * verify ssl is default. - - - 0.8.9 (2011-12-28) - ++++++++++++++++++ - - * Packaging fix. - - - 0.8.8 (2011-12-28) - ++++++++++++++++++ - - * SSL CERT VERIFICATION! - * Release of Cerifi: Mozilla's cert list. - * New 'verify' argument for SSL requests. - * Urllib3 update. - - 0.8.7 (2011-12-24) - ++++++++++++++++++ - - * iter_lines last-line truncation fix - * Force safe_mode for async requests - * Handle safe_mode exceptions more consistently - * Fix iteration on null responses in safe_mode - - 0.8.6 (2011-12-18) - ++++++++++++++++++ - - * Socket timeout fixes. - * Proxy Authorization support. - - 0.8.5 (2011-12-14) - ++++++++++++++++++ - - * Response.iter_lines! - - 0.8.4 (2011-12-11) - ++++++++++++++++++ - - * Prefetch bugfix. - * Added license to installed version. - - 0.8.3 (2011-11-27) - ++++++++++++++++++ - - * Converted auth system to use simpler callable objects. - * New session parameter to API methods. - * Display full URL while logging. - - 0.8.2 (2011-11-19) - ++++++++++++++++++ - - * New Unicode decoding system, based on over-ridable `Response.encoding`. - * Proper URL slash-quote handling. - * Cookies with ``[``, ``]``, and ``_`` allowed. - - 0.8.1 (2011-11-15) - ++++++++++++++++++ - - * URL Request path fix - * Proxy fix. - * Timeouts fix. - - 0.8.0 (2011-11-13) - ++++++++++++++++++ - - * Keep-alive support! - * Complete removal of Urllib2 - * Complete removal of Poster - * Complete removal of CookieJars - * New ConnectionError raising - * Safe_mode for error catching - * prefetch parameter for request methods - * OPTION method - * Async pool size throttling - * File uploads send real names - * Vendored in urllib3 - - 0.7.6 (2011-11-07) - ++++++++++++++++++ - - * Digest authentication bugfix (attach query data to path) - - 0.7.5 (2011-11-04) - ++++++++++++++++++ - - * Response.content = None if there was an invalid repsonse. - * Redirection auth handling. - - 0.7.4 (2011-10-26) - ++++++++++++++++++ - - * Session Hooks fix. - - 0.7.3 (2011-10-23) - ++++++++++++++++++ - - * Digest Auth fix. - - - 0.7.2 (2011-10-23) - ++++++++++++++++++ - - * PATCH Fix. - - - 0.7.1 (2011-10-23) - ++++++++++++++++++ - - * Move away from urllib2 authentication handling. - * Fully Remove AuthManager, AuthObject, &c. - * New tuple-based auth system with handler callbacks. - - - 0.7.0 (2011-10-22) - ++++++++++++++++++ - - * Sessions are now the primary interface. - * Deprecated InvalidMethodException. - * PATCH fix. - * New config system (no more global settings). - - - 0.6.6 (2011-10-19) - ++++++++++++++++++ - - * Session parameter bugfix (params merging). - - - 0.6.5 (2011-10-18) - ++++++++++++++++++ - - * Offline (fast) test suite. - * Session dictionary argument merging. - - - 0.6.4 (2011-10-13) - ++++++++++++++++++ - - * Automatic decoding of unicode, based on HTTP Headers. - * New ``decode_unicode`` setting. - * Removal of ``r.read/close`` methods. - * New ``r.faw`` interface for advanced response usage.* - * Automatic expansion of parameterized headers. - - - 0.6.3 (2011-10-13) - ++++++++++++++++++ - - * Beautiful ``requests.async`` module, for making async requests w/ gevent. - - - 0.6.2 (2011-10-09) - ++++++++++++++++++ - - * GET/HEAD obeys allow_redirects=False. - - - 0.6.1 (2011-08-20) - ++++++++++++++++++ - - * Enhanced status codes experience ``\o/`` - * Set a maximum number of redirects (``settings.max_redirects``) - * Full Unicode URL support - * Support for protocol-less redirects. - * Allow for arbitrary request types. - * Bugfixes - - - 0.6.0 (2011-08-17) - ++++++++++++++++++ - - * New callback hook system - * New persistient sessions object and context manager - * Transparent Dict-cookie handling - * Status code reference object - * Removed Response.cached - * Added Response.request - * All args are kwargs - * Relative redirect support - * HTTPError handling improvements - * Improved https testing - * Bugfixes - - - 0.5.1 (2011-07-23) - ++++++++++++++++++ - - * International Domain Name Support! - * Access headers without fetching entire body (``read()``) - * Use lists as dicts for parameters - * Add Forced Basic Authentication - * Forced Basic is default authentication type - * ``python-requests.org`` default User-Agent header - * CaseInsensitiveDict lower-case caching - * Response.history bugfix - - - 0.5.0 (2011-06-21) - ++++++++++++++++++ - - * PATCH Support - * Support for Proxies - * HTTPBin Test Suite - * Redirect Fixes - * settings.verbose stream writing - * Querystrings for all methods - * URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicity raised - ``r.requests.get('hwe://blah'); r.raise_for_status()`` - - - 0.4.1 (2011-05-22) - ++++++++++++++++++ - - * Improved Redirection Handling - * New 'allow_redirects' param for following non-GET/HEAD Redirects - * Settings module refactoring - - - 0.4.0 (2011-05-15) - ++++++++++++++++++ - - * Response.history: list of redirected responses - * Case-Insensitive Header Dictionaries! - * Unicode URLs - - - 0.3.4 (2011-05-14) - ++++++++++++++++++ - - * Urllib2 HTTPAuthentication Recursion fix (Basic/Digest) - * Internal Refactor - * Bytes data upload Bugfix - - - - 0.3.3 (2011-05-12) - ++++++++++++++++++ - - * Request timeouts - * Unicode url-encoded data - * Settings context manager and module - - - 0.3.2 (2011-04-15) - ++++++++++++++++++ - - * Automatic Decompression of GZip Encoded Content - * AutoAuth Support for Tupled HTTP Auth - - - 0.3.1 (2011-04-01) - ++++++++++++++++++ - - * Cookie Changes - * Response.read() - * Poster fix - - - 0.3.0 (2011-02-25) - ++++++++++++++++++ - - * Automatic Authentication API Change - * Smarter Query URL Parameterization - * Allow file uploads and POST data together - * New Authentication Manager System - - Simpler Basic HTTP System - - Supports all build-in urllib2 Auths - - Allows for custom Auth Handlers - - - 0.2.4 (2011-02-19) - ++++++++++++++++++ - - * Python 2.5 Support - * PyPy-c v1.4 Support - * Auto-Authentication tests - * Improved Request object constructor - - 0.2.3 (2011-02-15) - ++++++++++++++++++ - - * New HTTPHandling Methods - - Reponse.__nonzero__ (false if bad HTTP Status) - - Response.ok (True if expected HTTP Status) - - Response.error (Logged HTTPError if bad HTTP Status) - - Reponse.raise_for_status() (Raises stored HTTPError) - - - 0.2.2 (2011-02-14) - ++++++++++++++++++ - - * Still handles request in the event of an HTTPError. (Issue #2) - * Eventlet and Gevent Monkeypatch support. - * Cookie Support (Issue #1) - - - 0.2.1 (2011-02-14) - ++++++++++++++++++ - - * Added file attribute to POST and PUT requests for multipart-encode file uploads. - * Added Request.url attribute for context and redirects - - - 0.2.0 (2011-02-14) - ++++++++++++++++++ - - * Birth! - - - 0.0.1 (2011-02-13) - ++++++++++++++++++ - - * Frustration - * Conception - - -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Natural Language :: English -Classifier: License :: OSI Approved :: ISC License (ISCL) -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.0 -Classifier: Programming Language :: Python :: 3.1 diff --git a/vendor-local/packages/requests/README.rst b/vendor-local/packages/requests/README.rst deleted file mode 100644 index 5a2666600e6..00000000000 --- a/vendor-local/packages/requests/README.rst +++ /dev/null @@ -1,74 +0,0 @@ -Requests: HTTP for Humans -========================= - -Requests is an ISC Licensed HTTP library, written in Python, for human -beings. - -Most existing Python modules for sending HTTP requests are extremely -verbose and cumbersome. Python's builtin urllib2 module provides most of -the HTTP capabilities you should need, but the api is thoroughly broken. -It requires an enormous amount of work (even method overrides) to -perform the simplest of tasks. - -Things shouldn't be this way. Not in Python. - -:: - - >>> r = requests.get('https://api.github.com', auth=('user', 'pass')) - >>> r.status_code - 204 - >>> r.headers['content-type'] - 'application/json' - >>> r.text - ... - -See `the same code, without Requests <https://gist.github.com/973705>`_. - -Requests allow you to send **HEAD**, **GET**, **POST**, **PUT**, -**PATCH**, and **DELETE** HTTP requests. You can add headers, form data, -multipart files, and parameters with simple Python dictionaries, and access the -response data in the same way. It's powered by httplib and `urllib3 -<https://github.com/shazow/urllib3>`_, but it does all the hard work and crazy -hacks for you. - - -Features --------- - -- International Domains and URLs -- Keep-Alive & Connection Pooling -- Sessions with Cookie Persistence -- Browser-style SSL Verification -- Basic/Digest Authentication -- Elegant Key/Value Cookies -- Automatic Decompression -- Unicode Response Bodies -- Multipart File Uploads -- Connection Timeouts - - -Installation ------------- - -To install requests, simply: :: - - $ pip install requests - -Or, if you absolutely must: :: - - $ easy_install requests - -But, you really shouldn't do that. - - - -Contribute ----------- - -#. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a Contributor Friendly tag for issues that should be ideal for people who are not very familiar with the codebase yet. -#. Fork `the repository`_ on Github to start making your changes to the **develop** branch (or branch off of it). -#. Write a test which shows that the bug was fixed or that the feature works as expected. -#. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_. - -.. _`the repository`: http://github.com/kennethreitz/requests -.. _AUTHORS: http://github.com/kennethreitz/requests/blob/master/AUTHORS diff --git a/vendor-local/packages/requests/pip-egg-info/requests.egg-info/PKG-INFO b/vendor-local/packages/requests/pip-egg-info/requests.egg-info/PKG-INFO deleted file mode 100644 index 9084c027827..00000000000 --- a/vendor-local/packages/requests/pip-egg-info/requests.egg-info/PKG-INFO +++ /dev/null @@ -1,486 +0,0 @@ -Metadata-Version: 1.0 -Name: requests -Version: 0.10.4 -Summary: Python HTTP for Humans. -Home-page: http://python-requests.org -Author: Kenneth Reitz -Author-email: me@kennethreitz.com -License: ISC -Description: Requests: HTTP for Humans - ========================= - - Requests is an ISC Licensed HTTP library, written in Python, for human - beings. - - Most existing Python modules for sending HTTP requests are extremely - verbose and cumbersome. Python's builtin urllib2 module provides most of - the HTTP capabilities you should need, but the api is thoroughly broken. - It requires an enormous amount of work (even method overrides) to - perform the simplest of tasks. - - Things shouldn't be this way. Not in Python. - - :: - - >>> r = requests.get('https://api.github.com', auth=('user', 'pass')) - >>> r.status_code - 204 - >>> r.headers['content-type'] - 'application/json' - >>> r.text - ... - - See `the same code, without Requests <https://gist.github.com/973705>`_. - - Requests allow you to send **HEAD**, **GET**, **POST**, **PUT**, - **PATCH**, and **DELETE** HTTP requests. You can add headers, form data, - multipart files, and parameters with simple Python dictionaries, and access the - response data in the same way. It's powered by httplib and `urllib3 - <https://github.com/shazow/urllib3>`_, but it does all the hard work and crazy - hacks for you. - - - Features - -------- - - - International Domains and URLs - - Keep-Alive & Connection Pooling - - Sessions with Cookie Persistence - - Browser-style SSL Verification - - Basic/Digest Authentication - - Elegant Key/Value Cookies - - Automatic Decompression - - Unicode Response Bodies - - Multipart File Uploads - - Connection Timeouts - - - Installation - ------------ - - To install requests, simply: :: - - $ pip install requests - - Or, if you absolutely must: :: - - $ easy_install requests - - But, you really shouldn't do that. - - - - Contribute - ---------- - - #. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a Contributor Friendly tag for issues that should be ideal for people who are not very familiar with the codebase yet. - #. Fork `the repository`_ on Github to start making your changes to the **develop** branch (or branch off of it). - #. Write a test which shows that the bug was fixed or that the feature works as expected. - #. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_. - - .. _`the repository`: http://github.com/kennethreitz/requests - .. _AUTHORS: http://github.com/kennethreitz/requests/blob/master/AUTHORS - - - History - ------- - - 0.10.4 (2012-02-20) - +++++++++++++++++++ - - * Honor netrc. - - 0.10.3 (2012-02-20) - +++++++++++++++++++ - - * HEAD requests don't follow redirects anymore. - * raise_for_status() doesn't raise for 3xx anymore. - * Make Session objects picklable. - * ValueError for invalid schema URLs. - - 0.10.2 (2012-01-15) - +++++++++++++++++++ - - * Vastly improved URL quoting. - * Additional allowed cookie key values. - * Attempted fix for "Too many open files" Error - * Replace unicode errors on first pass, no need for second pass. - * Append '/' to bare-domain urls before query insertion. - * Exceptions now inherit from RuntimeError. - * Binary uploads + auth fix. - * Bugfixes. - - - 0.10.1 (2012-01-23) - +++++++++++++++++++ - - * PYTHON 3 SUPPORT! - * Dropped 2.5 Support. (*Backwards Incompatible*) - - 0.10.0 (2012-01-21) - +++++++++++++++++++ - - * ``Response.content`` is now bytes-only. (*Backwards Incompatible*) - * New ``Response.text`` is unicode-only. - * If no ``Response.encoding`` is specified and ``chardet`` is available, ``Respoonse.text`` will guess an encoding. - * Default to ISO-8859-1 (Western) encoding for "text" subtypes. - * Removal of `decode_unicode`. (*Backwards Incompatible*) - * New multiple-hooks system. - * New ``Response.register_hook`` for registering hooks within the pipeline. - * ``Response.url`` is now Unicode. - - 0.9.3 (2012-01-18) - ++++++++++++++++++ - - * SSL verify=False bugfix (apparent on windows machines). - - 0.9.2 (2012-01-18) - ++++++++++++++++++ - - * Asynchronous async.send method. - * Support for proper chunk streams with boundaries. - * session argument for Session classes. - * Print entire hook tracebacks, not just exception instance. - * Fix response.iter_lines from pending next line. - * Fix but in HTTP-digest auth w/ URI having query strings. - * Fix in Event Hooks section. - * Urllib3 update. - - - 0.9.1 (2012-01-06) - ++++++++++++++++++ - - * danger_mode for automatic Response.raise_for_status() - * Response.iter_lines refactor - - 0.9.0 (2011-12-28) - ++++++++++++++++++ - - * verify ssl is default. - - - 0.8.9 (2011-12-28) - ++++++++++++++++++ - - * Packaging fix. - - - 0.8.8 (2011-12-28) - ++++++++++++++++++ - - * SSL CERT VERIFICATION! - * Release of Cerifi: Mozilla's cert list. - * New 'verify' argument for SSL requests. - * Urllib3 update. - - 0.8.7 (2011-12-24) - ++++++++++++++++++ - - * iter_lines last-line truncation fix - * Force safe_mode for async requests - * Handle safe_mode exceptions more consistently - * Fix iteration on null responses in safe_mode - - 0.8.6 (2011-12-18) - ++++++++++++++++++ - - * Socket timeout fixes. - * Proxy Authorization support. - - 0.8.5 (2011-12-14) - ++++++++++++++++++ - - * Response.iter_lines! - - 0.8.4 (2011-12-11) - ++++++++++++++++++ - - * Prefetch bugfix. - * Added license to installed version. - - 0.8.3 (2011-11-27) - ++++++++++++++++++ - - * Converted auth system to use simpler callable objects. - * New session parameter to API methods. - * Display full URL while logging. - - 0.8.2 (2011-11-19) - ++++++++++++++++++ - - * New Unicode decoding system, based on over-ridable `Response.encoding`. - * Proper URL slash-quote handling. - * Cookies with ``[``, ``]``, and ``_`` allowed. - - 0.8.1 (2011-11-15) - ++++++++++++++++++ - - * URL Request path fix - * Proxy fix. - * Timeouts fix. - - 0.8.0 (2011-11-13) - ++++++++++++++++++ - - * Keep-alive support! - * Complete removal of Urllib2 - * Complete removal of Poster - * Complete removal of CookieJars - * New ConnectionError raising - * Safe_mode for error catching - * prefetch parameter for request methods - * OPTION method - * Async pool size throttling - * File uploads send real names - * Vendored in urllib3 - - 0.7.6 (2011-11-07) - ++++++++++++++++++ - - * Digest authentication bugfix (attach query data to path) - - 0.7.5 (2011-11-04) - ++++++++++++++++++ - - * Response.content = None if there was an invalid repsonse. - * Redirection auth handling. - - 0.7.4 (2011-10-26) - ++++++++++++++++++ - - * Session Hooks fix. - - 0.7.3 (2011-10-23) - ++++++++++++++++++ - - * Digest Auth fix. - - - 0.7.2 (2011-10-23) - ++++++++++++++++++ - - * PATCH Fix. - - - 0.7.1 (2011-10-23) - ++++++++++++++++++ - - * Move away from urllib2 authentication handling. - * Fully Remove AuthManager, AuthObject, &c. - * New tuple-based auth system with handler callbacks. - - - 0.7.0 (2011-10-22) - ++++++++++++++++++ - - * Sessions are now the primary interface. - * Deprecated InvalidMethodException. - * PATCH fix. - * New config system (no more global settings). - - - 0.6.6 (2011-10-19) - ++++++++++++++++++ - - * Session parameter bugfix (params merging). - - - 0.6.5 (2011-10-18) - ++++++++++++++++++ - - * Offline (fast) test suite. - * Session dictionary argument merging. - - - 0.6.4 (2011-10-13) - ++++++++++++++++++ - - * Automatic decoding of unicode, based on HTTP Headers. - * New ``decode_unicode`` setting. - * Removal of ``r.read/close`` methods. - * New ``r.faw`` interface for advanced response usage.* - * Automatic expansion of parameterized headers. - - - 0.6.3 (2011-10-13) - ++++++++++++++++++ - - * Beautiful ``requests.async`` module, for making async requests w/ gevent. - - - 0.6.2 (2011-10-09) - ++++++++++++++++++ - - * GET/HEAD obeys allow_redirects=False. - - - 0.6.1 (2011-08-20) - ++++++++++++++++++ - - * Enhanced status codes experience ``\o/`` - * Set a maximum number of redirects (``settings.max_redirects``) - * Full Unicode URL support - * Support for protocol-less redirects. - * Allow for arbitrary request types. - * Bugfixes - - - 0.6.0 (2011-08-17) - ++++++++++++++++++ - - * New callback hook system - * New persistient sessions object and context manager - * Transparent Dict-cookie handling - * Status code reference object - * Removed Response.cached - * Added Response.request - * All args are kwargs - * Relative redirect support - * HTTPError handling improvements - * Improved https testing - * Bugfixes - - - 0.5.1 (2011-07-23) - ++++++++++++++++++ - - * International Domain Name Support! - * Access headers without fetching entire body (``read()``) - * Use lists as dicts for parameters - * Add Forced Basic Authentication - * Forced Basic is default authentication type - * ``python-requests.org`` default User-Agent header - * CaseInsensitiveDict lower-case caching - * Response.history bugfix - - - 0.5.0 (2011-06-21) - ++++++++++++++++++ - - * PATCH Support - * Support for Proxies - * HTTPBin Test Suite - * Redirect Fixes - * settings.verbose stream writing - * Querystrings for all methods - * URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicity raised - ``r.requests.get('hwe://blah'); r.raise_for_status()`` - - - 0.4.1 (2011-05-22) - ++++++++++++++++++ - - * Improved Redirection Handling - * New 'allow_redirects' param for following non-GET/HEAD Redirects - * Settings module refactoring - - - 0.4.0 (2011-05-15) - ++++++++++++++++++ - - * Response.history: list of redirected responses - * Case-Insensitive Header Dictionaries! - * Unicode URLs - - - 0.3.4 (2011-05-14) - ++++++++++++++++++ - - * Urllib2 HTTPAuthentication Recursion fix (Basic/Digest) - * Internal Refactor - * Bytes data upload Bugfix - - - - 0.3.3 (2011-05-12) - ++++++++++++++++++ - - * Request timeouts - * Unicode url-encoded data - * Settings context manager and module - - - 0.3.2 (2011-04-15) - ++++++++++++++++++ - - * Automatic Decompression of GZip Encoded Content - * AutoAuth Support for Tupled HTTP Auth - - - 0.3.1 (2011-04-01) - ++++++++++++++++++ - - * Cookie Changes - * Response.read() - * Poster fix - - - 0.3.0 (2011-02-25) - ++++++++++++++++++ - - * Automatic Authentication API Change - * Smarter Query URL Parameterization - * Allow file uploads and POST data together - * New Authentication Manager System - - Simpler Basic HTTP System - - Supports all build-in urllib2 Auths - - Allows for custom Auth Handlers - - - 0.2.4 (2011-02-19) - ++++++++++++++++++ - - * Python 2.5 Support - * PyPy-c v1.4 Support - * Auto-Authentication tests - * Improved Request object constructor - - 0.2.3 (2011-02-15) - ++++++++++++++++++ - - * New HTTPHandling Methods - - Reponse.__nonzero__ (false if bad HTTP Status) - - Response.ok (True if expected HTTP Status) - - Response.error (Logged HTTPError if bad HTTP Status) - - Reponse.raise_for_status() (Raises stored HTTPError) - - - 0.2.2 (2011-02-14) - ++++++++++++++++++ - - * Still handles request in the event of an HTTPError. (Issue #2) - * Eventlet and Gevent Monkeypatch support. - * Cookie Support (Issue #1) - - - 0.2.1 (2011-02-14) - ++++++++++++++++++ - - * Added file attribute to POST and PUT requests for multipart-encode file uploads. - * Added Request.url attribute for context and redirects - - - 0.2.0 (2011-02-14) - ++++++++++++++++++ - - * Birth! - - - 0.0.1 (2011-02-13) - ++++++++++++++++++ - - * Frustration - * Conception - - -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Natural Language :: English -Classifier: License :: OSI Approved :: ISC License (ISCL) -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.0 -Classifier: Programming Language :: Python :: 3.1 diff --git a/vendor-local/packages/requests/pip-egg-info/requests.egg-info/SOURCES.txt b/vendor-local/packages/requests/pip-egg-info/requests.egg-info/SOURCES.txt deleted file mode 100644 index 5ded3afd1fc..00000000000 --- a/vendor-local/packages/requests/pip-egg-info/requests.egg-info/SOURCES.txt +++ /dev/null @@ -1,41 +0,0 @@ -HISTORY.rst -LICENSE -MANIFEST.in -NOTICE -README.rst -setup.cfg -pip-egg-info/requests.egg-info/PKG-INFO -pip-egg-info/requests.egg-info/SOURCES.txt -pip-egg-info/requests.egg-info/dependency_links.txt -pip-egg-info/requests.egg-info/requires.txt -pip-egg-info/requests.egg-info/top_level.txt -requests/__init__.py -requests/api.py -requests/async.py -requests/auth.py -requests/compat.py -requests/defaults.py -requests/exceptions.py -requests/hooks.py -requests/models.py -requests/sessions.py -requests/status_codes.py -requests/structures.py -requests/utils.py -requests/packages/__init__.py -requests/packages/oreos/__init__.py -requests/packages/oreos/core.py -requests/packages/oreos/monkeys.py -requests/packages/oreos/structures.py -requests/packages/urllib3/__init__.py -requests/packages/urllib3/_collections.py -requests/packages/urllib3/connectionpool.py -requests/packages/urllib3/exceptions.py -requests/packages/urllib3/filepost.py -requests/packages/urllib3/poolmanager.py -requests/packages/urllib3/request.py -requests/packages/urllib3/response.py -requests/packages/urllib3/packages/__init__.py -requests/packages/urllib3/packages/six.py -requests/packages/urllib3/packages/mimetools_choose_boundary/__init__.py -requests/packages/urllib3/packages/ssl_match_hostname/__init__.py \ No newline at end of file diff --git a/vendor-local/packages/requests/pip-egg-info/requests.egg-info/requires.txt b/vendor-local/packages/requests/pip-egg-info/requests.egg-info/requires.txt deleted file mode 100644 index a8c0e5cc0ea..00000000000 --- a/vendor-local/packages/requests/pip-egg-info/requests.egg-info/requires.txt +++ /dev/null @@ -1,2 +0,0 @@ -certifi>=0.0.7 -chardet>=1.0.0 \ No newline at end of file diff --git a/vendor-local/packages/requests/requests.egg-info/PKG-INFO b/vendor-local/packages/requests/requests.egg-info/PKG-INFO deleted file mode 100644 index 04ef2f7eedd..00000000000 --- a/vendor-local/packages/requests/requests.egg-info/PKG-INFO +++ /dev/null @@ -1,486 +0,0 @@ -Metadata-Version: 1.0 -Name: requests -Version: 0.10.4 -Summary: Python HTTP for Humans. -Home-page: http://python-requests.org -Author: Kenneth Reitz -Author-email: me@kennethreitz.com -License: ISC -Description: Requests: HTTP for Humans - ========================= - - Requests is an ISC Licensed HTTP library, written in Python, for human - beings. - - Most existing Python modules for sending HTTP requests are extremely - verbose and cumbersome. Python's builtin urllib2 module provides most of - the HTTP capabilities you should need, but the api is thoroughly broken. - It requires an enormous amount of work (even method overrides) to - perform the simplest of tasks. - - Things shouldn't be this way. Not in Python. - - :: - - >>> r = requests.get('https://api.github.com', auth=('user', 'pass')) - >>> r.status_code - 204 - >>> r.headers['content-type'] - 'application/json' - >>> r.text - ... - - See `the same code, without Requests <https://gist.github.com/973705>`_. - - Requests allow you to send **HEAD**, **GET**, **POST**, **PUT**, - **PATCH**, and **DELETE** HTTP requests. You can add headers, form data, - multipart files, and parameters with simple Python dictionaries, and access the - response data in the same way. It's powered by httplib and `urllib3 - <https://github.com/shazow/urllib3>`_, but it does all the hard work and crazy - hacks for you. - - - Features - -------- - - - International Domains and URLs - - Keep-Alive & Connection Pooling - - Sessions with Cookie Persistence - - Browser-style SSL Verification - - Basic/Digest Authentication - - Elegant Key/Value Cookies - - Automatic Decompression - - Unicode Response Bodies - - Multipart File Uploads - - Connection Timeouts - - - Installation - ------------ - - To install requests, simply: :: - - $ pip install requests - - Or, if you absolutely must: :: - - $ easy_install requests - - But, you really shouldn't do that. - - - - Contribute - ---------- - - #. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a Contributor Friendly tag for issues that should be ideal for people who are not very familiar with the codebase yet. - #. Fork `the repository`_ on Github to start making your changes to the **develop** branch (or branch off of it). - #. Write a test which shows that the bug was fixed or that the feature works as expected. - #. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_. - - .. _`the repository`: http://github.com/kennethreitz/requests - .. _AUTHORS: http://github.com/kennethreitz/requests/blob/master/AUTHORS - - - History - ------- - - 0.10.4 (2012-02-20) - +++++++++++++++++++ - - * Honor netrc. - - 0.10.3 (2012-02-20) - +++++++++++++++++++ - - * HEAD requests don't follow redirects anymore. - * raise_for_status() doesn't raise for 3xx anymore. - * Make Session objects picklable. - * ValueError for invalid schema URLs. - - 0.10.2 (2012-01-15) - +++++++++++++++++++ - - * Vastly improved URL quoting. - * Additional allowed cookie key values. - * Attempted fix for "Too many open files" Error - * Replace unicode errors on first pass, no need for second pass. - * Append '/' to bare-domain urls before query insertion. - * Exceptions now inherit from RuntimeError. - * Binary uploads + auth fix. - * Bugfixes. - - - 0.10.1 (2012-01-23) - +++++++++++++++++++ - - * PYTHON 3 SUPPORT! - * Dropped 2.5 Support. (*Backwards Incompatible*) - - 0.10.0 (2012-01-21) - +++++++++++++++++++ - - * ``Response.content`` is now bytes-only. (*Backwards Incompatible*) - * New ``Response.text`` is unicode-only. - * If no ``Response.encoding`` is specified and ``chardet`` is available, ``Respoonse.text`` will guess an encoding. - * Default to ISO-8859-1 (Western) encoding for "text" subtypes. - * Removal of `decode_unicode`. (*Backwards Incompatible*) - * New multiple-hooks system. - * New ``Response.register_hook`` for registering hooks within the pipeline. - * ``Response.url`` is now Unicode. - - 0.9.3 (2012-01-18) - ++++++++++++++++++ - - * SSL verify=False bugfix (apparent on windows machines). - - 0.9.2 (2012-01-18) - ++++++++++++++++++ - - * Asynchronous async.send method. - * Support for proper chunk streams with boundaries. - * session argument for Session classes. - * Print entire hook tracebacks, not just exception instance. - * Fix response.iter_lines from pending next line. - * Fix but in HTTP-digest auth w/ URI having query strings. - * Fix in Event Hooks section. - * Urllib3 update. - - - 0.9.1 (2012-01-06) - ++++++++++++++++++ - - * danger_mode for automatic Response.raise_for_status() - * Response.iter_lines refactor - - 0.9.0 (2011-12-28) - ++++++++++++++++++ - - * verify ssl is default. - - - 0.8.9 (2011-12-28) - ++++++++++++++++++ - - * Packaging fix. - - - 0.8.8 (2011-12-28) - ++++++++++++++++++ - - * SSL CERT VERIFICATION! - * Release of Cerifi: Mozilla's cert list. - * New 'verify' argument for SSL requests. - * Urllib3 update. - - 0.8.7 (2011-12-24) - ++++++++++++++++++ - - * iter_lines last-line truncation fix - * Force safe_mode for async requests - * Handle safe_mode exceptions more consistently - * Fix iteration on null responses in safe_mode - - 0.8.6 (2011-12-18) - ++++++++++++++++++ - - * Socket timeout fixes. - * Proxy Authorization support. - - 0.8.5 (2011-12-14) - ++++++++++++++++++ - - * Response.iter_lines! - - 0.8.4 (2011-12-11) - ++++++++++++++++++ - - * Prefetch bugfix. - * Added license to installed version. - - 0.8.3 (2011-11-27) - ++++++++++++++++++ - - * Converted auth system to use simpler callable objects. - * New session parameter to API methods. - * Display full URL while logging. - - 0.8.2 (2011-11-19) - ++++++++++++++++++ - - * New Unicode decoding system, based on over-ridable `Response.encoding`. - * Proper URL slash-quote handling. - * Cookies with ``[``, ``]``, and ``_`` allowed. - - 0.8.1 (2011-11-15) - ++++++++++++++++++ - - * URL Request path fix - * Proxy fix. - * Timeouts fix. - - 0.8.0 (2011-11-13) - ++++++++++++++++++ - - * Keep-alive support! - * Complete removal of Urllib2 - * Complete removal of Poster - * Complete removal of CookieJars - * New ConnectionError raising - * Safe_mode for error catching - * prefetch parameter for request methods - * OPTION method - * Async pool size throttling - * File uploads send real names - * Vendored in urllib3 - - 0.7.6 (2011-11-07) - ++++++++++++++++++ - - * Digest authentication bugfix (attach query data to path) - - 0.7.5 (2011-11-04) - ++++++++++++++++++ - - * Response.content = None if there was an invalid repsonse. - * Redirection auth handling. - - 0.7.4 (2011-10-26) - ++++++++++++++++++ - - * Session Hooks fix. - - 0.7.3 (2011-10-23) - ++++++++++++++++++ - - * Digest Auth fix. - - - 0.7.2 (2011-10-23) - ++++++++++++++++++ - - * PATCH Fix. - - - 0.7.1 (2011-10-23) - ++++++++++++++++++ - - * Move away from urllib2 authentication handling. - * Fully Remove AuthManager, AuthObject, &c. - * New tuple-based auth system with handler callbacks. - - - 0.7.0 (2011-10-22) - ++++++++++++++++++ - - * Sessions are now the primary interface. - * Deprecated InvalidMethodException. - * PATCH fix. - * New config system (no more global settings). - - - 0.6.6 (2011-10-19) - ++++++++++++++++++ - - * Session parameter bugfix (params merging). - - - 0.6.5 (2011-10-18) - ++++++++++++++++++ - - * Offline (fast) test suite. - * Session dictionary argument merging. - - - 0.6.4 (2011-10-13) - ++++++++++++++++++ - - * Automatic decoding of unicode, based on HTTP Headers. - * New ``decode_unicode`` setting. - * Removal of ``r.read/close`` methods. - * New ``r.faw`` interface for advanced response usage.* - * Automatic expansion of parameterized headers. - - - 0.6.3 (2011-10-13) - ++++++++++++++++++ - - * Beautiful ``requests.async`` module, for making async requests w/ gevent. - - - 0.6.2 (2011-10-09) - ++++++++++++++++++ - - * GET/HEAD obeys allow_redirects=False. - - - 0.6.1 (2011-08-20) - ++++++++++++++++++ - - * Enhanced status codes experience ``\o/`` - * Set a maximum number of redirects (``settings.max_redirects``) - * Full Unicode URL support - * Support for protocol-less redirects. - * Allow for arbitrary request types. - * Bugfixes - - - 0.6.0 (2011-08-17) - ++++++++++++++++++ - - * New callback hook system - * New persistient sessions object and context manager - * Transparent Dict-cookie handling - * Status code reference object - * Removed Response.cached - * Added Response.request - * All args are kwargs - * Relative redirect support - * HTTPError handling improvements - * Improved https testing - * Bugfixes - - - 0.5.1 (2011-07-23) - ++++++++++++++++++ - - * International Domain Name Support! - * Access headers without fetching entire body (``read()``) - * Use lists as dicts for parameters - * Add Forced Basic Authentication - * Forced Basic is default authentication type - * ``python-requests.org`` default User-Agent header - * CaseInsensitiveDict lower-case caching - * Response.history bugfix - - - 0.5.0 (2011-06-21) - ++++++++++++++++++ - - * PATCH Support - * Support for Proxies - * HTTPBin Test Suite - * Redirect Fixes - * settings.verbose stream writing - * Querystrings for all methods - * URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicity raised - ``r.requests.get('hwe://blah'); r.raise_for_status()`` - - - 0.4.1 (2011-05-22) - ++++++++++++++++++ - - * Improved Redirection Handling - * New 'allow_redirects' param for following non-GET/HEAD Redirects - * Settings module refactoring - - - 0.4.0 (2011-05-15) - ++++++++++++++++++ - - * Response.history: list of redirected responses - * Case-Insensitive Header Dictionaries! - * Unicode URLs - - - 0.3.4 (2011-05-14) - ++++++++++++++++++ - - * Urllib2 HTTPAuthentication Recursion fix (Basic/Digest) - * Internal Refactor - * Bytes data upload Bugfix - - - - 0.3.3 (2011-05-12) - ++++++++++++++++++ - - * Request timeouts - * Unicode url-encoded data - * Settings context manager and module - - - 0.3.2 (2011-04-15) - ++++++++++++++++++ - - * Automatic Decompression of GZip Encoded Content - * AutoAuth Support for Tupled HTTP Auth - - - 0.3.1 (2011-04-01) - ++++++++++++++++++ - - * Cookie Changes - * Response.read() - * Poster fix - - - 0.3.0 (2011-02-25) - ++++++++++++++++++ - - * Automatic Authentication API Change - * Smarter Query URL Parameterization - * Allow file uploads and POST data together - * New Authentication Manager System - - Simpler Basic HTTP System - - Supports all build-in urllib2 Auths - - Allows for custom Auth Handlers - - - 0.2.4 (2011-02-19) - ++++++++++++++++++ - - * Python 2.5 Support - * PyPy-c v1.4 Support - * Auto-Authentication tests - * Improved Request object constructor - - 0.2.3 (2011-02-15) - ++++++++++++++++++ - - * New HTTPHandling Methods - - Reponse.__nonzero__ (false if bad HTTP Status) - - Response.ok (True if expected HTTP Status) - - Response.error (Logged HTTPError if bad HTTP Status) - - Reponse.raise_for_status() (Raises stored HTTPError) - - - 0.2.2 (2011-02-14) - ++++++++++++++++++ - - * Still handles request in the event of an HTTPError. (Issue #2) - * Eventlet and Gevent Monkeypatch support. - * Cookie Support (Issue #1) - - - 0.2.1 (2011-02-14) - ++++++++++++++++++ - - * Added file attribute to POST and PUT requests for multipart-encode file uploads. - * Added Request.url attribute for context and redirects - - - 0.2.0 (2011-02-14) - ++++++++++++++++++ - - * Birth! - - - 0.0.1 (2011-02-13) - ++++++++++++++++++ - - * Frustration - * Conception - - -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Natural Language :: English -Classifier: License :: OSI Approved :: ISC License (ISCL) -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.0 -Classifier: Programming Language :: Python :: 3.1 diff --git a/vendor-local/packages/requests/requests.egg-info/SOURCES.txt b/vendor-local/packages/requests/requests.egg-info/SOURCES.txt deleted file mode 100644 index 40e762be2ab..00000000000 --- a/vendor-local/packages/requests/requests.egg-info/SOURCES.txt +++ /dev/null @@ -1,41 +0,0 @@ -HISTORY.rst -LICENSE -MANIFEST.in -NOTICE -README.rst -setup.py -requests/__init__.py -requests/api.py -requests/async.py -requests/auth.py -requests/compat.py -requests/defaults.py -requests/exceptions.py -requests/hooks.py -requests/models.py -requests/sessions.py -requests/status_codes.py -requests/structures.py -requests/utils.py -requests.egg-info/PKG-INFO -requests.egg-info/SOURCES.txt -requests.egg-info/dependency_links.txt -requests.egg-info/requires.txt -requests.egg-info/top_level.txt -requests/packages/__init__.py -requests/packages/oreos/__init__.py -requests/packages/oreos/core.py -requests/packages/oreos/monkeys.py -requests/packages/oreos/structures.py -requests/packages/urllib3/__init__.py -requests/packages/urllib3/_collections.py -requests/packages/urllib3/connectionpool.py -requests/packages/urllib3/exceptions.py -requests/packages/urllib3/filepost.py -requests/packages/urllib3/poolmanager.py -requests/packages/urllib3/request.py -requests/packages/urllib3/response.py -requests/packages/urllib3/packages/__init__.py -requests/packages/urllib3/packages/six.py -requests/packages/urllib3/packages/mimetools_choose_boundary/__init__.py -requests/packages/urllib3/packages/ssl_match_hostname/__init__.py \ No newline at end of file diff --git a/vendor-local/packages/requests/requests.egg-info/requires.txt b/vendor-local/packages/requests/requests.egg-info/requires.txt deleted file mode 100644 index a8c0e5cc0ea..00000000000 --- a/vendor-local/packages/requests/requests.egg-info/requires.txt +++ /dev/null @@ -1,2 +0,0 @@ -certifi>=0.0.7 -chardet>=1.0.0 \ No newline at end of file diff --git a/vendor-local/packages/requests/requests.egg-info/top_level.txt b/vendor-local/packages/requests/requests.egg-info/top_level.txt deleted file mode 100644 index f2293605cf1..00000000000 --- a/vendor-local/packages/requests/requests.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -requests diff --git a/vendor-local/packages/requests/requests/__init__.py b/vendor-local/packages/requests/requests/__init__.py deleted file mode 100644 index 997781f4735..00000000000 --- a/vendor-local/packages/requests/requests/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- - -# __ -# /__) _ _ _ _ _/ _ -# / ( (- (/ (/ (- _) / _) -# / - -""" -requests -~~~~~~~~ - -:copyright: (c) 2012 by Kenneth Reitz. -:license: ISC, see LICENSE for more details. - -""" - -__title__ = 'requests' -__version__ = '0.10.4' -__build__ = 0x001004 -__author__ = 'Kenneth Reitz' -__license__ = 'ISC' -__copyright__ = 'Copyright 2012 Kenneth Reitz' - - -from . import utils -from .models import Request, Response -from .api import request, get, head, post, patch, put, delete, options -from .sessions import session, Session -from .status_codes import codes -from .exceptions import ( - RequestException, Timeout, URLRequired, - TooManyRedirects, HTTPError, ConnectionError -) diff --git a/vendor-local/packages/requests/requests/async.py b/vendor-local/packages/requests/requests/async.py deleted file mode 100644 index 24f8a617d7b..00000000000 --- a/vendor-local/packages/requests/requests/async.py +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.async -~~~~~~~~~~~~~~ - -This module contains an asynchronous replica of ``requests.api``, powered -by gevent. All API methods return a ``Request`` instance (as opposed to -``Response``). A list of requests can be sent with ``map()``. -""" - -try: - import gevent - from gevent import monkey as curious_george - from gevent.pool import Pool -except ImportError: - raise RuntimeError('Gevent is required for requests.async.') - -# Monkey-patch. -curious_george.patch_all(thread=False) - -from . import api - - -__all__ = ( - 'map', - 'get', 'options', 'head', 'post', 'put', 'patch', 'delete', 'request' -) - - -def patched(f): - """Patches a given API function to not send.""" - - def wrapped(*args, **kwargs): - - kwargs['return_response'] = False - kwargs['prefetch'] = True - - config = kwargs.get('config', {}) - config.update(safe_mode=True) - - kwargs['config'] = config - - return f(*args, **kwargs) - - return wrapped - - -def send(r, pool=None, prefetch=False): - """Sends the request object using the specified pool. If a pool isn't - specified this method blocks. Pools are useful because you can specify size - and can hence limit concurrency.""" - - if pool != None: - return pool.spawn(r.send, prefetch=prefetch) - - return gevent.spawn(r.send, prefetch=prefetch) - - -# Patched requests.api functions. -get = patched(api.get) -options = patched(api.options) -head = patched(api.head) -post = patched(api.post) -put = patched(api.put) -patch = patched(api.patch) -delete = patched(api.delete) -request = patched(api.request) - - -def map(requests, prefetch=True, size=None): - """Concurrently converts a list of Requests to Responses. - - :param requests: a collection of Request objects. - :param prefetch: If False, the content will not be downloaded immediately. - :param size: Specifies the number of requests to make at a time. If None, no throttling occurs. - """ - - requests = list(requests) - - pool = Pool(size) if size else None - jobs = [send(r, pool, prefetch=prefetch) for r in requests] - gevent.joinall(jobs) - - return [r.response for r in requests] \ No newline at end of file diff --git a/vendor-local/packages/requests/requests/auth.py b/vendor-local/packages/requests/requests/auth.py deleted file mode 100644 index 2e2bebcb2ba..00000000000 --- a/vendor-local/packages/requests/requests/auth.py +++ /dev/null @@ -1,148 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.auth -~~~~~~~~~~~~~ - -This module contains the authentication handlers for Requests. -""" - -import time -import hashlib - -from base64 import b64encode -from .compat import urlparse, str, bytes -from .utils import randombytes, parse_dict_header - - - -def _basic_auth_str(username, password): - """Returns a Basic Auth string.""" - - return 'Basic ' + b64encode(('%s:%s' % (username, password)).encode('latin1')).strip().decode('latin1') - - -class AuthBase(object): - """Base class that all auth implementations derive from""" - - def __call__(self, r): - raise NotImplementedError('Auth hooks must be callable.') - - -class HTTPBasicAuth(AuthBase): - """Attaches HTTP Basic Authentication to the given Request object.""" - def __init__(self, username, password): - self.username = username - self.password = password - - def __call__(self, r): - r.headers['Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPProxyAuth(HTTPBasicAuth): - """Attaches HTTP Proxy Authenetication to a given Request object.""" - def __call__(self, r): - r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPDigestAuth(AuthBase): - """Attaches HTTP Digest Authentication to the given Request object.""" - def __init__(self, username, password): - self.username = username - self.password = password - - def handle_401(self, r): - """Takes the given response and tries digest-auth, if needed.""" - - s_auth = r.headers.get('www-authenticate', '') - - if 'digest' in s_auth.lower(): - - last_nonce = '' - nonce_count = 0 - - chal = parse_dict_header(s_auth.replace('Digest ', '')) - - realm = chal['realm'] - nonce = chal['nonce'] - qop = chal.get('qop') - algorithm = chal.get('algorithm', 'MD5') - opaque = chal.get('opaque', None) - - algorithm = algorithm.upper() - # lambdas assume digest modules are imported at the top level - if algorithm == 'MD5': - def h(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.md5(x).hexdigest() - H = h - elif algorithm == 'SHA': - def h(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha1(x).hexdigest() - H = h - # XXX MD5-sess - KD = lambda s, d: H("%s:%s" % (s, d)) - - if H is None: - return None - - # XXX not implemented yet - entdig = None - p_parsed = urlparse(r.request.url) - path = p_parsed.path - if p_parsed.query: - path += '?' + p_parsed.query - - A1 = '%s:%s:%s' % (self.username, realm, self.password) - A2 = '%s:%s' % (r.request.method, path) - - if qop == 'auth': - if nonce == last_nonce: - nonce_count += 1 - else: - nonce_count = 1 - last_nonce = nonce - - ncvalue = '%08x' % nonce_count - s = str(nonce_count).encode('utf-8') - s += nonce.encode('utf-8') - s += time.ctime().encode('utf-8') - s += randombytes(8) - - cnonce = (hashlib.sha1(s).hexdigest()[:16]) - noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, H(A2)) - respdig = KD(H(A1), noncebit) - elif qop is None: - respdig = KD(H(A1), "%s:%s" % (nonce, H(A2))) - else: - # XXX handle auth-int. - return None - - # XXX should the partial digests be encoded too? - base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ - 'response="%s"' % (self.username, realm, nonce, path, respdig) - if opaque: - base += ', opaque="%s"' % opaque - if entdig: - base += ', digest="%s"' % entdig - base += ', algorithm="%s"' % algorithm - if qop: - base += ', qop=auth, nc=%s, cnonce="%s"' % (ncvalue, cnonce) - - r.request.headers['Authorization'] = 'Digest %s' % (base) - r.request.send(anyway=True) - _r = r.request.response - _r.history.append(r) - - return _r - - return r - - def __call__(self, r): - r.register_hook('response', self.handle_401) - return r diff --git a/vendor-local/packages/requests/requests/defaults.py b/vendor-local/packages/requests/requests/defaults.py deleted file mode 100644 index f537862befd..00000000000 --- a/vendor-local/packages/requests/requests/defaults.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.defaults -~~~~~~~~~~~~~~~~~ - -This module provides the Requests configuration defaults. - -Configurations: - -:base_headers: Default HTTP headers. -:verbose: Stream to write request logging to. -:max_redirects: Maximum number of redirects allowed within a request.s -:keep_alive: Reuse HTTP Connections? -:max_retries: The number of times a request should be retried in the event of a connection failure. -:danger_mode: If true, Requests will raise errors immediately. -:safe_mode: If true, Requests will catch all errors. -:pool_maxsize: The maximium size of an HTTP connection pool. -:pool_connections: The number of active HTTP connection pools to use. -""" - -SCHEMAS = ['http', 'https'] - -from . import __version__ - -defaults = dict() - - -defaults['base_headers'] = { - 'User-Agent': 'python-requests/%s' % __version__, - 'Accept-Encoding': ', '.join(('identity', 'deflate', 'compress', 'gzip')), - 'Accept': '*/*' -} - -defaults['verbose'] = None -defaults['max_redirects'] = 30 -defaults['pool_connections'] = 10 -defaults['pool_maxsize'] = 10 -defaults['max_retries'] = 0 -defaults['danger_mode'] = False -defaults['safe_mode'] = False -defaults['keep_alive'] = True - - diff --git a/vendor-local/packages/requests/requests/exceptions.py b/vendor-local/packages/requests/requests/exceptions.py deleted file mode 100644 index 94860a88f05..00000000000 --- a/vendor-local/packages/requests/requests/exceptions.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.exceptions -~~~~~~~~~~~~~~~~~~~ - -This module contains the set of Requests' exceptions. - -""" - -class RequestException(RuntimeError): - """There was an ambiguous exception that occurred while handling your - request.""" - -class HTTPError(RequestException): - """An HTTP error occurred.""" - -class ConnectionError(RequestException): - """A Connection error occurred.""" - -class SSLError(ConnectionError): - """An SSL error occurred.""" - -class Timeout(RequestException): - """The request timed out.""" - -class URLRequired(RequestException): - """A valid URL is required to make a request.""" - -class TooManyRedirects(RequestException): - """Too many redirects.""" diff --git a/vendor-local/packages/requests/requests/models.py b/vendor-local/packages/requests/requests/models.py deleted file mode 100644 index a238214a242..00000000000 --- a/vendor-local/packages/requests/requests/models.py +++ /dev/null @@ -1,793 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -import os -from datetime import datetime - -from .hooks import dispatch_hook, HOOKS -from .structures import CaseInsensitiveDict -from .status_codes import codes - -from .auth import HTTPBasicAuth, HTTPProxyAuth -from .packages.urllib3.response import HTTPResponse -from .packages.urllib3.exceptions import MaxRetryError -from .packages.urllib3.exceptions import SSLError as _SSLError -from .packages.urllib3.exceptions import HTTPError as _HTTPError -from .packages.urllib3 import connectionpool, poolmanager -from .packages.urllib3.filepost import encode_multipart_formdata -from .defaults import SCHEMAS -from .exceptions import ( - ConnectionError, HTTPError, RequestException, Timeout, TooManyRedirects, - URLRequired, SSLError) -from .utils import ( - get_encoding_from_headers, stream_untransfer, guess_filename, requote_uri, - dict_from_string, stream_decode_response_unicode, get_netrc_auth) -from .compat import ( - urlparse, urlunparse, urljoin, urlsplit, urlencode, str, bytes, - SimpleCookie, is_py2) - -# Import chardet if it is available. -try: - import chardet -except ImportError: - pass - -REDIRECT_STATI = (codes.moved, codes.found, codes.other, codes.temporary_moved) - - -class Request(object): - """The :class:`Request <Request>` object. It carries out all functionality of - Requests. Recommended interface is with the Requests functions. - """ - - def __init__(self, - url=None, - headers=dict(), - files=None, - method=None, - data=dict(), - params=dict(), - auth=None, - cookies=None, - timeout=None, - redirect=False, - allow_redirects=False, - proxies=None, - hooks=None, - config=None, - _poolmanager=None, - verify=None, - session=None): - - #: Float describes the timeout of the request. - # (Use socket.setdefaulttimeout() as fallback) - self.timeout = timeout - - #: Request URL. - self.url = url - - #: Dictionary of HTTP Headers to attach to the :class:`Request <Request>`. - self.headers = dict(headers or []) - - #: Dictionary of files to multipart upload (``{filename: content}``). - self.files = files - - #: HTTP Method to use. - self.method = method - - #: Dictionary or byte of request body data to attach to the - #: :class:`Request <Request>`. - self.data = None - - #: Dictionary or byte of querystring data to attach to the - #: :class:`Request <Request>`. - self.params = None - - #: True if :class:`Request <Request>` is part of a redirect chain (disables history - #: and HTTPError storage). - self.redirect = redirect - - #: Set to True if full redirects are allowed (e.g. re-POST-ing of data at new ``Location``) - self.allow_redirects = allow_redirects - - # Dictionary mapping protocol to the URL of the proxy (e.g. {'http': 'foo.bar:3128'}) - self.proxies = dict(proxies or []) - - self.data, self._enc_data = self._encode_params(data) - self.params, self._enc_params = self._encode_params(params) - - #: :class:`Response <Response>` instance, containing - #: content and metadata of HTTP Response, once :attr:`sent <send>`. - self.response = Response() - - #: Authentication tuple or object to attach to :class:`Request <Request>`. - self.auth = auth - - #: CookieJar to attach to :class:`Request <Request>`. - self.cookies = dict(cookies or []) - - #: Dictionary of configurations for this request. - self.config = dict(config or []) - - #: True if Request has been sent. - self.sent = False - - #: Event-handling hooks. - self.hooks = {} - - for event in HOOKS: - self.hooks[event] = [] - - hooks = hooks or {} - - for (k, v) in list(hooks.items()): - self.register_hook(event=k, hook=v) - - #: Session. - self.session = session - - #: SSL Verification. - self.verify = verify - - if headers: - headers = CaseInsensitiveDict(self.headers) - else: - headers = CaseInsensitiveDict() - - # Add configured base headers. - for (k, v) in list(self.config.get('base_headers', {}).items()): - if k not in headers: - headers[k] = v - - self.headers = headers - self._poolmanager = _poolmanager - - def __repr__(self): - return '<Request [%s]>' % (self.method) - - def _build_response(self, resp): - """Build internal :class:`Response <Response>` object - from given response. - """ - - def build(resp): - - response = Response() - - # Pass settings over. - response.config = self.config - - if resp: - - # Fallback to None if there's no status_code, for whatever reason. - response.status_code = getattr(resp, 'status', None) - - # Make headers case-insensitive. - response.headers = CaseInsensitiveDict(getattr(resp, 'headers', None)) - - # Set encoding. - response.encoding = get_encoding_from_headers(response.headers) - - # Start off with our local cookies. - cookies = self.cookies or dict() - - # Add new cookies from the server. - if 'set-cookie' in response.headers: - cookie_header = response.headers['set-cookie'] - cookies = dict_from_string(cookie_header) - - # Save cookies in Response. - response.cookies = cookies - - # No exceptions were harmed in the making of this request. - response.error = getattr(resp, 'error', None) - - # Save original response for later. - response.raw = resp - if isinstance(self.full_url, bytes): - response.url = self.full_url.decode('utf-8') - else: - response.url = self.full_url - - return response - - history = [] - - r = build(resp) - - self.cookies.update(r.cookies) - - if r.status_code in REDIRECT_STATI and not self.redirect: - while (('location' in r.headers) and - ((r.status_code is codes.see_other) or (self.allow_redirects))): - - r.content # Consume socket so it can be released - - if not len(history) < self.config.get('max_redirects'): - raise TooManyRedirects() - - # Release the connection back into the pool. - r.raw.release_conn() - - history.append(r) - - url = r.headers['location'] - - # Handle redirection without scheme (see: RFC 1808 Section 4) - if url.startswith('//'): - parsed_rurl = urlparse(r.url) - url = '%s:%s' % (parsed_rurl.scheme, url) - - # Facilitate non-RFC2616-compliant 'location' headers - # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') - if not urlparse(url).netloc: - url = urljoin(r.url, url) - - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4 - if r.status_code is codes.see_other: - method = 'GET' - else: - method = self.method - - # Remove the cookie headers that were sent. - headers = self.headers - try: - del headers['Cookie'] - except KeyError: - pass - - request = Request( - url=url, - headers=headers, - files=self.files, - method=method, - params=self.session.params, - auth=self.auth, - cookies=self.cookies, - redirect=True, - config=self.config, - timeout=self.timeout, - _poolmanager=self._poolmanager, - proxies=self.proxies, - verify=self.verify, - session=self.session - ) - - request.send() - r = request.response - self.cookies.update(r.cookies) - - r.history = history - - self.response = r - self.response.request = self - self.response.cookies.update(self.cookies) - - @staticmethod - def _encode_params(data): - """Encode parameters in a piece of data. - - If the data supplied is a dictionary, encodes each parameter in it, and - returns a list of tuples containing the encoded parameters, and a urlencoded - version of that. - - Otherwise, assumes the data is already encoded appropriately, and - returns it twice. - """ - - if isinstance(data, bytes): - return data, data - - if hasattr(data, '__iter__') and not isinstance(data, str): - data = dict(data) - - if hasattr(data, 'items'): - result = [] - for k, vs in list(data.items()): - for v in isinstance(vs, list) and vs or [vs]: - result.append((k.encode('utf-8') if isinstance(k, str) else k, - v.encode('utf-8') if isinstance(v, str) else v)) - return result, urlencode(result, doseq=True) - else: - return data, data - - @property - def full_url(self): - """Build the actual URL to use.""" - - if not self.url: - raise URLRequired() - - url = self.url - - # Support for unicode domain names and paths. - scheme, netloc, path, params, query, fragment = urlparse(url) - - if not scheme: - raise ValueError("Invalid URL %r: No schema supplied" % url) - - if not scheme in SCHEMAS: - raise ValueError("Invalid scheme %r" % scheme) - - netloc = netloc.encode('idna').decode('utf-8') - - if not path: - path = '/' - - if is_py2: - if isinstance(scheme, str): - scheme = scheme.encode('utf-8') - if isinstance(netloc, str): - netloc = netloc.encode('utf-8') - if isinstance(path, str): - path = path.encode('utf-8') - if isinstance(params, str): - params = params.encode('utf-8') - if isinstance(query, str): - query = query.encode('utf-8') - if isinstance(fragment, str): - fragment = fragment.encode('utf-8') - - url = (urlunparse([scheme, netloc, path, params, query, fragment])) - - if self._enc_params: - if urlparse(url).query: - url = '%s&%s' % (url, self._enc_params) - else: - url = '%s?%s' % (url, self._enc_params) - - url = requote_uri(url) - - return url - - @property - def path_url(self): - """Build the path URL to use.""" - - url = [] - - p = urlsplit(self.full_url) - - # Proxies use full URLs. - if p.scheme in self.proxies: - return self.full_url - - path = p.path - if not path: - path = '/' - - url.append(path) - - query = p.query - if query: - url.append('?') - url.append(query) - - return ''.join(url) - - def register_hook(self, event, hook): - """Properly register a hook.""" - - return self.hooks[event].append(hook) - - def send(self, anyway=False, prefetch=False): - """Sends the request. Returns True of successful, false if not. - If there was an HTTPError during transmission, - self.response.status_code will contain the HTTPError code. - - Once a request is successfully sent, `sent` will equal True. - - :param anyway: If True, request will be sent, even if it has - already been sent. - """ - - # Build the URL - url = self.full_url - - # Logging - if self.config.get('verbose'): - self.config.get('verbose').write('%s %s %s\n' % ( - datetime.now().isoformat(), self.method, url - )) - - # Nottin' on you. - body = None - content_type = None - - # Multi-part file uploads. - if self.files: - if not isinstance(self.data, str): - - try: - fields = self.data.copy() - except AttributeError: - fields = dict(self.data) - - for (k, v) in list(self.files.items()): - # support for explicit filename - if isinstance(v, (tuple, list)): - fn, fp = v - else: - fn = guess_filename(v) or k - fp = v - fields.update({k: (fn, fp.read())}) - - (body, content_type) = encode_multipart_formdata(fields) - else: - pass - # TODO: Conflict? - else: - if self.data: - - body = self._enc_data - if isinstance(self.data, str): - content_type = None - else: - content_type = 'application/x-www-form-urlencoded' - - # Add content-type if it wasn't explicitly provided. - if (content_type) and (not 'content-type' in self.headers): - self.headers['Content-Type'] = content_type - - # Use .netrc auth if none was provided. - if not self.auth: - self.auth = get_netrc_auth(url) - - if self.auth: - if isinstance(self.auth, tuple) and len(self.auth) == 2: - # special-case basic HTTP auth - self.auth = HTTPBasicAuth(*self.auth) - - # Allow auth to make its changes. - r = self.auth(self) - - # Update self to reflect the auth changes. - self.__dict__.update(r.__dict__) - - _p = urlparse(url) - proxy = self.proxies.get(_p.scheme) - - if proxy: - conn = poolmanager.proxy_from_url(proxy) - _proxy = urlparse(proxy) - if '@' in _proxy.netloc: - auth, url = _proxy.netloc.split('@', 1) - self.proxy_auth = HTTPProxyAuth(*auth.split(':', 1)) - r = self.proxy_auth(self) - self.__dict__.update(r.__dict__) - else: - # Check to see if keep_alive is allowed. - if self.config.get('keep_alive'): - conn = self._poolmanager.connection_from_url(url) - else: - conn = connectionpool.connection_from_url(url) - - if url.startswith('https') and self.verify: - - cert_loc = None - - # Allow self-specified cert location. - if self.verify is not True: - cert_loc = self.verify - - # Look for configuration. - if not cert_loc: - cert_loc = os.environ.get('REQUESTS_CA_BUNDLE') - - # Curl compatiblity. - if not cert_loc: - cert_loc = os.environ.get('CURL_CA_BUNDLE') - - # Use the awesome certifi list. - if not cert_loc: - cert_loc = __import__('certifi').where() - - conn.cert_reqs = 'CERT_REQUIRED' - conn.ca_certs = cert_loc - else: - conn.cert_reqs = 'CERT_NONE' - conn.ca_certs = None - - if not self.sent or anyway: - - if self.cookies: - - # Skip if 'cookie' header is explicitly set. - if 'cookie' not in self.headers: - - # Simple cookie with our dict. - c = SimpleCookie() - for (k, v) in list(self.cookies.items()): - c[k] = v - - # Turn it into a header. - cookie_header = c.output(header='', sep='; ').strip() - - # Attach Cookie header to request. - self.headers['Cookie'] = cookie_header - - # Pre-request hook. - r = dispatch_hook('pre_request', self.hooks, self) - self.__dict__.update(r.__dict__) - - try: - # The inner try .. except re-raises certain exceptions as - # internal exception types; the outer suppresses exceptions - # when safe mode is set. - try: - # Send the request. - r = conn.urlopen( - method=self.method, - url=self.path_url, - body=body, - headers=self.headers, - redirect=False, - assert_same_host=False, - preload_content=False, - decode_content=False, - retries=self.config.get('max_retries', 0), - timeout=self.timeout, - ) - self.sent = True - - except MaxRetryError as e: - raise ConnectionError(e) - - except (_SSLError, _HTTPError) as e: - if self.verify and isinstance(e, _SSLError): - raise SSLError(e) - - raise Timeout('Request timed out.') - - except RequestException as e: - if self.config.get('safe_mode', False): - # In safe mode, catch the exception and attach it to - # a blank urllib3.HTTPResponse object. - r = HTTPResponse() - r.error = e - else: - raise - - self._build_response(r) - - # Response manipulation hook. - self.response = dispatch_hook('response', self.hooks, self.response) - - # Post-request hook. - r = dispatch_hook('post_request', self.hooks, self) - self.__dict__.update(r.__dict__) - - # If prefetch is True, mark content as consumed. - if prefetch: - # Save the response. - self.response.content - - if self.config.get('danger_mode'): - self.response.raise_for_status() - - return self.sent - - -class Response(object): - """The core :class:`Response <Response>` object. All - :class:`Request <Request>` objects contain a - :class:`response <Response>` attribute, which is an instance - of this class. - """ - - def __init__(self): - - self._content = None - self._content_consumed = False - - #: Integer Code of responded HTTP Status. - self.status_code = None - - #: Case-insensitive Dictionary of Response Headers. - #: For example, ``headers['content-encoding']`` will return the - #: value of a ``'Content-Encoding'`` response header. - self.headers = CaseInsensitiveDict() - - #: File-like object representation of response (for advanced usage). - self.raw = None - - #: Final URL location of Response. - self.url = None - - #: Resulting :class:`HTTPError` of request, if one occurred. - self.error = None - - #: Encoding to decode with when accessing r.content. - self.encoding = None - - #: A list of :class:`Response <Response>` objects from - #: the history of the Request. Any redirect responses will end - #: up here. - self.history = [] - - #: The :class:`Request <Request>` that created the Response. - self.request = None - - #: A dictionary of Cookies the server sent back. - self.cookies = {} - - #: Dictionary of configurations for this request. - self.config = {} - - def __repr__(self): - return '<Response [%s]>' % (self.status_code) - - def __bool__(self): - """Returns true if :attr:`status_code` is 'OK'.""" - return self.ok - - def __nonzero__(self): - """Returns true if :attr:`status_code` is 'OK'.""" - return self.ok - - @property - def ok(self): - try: - self.raise_for_status() - except HTTPError: - return False - return True - - def iter_content(self, chunk_size=10 * 1024, decode_unicode=False): - """Iterates over the response data. This avoids reading the content - at once into memory for large responses. The chunk size is the number - of bytes it should read into memory. This is not necessarily the - length of each item returned as decoding can take place. - """ - if self._content_consumed: - raise RuntimeError( - 'The content for this response was already consumed' - ) - - def generate(): - while 1: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk - self._content_consumed = True - - def generate_chunked(): - resp = self.raw._original_response - fp = resp.fp - if resp.chunk_left is not None: - pending_bytes = resp.chunk_left - while pending_bytes: - chunk = fp.read(min(chunk_size, pending_bytes)) - pending_bytes -= len(chunk) - yield chunk - fp.read(2) # throw away crlf - while 1: - #XXX correct line size? (httplib has 64kb, seems insane) - pending_bytes = fp.readline(40).strip() - pending_bytes = int(pending_bytes, 16) - if pending_bytes == 0: - break - while pending_bytes: - chunk = fp.read(min(chunk_size, pending_bytes)) - pending_bytes -= len(chunk) - yield chunk - fp.read(2) # throw away crlf - self._content_consumed = True - fp.close() - - if getattr(getattr(self.raw, '_original_response', None), 'chunked', False): - gen = generate_chunked() - else: - gen = generate() - - gen = stream_untransfer(gen, self) - - if decode_unicode: - gen = stream_decode_response_unicode(gen, self) - - return gen - - def iter_lines(self, chunk_size=10 * 1024, decode_unicode=None): - """Iterates over the response data, one line at a time. This - avoids reading the content at once into memory for large - responses. - """ - - #TODO: why rstrip by default - pending = None - - for chunk in self.iter_content(chunk_size, decode_unicode=decode_unicode): - - if pending is not None: - chunk = pending + chunk - lines = chunk.splitlines(True) - - for line in lines[:-1]: - yield line.rstrip() - - # Save the last part of the chunk for next iteration, to keep full line together - # lines may be empty for the last chunk of a chunked response - - if lines: - pending = lines[-1] - #if pending is a complete line, give it baack - if pending[-1] == '\n': - yield pending.rstrip() - pending = None - else: - pending = None - - # Yield the last line - if pending is not None: - yield pending.rstrip() - - @property - def content(self): - """Content of the response, in bytes.""" - - if self._content is None: - # Read the contents. - try: - if self._content_consumed: - raise RuntimeError( - 'The content for this response was already consumed') - - self._content = bytes().join(self.iter_content()) or None - # print repr(self._content) - except AttributeError: - self._content = None - - self._content_consumed = True - return self._content - - @property - def text(self): - """Content of the response, in unicode. - - if Response.encoding is None and chardet module is available, encoding - will be guessed. - """ - - # Try charset from content-type - content = None - encoding = self.encoding - - # Fallback to auto-detected encoding if chardet is available. - if self.encoding is None: - try: - detected = chardet.detect(self.content) or {} - encoding = detected.get('encoding') - - # Trust that chardet isn't available or something went terribly wrong. - except Exception: - pass - - # Decode unicode from given encoding. - try: - content = str(self.content, encoding, errors='replace') - except (UnicodeError, TypeError): - pass - - return content - - def raise_for_status(self, allow_redirects=True): - """Raises stored :class:`HTTPError` or :class:`URLError`, if one occurred.""" - - if self.error: - raise self.error - - if (self.status_code >= 300) and (self.status_code < 400) and not allow_redirects: - raise HTTPError('%s Redirection' % self.status_code) - - elif (self.status_code >= 400) and (self.status_code < 500): - raise HTTPError('%s Client Error' % self.status_code) - - elif (self.status_code >= 500) and (self.status_code < 600): - raise HTTPError('%s Server Error' % self.status_code) diff --git a/vendor-local/packages/requests/requests/packages/oreos/__init__.py b/vendor-local/packages/requests/requests/packages/oreos/__init__.py deleted file mode 100644 index d01340f2709..00000000000 --- a/vendor-local/packages/requests/requests/packages/oreos/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- - -from .core import dict_from_string \ No newline at end of file diff --git a/vendor-local/packages/requests/requests/packages/oreos/core.py b/vendor-local/packages/requests/requests/packages/oreos/core.py deleted file mode 100644 index 359d74476a2..00000000000 --- a/vendor-local/packages/requests/requests/packages/oreos/core.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -oreos.core -~~~~~~~~~~ - -The creamy white center. -""" - -from .monkeys import SimpleCookie - - -def dict_from_string(s): - """Returns a MultiDict with Cookies.""" - - cookies = dict() - - c = SimpleCookie() - c.load(s) - - for k,v in c.items(): - cookies.update({k: v.value}) - - return cookies \ No newline at end of file diff --git a/vendor-local/packages/requests/requests/packages/oreos/monkeys.py b/vendor-local/packages/requests/requests/packages/oreos/monkeys.py deleted file mode 100644 index 9f9a9c70a8c..00000000000 --- a/vendor-local/packages/requests/requests/packages/oreos/monkeys.py +++ /dev/null @@ -1,773 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -oreos.monkeys -~~~~~~~~~~~~~ - -Monkeypatches. -""" -#!/usr/bin/env python -# - -#### -# Copyright 2000 by Timothy O'Malley <timo@alum.mit.edu> -# -# All Rights Reserved -# -# Permission to use, copy, modify, and distribute this software -# and its documentation for any purpose and without fee is hereby -# granted, provided that the above copyright notice appear in all -# copies and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Timothy O'Malley not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# Timothy O'Malley DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -# AND FITNESS, IN NO EVENT SHALL Timothy O'Malley BE LIABLE FOR -# ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -# PERFORMANCE OF THIS SOFTWARE. -# -#### -# -# Id: Cookie.py,v 2.29 2000/08/23 05:28:49 timo Exp -# by Timothy O'Malley <timo@alum.mit.edu> -# -# Cookie.py is a Python module for the handling of HTTP -# cookies as a Python dictionary. See RFC 2109 for more -# information on cookies. -# -# The original idea to treat Cookies as a dictionary came from -# Dave Mitchell (davem@magnet.com) in 1995, when he released the -# first version of nscookie.py. -# -#### - -r""" -Here's a sample session to show how to use this module. -At the moment, this is the only documentation. - -The Basics ----------- - -Importing is easy.. - - >>> import Cookie - -Most of the time you start by creating a cookie. Cookies come in -three flavors, each with slightly different encoding semantics, but -more on that later. - - >>> C = Cookie.SimpleCookie() - >>> C = Cookie.SerialCookie() - >>> C = Cookie.SmartCookie() - -[Note: Long-time users of Cookie.py will remember using -Cookie.Cookie() to create an Cookie object. Although deprecated, it -is still supported by the code. See the Backward Compatibility notes -for more information.] - -Once you've created your Cookie, you can add values just as if it were -a dictionary. - - >>> C = Cookie.SmartCookie() - >>> C["fig"] = "newton" - >>> C["sugar"] = "wafer" - >>> C.output() - 'Set-Cookie: fig=newton\r\nSet-Cookie: sugar=wafer' - -Notice that the printable representation of a Cookie is the -appropriate format for a Set-Cookie: header. This is the -default behavior. You can change the header and printed -attributes by using the .output() function - - >>> C = Cookie.SmartCookie() - >>> C["rocky"] = "road" - >>> C["rocky"]["path"] = "/cookie" - >>> print C.output(header="Cookie:") - Cookie: rocky=road; Path=/cookie - >>> print C.output(attrs=[], header="Cookie:") - Cookie: rocky=road - -The load() method of a Cookie extracts cookies from a string. In a -CGI script, you would use this method to extract the cookies from the -HTTP_COOKIE environment variable. - - >>> C = Cookie.SmartCookie() - >>> C.load("chips=ahoy; vienna=finger") - >>> C.output() - 'Set-Cookie: chips=ahoy\r\nSet-Cookie: vienna=finger' - -The load() method is darn-tootin smart about identifying cookies -within a string. Escaped quotation marks, nested semicolons, and other -such trickeries do not confuse it. - - >>> C = Cookie.SmartCookie() - >>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";') - >>> print C - Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;" - -Each element of the Cookie also supports all of the RFC 2109 -Cookie attributes. Here's an example which sets the Path -attribute. - - >>> C = Cookie.SmartCookie() - >>> C["oreo"] = "doublestuff" - >>> C["oreo"]["path"] = "/" - >>> print C - Set-Cookie: oreo=doublestuff; Path=/ - -Each dictionary element has a 'value' attribute, which gives you -back the value associated with the key. - - >>> C = Cookie.SmartCookie() - >>> C["twix"] = "none for you" - >>> C["twix"].value - 'none for you' - - -A Bit More Advanced -------------------- - -As mentioned before, there are three different flavors of Cookie -objects, each with different encoding/decoding semantics. This -section briefly discusses the differences. - -SimpleCookie - -The SimpleCookie expects that all values should be standard strings. -Just to be sure, SimpleCookie invokes the str() builtin to convert -the value to a string, when the values are set dictionary-style. - - >>> C = Cookie.SimpleCookie() - >>> C["number"] = 7 - >>> C["string"] = "seven" - >>> C["number"].value - '7' - >>> C["string"].value - 'seven' - >>> C.output() - 'Set-Cookie: number=7\r\nSet-Cookie: string=seven' - - -SerialCookie - -The SerialCookie expects that all values should be serialized using -cPickle (or pickle, if cPickle isn't available). As a result of -serializing, SerialCookie can save almost any Python object to a -value, and recover the exact same object when the cookie has been -returned. (SerialCookie can yield some strange-looking cookie -values, however.) - - >>> C = Cookie.SerialCookie() - >>> C["number"] = 7 - >>> C["string"] = "seven" - >>> C["number"].value - 7 - >>> C["string"].value - 'seven' - >>> C.output() - 'Set-Cookie: number="I7\\012."\r\nSet-Cookie: string="S\'seven\'\\012p1\\012."' - -Be warned, however, if SerialCookie cannot de-serialize a value (because -it isn't a valid pickle'd object), IT WILL RAISE AN EXCEPTION. - - -SmartCookie - -The SmartCookie combines aspects of each of the other two flavors. -When setting a value in a dictionary-fashion, the SmartCookie will -serialize (ala cPickle) the value *if and only if* it isn't a -Python string. String objects are *not* serialized. Similarly, -when the load() method parses out values, it attempts to de-serialize -the value. If it fails, then it fallsback to treating the value -as a string. - - >>> C = Cookie.SmartCookie() - >>> C["number"] = 7 - >>> C["string"] = "seven" - >>> C["number"].value - 7 - >>> C["string"].value - 'seven' - >>> C.output() - 'Set-Cookie: number="I7\\012."\r\nSet-Cookie: string=seven' - - -Backwards Compatibility ------------------------ - -In order to keep compatibilty with earlier versions of Cookie.py, -it is still possible to use Cookie.Cookie() to create a Cookie. In -fact, this simply returns a SmartCookie. - - >>> C = Cookie.Cookie() - >>> print C.__class__.__name__ - SmartCookie - - -Finis. -""" #" -# ^ -# |----helps out font-lock - -# -# Import our required modules -# -import string - -try: - from cPickle import dumps, loads -except ImportError: - from pickle import dumps, loads - -import re, warnings - -__all__ = ["CookieError","BaseCookie","SimpleCookie","SerialCookie", - "SmartCookie","Cookie"] - -_nulljoin = ''.join -_semispacejoin = '; '.join -_spacejoin = ' '.join - -# -# Define an exception visible to External modules -# -class CookieError(Exception): - pass - - -# These quoting routines conform to the RFC2109 specification, which in -# turn references the character definitions from RFC2068. They provide -# a two-way quoting algorithm. Any non-text character is translated -# into a 4 character sequence: a forward-slash followed by the -# three-digit octal equivalent of the character. Any '\' or '"' is -# quoted with a preceeding '\' slash. -# -# These are taken from RFC2068 and RFC2109. -# _RFC2965Forbidden is the list of forbidden chars we accept anyway -# _LegalChars is the list of chars which don't require "'s -# _Translator hash-table for fast quoting -# -_RFC2965Forbidden = "[]:{}" -_LegalChars = ( string.ascii_letters + string.digits + - "!#$%&'*+-.^_`|~_" + _RFC2965Forbidden ) -_Translator = { - '\000' : '\\000', '\001' : '\\001', '\002' : '\\002', - '\003' : '\\003', '\004' : '\\004', '\005' : '\\005', - '\006' : '\\006', '\007' : '\\007', '\010' : '\\010', - '\011' : '\\011', '\012' : '\\012', '\013' : '\\013', - '\014' : '\\014', '\015' : '\\015', '\016' : '\\016', - '\017' : '\\017', '\020' : '\\020', '\021' : '\\021', - '\022' : '\\022', '\023' : '\\023', '\024' : '\\024', - '\025' : '\\025', '\026' : '\\026', '\027' : '\\027', - '\030' : '\\030', '\031' : '\\031', '\032' : '\\032', - '\033' : '\\033', '\034' : '\\034', '\035' : '\\035', - '\036' : '\\036', '\037' : '\\037', - - # Because of the way browsers really handle cookies (as opposed - # to what the RFC says) we also encode , and ; - - ',' : '\\054', ';' : '\\073', - - '"' : '\\"', '\\' : '\\\\', - - '\177' : '\\177', '\200' : '\\200', '\201' : '\\201', - '\202' : '\\202', '\203' : '\\203', '\204' : '\\204', - '\205' : '\\205', '\206' : '\\206', '\207' : '\\207', - '\210' : '\\210', '\211' : '\\211', '\212' : '\\212', - '\213' : '\\213', '\214' : '\\214', '\215' : '\\215', - '\216' : '\\216', '\217' : '\\217', '\220' : '\\220', - '\221' : '\\221', '\222' : '\\222', '\223' : '\\223', - '\224' : '\\224', '\225' : '\\225', '\226' : '\\226', - '\227' : '\\227', '\230' : '\\230', '\231' : '\\231', - '\232' : '\\232', '\233' : '\\233', '\234' : '\\234', - '\235' : '\\235', '\236' : '\\236', '\237' : '\\237', - '\240' : '\\240', '\241' : '\\241', '\242' : '\\242', - '\243' : '\\243', '\244' : '\\244', '\245' : '\\245', - '\246' : '\\246', '\247' : '\\247', '\250' : '\\250', - '\251' : '\\251', '\252' : '\\252', '\253' : '\\253', - '\254' : '\\254', '\255' : '\\255', '\256' : '\\256', - '\257' : '\\257', '\260' : '\\260', '\261' : '\\261', - '\262' : '\\262', '\263' : '\\263', '\264' : '\\264', - '\265' : '\\265', '\266' : '\\266', '\267' : '\\267', - '\270' : '\\270', '\271' : '\\271', '\272' : '\\272', - '\273' : '\\273', '\274' : '\\274', '\275' : '\\275', - '\276' : '\\276', '\277' : '\\277', '\300' : '\\300', - '\301' : '\\301', '\302' : '\\302', '\303' : '\\303', - '\304' : '\\304', '\305' : '\\305', '\306' : '\\306', - '\307' : '\\307', '\310' : '\\310', '\311' : '\\311', - '\312' : '\\312', '\313' : '\\313', '\314' : '\\314', - '\315' : '\\315', '\316' : '\\316', '\317' : '\\317', - '\320' : '\\320', '\321' : '\\321', '\322' : '\\322', - '\323' : '\\323', '\324' : '\\324', '\325' : '\\325', - '\326' : '\\326', '\327' : '\\327', '\330' : '\\330', - '\331' : '\\331', '\332' : '\\332', '\333' : '\\333', - '\334' : '\\334', '\335' : '\\335', '\336' : '\\336', - '\337' : '\\337', '\340' : '\\340', '\341' : '\\341', - '\342' : '\\342', '\343' : '\\343', '\344' : '\\344', - '\345' : '\\345', '\346' : '\\346', '\347' : '\\347', - '\350' : '\\350', '\351' : '\\351', '\352' : '\\352', - '\353' : '\\353', '\354' : '\\354', '\355' : '\\355', - '\356' : '\\356', '\357' : '\\357', '\360' : '\\360', - '\361' : '\\361', '\362' : '\\362', '\363' : '\\363', - '\364' : '\\364', '\365' : '\\365', '\366' : '\\366', - '\367' : '\\367', '\370' : '\\370', '\371' : '\\371', - '\372' : '\\372', '\373' : '\\373', '\374' : '\\374', - '\375' : '\\375', '\376' : '\\376', '\377' : '\\377' - } - -_idmap = ''.join(chr(x) for x in range(256)) - -def _quote(str, LegalChars=_LegalChars, - idmap=_idmap, translate=string.translate): - # - # If the string does not need to be double-quoted, - # then just return the string. Otherwise, surround - # the string in doublequotes and precede quote (with a \) - # special characters. - # - if "" == translate(str, idmap, LegalChars): - return str - else: - return '"' + _nulljoin( map(_Translator.get, str, str) ) + '"' -# end _quote - - -_OctalPatt = re.compile(r"\\[0-3][0-7][0-7]") -_QuotePatt = re.compile(r"[\\].") - -def _unquote(str): - # If there aren't any doublequotes, - # then there can't be any special characters. See RFC 2109. - if len(str) < 2: - return str - if str[0] != '"' or str[-1] != '"': - return str - - # We have to assume that we must decode this string. - # Down to work. - - # Remove the "s - str = str[1:-1] - - # Check for special sequences. Examples: - # \012 --> \n - # \" --> " - # - i = 0 - n = len(str) - res = [] - while 0 <= i < n: - Omatch = _OctalPatt.search(str, i) - Qmatch = _QuotePatt.search(str, i) - if not Omatch and not Qmatch: # Neither matched - res.append(str[i:]) - break - # else: - j = k = -1 - if Omatch: j = Omatch.start(0) - if Qmatch: k = Qmatch.start(0) - if Qmatch and ( not Omatch or k < j ): # QuotePatt matched - res.append(str[i:k]) - res.append(str[k+1]) - i = k+2 - else: # OctalPatt matched - res.append(str[i:j]) - res.append( chr( int(str[j+1:j+4], 8) ) ) - i = j+4 - return _nulljoin(res) -# end _unquote - -# The _getdate() routine is used to set the expiration time in -# the cookie's HTTP header. By default, _getdate() returns the -# current time in the appropriate "expires" format for a -# Set-Cookie header. The one optional argument is an offset from -# now, in seconds. For example, an offset of -3600 means "one hour ago". -# The offset may be a floating point number. -# - -_weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] - -_monthname = [None, - 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] - -def _getdate(future=0, weekdayname=_weekdayname, monthname=_monthname): - from time import gmtime, time - now = time() - year, month, day, hh, mm, ss, wd, y, z = gmtime(now + future) - return "%s, %02d-%3s-%4d %02d:%02d:%02d GMT" % \ - (weekdayname[wd], day, monthname[month], year, hh, mm, ss) - - -# -# A class to hold ONE key,value pair. -# In a cookie, each such pair may have several attributes. -# so this class is used to keep the attributes associated -# with the appropriate key,value pair. -# This class also includes a coded_value attribute, which -# is used to hold the network representation of the -# value. This is most useful when Python objects are -# pickled for network transit. -# - -class Morsel(dict): - # RFC 2109 lists these attributes as reserved: - # path comment domain - # max-age secure version - # - # For historical reasons, these attributes are also reserved: - # expires - # - # This is an extension from Microsoft: - # httponly - # - # This dictionary provides a mapping from the lowercase - # variant on the left to the appropriate traditional - # formatting on the right. - _reserved = { "expires" : "expires", - "path" : "Path", - "comment" : "Comment", - "domain" : "Domain", - "max-age" : "Max-Age", - "secure" : "secure", - "httponly" : "httponly", - "version" : "Version", - } - - def __init__(self): - # Set defaults - self.key = self.value = self.coded_value = None - - # Set default attributes - for K in self._reserved: - dict.__setitem__(self, K, "") - # end __init__ - - def __setitem__(self, K, V): - K = K.lower() - if not K in self._reserved: - raise CookieError("Invalid Attribute %s" % K) - dict.__setitem__(self, K, V) - # end __setitem__ - - def isReservedKey(self, K): - return K.lower() in self._reserved - # end isReservedKey - - def set(self, key, val, coded_val, - LegalChars=_LegalChars, - idmap=_idmap, translate=string.translate): - # First we verify that the key isn't a reserved word - # Second we make sure it only contains legal characters - if key.lower() in self._reserved: - raise CookieError("Attempt to set a reserved key: %s" % key) - if "" != translate(key, idmap, LegalChars): - raise CookieError("Illegal key value: %s" % key) - - # It's a good key, so save it. - self.key = key - self.value = val - self.coded_value = coded_val - # end set - - def output(self, attrs=None, header = "Set-Cookie:"): - return "%s %s" % ( header, self.OutputString(attrs) ) - - __str__ = output - - def __repr__(self): - return '<%s: %s=%s>' % (self.__class__.__name__, - self.key, repr(self.value) ) - - def js_output(self, attrs=None): - # Print javascript - return """ - <script type="text/javascript"> - <!-- begin hiding - document.cookie = \"%s\"; - // end hiding --> - </script> - """ % ( self.OutputString(attrs).replace('"',r'\"'), ) - # end js_output() - - def OutputString(self, attrs=None): - # Build up our result - # - result = [] - RA = result.append - - # First, the key=value pair - RA("%s=%s" % (self.key, self.coded_value)) - - # Now add any defined attributes - if attrs is None: - attrs = self._reserved - items = self.items() - items.sort() - for K,V in items: - if V == "": continue - if K not in attrs: continue - if K == "expires" and type(V) == type(1): - RA("%s=%s" % (self._reserved[K], _getdate(V))) - elif K == "max-age" and type(V) == type(1): - RA("%s=%d" % (self._reserved[K], V)) - elif K == "secure": - RA(str(self._reserved[K])) - elif K == "httponly": - RA(str(self._reserved[K])) - else: - RA("%s=%s" % (self._reserved[K], V)) - - # Return the result - return _semispacejoin(result) - # end OutputString -# end Morsel class - - - -# -# Pattern for finding cookie -# -# This used to be strict parsing based on the RFC2109 and RFC2068 -# specifications. I have since discovered that MSIE 3.0x doesn't -# follow the character rules outlined in those specs. As a -# result, the parsing rules here are less strict. -# - -_LegalCharsPatt = r"[\w\d!#%&'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=\[\]\_]" - -_CookiePattern = re.compile( - r"(?x)" # This is a Verbose pattern - r"(?P<key>" # Start of group 'key' - ""+ _LegalCharsPatt +"+?" # Any word of at least one letter, nongreedy - r")" # End of group 'key' - r"\s*=\s*" # Equal Sign - r"(?P<val>" # Start of group 'val' - r'"(?:[^\\"]|\\.)*"' # Any doublequoted string - r"|" # or - r"\w{3},\s[\w\d-]{9,11}\s[\d:]{8}\sGMT" # Special case for "expires" attr - r"|" # or - ""+ _LegalCharsPatt +"*" # Any word or empty string - r")" # End of group 'val' - r"\s*;?" # Probably ending in a semi-colon - ) - - -# At long last, here is the cookie class. -# Using this class is almost just like using a dictionary. -# See this module's docstring for example usage. -# -class BaseCookie(dict): - # A container class for a set of Morsels - # - - def value_decode(self, val): - """real_value, coded_value = value_decode(STRING) - Called prior to setting a cookie's value from the network - representation. The VALUE is the value read from HTTP - header. - Override this function to modify the behavior of cookies. - """ - return val, val - # end value_encode - - def value_encode(self, val): - """real_value, coded_value = value_encode(VALUE) - Called prior to setting a cookie's value from the dictionary - representation. The VALUE is the value being assigned. - Override this function to modify the behavior of cookies. - """ - strval = str(val) - return strval, strval - # end value_encode - - def __init__(self, input=None): - if input: self.load(input) - # end __init__ - - def __set(self, key, real_value, coded_value): - """Private method for setting a cookie's value""" - M = self.get(key, Morsel()) - M.set(key, real_value, coded_value) - dict.__setitem__(self, key, M) - # end __set - - def __setitem__(self, key, value): - """Dictionary style assignment.""" - rval, cval = self.value_encode(value) - self.__set(key, rval, cval) - # end __setitem__ - - def output(self, attrs=None, header="Set-Cookie:", sep="\015\012"): - """Return a string suitable for HTTP.""" - result = [] - items = self.items() - items.sort() - for K,V in items: - result.append( V.output(attrs, header) ) - return sep.join(result) - # end output - - __str__ = output - - def __repr__(self): - L = [] - items = self.items() - items.sort() - for K,V in items: - L.append( '%s=%s' % (K,repr(V.value) ) ) - return '<%s: %s>' % (self.__class__.__name__, _spacejoin(L)) - - def js_output(self, attrs=None): - """Return a string suitable for JavaScript.""" - result = [] - items = self.items() - items.sort() - for K,V in items: - result.append( V.js_output(attrs) ) - return _nulljoin(result) - # end js_output - - def load(self, rawdata): - """Load cookies from a string (presumably HTTP_COOKIE) or - from a dictionary. Loading cookies from a dictionary 'd' - is equivalent to calling: - map(Cookie.__setitem__, d.keys(), d.values()) - """ - if type(rawdata) == type(""): - self.__ParseString(rawdata) - else: - # self.update() wouldn't call our custom __setitem__ - for k, v in rawdata.items(): - self[k] = v - return - # end load() - - def __ParseString(self, str, patt=_CookiePattern): - i = 0 # Our starting point - n = len(str) # Length of string - M = None # current morsel - - while 0 <= i < n: - # Start looking for a cookie - match = patt.search(str, i) - if not match: break # No more cookies - - K,V = match.group("key"), match.group("val") - i = match.end(0) - - # Parse the key, value in case it's metainfo - if K[0] == "$": - # We ignore attributes which pertain to the cookie - # mechanism as a whole. See RFC 2109. - # (Does anyone care?) - if M: - M[ K[1:] ] = V - elif K.lower() in Morsel._reserved: - if M: - M[ K ] = _unquote(V) - else: - rval, cval = self.value_decode(V) - self.__set(K, rval, cval) - M = self[K] - # end __ParseString -# end BaseCookie class - -class SimpleCookie(BaseCookie): - """SimpleCookie - SimpleCookie supports strings as cookie values. When setting - the value using the dictionary assignment notation, SimpleCookie - calls the builtin str() to convert the value to a string. Values - received from HTTP are kept as strings. - """ - def value_decode(self, val): - return _unquote( val ), val - def value_encode(self, val): - strval = str(val) - return strval, _quote( strval ) -# end SimpleCookie - -class SerialCookie(BaseCookie): - """SerialCookie - SerialCookie supports arbitrary objects as cookie values. All - values are serialized (using cPickle) before being sent to the - client. All incoming values are assumed to be valid Pickle - representations. IF AN INCOMING VALUE IS NOT IN A VALID PICKLE - FORMAT, THEN AN EXCEPTION WILL BE RAISED. - - Note: Large cookie values add overhead because they must be - retransmitted on every HTTP transaction. - - Note: HTTP has a 2k limit on the size of a cookie. This class - does not check for this limit, so be careful!!! - """ - def __init__(self, input=None): - warnings.warn("SerialCookie class is insecure; do not use it", - DeprecationWarning) - BaseCookie.__init__(self, input) - # end __init__ - def value_decode(self, val): - # This could raise an exception! - return loads( _unquote(val) ), val - def value_encode(self, val): - return val, _quote( dumps(val) ) -# end SerialCookie - -class SmartCookie(BaseCookie): - """SmartCookie - SmartCookie supports arbitrary objects as cookie values. If the - object is a string, then it is quoted. If the object is not a - string, however, then SmartCookie will use cPickle to serialize - the object into a string representation. - - Note: Large cookie values add overhead because they must be - retransmitted on every HTTP transaction. - - Note: HTTP has a 2k limit on the size of a cookie. This class - does not check for this limit, so be careful!!! - """ - def __init__(self, input=None): - warnings.warn("Cookie/SmartCookie class is insecure; do not use it", - DeprecationWarning) - BaseCookie.__init__(self, input) - # end __init__ - def value_decode(self, val): - strval = _unquote(val) - try: - return loads(strval), val - except: - return strval, val - def value_encode(self, val): - if type(val) == type(""): - return val, _quote(val) - else: - return val, _quote( dumps(val) ) -# end SmartCookie - - -########################################################### -# Backwards Compatibility: Don't break any existing code! - -# We provide Cookie() as an alias for SmartCookie() -Cookie = SmartCookie - -# -########################################################### - -def _test(): - import doctest, Cookie - return doctest.testmod(Cookie) - -if __name__ == "__main__": - _test() - - -#Local Variables: -#tab-width: 4 -#end: diff --git a/vendor-local/packages/requests/requests/packages/oreos/structures.py b/vendor-local/packages/requests/requests/packages/oreos/structures.py deleted file mode 100644 index 83292777011..00000000000 --- a/vendor-local/packages/requests/requests/packages/oreos/structures.py +++ /dev/null @@ -1,399 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -oreos.structures -~~~~~~~~~~~~~~~~ - -The plastic blue packaging. - -This is mostly directly stolen from mitsuhiko/werkzeug. -""" - -__all__ = ('MultiDict',) - -class _Missing(object): - - def __repr__(self): - return 'no value' - - def __reduce__(self): - return '_missing' - -_missing = _Missing() - - - -def iter_multi_items(mapping): - """Iterates over the items of a mapping yielding keys and values - without dropping any from more complex structures. - """ - if isinstance(mapping, MultiDict): - for item in mapping.iteritems(multi=True): - yield item - elif isinstance(mapping, dict): - for key, value in mapping.iteritems(): - if isinstance(value, (tuple, list)): - for value in value: - yield key, value - else: - yield key, value - else: - for item in mapping: - yield item - - - -class TypeConversionDict(dict): - """Works like a regular dict but the :meth:`get` method can perform - type conversions. :class:`MultiDict` and :class:`CombinedMultiDict` - are subclasses of this class and provide the same feature. - - .. versionadded:: 0.5 - """ - - def get(self, key, default=None, type=None): - """Return the default value if the requested data doesn't exist. - If `type` is provided and is a callable it should convert the value, - return it or raise a :exc:`ValueError` if that is not possible. In - this case the function will return the default as if the value was not - found: - - >>> d = TypeConversionDict(foo='42', bar='blub') - >>> d.get('foo', type=int) - 42 - >>> d.get('bar', -1, type=int) - -1 - - :param key: The key to be looked up. - :param default: The default value to be returned if the key can't - be looked up. If not further specified `None` is - returned. - :param type: A callable that is used to cast the value in the - :class:`MultiDict`. If a :exc:`ValueError` is raised - by this callable the default value is returned. - """ - try: - rv = self[key] - if type is not None: - rv = type(rv) - except (KeyError, ValueError): - rv = default - return rv - - -class MultiDict(TypeConversionDict): - """A :class:`MultiDict` is a dictionary subclass customized to deal with - multiple values for the same key which is for example used by the parsing - functions in the wrappers. This is necessary because some HTML form - elements pass multiple values for the same key. - - :class:`MultiDict` implements all standard dictionary methods. - Internally, it saves all values for a key as a list, but the standard dict - access methods will only return the first value for a key. If you want to - gain access to the other values, too, you have to use the `list` methods as - explained below. - - Basic Usage: - - >>> d = MultiDict([('a', 'b'), ('a', 'c')]) - >>> d - MultiDict([('a', 'b'), ('a', 'c')]) - >>> d['a'] - 'b' - >>> d.getlist('a') - ['b', 'c'] - >>> 'a' in d - True - - It behaves like a normal dict thus all dict functions will only return the - first value when multiple values for one key are found. - - From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a - subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will - render a page for a ``400 BAD REQUEST`` if caught in a catch-all for HTTP - exceptions. - - A :class:`MultiDict` can be constructed from an iterable of - ``(key, value)`` tuples, a dict, a :class:`MultiDict` or from Werkzeug 0.2 - onwards some keyword parameters. - - :param mapping: the initial value for the :class:`MultiDict`. Either a - regular dict, an iterable of ``(key, value)`` tuples - or `None`. - """ - - def __init__(self, mapping=None): - if isinstance(mapping, MultiDict): - dict.__init__(self, ((k, l[:]) for k, l in mapping.iterlists())) - elif isinstance(mapping, dict): - tmp = {} - for key, value in mapping.iteritems(): - if isinstance(value, (tuple, list)): - value = list(value) - else: - value = [value] - tmp[key] = value - dict.__init__(self, tmp) - else: - tmp = {} - for key, value in mapping or (): - tmp.setdefault(key, []).append(value) - dict.__init__(self, tmp) - - def __getstate__(self): - return dict(self.lists()) - - def __setstate__(self, value): - dict.clear(self) - dict.update(self, value) - - def __iter__(self): - return self.iterkeys() - - def __getitem__(self, key): - """Return the first data value for this key; - raises KeyError if not found. - - :param key: The key to be looked up. - :raise KeyError: if the key does not exist. - """ - if key in self: - return dict.__getitem__(self, key)[0] - raise KeyError(key) - - def __setitem__(self, key, value): - """Like :meth:`add` but removes an existing key first. - - :param key: the key for the value. - :param value: the value to set. - """ - dict.__setitem__(self, key, [value]) - - def add(self, key, value): - """Adds a new value for the key. - - .. versionadded:: 0.6 - - :param key: the key for the value. - :param value: the value to add. - """ - dict.setdefault(self, key, []).append(value) - - def getlist(self, key, type=None): - """Return the list of items for a given key. If that key is not in the - `MultiDict`, the return value will be an empty list. Just as `get` - `getlist` accepts a `type` parameter. All items will be converted - with the callable defined there. - - :param key: The key to be looked up. - :param type: A callable that is used to cast the value in the - :class:`MultiDict`. If a :exc:`ValueError` is raised - by this callable the value will be removed from the list. - :return: a :class:`list` of all the values for the key. - """ - try: - rv = dict.__getitem__(self, key) - except KeyError: - return [] - if type is None: - return list(rv) - result = [] - for item in rv: - try: - result.append(type(item)) - except ValueError: - pass - return result - - def setlist(self, key, new_list): - """Remove the old values for a key and add new ones. Note that the list - you pass the values in will be shallow-copied before it is inserted in - the dictionary. - - >>> d = MultiDict() - >>> d.setlist('foo', ['1', '2']) - >>> d['foo'] - '1' - >>> d.getlist('foo') - ['1', '2'] - - :param key: The key for which the values are set. - :param new_list: An iterable with the new values for the key. Old values - are removed first. - """ - dict.__setitem__(self, key, list(new_list)) - - def setdefault(self, key, default=None): - """Returns the value for the key if it is in the dict, otherwise it - returns `default` and sets that value for `key`. - - :param key: The key to be looked up. - :param default: The default value to be returned if the key is not - in the dict. If not further specified it's `None`. - """ - if key not in self: - self[key] = default - else: - default = self[key] - return default - - def setlistdefault(self, key, default_list=None): - """Like `setdefault` but sets multiple values. The list returned - is not a copy, but the list that is actually used internally. This - means that you can put new values into the dict by appending items - to the list: - - >>> d = MultiDict({"foo": 1}) - >>> d.setlistdefault("foo").extend([2, 3]) - >>> d.getlist("foo") - [1, 2, 3] - - :param key: The key to be looked up. - :param default: An iterable of default values. It is either copied - (in case it was a list) or converted into a list - before returned. - :return: a :class:`list` - """ - if key not in self: - default_list = list(default_list or ()) - dict.__setitem__(self, key, default_list) - else: - default_list = dict.__getitem__(self, key) - return default_list - - def items(self, multi=False): - """Return a list of ``(key, value)`` pairs. - - :param multi: If set to `True` the list returned will have a - pair for each value of each key. Otherwise it - will only contain pairs for the first value of - each key. - - :return: a :class:`list` - """ - return list(self.iteritems(multi)) - - def lists(self): - """Return a list of ``(key, values)`` pairs, where values is the list of - all values associated with the key. - - :return: a :class:`list` - """ - return list(self.iterlists()) - - def values(self): - """Returns a list of the first value on every key's value list. - - :return: a :class:`list`. - """ - return [self[key] for key in self.iterkeys()] - - def listvalues(self): - """Return a list of all values associated with a key. Zipping - :meth:`keys` and this is the same as calling :meth:`lists`: - - >>> d = MultiDict({"foo": [1, 2, 3]}) - >>> zip(d.keys(), d.listvalues()) == d.lists() - True - - :return: a :class:`list` - """ - return list(self.iterlistvalues()) - - def iteritems(self, multi=False): - """Like :meth:`items` but returns an iterator.""" - for key, values in dict.iteritems(self): - if multi: - for value in values: - yield key, value - else: - yield key, values[0] - - def iterlists(self): - """Like :meth:`items` but returns an iterator.""" - for key, values in dict.iteritems(self): - yield key, list(values) - - def itervalues(self): - """Like :meth:`values` but returns an iterator.""" - for values in dict.itervalues(self): - yield values[0] - - def iterlistvalues(self): - """Like :meth:`listvalues` but returns an iterator.""" - return dict.itervalues(self) - - def copy(self): - """Return a shallow copy of this object.""" - return self.__class__(self) - - def to_dict(self, flat=True): - """Return the contents as regular dict. If `flat` is `True` the - returned dict will only have the first item present, if `flat` is - `False` all values will be returned as lists. - - :param flat: If set to `False` the dict returned will have lists - with all the values in it. Otherwise it will only - contain the first value for each key. - :return: a :class:`dict` - """ - if flat: - return dict(self.iteritems()) - return dict(self.lists()) - - def update(self, other_dict): - """update() extends rather than replaces existing key lists.""" - for key, value in iter_multi_items(other_dict): - MultiDict.add(self, key, value) - - def pop(self, key, default=_missing): - """Pop the first item for a list on the dict. Afterwards the - key is removed from the dict, so additional values are discarded: - - >>> d = MultiDict({"foo": [1, 2, 3]}) - >>> d.pop("foo") - 1 - >>> "foo" in d - False - - :param key: the key to pop. - :param default: if provided the value to return if the key was - not in the dictionary. - """ - try: - return dict.pop(self, key)[0] - except KeyError as e: - if default is not _missing: - return default - raise KeyError(str(e)) - - def popitem(self): - """Pop an item from the dict.""" - try: - item = dict.popitem(self) - return (item[0], item[1][0]) - except KeyError as e: - raise KeyError(str(e)) - - def poplist(self, key): - """Pop the list for a key from the dict. If the key is not in the dict - an empty list is returned. - - .. versionchanged:: 0.5 - If the key does no longer exist a list is returned instead of - raising an error. - """ - return dict.pop(self, key, []) - - def popitemlist(self): - """Pop a ``(key, list)`` tuple from the dict.""" - try: - return dict.popitem(self) - except KeyError as e: - raise KeyError(str(e)) - - def __copy__(self): - return self.copy() - - def __repr__(self): - return '%s(%r)' % (self.__class__.__name__, self.items(multi=True)) diff --git a/vendor-local/packages/requests/requests/packages/urllib3/_collections.py b/vendor-local/packages/requests/requests/packages/urllib3/_collections.py deleted file mode 100644 index 3cef081e03d..00000000000 --- a/vendor-local/packages/requests/requests/packages/urllib3/_collections.py +++ /dev/null @@ -1,131 +0,0 @@ -# urllib3/_collections.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -from collections import deque - -from threading import RLock - -__all__ = ['RecentlyUsedContainer'] - - -class AccessEntry(object): - __slots__ = ('key', 'is_valid') - - def __init__(self, key, is_valid=True): - self.key = key - self.is_valid = is_valid - - -class RecentlyUsedContainer(dict): - """ - Provides a dict-like that maintains up to ``maxsize`` keys while throwing - away the least-recently-used keys beyond ``maxsize``. - """ - - # If len(self.access_log) exceeds self._maxsize * CLEANUP_FACTOR, then we - # will attempt to cleanup the invalidated entries in the access_log - # datastructure during the next 'get' operation. - CLEANUP_FACTOR = 10 - - def __init__(self, maxsize=10): - self._maxsize = maxsize - - self._container = {} - - # We use a deque to to store our keys ordered by the last access. - self.access_log = deque() - self.access_log_lock = RLock() - - # We look up the access log entry by the key to invalidate it so we can - # insert a new authorative entry at the head without having to dig and - # find the old entry for removal immediately. - self.access_lookup = {} - - # Trigger a heap cleanup when we get past this size - self.access_log_limit = maxsize * self.CLEANUP_FACTOR - - def _invalidate_entry(self, key): - "If exists: Invalidate old entry and return it." - old_entry = self.access_lookup.get(key) - if old_entry: - old_entry.is_valid = False - - return old_entry - - def _push_entry(self, key): - "Push entry onto our access log, invalidate the old entry if exists." - self._invalidate_entry(key) - - new_entry = AccessEntry(key) - self.access_lookup[key] = new_entry - - self.access_log_lock.acquire() - self.access_log.appendleft(new_entry) - self.access_log_lock.release() - - def _prune_entries(self, num): - "Pop entries from our access log until we popped ``num`` valid ones." - while num > 0: - self.access_log_lock.acquire() - p = self.access_log.pop() - self.access_log_lock.release() - - if not p.is_valid: - continue # Invalidated entry, skip - - dict.pop(self, p.key, None) - self.access_lookup.pop(p.key, None) - num -= 1 - - def _prune_invalidated_entries(self): - "Rebuild our access_log without the invalidated entries." - self.access_log_lock.acquire() - self.access_log = deque(e for e in self.access_log if e.is_valid) - self.access_log_lock.release() - - def _get_ordered_access_keys(self): - "Return ordered access keys for inspection. Used for testing." - self.access_log_lock.acquire() - r = [e.key for e in self.access_log if e.is_valid] - self.access_log_lock.release() - - return r - - def __getitem__(self, key): - item = dict.get(self, key) - - if not item: - raise KeyError(key) - - # Insert new entry with new high priority, also implicitly invalidates - # the old entry. - self._push_entry(key) - - if len(self.access_log) > self.access_log_limit: - # Heap is getting too big, try to clean up any tailing invalidated - # entries. - self._prune_invalidated_entries() - - return item - - def __setitem__(self, key, item): - # Add item to our container and access log - dict.__setitem__(self, key, item) - self._push_entry(key) - - # Discard invalid and excess entries - self._prune_entries(len(self) - self._maxsize) - - def __delitem__(self, key): - self._invalidate_entry(key) - self.access_lookup.pop(key, None) - dict.__delitem__(self, key) - - def get(self, key, default=None): - try: - return self[key] - except KeyError: - return default diff --git a/vendor-local/packages/requests/requests/packages/urllib3/connectionpool.py b/vendor-local/packages/requests/requests/packages/urllib3/connectionpool.py deleted file mode 100644 index 52b1802bcd7..00000000000 --- a/vendor-local/packages/requests/requests/packages/urllib3/connectionpool.py +++ /dev/null @@ -1,604 +0,0 @@ -# urllib3/connectionpool.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import logging -import socket - -from socket import error as SocketError, timeout as SocketTimeout - -try: - from select import poll, POLLIN -except ImportError: # Doesn't exist on OSX and other platforms - from select import select - poll = False - -try: # Python 3 - from http.client import HTTPConnection, HTTPSConnection, HTTPException - from http.client import HTTP_PORT, HTTPS_PORT -except ImportError: - from httplib import HTTPConnection, HTTPSConnection, HTTPException - from httplib import HTTP_PORT, HTTPS_PORT - -try: # Python 3 - from queue import Queue, Empty, Full -except ImportError: - from Queue import Queue, Empty, Full - -try: # Compiled with SSL? - import ssl - BaseSSLError = ssl.SSLError -except ImportError: - ssl = None - BaseSSLError = None - - -from .packages.ssl_match_hostname import match_hostname, CertificateError -from .request import RequestMethods -from .response import HTTPResponse -from .exceptions import (SSLError, - MaxRetryError, - TimeoutError, - HostChangedError, - EmptyPoolError, -) - -from .packages.ssl_match_hostname import match_hostname, CertificateError -from .packages import six - -xrange = six.moves.xrange - -log = logging.getLogger(__name__) - -_Default = object() - -port_by_scheme = { - 'http': HTTP_PORT, - 'https': HTTPS_PORT, -} - -## Connection objects (extension of httplib) - -class VerifiedHTTPSConnection(HTTPSConnection): - """ - Based on httplib.HTTPSConnection but wraps the socket with - SSL certification. - """ - cert_reqs = None - ca_certs = None - - def set_cert(self, key_file=None, cert_file=None, - cert_reqs='CERT_NONE', ca_certs=None): - ssl_req_scheme = { - 'CERT_NONE': ssl.CERT_NONE, - 'CERT_OPTIONAL': ssl.CERT_OPTIONAL, - 'CERT_REQUIRED': ssl.CERT_REQUIRED - } - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = ssl_req_scheme.get(cert_reqs) or ssl.CERT_NONE - self.ca_certs = ca_certs - - def connect(self): - # Add certificate verification - sock = socket.create_connection((self.host, self.port), self.timeout) - - # Wrap socket using verification with the root certs in - # trusted_root_certs - self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, - cert_reqs=self.cert_reqs, - ca_certs=self.ca_certs) - if self.ca_certs: - match_hostname(self.sock.getpeercert(), self.host) - -## Pool objects - -class ConnectionPool(object): - """ - Base class for all connection pools, such as - :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. - """ - - scheme = None - - def __init__(self, host, port=None): - self.host = host - self.port = port - - def __str__(self): - return '%s(host=%r, port=%r)' % (type(self).__name__, - self.host, self.port) - - -class HTTPConnectionPool(ConnectionPool, RequestMethods): - """ - Thread-safe connection pool for one host. - - :param host: - Host used for this HTTP Connection (e.g. "localhost"), passed into - :class:`httplib.HTTPConnection`. - - :param port: - Port used for this HTTP Connection (None is equivalent to 80), passed - into :class:`httplib.HTTPConnection`. - - :param strict: - Causes BadStatusLine to be raised if the status line can't be parsed - as a valid HTTP/1.0 or 1.1 status line, passed into - :class:`httplib.HTTPConnection`. - - :param timeout: - Socket timeout for each individual connection, can be a float. None - disables timeout. - - :param maxsize: - Number of connections to save that can be reused. More than 1 is useful - in multithreaded situations. If ``block`` is set to false, more - connections will be created but they will not be saved once they've - been used. - - :param block: - If set to True, no more than ``maxsize`` connections will be used at - a time. When no free connections are available, the call will block - until a connection has been released. This is a useful side effect for - particular multithreaded situations where one does not want to use more - than maxsize connections per host to prevent flooding. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - """ - - scheme = 'http' - - def __init__(self, host, port=None, strict=False, timeout=None, maxsize=1, - block=False, headers=None): - self.host = host - self.port = port - self.strict = strict - self.timeout = timeout - self.pool = Queue(maxsize) - self.block = block - self.headers = headers or {} - - # Fill the queue up so that doing get() on it will block properly - for _ in xrange(maxsize): - self.pool.put(None) - - # These are mostly for testing and debugging purposes. - self.num_connections = 0 - self.num_requests = 0 - - def _new_conn(self): - """ - Return a fresh :class:`httplib.HTTPConnection`. - """ - self.num_connections += 1 - log.info("Starting new HTTP connection (%d): %s" % - (self.num_connections, self.host)) - return HTTPConnection(host=self.host, port=self.port) - - def _get_conn(self, timeout=None): - """ - Get a connection. Will return a pooled connection if one is available. - - If no connections are available and :prop:`.block` is ``False``, then a - fresh connection is returned. - - :param timeout: - Seconds to wait before giving up and raising - :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and - :prop:`.block` is ``True``. - """ - conn = None - try: - conn = self.pool.get(block=self.block, timeout=timeout) - - # If this is a persistent connection, check if it got disconnected - if conn and conn.sock and is_connection_dropped(conn): - log.info("Resetting dropped connection: %s" % self.host) - conn.close() - - except Empty: - if self.block: - raise EmptyPoolError(self, - "Pool reached maximum size and no more " - "connections are allowed.") - pass # Oh well, we'll create a new connection then - - return conn or self._new_conn() - - def _put_conn(self, conn): - """ - Put a connection back into the pool. - - :param conn: - Connection object for the current host and port as returned by - :meth:`._new_conn` or :meth:`._get_conn`. - - If the pool is already full, the connection is discarded because we - exceeded maxsize. If connections are discarded frequently, then maxsize - should be increased. - """ - try: - self.pool.put(conn, block=False) - except Full: - # This should never happen if self.block == True - log.warning("HttpConnectionPool is full, discarding connection: %s" - % self.host) - - def _make_request(self, conn, method, url, timeout=_Default, - **httplib_request_kw): - """ - Perform a request on a given httplib connection object taken from our - pool. - """ - self.num_requests += 1 - - if timeout is _Default: - timeout = self.timeout - - conn.timeout = timeout # This only does anything in Py26+ - - conn.request(method, url, **httplib_request_kw) - conn.sock.settimeout(timeout) - httplib_response = conn.getresponse() - - log.debug("\"%s %s %s\" %s %s" % - (method, url, - conn._http_vsn_str, # pylint: disable-msg=W0212 - httplib_response.status, httplib_response.length)) - - return httplib_response - - - def is_same_host(self, url): - """ - Check if the given ``url`` is a member of the same host as this - connection pool. - """ - # TODO: Add optional support for socket.gethostbyname checking. - scheme, host, port = get_host(url) - - if self.port and not port: - # Use explicit default port for comparison when none is given. - port = port_by_scheme.get(scheme) - - return (url.startswith('/') or - (scheme, host, port) == (self.scheme, self.host, self.port)) - - def urlopen(self, method, url, body=None, headers=None, retries=3, - redirect=True, assert_same_host=True, timeout=_Default, - pool_timeout=None, release_conn=None, **response_kw): - """ - Get a connection from the pool and perform an HTTP request. This is the - lowest level call for making a request, so you'll need to specify all - the raw details. - - .. note:: - - More commonly, it's appropriate to use a convenience method provided - by :class:`.RequestMethods`, such as :meth:`.request`. - - .. note:: - - `release_conn` will only behave as expected if - `preload_content=False` because we want to make - `preload_content=False` the default behaviour someday soon without - breaking backwards compatibility. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param body: - Data to send in the request body (useful for creating - POST requests, see HTTPConnectionPool.post_url for - more convenience). - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param retries: - Number of retries to allow before raising a MaxRetryError exception. - - :param redirect: - Automatically handle redirects (status codes 301, 302, 303, 307), - each redirect counts as a retry. - - :param assert_same_host: - If ``True``, will make sure that the host of the pool requests is - consistent else will raise HostChangedError. When False, you can - use the pool on an HTTP proxy and request foreign hosts. - - :param timeout: - If specified, overrides the default timeout for this one request. - - :param pool_timeout: - If set and the pool is set to block=True, then this method will - block for ``pool_timeout`` seconds and raise EmptyPoolError if no - connection is available within the time period. - - :param release_conn: - If False, then the urlopen call will not release the connection - back into the pool once a response is received (but will release if - you read the entire contents of the response such as when - `preload_content=True`). This is useful if you're not preloading - the response's content immediately. You will need to call - ``r.release_conn()`` on the response ``r`` to return the connection - back into the pool. If None, it takes the value of - ``response_kw.get('preload_content', True)``. - - :param \**response_kw: - Additional parameters are passed to - :meth:`urllib3.response.HTTPResponse.from_httplib` - """ - if headers is None: - headers = self.headers - - if retries < 0: - raise MaxRetryError(self, url) - - if timeout is _Default: - timeout = self.timeout - - if release_conn is None: - release_conn = response_kw.get('preload_content', True) - - # Check host - if assert_same_host and not self.is_same_host(url): - host = "%s://%s" % (self.scheme, self.host) - if self.port: - host = "%s:%d" % (host, self.port) - - raise HostChangedError(self, url, retries - 1) - - conn = None - - try: - # Request a connection from the queue - # (Could raise SocketError: Bad file descriptor) - conn = self._get_conn(timeout=pool_timeout) - - # Make the request on the httplib connection object - httplib_response = self._make_request(conn, method, url, - timeout=timeout, - body=body, headers=headers) - - # If we're going to release the connection in ``finally:``, then - # the request doesn't need to know about the connection. Otherwise - # it will also try to release it and we'll have a double-release - # mess. - response_conn = not release_conn and conn - - # Import httplib's response into our own wrapper object - response = HTTPResponse.from_httplib(httplib_response, - pool=self, - connection=response_conn, - **response_kw) - - # else: - # The connection will be put back into the pool when - # ``response.release_conn()`` is called (implicitly by - # ``response.read()``) - - except Empty as e: - # Timed out by queue - raise TimeoutError(self, "Request timed out. (pool_timeout=%s)" % - pool_timeout) - - except SocketTimeout as e: - # Timed out by socket - raise TimeoutError(self, "Request timed out. (timeout=%s)" % - timeout) - - except BaseSSLError as e: - # SSL certificate error - raise SSLError(e) - - except CertificateError as e: - # Name mismatch - raise SSLError(e) - - except (HTTPException, SocketError) as e: - # Connection broken, discard. It will be replaced next _get_conn(). - conn = None - # This is necessary so we can access e below - err = e - - finally: - if conn and release_conn: - # Put the connection back to be reused - self._put_conn(conn) - - if not conn: - log.warn("Retrying (%d attempts remain) after connection " - "broken by '%r': %s" % (retries, err, url)) - return self.urlopen(method, url, body, headers, retries - 1, - redirect, assert_same_host) # Try again - - # Handle redirect? - redirect_location = redirect and response.get_redirect_location() - if redirect_location: - log.info("Redirecting %s -> %s" % (url, redirect_location)) - return self.urlopen(method, redirect_location, body, headers, - retries - 1, redirect, assert_same_host) - - return response - - -class HTTPSConnectionPool(HTTPConnectionPool): - """ - Same as :class:`.HTTPConnectionPool`, but HTTPS. - - When Python is compiled with the :mod:`ssl` module, then - :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, - instead of :class:httplib.HTTPSConnection`. - - The ``key_file``, ``cert_file``, ``cert_reqs``, and ``ca_certs`` parameters - are only used if :mod:`ssl` is available and are fed into - :meth:`ssl.wrap_socket` to upgrade the connection socket into an SSL socket. - """ - - scheme = 'https' - - def __init__(self, host, port=None, - strict=False, timeout=None, maxsize=1, - block=False, headers=None, - key_file=None, cert_file=None, - cert_reqs='CERT_NONE', ca_certs=None): - - super(HTTPSConnectionPool, self).__init__(host, port, - strict, timeout, maxsize, - block, headers) - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.ca_certs = ca_certs - - def _new_conn(self): - """ - Return a fresh :class:`httplib.HTTPSConnection`. - """ - self.num_connections += 1 - log.info("Starting new HTTPS connection (%d): %s" - % (self.num_connections, self.host)) - - if not ssl: - return HTTPSConnection(host=self.host, port=self.port) - - connection = VerifiedHTTPSConnection(host=self.host, port=self.port) - connection.set_cert(key_file=self.key_file, cert_file=self.cert_file, - cert_reqs=self.cert_reqs, ca_certs=self.ca_certs) - return connection - - -## Helpers - -def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, - basic_auth=None): - """ - Shortcuts for generating request headers. - - :param keep_alive: - If ``True``, adds 'connection: keep-alive' header. - - :param accept_encoding: - Can be a boolean, list, or string. - ``True`` translates to 'gzip,deflate'. - List will get joined by comma. - String will be used as provided. - - :param user_agent: - String representing the user-agent you want, such as - "python-urllib3/0.6" - - :param basic_auth: - Colon-separated username:password string for 'authorization: basic ...' - auth header. - - Example: :: - - >>> make_headers(keep_alive=True, user_agent="Batman/1.0") - {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} - >>> make_headers(accept_encoding=True) - {'accept-encoding': 'gzip,deflate'} - """ - headers = {} - if accept_encoding: - if isinstance(accept_encoding, str): - pass - elif isinstance(accept_encoding, list): - accept_encoding = ','.join(accept_encoding) - else: - accept_encoding = 'gzip,deflate' - headers['accept-encoding'] = accept_encoding - - if user_agent: - headers['user-agent'] = user_agent - - if keep_alive: - headers['connection'] = 'keep-alive' - - if basic_auth: - headers['authorization'] = 'Basic ' + \ - basic_auth.encode('base64').strip() - - return headers - - -def get_host(url): - """ - Given a url, return its scheme, host and port (None if it's not there). - - For example: :: - - >>> get_host('http://google.com/mail/') - ('http', 'google.com', None) - >>> get_host('google.com:80') - ('http', 'google.com', 80) - """ - # This code is actually similar to urlparse.urlsplit, but much - # simplified for our needs. - port = None - scheme = 'http' - if '://' in url: - scheme, url = url.split('://', 1) - if '/' in url: - url, _path = url.split('/', 1) - if '@' in url: - _auth, url = url.split('@', 1) - if ':' in url: - url, port = url.split(':', 1) - port = int(port) - return scheme, url, port - - -def connection_from_url(url, **kw): - """ - Given a url, return an :class:`.ConnectionPool` instance of its host. - - This is a shortcut for not having to parse out the scheme, host, and port - of the url before creating an :class:`.ConnectionPool` instance. - - :param url: - Absolute URL string that must include the scheme. Port is optional. - - :param \**kw: - Passes additional parameters to the constructor of the appropriate - :class:`.ConnectionPool`. Useful for specifying things like - timeout, maxsize, headers, etc. - - Example: :: - - >>> conn = connection_from_url('http://google.com/') - >>> r = conn.request('GET', '/') - """ - scheme, host, port = get_host(url) - if scheme == 'https': - return HTTPSConnectionPool(host, port=port, **kw) - else: - return HTTPConnectionPool(host, port=port, **kw) - - -def is_connection_dropped(conn): - """ - Returns True if the connection is dropped and should be closed. - - :param conn: - ``HTTPConnection`` object. - """ - if not poll: - return select([conn.sock], [], [], 0.0)[0] - - # This version is better on platforms that support it. - p = poll() - p.register(conn.sock, POLLIN) - for (fno, ev) in p.poll(0.0): - if fno == conn.sock.fileno(): - # Either data is buffered (bad), or the connection is dropped. - return True diff --git a/vendor-local/packages/requests/requests/packages/urllib3/exceptions.py b/vendor-local/packages/requests/requests/packages/urllib3/exceptions.py deleted file mode 100644 index 0bffeb47519..00000000000 --- a/vendor-local/packages/requests/requests/packages/urllib3/exceptions.py +++ /dev/null @@ -1,54 +0,0 @@ -# urllib3/exceptions.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -## Base Exceptions - -class HTTPError(Exception): - "Base exception used by this module." - pass - - -class PoolError(HTTPError): - "Base exception for errors caused within a pool." - def __init__(self, pool, message): - self.pool = pool - HTTPError.__init__(self, "%s: %s" % (pool, message)) - - -class SSLError(HTTPError): - "Raised when SSL certificate fails in an HTTPS connection." - pass - - -## Leaf Exceptions - -class MaxRetryError(PoolError): - "Raised when the maximum number of retries is exceeded." - def __init__(self, pool, url): - PoolError.__init__(self, pool, - "Max retries exceeded with url: %s" % url) - - self.url = url - - -class HostChangedError(PoolError): - "Raised when an existing pool gets a request for a foreign host." - def __init__(self, pool, url, retries=3): - PoolError.__init__(self, pool, - "Tried to open a foreign host with url: %s" % url) - - self.url = url - self.retries = retries - - -class TimeoutError(PoolError): - "Raised when a socket timeout occurs." - pass - - -class EmptyPoolError(PoolError): - "Raised when a pool runs out of connections and no more are allowed." - pass diff --git a/vendor-local/packages/requests/requests/packages/urllib3/filepost.py b/vendor-local/packages/requests/requests/packages/urllib3/filepost.py deleted file mode 100644 index e1ec8af792e..00000000000 --- a/vendor-local/packages/requests/requests/packages/urllib3/filepost.py +++ /dev/null @@ -1,74 +0,0 @@ -# urllib3/filepost.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import codecs -import mimetypes - -try: - from mimetools import choose_boundary -except ImportError: - from .packages.mimetools_choose_boundary import choose_boundary - -from io import BytesIO - -from .packages import six -from .packages.six import b - -writer = codecs.lookup('utf-8')[3] - - -def get_content_type(filename): - return mimetypes.guess_type(filename)[0] or 'application/octet-stream' - - -def encode_multipart_formdata(fields, boundary=None): - """ - Encode a dictionary of ``fields`` using the multipart/form-data mime format. - - :param fields: - Dictionary of fields. The key is treated as the field name, and the - value as the body of the form-data. If the value is a tuple of two - elements, then the first element is treated as the filename of the - form-data section. - - :param boundary: - If not specified, then a random boundary will be generated using - :func:`mimetools.choose_boundary`. - """ - body = BytesIO() - if boundary is None: - boundary = choose_boundary() - - for fieldname, value in six.iteritems(fields): - body.write(b('--%s\r\n' % (boundary))) - - if isinstance(value, tuple): - filename, data = value - writer(body).write('Content-Disposition: form-data; name="%s"; ' - 'filename="%s"\r\n' % (fieldname, filename)) - body.write(b('Content-Type: %s\r\n\r\n' % - (get_content_type(filename)))) - else: - data = value - writer(body).write('Content-Disposition: form-data; name="%s"\r\n' - % (fieldname)) - body.write(b'Content-Type: text/plain\r\n\r\n') - - if isinstance(data, int): - data = str(data) # Backwards compatibility - - if isinstance(data, six.text_type): - writer(body).write(data) - else: - body.write(data) - - body.write(b'\r\n') - - body.write(b('--%s--\r\n' % (boundary))) - - content_type = b('multipart/form-data; boundary=%s' % boundary) - - return body.getvalue(), content_type diff --git a/vendor-local/packages/requests/requests/packages/urllib3/packages/mimetools_choose_boundary/__init__.py b/vendor-local/packages/requests/requests/packages/urllib3/packages/mimetools_choose_boundary/__init__.py deleted file mode 100644 index a0109abf3cc..00000000000 --- a/vendor-local/packages/requests/requests/packages/urllib3/packages/mimetools_choose_boundary/__init__.py +++ /dev/null @@ -1,47 +0,0 @@ -"""The function mimetools.choose_boundary() from Python 2.7, which seems to -have disappeared in Python 3 (although email.generator._make_boundary() might -work as a replacement?). - -Tweaked to use lock from threading rather than thread. -""" -import os -from threading import Lock -_counter_lock = Lock() - -_counter = 0 -def _get_next_counter(): - global _counter - with _counter_lock: - _counter += 1 - return _counter - -_prefix = None - -def choose_boundary(): - """Return a string usable as a multipart boundary. - - The string chosen is unique within a single program run, and - incorporates the user id (if available), process id (if available), - and current time. So it's very unlikely the returned string appears - in message text, but there's no guarantee. - - The boundary contains dots so you have to quote it in the header.""" - - global _prefix - import time - if _prefix is None: - import socket - try: - hostid = socket.gethostbyname(socket.gethostname()) - except socket.gaierror: - hostid = '127.0.0.1' - try: - uid = repr(os.getuid()) - except AttributeError: - uid = '1' - try: - pid = repr(os.getpid()) - except AttributeError: - pid = '1' - _prefix = hostid + '.' + uid + '.' + pid - return "%s.%.3f.%d" % (_prefix, time.time(), _get_next_counter()) diff --git a/vendor-local/packages/requests/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py b/vendor-local/packages/requests/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py deleted file mode 100644 index 9560b045295..00000000000 --- a/vendor-local/packages/requests/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -"""The match_hostname() function from Python 3.2, essential when using SSL.""" - -import re - -__version__ = '3.2.2' - -class CertificateError(ValueError): - pass - -def _dnsname_to_pat(dn): - pats = [] - for frag in dn.split(r'.'): - if frag == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - else: - # Otherwise, '*' matches any dotless fragment. - frag = re.escape(frag) - pats.append(frag.replace(r'\*', '[^.]*')) - return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - -def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules - are mostly followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate") - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if _dnsname_to_pat(value).match(hostname): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_to_pat(value).match(hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") diff --git a/vendor-local/packages/requests/requests/packages/urllib3/poolmanager.py b/vendor-local/packages/requests/requests/packages/urllib3/poolmanager.py deleted file mode 100644 index f194b2e86a6..00000000000 --- a/vendor-local/packages/requests/requests/packages/urllib3/poolmanager.py +++ /dev/null @@ -1,128 +0,0 @@ -# urllib3/poolmanager.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import logging - -from ._collections import RecentlyUsedContainer -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from .connectionpool import get_host, connection_from_url, port_by_scheme -from .exceptions import HostChangedError -from .request import RequestMethods - - -__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] - - -pool_classes_by_scheme = { - 'http': HTTPConnectionPool, - 'https': HTTPSConnectionPool, -} - -log = logging.getLogger(__name__) - - -class PoolManager(RequestMethods): - """ - Allows for arbitrary requests while transparently keeping track of - necessary connection pools for you. - - :param num_pools: - Number of connection pools to cache before discarding the least recently - used pool. - - :param \**connection_pool_kw: - Additional parameters are used to create fresh - :class:`urllib3.connectionpool.ConnectionPool` instances. - - Example: :: - - >>> manager = PoolManager() - >>> r = manager.urlopen("http://google.com/") - >>> r = manager.urlopen("http://google.com/mail") - >>> r = manager.urlopen("http://yahoo.com/") - >>> len(r.pools) - 2 - - """ - - # TODO: Make sure there are no memory leaks here. - - def __init__(self, num_pools=10, **connection_pool_kw): - self.connection_pool_kw = connection_pool_kw - self.pools = RecentlyUsedContainer(num_pools) - - def connection_from_host(self, host, port=80, scheme='http'): - """ - Get a :class:`ConnectionPool` based on the host, port, and scheme. - - Note that an appropriate ``port`` value is required here to normalize - connection pools in our container most effectively. - """ - pool_key = (scheme, host, port) - - # If the scheme, host, or port doesn't match existing open connections, - # open a new ConnectionPool. - pool = self.pools.get(pool_key) - if pool: - return pool - - # Make a fresh ConnectionPool of the desired type - pool_cls = pool_classes_by_scheme[scheme] - pool = pool_cls(host, port, **self.connection_pool_kw) - - self.pools[pool_key] = pool - - return pool - - def connection_from_url(self, url): - """ - Similar to :func:`urllib3.connectionpool.connection_from_url` but - doesn't pass any additional parameters to the - :class:`urllib3.connectionpool.ConnectionPool` constructor. - - Additional parameters are taken from the :class:`.PoolManager` - constructor. - """ - scheme, host, port = get_host(url) - - port = port or port_by_scheme.get(scheme, 80) - - return self.connection_from_host(host, port=port, scheme=scheme) - - def urlopen(self, method, url, **kw): - """ - Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen`. - - ``url`` must be absolute, such that an appropriate - :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. - """ - conn = self.connection_from_url(url) - try: - return conn.urlopen(method, url, **kw) - - except HostChangedError as e: - kw['retries'] = e.retries # Persist retries countdown - return self.urlopen(method, e.url, **kw) - - -class ProxyManager(RequestMethods): - """ - Given a ConnectionPool to a proxy, the ProxyManager's ``urlopen`` method - will make requests to any url through the defined proxy. - """ - - def __init__(self, proxy_pool): - self.proxy_pool = proxy_pool - - def urlopen(self, method, url, **kw): - "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." - kw['assert_same_host'] = False - return self.proxy_pool.urlopen(method, url, **kw) - - -def proxy_from_url(url, **pool_kw): - proxy_pool = connection_from_url(url, **pool_kw) - return ProxyManager(proxy_pool) diff --git a/vendor-local/packages/requests/requests/packages/urllib3/response.py b/vendor-local/packages/requests/requests/packages/urllib3/response.py deleted file mode 100644 index e0239703618..00000000000 --- a/vendor-local/packages/requests/requests/packages/urllib3/response.py +++ /dev/null @@ -1,196 +0,0 @@ -# urllib3/response.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import gzip -import logging -import zlib - -from io import BytesIO - -from .exceptions import HTTPError - - -try: - basestring = basestring -except NameError: # Python 3 - basestring = (str, bytes) - - -log = logging.getLogger(__name__) - - -def decode_gzip(data): - gzipper = gzip.GzipFile(fileobj=BytesIO(data)) - return gzipper.read() - - -def decode_deflate(data): - try: - return zlib.decompress(data) - except zlib.error: - return zlib.decompress(data, -zlib.MAX_WBITS) - - -class HTTPResponse(object): - """ - HTTP Response container. - - Backwards-compatible to httplib's HTTPResponse but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. - - Extra parameters for behaviour not present in httplib.HTTPResponse: - - :param preload_content: - If True, the response's body will be preloaded during construction. - - :param decode_content: - If True, attempts to decode specific content-encoding's based on headers - (like 'gzip' and 'deflate') will be skipped and raw data will be used - instead. - - :param original_response: - When this HTTPResponse wrapper is generated from an httplib.HTTPResponse - object, it's convenient to include the original for debug purposes. It's - otherwise unused. - """ - - CONTENT_DECODERS = { - 'gzip': decode_gzip, - 'deflate': decode_deflate, - } - - def __init__(self, body='', headers=None, status=0, version=0, reason=None, - strict=0, preload_content=True, decode_content=True, - original_response=None, pool=None, connection=None): - self.headers = headers or {} - self.status = status - self.version = version - self.reason = reason - self.strict = strict - - self._decode_content = decode_content - self._body = body if body and isinstance(body, basestring) else None - self._fp = None - self._original_response = original_response - - self._pool = pool - self._connection = connection - - if hasattr(body, 'read'): - self._fp = body - - if preload_content and not self._body: - self._body = self.read(decode_content=decode_content) - - def get_redirect_location(self): - """ - Should we redirect and where to? - - :returns: Truthy redirect location string if we got a redirect status - code and valid location. ``None`` if redirect status and no - location. ``False`` if not a redirect status code. - """ - if self.status in [301, 302, 303, 307]: - return self.headers.get('location') - - return False - - def release_conn(self): - if not self._pool or not self._connection: - return - - self._pool._put_conn(self._connection) - self._connection = None - - @property - def data(self): - # For backwords-compat with earlier urllib3 0.4 and earlier. - if self._body: - return self._body - - if self._fp: - return self.read(cache_content=True) - - def read(self, amt=None, decode_content=None, cache_content=False): - """ - Similar to :meth:`httplib.HTTPResponse.read`, but with two additional - parameters: ``decode_content`` and ``cache_content``. - - :param amt: - How much of the content to read. If specified, decoding and caching - is skipped because we can't decode partial content nor does it make - sense to cache partial content as the full response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. (Overridden if ``amt`` is set.) - - :param cache_content: - If True, will save the returned data such that the same result is - returned despite of the state of the underlying file object. This - is useful if you want the ``.data`` property to continue working - after having ``.read()`` the file object. (Overridden if ``amt`` is - set.) - """ - content_encoding = self.headers.get('content-encoding') - decoder = self.CONTENT_DECODERS.get(content_encoding) - if decode_content is None: - decode_content = self._decode_content - - if self._fp is None: - return - - try: - if amt is None: - # cStringIO doesn't like amt=None - data = self._fp.read() - else: - return self._fp.read(amt) - - try: - if decode_content and decoder: - data = decoder(data) - except IOError: - raise HTTPError("Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding) - - if cache_content: - self._body = data - - return data - - finally: - if self._original_response and self._original_response.isclosed(): - self.release_conn() - - @classmethod - def from_httplib(ResponseCls, r, **response_kw): - """ - Given an :class:`httplib.HTTPResponse` instance ``r``, return a - corresponding :class:`urllib3.response.HTTPResponse` object. - - Remaining parameters are passed to the HTTPResponse constructor, along - with ``original_response=r``. - """ - - # HTTPResponse objects in Python 3 don't have a .strict attribute - strict = getattr(r, 'strict', 0) - return ResponseCls(body=r, - # In Python 3, the header keys are returned capitalised - headers=dict((k.lower(), v) for k,v in r.getheaders()), - status=r.status, - version=r.version, - reason=r.reason, - strict=strict, - original_response=r, - **response_kw) - - # Backwards-compatibility methods for httplib.HTTPResponse - def getheaders(self): - return self.headers - - def getheader(self, name, default=None): - return self.headers.get(name, default) diff --git a/vendor-local/packages/requests/requests/sessions.py b/vendor-local/packages/requests/requests/sessions.py deleted file mode 100644 index 29ae1d9aeb4..00000000000 --- a/vendor-local/packages/requests/requests/sessions.py +++ /dev/null @@ -1,297 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.session -~~~~~~~~~~~~~~~~ - -This module provides a Session object to manage and persist settings across -requests (cookies, auth, proxies). - -""" - -from .defaults import defaults -from .models import Request -from .hooks import dispatch_hook -from .utils import header_expand -from .packages.urllib3.poolmanager import PoolManager - - -def merge_kwargs(local_kwarg, default_kwarg): - """Merges kwarg dictionaries. - - If a local key in the dictionary is set to None, it will be removed. - """ - - if default_kwarg is None: - return local_kwarg - - if isinstance(local_kwarg, str): - return local_kwarg - - if local_kwarg is None: - return default_kwarg - - # Bypass if not a dictionary (e.g. timeout) - if not hasattr(default_kwarg, 'items'): - return local_kwarg - - # Update new values. - kwargs = default_kwarg.copy() - kwargs.update(local_kwarg) - - # Remove keys that are set to None. - for (k, v) in list(local_kwarg.items()): - if v is None: - del kwargs[k] - - return kwargs - - -class Session(object): - """A Requests session.""" - - __attrs__ = [ - 'headers', 'cookies', 'auth', 'timeout', 'proxies', 'hooks', - 'params', 'config', 'verify'] - - - def __init__(self, - headers=None, - cookies=None, - auth=None, - timeout=None, - proxies=None, - hooks=None, - params=None, - config=None, - verify=True): - - self.headers = headers or {} - self.cookies = cookies or {} - self.auth = auth - self.timeout = timeout - self.proxies = proxies or {} - self.hooks = hooks or {} - self.params = params or {} - self.config = config or {} - self.verify = verify - - for (k, v) in list(defaults.items()): - self.config.setdefault(k, v) - - self.init_poolmanager() - - # Set up a CookieJar to be used by default - self.cookies = {} - - # Add passed cookies in. - if cookies is not None: - self.cookies.update(cookies) - - def init_poolmanager(self): - self.poolmanager = PoolManager( - num_pools=self.config.get('pool_connections'), - maxsize=self.config.get('pool_maxsize') - ) - - def __repr__(self): - return '<requests-client at 0x%x>' % (id(self)) - - def __enter__(self): - return self - - def __exit__(self, *args): - pass - - def request(self, method, url, - params=None, - data=None, - headers=None, - cookies=None, - files=None, - auth=None, - timeout=None, - allow_redirects=False, - proxies=None, - hooks=None, - return_response=True, - config=None, - prefetch=False, - verify=None): - - """Constructs and sends a :class:`Request <Request>`. - Returns :class:`Response <Response>` object. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. - :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of 'filename': file-like-objects for multipart encoding upload. - :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) Float describing the timeout of the request. - :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed. - :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param return_response: (optional) If False, an un-sent Request object will returned. - :param config: (optional) A configuration dictionary. - :param prefetch: (optional) if ``True``, the response content will be immediately downloaded. - :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. - """ - - method = str(method).upper() - - # Default empty dicts for dict params. - cookies = {} if cookies is None else cookies - data = {} if data is None else data - files = {} if files is None else files - headers = {} if headers is None else headers - params = {} if params is None else params - hooks = {} if hooks is None else hooks - - # use session's hooks as defaults - for key, cb in list(self.hooks.items()): - hooks.setdefault(key, cb) - - # Expand header values. - if headers: - for k, v in list(headers.items()) or {}: - headers[k] = header_expand(v) - - args = dict( - method=method, - url=url, - data=data, - params=params, - headers=headers, - cookies=cookies, - files=files, - auth=auth, - hooks=hooks, - timeout=timeout, - allow_redirects=allow_redirects, - proxies=proxies, - config=config, - verify=verify, - _poolmanager=self.poolmanager - ) - - # Merge local kwargs with session kwargs. - for attr in self.__attrs__: - session_val = getattr(self, attr, None) - local_val = args.get(attr) - - args[attr] = merge_kwargs(local_val, session_val) - - # Arguments manipulation hook. - args = dispatch_hook('args', args['hooks'], args) - - # Create the (empty) response. - r = Request(**args) - - # Give the response some context. - r.session = self - - # Don't send if asked nicely. - if not return_response: - return r - - # Send the HTTP Request. - r.send(prefetch=prefetch) - - # Send any cookies back up the to the session. - self.cookies.update(r.response.cookies) - - # Return the response. - return r.response - - - def get(self, url, **kwargs): - """Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param **kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('get', url, **kwargs) - - - def options(self, url, **kwargs): - """Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param **kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('options', url, **kwargs) - - - def head(self, url, **kwargs): - """Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param **kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', False) - return self.request('head', url, **kwargs) - - - def post(self, url, data=None, **kwargs): - """Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`. - :param **kwargs: Optional arguments that ``request`` takes. - """ - - return self.request('post', url, data=data, **kwargs) - - - def put(self, url, data=None, **kwargs): - """Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`. - :param **kwargs: Optional arguments that ``request`` takes. - """ - - return self.request('put', url, data=data, **kwargs) - - - def patch(self, url, data=None, **kwargs): - """Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`. - :param **kwargs: Optional arguments that ``request`` takes. - """ - - return self.request('patch', url, data=data, **kwargs) - - - def delete(self, url, **kwargs): - """Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param **kwargs: Optional arguments that ``request`` takes. - """ - - return self.request('delete', url, **kwargs) - - def __getstate__(self): - return dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) - - def __setstate__(self, state): - for attr, value in state.items(): - setattr(self, attr, value) - - self.init_poolmanager() - - -def session(**kwargs): - """Returns a :class:`Session` for context-management.""" - - return Session(**kwargs) diff --git a/vendor-local/packages/requests/requests/structures.py b/vendor-local/packages/requests/requests/structures.py deleted file mode 100644 index 37467542075..00000000000 --- a/vendor-local/packages/requests/requests/structures.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.structures -~~~~~~~~~~~~~~~~~~~ - -Data structures that power Requests. - -""" - - -class CaseInsensitiveDict(dict): - """Case-insensitive Dictionary - - For example, ``headers['content-encoding']`` will return the - value of a ``'Content-Encoding'`` response header.""" - - @property - def lower_keys(self): - if not hasattr(self, '_lower_keys') or not self._lower_keys: - self._lower_keys = dict((k.lower(), k) for k in list(self.keys())) - return self._lower_keys - - def _clear_lower_keys(self): - if hasattr(self, '_lower_keys'): - self._lower_keys.clear() - - def __setitem__(self, key, value): - dict.__setitem__(self, key, value) - self._clear_lower_keys() - - def __delitem__(self, key): - dict.__delitem__(self, key) - self._lower_keys.clear() - - def __contains__(self, key): - return key.lower() in self.lower_keys - - def __getitem__(self, key): - # We allow fall-through here, so values default to None - if key in self: - return dict.__getitem__(self, self.lower_keys[key.lower()]) - - def get(self, key, default=None): - if key in self: - return self[key] - else: - return default - -class LookupDict(dict): - """Dictionary lookup object.""" - - def __init__(self, name=None): - self.name = name - super(LookupDict, self).__init__() - - def __repr__(self): - return '<lookup \'%s\'>' % (self.name) - - def __getitem__(self, key): - # We allow fall-through here, so values default to None - - return self.__dict__.get(key, None) - - def get(self, key, default=None): - return self.__dict__.get(key, default) diff --git a/vendor-local/packages/requests/requests/utils.py b/vendor-local/packages/requests/requests/utils.py deleted file mode 100644 index 68efa4697aa..00000000000 --- a/vendor-local/packages/requests/requests/utils.py +++ /dev/null @@ -1,456 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. - -""" - -import cgi -import codecs -import os -import random -import re -import zlib -from netrc import netrc, NetrcParseError - -from .compat import parse_http_list as _parse_list_header -from .compat import quote, cookielib, SimpleCookie, is_py2, urlparse -from .compat import basestring, bytes - - -NETRC_FILES = ('.netrc', '_netrc') - - -def get_netrc_auth(url): - """Returns the Requests tuple auth for a given url from netrc.""" - - locations = (os.path.expanduser('~/{0}'.format(f)) for f in NETRC_FILES) - netrc_path = None - - for loc in locations: - if os.path.exists(loc) and not netrc_path: - netrc_path = loc - - # Abort early if there isn't one. - if netrc_path is None: - return netrc_path - - ri = urlparse(url) - - # Strip port numbers from netloc - host = ri.netloc.split(':')[0] - - try: - _netrc = netrc(netrc_path).authenticators(host) - if _netrc: - # Return with login / password - login_i = (0 if _netrc[0] else 1) - return (_netrc[login_i], _netrc[2]) - except NetrcParseError: - pass - - -def dict_from_string(s): - """Returns a MultiDict with Cookies.""" - - cookies = dict() - - c = SimpleCookie() - c.load(s) - - for k, v in list(c.items()): - cookies.update({k: v.value}) - - return cookies - - -def guess_filename(obj): - """Tries to guess the filename of the given object.""" - name = getattr(obj, 'name', None) - if name and name[0] != '<' and name[-1] != '>': - return name - - -# From mitsuhiko/werkzeug (used with permission). -def parse_list_header(value): - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -# From mitsuhiko/werkzeug (used with permission). -def parse_dict_header(value): - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict: - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - :param value: a string with a dict header. - :return: :class:`dict` - """ - result = {} - for item in _parse_list_header(value): - if '=' not in item: - result[item] = None - continue - name, value = item.split('=', 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -# From mitsuhiko/werkzeug (used with permission). -def unquote_header_value(value, is_filename=False): - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - :param value: the header value to unquote. - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != '\\\\': - return value.replace('\\\\', '\\').replace('\\"', '"') - return value - - -def header_expand(headers): - """Returns an HTTP Header value string from a dictionary. - - Example expansion:: - - {'text/x-dvi': {'q': '.8', 'mxb': '100000', 'mxt': '5.0'}, 'text/x-c': {}} - # Accept: text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c - - (('text/x-dvi', {'q': '.8', 'mxb': '100000', 'mxt': '5.0'}), ('text/x-c', {})) - # Accept: text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c - """ - - collector = [] - - if isinstance(headers, dict): - headers = list(headers.items()) - elif isinstance(headers, basestring): - return headers - elif isinstance(headers, str): - # As discussed in https://github.com/kennethreitz/requests/issues/400 - # latin-1 is the most conservative encoding used on the web. Anyone - # who needs more can encode to a byte-string before calling - return headers.encode("latin-1") - elif headers is None: - return headers - - for i, (value, params) in enumerate(headers): - - _params = [] - - for (p_k, p_v) in list(params.items()): - - _params.append('%s=%s' % (p_k, p_v)) - - collector.append(value) - collector.append('; ') - - if len(params): - - collector.append('; '.join(_params)) - - if not len(headers) == i + 1: - collector.append(', ') - - # Remove trailing separators. - if collector[-1] in (', ', '; '): - del collector[-1] - - return ''.join(collector) - - -def randombytes(n): - """Return n random bytes.""" - if is_py2: - L = [chr(random.randrange(0, 256)) for i in range(n)] - else: - L = [chr(random.randrange(0, 256)).encode('utf-8') for i in range(n)] - return b"".join(L) - - -def dict_from_cookiejar(cj): - """Returns a key/value dictionary from a CookieJar. - - :param cj: CookieJar object to extract cookies from. - """ - - cookie_dict = {} - - for _, cookies in list(cj._cookies.items()): - for _, cookies in list(cookies.items()): - for cookie in list(cookies.values()): - # print cookie - cookie_dict[cookie.name] = cookie.value - - return cookie_dict - - -def cookiejar_from_dict(cookie_dict): - """Returns a CookieJar from a key/value dictionary. - - :param cookie_dict: Dict of key/values to insert into CookieJar. - """ - - # return cookiejar if one was passed in - if isinstance(cookie_dict, cookielib.CookieJar): - return cookie_dict - - # create cookiejar - cj = cookielib.CookieJar() - - cj = add_dict_to_cookiejar(cj, cookie_dict) - - return cj - - -def add_dict_to_cookiejar(cj, cookie_dict): - """Returns a CookieJar from a key/value dictionary. - - :param cj: CookieJar to insert cookies into. - :param cookie_dict: Dict of key/values to insert into CookieJar. - """ - - for k, v in list(cookie_dict.items()): - - cookie = cookielib.Cookie( - version=0, - name=k, - value=v, - port=None, - port_specified=False, - domain='', - domain_specified=False, - domain_initial_dot=False, - path='/', - path_specified=True, - secure=False, - expires=None, - discard=True, - comment=None, - comment_url=None, - rest={'HttpOnly': None}, - rfc2109=False - ) - - # add cookie to cookiejar - cj.set_cookie(cookie) - - return cj - - -def get_encodings_from_content(content): - """Returns encodings from given content string. - - :param content: bytestring to extract encodings from. - """ - - charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) - - return charset_re.findall(content) - - -def get_encoding_from_headers(headers): - """Returns encodings from given HTTP Header Dict. - - :param headers: dictionary to extract encoding from. - """ - - content_type = headers.get('content-type') - - if not content_type: - return None - - content_type, params = cgi.parse_header(content_type) - - if 'charset' in params: - return params['charset'].strip("'\"") - - if 'text' in content_type: - return 'ISO-8859-1' - - -def stream_decode_response_unicode(iterator, r): - """Stream decodes a iterator.""" - - if r.encoding is None: - for item in iterator: - yield item - return - - decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') - for chunk in iterator: - rv = decoder.decode(chunk) - if rv: - yield rv - rv = decoder.decode('', final=True) - if rv: - yield rv - - -def get_unicode_from_response(r): - """Returns the requested content back in unicode. - - :param r: Response object to get unicode content from. - - Tried: - - 1. charset from content-type - - 2. every encodings from ``<meta ... charset=XXX>`` - - 3. fall back and replace all unicode characters - - """ - - tried_encodings = [] - - # Try charset from content-type - encoding = get_encoding_from_headers(r.headers) - - if encoding: - try: - return str(r.content, encoding) - except UnicodeError: - tried_encodings.append(encoding) - - # Fall back: - try: - return str(r.content, encoding, errors='replace') - except TypeError: - return r.content - - -def stream_decompress(iterator, mode='gzip'): - """ - Stream decodes an iterator over compressed data - - :param iterator: An iterator over compressed data - :param mode: 'gzip' or 'deflate' - :return: An iterator over decompressed data - """ - - if mode not in ['gzip', 'deflate']: - raise ValueError('stream_decompress mode must be gzip or deflate') - - zlib_mode = 16 + zlib.MAX_WBITS if mode == 'gzip' else -zlib.MAX_WBITS - dec = zlib.decompressobj(zlib_mode) - try: - for chunk in iterator: - rv = dec.decompress(chunk) - if rv: - yield rv - except zlib.error: - # If there was an error decompressing, just return the raw chunk - yield chunk - # Continue to return the rest of the raw data - for chunk in iterator: - yield chunk - else: - # Make sure everything has been returned from the decompression object - buf = dec.decompress(bytes()) - rv = buf + dec.flush() - if rv: - yield rv - - -def stream_untransfer(gen, resp): - if 'gzip' in resp.headers.get('content-encoding', ''): - gen = stream_decompress(gen, mode='gzip') - elif 'deflate' in resp.headers.get('content-encoding', ''): - gen = stream_decompress(gen, mode='deflate') - - return gen - - -# The unreserved URI characters (RFC 3986) -UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - + "0123456789-._~") - - -def unquote_unreserved(uri): - """Un-escape any percent-escape sequences in a URI that are unreserved - characters. - This leaves all reserved, illegal and non-ASCII bytes encoded. - """ - parts = uri.split('%') - for i in range(1, len(parts)): - h = parts[i][0:2] - if len(h) == 2: - c = chr(int(h, 16)) - if c in UNRESERVED_SET: - parts[i] = c + parts[i][2:] - else: - parts[i] = '%' + parts[i] - else: - parts[i] = '%' + parts[i] - return ''.join(parts) - - -def requote_uri(uri): - """Re-quote the given URI. - - This function passes the given URI through an unquote/quote cycle to - ensure that it is fully and consistently quoted. - """ - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, unreserved, - # or '%') - return quote(unquote_unreserved(uri), safe="!#$%&'()*+,/:;=?@[]~") diff --git a/vendor-local/packages/requests/setup.cfg b/vendor-local/packages/requests/setup.cfg deleted file mode 100644 index 861a9f55426..00000000000 --- a/vendor-local/packages/requests/setup.cfg +++ /dev/null @@ -1,5 +0,0 @@ -[egg_info] -tag_build = -tag_date = 0 -tag_svn_revision = 0 - diff --git a/vendor-local/packages/requests/setup.py b/vendor-local/packages/requests/setup.py deleted file mode 100644 index 849ab830632..00000000000 --- a/vendor-local/packages/requests/setup.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import os -import sys -import requests -from requests.compat import is_py3, is_py2 - -try: - from setuptools import setup -except ImportError: - from distutils.core import setup - - - -if sys.argv[-1] == 'publish': - os.system('python setup.py sdist upload') - sys.exit() - -if sys.argv[-1] == 'test': - os.system('python test_requests.py') - sys.exit() - -required = ['certifi>=0.0.7',] -packages = [ - 'requests', - 'requests.packages', - 'requests.packages.urllib3', - 'requests.packages.urllib3.packages', - 'requests.packages.urllib3.packages.ssl_match_hostname', - 'requests.packages.urllib3.packages.mimetools_choose_boundary', -] - -if is_py3: - required.append('chardet2') -else: - required.append('chardet>=1.0.0') - packages.append('requests.packages.oreos') - - -setup( - name='requests', - version=requests.__version__, - description='Python HTTP for Humans.', - long_description=open('README.rst').read() + '\n\n' + - open('HISTORY.rst').read(), - author='Kenneth Reitz', - author_email='me@kennethreitz.com', - url='http://python-requests.org', - packages=packages, - package_data={'': ['LICENSE', 'NOTICE']}, - include_package_data=True, - install_requires=required, - license='ISC', - classifiers=( - 'Development Status :: 5 - Production/Stable', - 'Intended Audience :: Developers', - 'Natural Language :: English', - 'License :: OSI Approved :: ISC License (ISCL)', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2.6', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.0', - 'Programming Language :: Python :: 3.1', - ), -) diff --git a/vendor-local/vendor.pth b/vendor-local/vendor.pth index baf93125c1b..807a2a11bdf 100644 --- a/vendor-local/vendor.pth +++ b/vendor-local/vendor.pth @@ -5,7 +5,6 @@ src/django-dnt src/django-statsd src/django-waffle src/pystatsd -packages/requests packages/certifi packages/chardet packages/python-memcached From 09b0ac712c24d9c3756ead8797821725f3ea4731 Mon Sep 17 00:00:00 2001 From: Michael Kelly <mkelly@mozilla.com> Date: Mon, 2 Dec 2013 16:27:54 -0500 Subject: [PATCH 11/23] Fix bug 935248: Firefox Release notes powered by RNA/Nucleus. --- .../templates/firefox/releases/notes.html | 74 ++++++++++++ .../firefox/releases/system_requirements.html | 33 +++++ bedrock/firefox/tests/__init__.py | 49 ++++++++ .../firefox/{tests.py => tests/test_base.py} | 0 .../product_details_json/.last_update | 0 .../firefox_beta_builds.json | 0 .../firefox_history_development_releases.json | 0 .../firefox_history_major_releases.json | 0 .../firefox_history_stability_releases.json | 0 .../firefox_primary_builds.json | 0 .../firefox_versions.json | 0 .../product_details_json/languages.json | 0 .../product_details_json/mobile_details.json | 0 .../mobile_history_development_releases.json | 0 .../mobile_history_major_releases.json | 0 .../mobile_history_stability_releases.json | 0 .../product_details_json/regions/.last_update | 0 .../product_details_json/regions/af.json | 0 .../product_details_json/regions/ak.json | 0 .../product_details_json/regions/ar.json | 0 .../product_details_json/regions/as.json | 0 .../product_details_json/regions/ast.json | 0 .../product_details_json/regions/be.json | 0 .../product_details_json/regions/bg.json | 0 .../product_details_json/regions/bn-BD.json | 0 .../product_details_json/regions/bn-IN.json | 0 .../product_details_json/regions/br.json | 0 .../product_details_json/regions/ca.json | 0 .../product_details_json/regions/cs.json | 0 .../product_details_json/regions/cy.json | 0 .../product_details_json/regions/da.json | 0 .../product_details_json/regions/de.json | 0 .../product_details_json/regions/el.json | 0 .../product_details_json/regions/en-GB.json | 0 .../product_details_json/regions/en-US.json | 0 .../product_details_json/regions/en-ZA.json | 0 .../product_details_json/regions/eo.json | 0 .../product_details_json/regions/es-AR.json | 0 .../product_details_json/regions/es-CL.json | 0 .../product_details_json/regions/es-ES.json | 0 .../product_details_json/regions/es-MX.json | 0 .../product_details_json/regions/et.json | 0 .../product_details_json/regions/eu.json | 0 .../product_details_json/regions/fa.json | 0 .../product_details_json/regions/fi.json | 0 .../product_details_json/regions/fr.json | 0 .../product_details_json/regions/fy-NL.json | 0 .../product_details_json/regions/ga-IE.json | 0 .../product_details_json/regions/gd.json | 0 .../product_details_json/regions/gl.json | 0 .../product_details_json/regions/gu-IN.json | 0 .../product_details_json/regions/he.json | 0 .../product_details_json/regions/hi-IN.json | 0 .../product_details_json/regions/hr.json | 0 .../product_details_json/regions/hu.json | 0 .../product_details_json/regions/hy-AM.json | 0 .../product_details_json/regions/id.json | 0 .../product_details_json/regions/is.json | 0 .../product_details_json/regions/it.json | 0 .../product_details_json/regions/ka.json | 0 .../product_details_json/regions/kk.json | 0 .../product_details_json/regions/kn.json | 0 .../product_details_json/regions/ko.json | 0 .../product_details_json/regions/ku.json | 0 .../product_details_json/regions/lg.json | 0 .../product_details_json/regions/lt.json | 0 .../product_details_json/regions/lv.json | 0 .../product_details_json/regions/mai.json | 0 .../product_details_json/regions/mk.json | 0 .../product_details_json/regions/ml.json | 0 .../product_details_json/regions/mn.json | 0 .../product_details_json/regions/mr.json | 0 .../product_details_json/regions/nb-NO.json | 0 .../product_details_json/regions/nl.json | 0 .../product_details_json/regions/nn-NO.json | 0 .../product_details_json/regions/nso.json | 0 .../product_details_json/regions/oc.json | 0 .../product_details_json/regions/or.json | 0 .../product_details_json/regions/pa-IN.json | 0 .../product_details_json/regions/pl.json | 0 .../product_details_json/regions/pt-BR.json | 0 .../product_details_json/regions/pt-PT.json | 0 .../product_details_json/regions/rm.json | 0 .../product_details_json/regions/ro.json | 0 .../product_details_json/regions/ru.json | 0 .../product_details_json/regions/si.json | 0 .../product_details_json/regions/sk.json | 0 .../product_details_json/regions/sl.json | 0 .../product_details_json/regions/son.json | 0 .../product_details_json/regions/sq.json | 0 .../product_details_json/regions/sr.json | 0 .../product_details_json/regions/sv-SE.json | 0 .../product_details_json/regions/ta-LK.json | 0 .../product_details_json/regions/ta.json | 0 .../product_details_json/regions/te.json | 0 .../product_details_json/regions/th.json | 0 .../product_details_json/regions/tr.json | 0 .../product_details_json/regions/uk.json | 0 .../product_details_json/regions/vi.json | 0 .../product_details_json/regions/zh-CN.json | 0 .../product_details_json/regions/zh-TW.json | 0 .../product_details_json/regions/zu.json | 0 .../thunderbird_beta_builds.json | 0 ...nderbird_history_development_releases.json | 0 .../thunderbird_history_major_releases.json | 0 ...hunderbird_history_stability_releases.json | 0 .../thunderbird_primary_builds.json | 0 .../thunderbird_versions.json | 0 bedrock/firefox/tests/test_views.py | 113 ++++++++++++++++++ bedrock/firefox/urls.py | 3 + bedrock/firefox/views.py | 42 ++++++- bedrock/settings/base.py | 8 ++ requirements/dev.txt | 1 + 113 files changed, 318 insertions(+), 5 deletions(-) create mode 100644 bedrock/firefox/templates/firefox/releases/notes.html create mode 100644 bedrock/firefox/templates/firefox/releases/system_requirements.html create mode 100644 bedrock/firefox/tests/__init__.py rename bedrock/firefox/{tests.py => tests/test_base.py} (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/.last_update (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/firefox_beta_builds.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/firefox_history_development_releases.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/firefox_history_major_releases.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/firefox_history_stability_releases.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/firefox_primary_builds.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/firefox_versions.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/languages.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/mobile_details.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/mobile_history_development_releases.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/mobile_history_major_releases.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/mobile_history_stability_releases.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/.last_update (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/af.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ak.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ar.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/as.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ast.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/be.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/bg.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/bn-BD.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/bn-IN.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/br.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ca.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/cs.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/cy.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/da.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/de.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/el.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/en-GB.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/en-US.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/en-ZA.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/eo.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/es-AR.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/es-CL.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/es-ES.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/es-MX.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/et.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/eu.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/fa.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/fi.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/fr.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/fy-NL.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ga-IE.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/gd.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/gl.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/gu-IN.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/he.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/hi-IN.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/hr.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/hu.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/hy-AM.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/id.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/is.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/it.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ka.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/kk.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/kn.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ko.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ku.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/lg.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/lt.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/lv.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/mai.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/mk.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ml.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/mn.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/mr.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/nb-NO.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/nl.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/nn-NO.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/nso.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/oc.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/or.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/pa-IN.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/pl.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/pt-BR.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/pt-PT.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/rm.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ro.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ru.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/si.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/sk.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/sl.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/son.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/sq.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/sr.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/sv-SE.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ta-LK.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/ta.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/te.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/th.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/tr.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/uk.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/vi.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/zh-CN.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/zh-TW.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/regions/zu.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/thunderbird_beta_builds.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/thunderbird_history_development_releases.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/thunderbird_history_major_releases.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/thunderbird_history_stability_releases.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/thunderbird_primary_builds.json (100%) rename bedrock/firefox/{ => tests}/test_data/product_details_json/thunderbird_versions.json (100%) create mode 100644 bedrock/firefox/tests/test_views.py diff --git a/bedrock/firefox/templates/firefox/releases/notes.html b/bedrock/firefox/templates/firefox/releases/notes.html new file mode 100644 index 00000000000..cd0c4f37941 --- /dev/null +++ b/bedrock/firefox/templates/firefox/releases/notes.html @@ -0,0 +1,74 @@ +{# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. #} + +{% extends "firefox/fxos-base.html" %} + +{% block page_title_prefix %}{% endblock %} +{% block page_title %}{{ _('Firefox — {version} Notes')|f(version=version) }}{% endblock %} + +{% block body_id %}notes{% endblock %} +{% block body_class %}fxos-notes sky{% endblock %} + + +{% block site_css %} + {{ css('firefox_releasenotes') }} +{% endblock %} + +{% block extrahead %}{% endblock %} + +{% block content %} + <header id="main-feature"> + <h1>{{ _('Firefox {version} Notes')|f(version=version) }}</h1> + + <h2>{{ _('First offered to release channel users on {date}')|f(date=release.release_date|l10n_format_date) }}</h2> + + <p> + {% trans feedback='https://input.mozilla.org/feedback', + bugzilla='https://bugzilla.mozilla.org/' %} + As always, you’re encouraged to + <a href="{{ feedback }}">tell us what you think</a>, + or <a href="{{ bugzilla }}">file a bug in Bugzilla</a>. + {% endtrans %} + </p> + </header> + + <div id="main-content"> + <article class="main-column"> + <section class="notes-section" id="new-features"> + <h3>{{ _('New Features') }}</h3> + <ul class="section-items"> + {% for note in new_features %} + <li> + <small>{{ note.tag.text }}</small> + <p>{{ note.html|safe }}</p> + </li> + {% endfor %} + </ul> + </section> + + <section class="notes-section" id="known-issues"> + <h3>{{ _('Known Issues') }}</h3> + <ul class="section-items"> + {% for note in known_issues %} + <li> + <small>{{ _('UNRESOLVED') }}</small> + <p>{{ note.html|safe }}</p> + {% if not note.fixed_in_version is none %} + <small>{{ _('Unresolved in v{version_number}')|f(version_number=major_version) }}</small> + <small> + <a href="{{ url('firefox.releasenotes', '{major_version}.0'|f(major_version=note.fixed_in_version)) }}"> + {{ _('Resolved in v{version_number}')|f(version_number=note.fixed_in_version) }} + </a> + </small> + {% endif %} + </li> + {% endfor %} + </ul> + </section> + </article> + <aside id="sidebar" class="sidebar"></aside> + </div> +{% endblock %} + +{% block js %}{% endblock %} diff --git a/bedrock/firefox/templates/firefox/releases/system_requirements.html b/bedrock/firefox/templates/firefox/releases/system_requirements.html new file mode 100644 index 00000000000..67f271b80c0 --- /dev/null +++ b/bedrock/firefox/templates/firefox/releases/system_requirements.html @@ -0,0 +1,33 @@ +{# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. #} + +{% extends "firefox/base-resp.html" %} + +{% block page_title_prefix %}{% endblock %} +{% block page_title %}{{ _('Firefox — {version} System Requirements')|f(version=version) }}{% endblock %} + +{% block body_id %}notes{% endblock %} +{% block body_class %}fxos-notes sky{% endblock %} + + +{% block site_css %} + {{ css('firefox_releasenotes') }} +{% endblock %} + +{% block extrahead %}{% endblock %} + +{% block content %} + <header id="main-feature"> + <h1>{{ _('Firefox {version} System Requirements')|f(version=version) }}</h1> + </header> + + <div id="main-content"> + <article class="main-column"> + {{ release.system_requirements|markdown()|safe }} + </article> + </div> + {% block sidebar %}{% endblock %} +{% endblock %} + +{% block js %}{% endblock %} diff --git a/bedrock/firefox/tests/__init__.py b/bedrock/firefox/tests/__init__.py new file mode 100644 index 00000000000..02631b87624 --- /dev/null +++ b/bedrock/firefox/tests/__init__.py @@ -0,0 +1,49 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +from datetime import datetime + +import rna.models +from factory import DjangoModelFactory, LazyAttribute, Sequence, SubFactory +from factory.fuzzy import FuzzyNaiveDateTime, FuzzyInteger + + +class ChannelFactory(DjangoModelFactory): + FACTORY_FOR = rna.models.Channel + name = Sequence(lambda n: 'Channel {0}'.format(n)) + + +class ProductFactory(DjangoModelFactory): + FACTORY_FOR = rna.models.Product + name = Sequence(lambda n: 'Product {0}'.format(n)) + text = Sequence(lambda n: 'Text {0}'.format(n)) + + +class ReleaseFactory(DjangoModelFactory): + FACTORY_FOR = rna.models.Release + product = SubFactory(ProductFactory) + channel = SubFactory(ChannelFactory) + version = FuzzyInteger(0) + sub_version = 0 + release_date = FuzzyNaiveDateTime(datetime(2013, 12, 2)) + text = '' + + +class TagFactory(DjangoModelFactory): + FACTORY_FOR = rna.models.Tag + text = Sequence(lambda n: 'Tag {0}'.format(n)) + sort_num = Sequence(lambda n: n) + + +class NoteFactory(DjangoModelFactory): + FACTORY_FOR = rna.models.Note + bug = None + html = '<p>Note!</p>' + first_version = Sequence(lambda n: n) + first_channel = SubFactory(ChannelFactory) + fixed_in_version = LazyAttribute(lambda n: n.first_version + 2) + fixed_in_channel = SubFactory(ChannelFactory) + tag = SubFactory(TagFactory) + product = SubFactory(ProductFactory) + sort_num = Sequence(lambda n: n) + fixed_in_subversion = None diff --git a/bedrock/firefox/tests.py b/bedrock/firefox/tests/test_base.py similarity index 100% rename from bedrock/firefox/tests.py rename to bedrock/firefox/tests/test_base.py diff --git a/bedrock/firefox/test_data/product_details_json/.last_update b/bedrock/firefox/tests/test_data/product_details_json/.last_update similarity index 100% rename from bedrock/firefox/test_data/product_details_json/.last_update rename to bedrock/firefox/tests/test_data/product_details_json/.last_update diff --git a/bedrock/firefox/test_data/product_details_json/firefox_beta_builds.json b/bedrock/firefox/tests/test_data/product_details_json/firefox_beta_builds.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/firefox_beta_builds.json rename to bedrock/firefox/tests/test_data/product_details_json/firefox_beta_builds.json diff --git a/bedrock/firefox/test_data/product_details_json/firefox_history_development_releases.json b/bedrock/firefox/tests/test_data/product_details_json/firefox_history_development_releases.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/firefox_history_development_releases.json rename to bedrock/firefox/tests/test_data/product_details_json/firefox_history_development_releases.json diff --git a/bedrock/firefox/test_data/product_details_json/firefox_history_major_releases.json b/bedrock/firefox/tests/test_data/product_details_json/firefox_history_major_releases.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/firefox_history_major_releases.json rename to bedrock/firefox/tests/test_data/product_details_json/firefox_history_major_releases.json diff --git a/bedrock/firefox/test_data/product_details_json/firefox_history_stability_releases.json b/bedrock/firefox/tests/test_data/product_details_json/firefox_history_stability_releases.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/firefox_history_stability_releases.json rename to bedrock/firefox/tests/test_data/product_details_json/firefox_history_stability_releases.json diff --git a/bedrock/firefox/test_data/product_details_json/firefox_primary_builds.json b/bedrock/firefox/tests/test_data/product_details_json/firefox_primary_builds.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/firefox_primary_builds.json rename to bedrock/firefox/tests/test_data/product_details_json/firefox_primary_builds.json diff --git a/bedrock/firefox/test_data/product_details_json/firefox_versions.json b/bedrock/firefox/tests/test_data/product_details_json/firefox_versions.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/firefox_versions.json rename to bedrock/firefox/tests/test_data/product_details_json/firefox_versions.json diff --git a/bedrock/firefox/test_data/product_details_json/languages.json b/bedrock/firefox/tests/test_data/product_details_json/languages.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/languages.json rename to bedrock/firefox/tests/test_data/product_details_json/languages.json diff --git a/bedrock/firefox/test_data/product_details_json/mobile_details.json b/bedrock/firefox/tests/test_data/product_details_json/mobile_details.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/mobile_details.json rename to bedrock/firefox/tests/test_data/product_details_json/mobile_details.json diff --git a/bedrock/firefox/test_data/product_details_json/mobile_history_development_releases.json b/bedrock/firefox/tests/test_data/product_details_json/mobile_history_development_releases.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/mobile_history_development_releases.json rename to bedrock/firefox/tests/test_data/product_details_json/mobile_history_development_releases.json diff --git a/bedrock/firefox/test_data/product_details_json/mobile_history_major_releases.json b/bedrock/firefox/tests/test_data/product_details_json/mobile_history_major_releases.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/mobile_history_major_releases.json rename to bedrock/firefox/tests/test_data/product_details_json/mobile_history_major_releases.json diff --git a/bedrock/firefox/test_data/product_details_json/mobile_history_stability_releases.json b/bedrock/firefox/tests/test_data/product_details_json/mobile_history_stability_releases.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/mobile_history_stability_releases.json rename to bedrock/firefox/tests/test_data/product_details_json/mobile_history_stability_releases.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/.last_update b/bedrock/firefox/tests/test_data/product_details_json/regions/.last_update similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/.last_update rename to bedrock/firefox/tests/test_data/product_details_json/regions/.last_update diff --git a/bedrock/firefox/test_data/product_details_json/regions/af.json b/bedrock/firefox/tests/test_data/product_details_json/regions/af.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/af.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/af.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ak.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ak.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ak.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ak.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ar.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ar.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ar.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ar.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/as.json b/bedrock/firefox/tests/test_data/product_details_json/regions/as.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/as.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/as.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ast.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ast.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ast.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ast.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/be.json b/bedrock/firefox/tests/test_data/product_details_json/regions/be.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/be.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/be.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/bg.json b/bedrock/firefox/tests/test_data/product_details_json/regions/bg.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/bg.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/bg.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/bn-BD.json b/bedrock/firefox/tests/test_data/product_details_json/regions/bn-BD.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/bn-BD.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/bn-BD.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/bn-IN.json b/bedrock/firefox/tests/test_data/product_details_json/regions/bn-IN.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/bn-IN.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/bn-IN.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/br.json b/bedrock/firefox/tests/test_data/product_details_json/regions/br.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/br.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/br.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ca.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ca.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ca.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ca.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/cs.json b/bedrock/firefox/tests/test_data/product_details_json/regions/cs.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/cs.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/cs.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/cy.json b/bedrock/firefox/tests/test_data/product_details_json/regions/cy.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/cy.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/cy.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/da.json b/bedrock/firefox/tests/test_data/product_details_json/regions/da.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/da.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/da.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/de.json b/bedrock/firefox/tests/test_data/product_details_json/regions/de.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/de.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/de.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/el.json b/bedrock/firefox/tests/test_data/product_details_json/regions/el.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/el.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/el.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/en-GB.json b/bedrock/firefox/tests/test_data/product_details_json/regions/en-GB.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/en-GB.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/en-GB.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/en-US.json b/bedrock/firefox/tests/test_data/product_details_json/regions/en-US.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/en-US.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/en-US.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/en-ZA.json b/bedrock/firefox/tests/test_data/product_details_json/regions/en-ZA.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/en-ZA.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/en-ZA.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/eo.json b/bedrock/firefox/tests/test_data/product_details_json/regions/eo.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/eo.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/eo.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/es-AR.json b/bedrock/firefox/tests/test_data/product_details_json/regions/es-AR.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/es-AR.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/es-AR.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/es-CL.json b/bedrock/firefox/tests/test_data/product_details_json/regions/es-CL.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/es-CL.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/es-CL.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/es-ES.json b/bedrock/firefox/tests/test_data/product_details_json/regions/es-ES.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/es-ES.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/es-ES.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/es-MX.json b/bedrock/firefox/tests/test_data/product_details_json/regions/es-MX.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/es-MX.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/es-MX.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/et.json b/bedrock/firefox/tests/test_data/product_details_json/regions/et.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/et.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/et.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/eu.json b/bedrock/firefox/tests/test_data/product_details_json/regions/eu.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/eu.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/eu.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/fa.json b/bedrock/firefox/tests/test_data/product_details_json/regions/fa.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/fa.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/fa.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/fi.json b/bedrock/firefox/tests/test_data/product_details_json/regions/fi.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/fi.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/fi.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/fr.json b/bedrock/firefox/tests/test_data/product_details_json/regions/fr.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/fr.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/fr.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/fy-NL.json b/bedrock/firefox/tests/test_data/product_details_json/regions/fy-NL.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/fy-NL.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/fy-NL.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ga-IE.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ga-IE.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ga-IE.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ga-IE.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/gd.json b/bedrock/firefox/tests/test_data/product_details_json/regions/gd.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/gd.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/gd.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/gl.json b/bedrock/firefox/tests/test_data/product_details_json/regions/gl.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/gl.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/gl.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/gu-IN.json b/bedrock/firefox/tests/test_data/product_details_json/regions/gu-IN.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/gu-IN.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/gu-IN.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/he.json b/bedrock/firefox/tests/test_data/product_details_json/regions/he.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/he.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/he.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/hi-IN.json b/bedrock/firefox/tests/test_data/product_details_json/regions/hi-IN.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/hi-IN.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/hi-IN.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/hr.json b/bedrock/firefox/tests/test_data/product_details_json/regions/hr.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/hr.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/hr.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/hu.json b/bedrock/firefox/tests/test_data/product_details_json/regions/hu.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/hu.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/hu.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/hy-AM.json b/bedrock/firefox/tests/test_data/product_details_json/regions/hy-AM.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/hy-AM.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/hy-AM.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/id.json b/bedrock/firefox/tests/test_data/product_details_json/regions/id.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/id.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/id.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/is.json b/bedrock/firefox/tests/test_data/product_details_json/regions/is.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/is.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/is.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/it.json b/bedrock/firefox/tests/test_data/product_details_json/regions/it.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/it.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/it.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ka.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ka.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ka.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ka.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/kk.json b/bedrock/firefox/tests/test_data/product_details_json/regions/kk.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/kk.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/kk.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/kn.json b/bedrock/firefox/tests/test_data/product_details_json/regions/kn.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/kn.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/kn.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ko.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ko.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ko.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ko.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ku.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ku.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ku.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ku.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/lg.json b/bedrock/firefox/tests/test_data/product_details_json/regions/lg.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/lg.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/lg.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/lt.json b/bedrock/firefox/tests/test_data/product_details_json/regions/lt.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/lt.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/lt.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/lv.json b/bedrock/firefox/tests/test_data/product_details_json/regions/lv.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/lv.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/lv.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/mai.json b/bedrock/firefox/tests/test_data/product_details_json/regions/mai.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/mai.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/mai.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/mk.json b/bedrock/firefox/tests/test_data/product_details_json/regions/mk.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/mk.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/mk.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ml.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ml.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ml.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ml.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/mn.json b/bedrock/firefox/tests/test_data/product_details_json/regions/mn.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/mn.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/mn.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/mr.json b/bedrock/firefox/tests/test_data/product_details_json/regions/mr.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/mr.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/mr.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/nb-NO.json b/bedrock/firefox/tests/test_data/product_details_json/regions/nb-NO.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/nb-NO.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/nb-NO.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/nl.json b/bedrock/firefox/tests/test_data/product_details_json/regions/nl.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/nl.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/nl.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/nn-NO.json b/bedrock/firefox/tests/test_data/product_details_json/regions/nn-NO.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/nn-NO.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/nn-NO.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/nso.json b/bedrock/firefox/tests/test_data/product_details_json/regions/nso.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/nso.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/nso.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/oc.json b/bedrock/firefox/tests/test_data/product_details_json/regions/oc.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/oc.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/oc.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/or.json b/bedrock/firefox/tests/test_data/product_details_json/regions/or.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/or.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/or.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/pa-IN.json b/bedrock/firefox/tests/test_data/product_details_json/regions/pa-IN.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/pa-IN.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/pa-IN.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/pl.json b/bedrock/firefox/tests/test_data/product_details_json/regions/pl.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/pl.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/pl.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/pt-BR.json b/bedrock/firefox/tests/test_data/product_details_json/regions/pt-BR.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/pt-BR.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/pt-BR.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/pt-PT.json b/bedrock/firefox/tests/test_data/product_details_json/regions/pt-PT.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/pt-PT.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/pt-PT.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/rm.json b/bedrock/firefox/tests/test_data/product_details_json/regions/rm.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/rm.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/rm.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ro.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ro.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ro.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ro.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ru.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ru.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ru.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ru.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/si.json b/bedrock/firefox/tests/test_data/product_details_json/regions/si.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/si.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/si.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/sk.json b/bedrock/firefox/tests/test_data/product_details_json/regions/sk.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/sk.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/sk.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/sl.json b/bedrock/firefox/tests/test_data/product_details_json/regions/sl.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/sl.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/sl.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/son.json b/bedrock/firefox/tests/test_data/product_details_json/regions/son.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/son.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/son.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/sq.json b/bedrock/firefox/tests/test_data/product_details_json/regions/sq.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/sq.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/sq.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/sr.json b/bedrock/firefox/tests/test_data/product_details_json/regions/sr.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/sr.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/sr.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/sv-SE.json b/bedrock/firefox/tests/test_data/product_details_json/regions/sv-SE.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/sv-SE.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/sv-SE.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ta-LK.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ta-LK.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ta-LK.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ta-LK.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/ta.json b/bedrock/firefox/tests/test_data/product_details_json/regions/ta.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/ta.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/ta.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/te.json b/bedrock/firefox/tests/test_data/product_details_json/regions/te.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/te.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/te.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/th.json b/bedrock/firefox/tests/test_data/product_details_json/regions/th.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/th.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/th.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/tr.json b/bedrock/firefox/tests/test_data/product_details_json/regions/tr.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/tr.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/tr.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/uk.json b/bedrock/firefox/tests/test_data/product_details_json/regions/uk.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/uk.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/uk.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/vi.json b/bedrock/firefox/tests/test_data/product_details_json/regions/vi.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/vi.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/vi.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/zh-CN.json b/bedrock/firefox/tests/test_data/product_details_json/regions/zh-CN.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/zh-CN.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/zh-CN.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/zh-TW.json b/bedrock/firefox/tests/test_data/product_details_json/regions/zh-TW.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/zh-TW.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/zh-TW.json diff --git a/bedrock/firefox/test_data/product_details_json/regions/zu.json b/bedrock/firefox/tests/test_data/product_details_json/regions/zu.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/regions/zu.json rename to bedrock/firefox/tests/test_data/product_details_json/regions/zu.json diff --git a/bedrock/firefox/test_data/product_details_json/thunderbird_beta_builds.json b/bedrock/firefox/tests/test_data/product_details_json/thunderbird_beta_builds.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/thunderbird_beta_builds.json rename to bedrock/firefox/tests/test_data/product_details_json/thunderbird_beta_builds.json diff --git a/bedrock/firefox/test_data/product_details_json/thunderbird_history_development_releases.json b/bedrock/firefox/tests/test_data/product_details_json/thunderbird_history_development_releases.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/thunderbird_history_development_releases.json rename to bedrock/firefox/tests/test_data/product_details_json/thunderbird_history_development_releases.json diff --git a/bedrock/firefox/test_data/product_details_json/thunderbird_history_major_releases.json b/bedrock/firefox/tests/test_data/product_details_json/thunderbird_history_major_releases.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/thunderbird_history_major_releases.json rename to bedrock/firefox/tests/test_data/product_details_json/thunderbird_history_major_releases.json diff --git a/bedrock/firefox/test_data/product_details_json/thunderbird_history_stability_releases.json b/bedrock/firefox/tests/test_data/product_details_json/thunderbird_history_stability_releases.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/thunderbird_history_stability_releases.json rename to bedrock/firefox/tests/test_data/product_details_json/thunderbird_history_stability_releases.json diff --git a/bedrock/firefox/test_data/product_details_json/thunderbird_primary_builds.json b/bedrock/firefox/tests/test_data/product_details_json/thunderbird_primary_builds.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/thunderbird_primary_builds.json rename to bedrock/firefox/tests/test_data/product_details_json/thunderbird_primary_builds.json diff --git a/bedrock/firefox/test_data/product_details_json/thunderbird_versions.json b/bedrock/firefox/tests/test_data/product_details_json/thunderbird_versions.json similarity index 100% rename from bedrock/firefox/test_data/product_details_json/thunderbird_versions.json rename to bedrock/firefox/tests/test_data/product_details_json/thunderbird_versions.json diff --git a/bedrock/firefox/tests/test_views.py b/bedrock/firefox/tests/test_views.py new file mode 100644 index 00000000000..c812d2b862d --- /dev/null +++ b/bedrock/firefox/tests/test_views.py @@ -0,0 +1,113 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +from django.test.client import RequestFactory + +from mock import patch +from nose.tools import eq_ +from rna.models import Release + +from bedrock.firefox import views +from bedrock.firefox.tests import NoteFactory, ProductFactory, ReleaseFactory +from bedrock.mozorg.tests import TestCase + + +class TestReleaseNotesView(TestCase): + def setUp(self): + self.factory = RequestFactory() + self.request = self.factory.get('/') + + self.render_patch = patch('bedrock.firefox.views.l10n_utils.render') + self.mock_render = self.render_patch.start() + + def tearDown(self): + self.render_patch.stop() + + @property + def last_ctx(self): + """ + Convenient way to access the context of the last rendered + response. + """ + return self.mock_render.call_args[0][2] + + def test_missing_minor_version(self): + """ + If the minor version is missing in the URL, it should default to + 0. + """ + ReleaseFactory.create(version=18, sub_version=0, channel__name='Release', + product__name='Firefox') + + views.release_notes(self.request, '18.0') + eq_(self.last_ctx['minor_version'], 0) + + def test_no_release_404(self): + """ + Fetch the release using get_object_or_404, so that an Http404 is + raised when the release isn't found. + """ + with patch('bedrock.firefox.views.get_object_or_404') as get_object_or_404: + views.release_notes(self.request, '18.0') + eq_(self.last_ctx['release'], get_object_or_404.return_value) + get_object_or_404.assert_called_with(Release, version=18, sub_version=0, + channel__name='Release', product__name='Firefox') + + def test_note_first_version_not_fixed(self): + """ + If a note started on or before the current version, and has yet + to be fixed, include it in known issues. + """ + product = ProductFactory.create(name='Firefox') + ReleaseFactory.create(version=19, sub_version=0, channel__name='Release', product=product) + note1 = NoteFactory.create(first_version=18, fixed_in_version=None, product=product) + note2 = NoteFactory.create(first_version=19, fixed_in_version=None, product=product) + + views.release_notes(self.request, '19.0') + eq_(set([note1, note2]), set(self.last_ctx['known_issues'])) + + def test_note_first_version_fixed(self): + """ + If a note started on or before the current version, and was + fixed on this version, include it in new features. If it was + fixed after this version, include it in known issues. + """ + product = ProductFactory.create(name='Firefox') + ReleaseFactory.create(version=19, sub_version=0, channel__name='Release', product=product) + note1 = NoteFactory.create(first_version=18, fixed_in_version=19, product=product) + note2 = NoteFactory.create(first_version=19, fixed_in_version=19, product=product) + note3 = NoteFactory.create(first_version=18, fixed_in_version=20, product=product) + note4 = NoteFactory.create(first_version=19, fixed_in_version=20, product=product) + + views.release_notes(self.request, '19.0') + eq_(set([note1, note2]), set(self.last_ctx['new_features'])) + eq_(set([note3, note4]), set(self.last_ctx['known_issues'])) + + def test_note_fixed_no_first_version(self): + """ + If a note started has no first version but was fixed in the + current version, include it in new features. + """ + product = ProductFactory.create(name='Firefox') + ReleaseFactory.create(version=19, sub_version=0, channel__name='Release', product=product) + note1 = NoteFactory.create(first_version=None, fixed_in_version=19, product=product) + + views.release_notes(self.request, '19.0') + eq_(set([note1]), set(self.last_ctx['new_features'])) + + def test_note_fixed_product_name(self): + """ + If a note does has no product or "Firefox" as the product, + include it. + """ + product = ProductFactory.create(name='Firefox') + ReleaseFactory.create(version=19, sub_version=0, channel__name='Release', product=product) + note1 = NoteFactory.create(first_version=None, fixed_in_version=19, product=product) + note2 = NoteFactory.create(first_version=None, fixed_in_version=19, product=None) + + # Notes that shouldn't appear. + NoteFactory.create(first_version=None, fixed_in_version=19, product__name='Fennec') + NoteFactory.create(first_version=None, fixed_in_version=19, product__name='FirefoxOS') + + views.release_notes(self.request, '19.0') + eq_(set([note1, note2]), set(self.last_ctx['new_features'])) diff --git a/bedrock/firefox/urls.py b/bedrock/firefox/urls.py index 10c6d7adfd1..8fb7c257326 100644 --- a/bedrock/firefox/urls.py +++ b/bedrock/firefox/urls.py @@ -15,6 +15,7 @@ whatsnew_re = latest_re % (version_re, 'whatsnew') product_re = '(?P<product>firefox|mobile)' channel_re = '(?P<channel>beta|aurora|organizations)' +releasenotes_re = latest_re % (version_re, 'releasenotes') urlpatterns = patterns('', @@ -79,6 +80,8 @@ page('mwc', 'firefox/os/mwc-2014-preview.html'), page('firefox/os/devices', 'firefox/os/devices.html'), + url(releasenotes_re, views.release_notes, name='firefox.releasenotes'), + # temporary URL for Aurora 29 survey page('firefox/aurora/up-to-date', 'firefox/whatsnew-aurora-29-survey.html'), ) diff --git a/bedrock/firefox/views.py b/bedrock/firefox/views.py index 3070b8a22fa..1933656da40 100644 --- a/bedrock/firefox/views.py +++ b/bedrock/firefox/views.py @@ -8,17 +8,17 @@ import re from django.conf import settings -from django.http import (HttpResponsePermanentRedirect, - HttpResponseRedirect) +from django.http import HttpResponsePermanentRedirect, HttpResponseRedirect +from django.shortcuts import get_object_or_404 from django.views.decorators.csrf import csrf_exempt, csrf_protect from django.views.decorators.vary import vary_on_headers from django.views.generic.base import TemplateView import basket -from lib import l10n_utils -from jingo_minify.helpers import BUILD_ID_JS, BUNDLE_HASHES from funfactory.urlresolvers import reverse - +from jingo_minify.helpers import BUILD_ID_JS, BUNDLE_HASHES +from lib import l10n_utils +from rna.models import Release from bedrock.firefox import version_re from bedrock.firefox.forms import SMSSendForm @@ -28,6 +28,7 @@ from bedrock.firefox.firefox_details import firefox_details, mobile_details from lib.l10n_utils.dotlang import _ + UA_REGEXP = re.compile(r"Firefox/(%s)" % version_re) LANG_FILES = ['firefox/partners/index'] @@ -407,3 +408,34 @@ def get_template_names(self): else: template = 'firefox/whatsnew.html' return template + + +def release_notes(request, version, channel='Release', product='Firefox'): + if len(version.split('.')) == 2: + query_version = version + '.0' + else: + query_version = version + release = get_object_or_404(Release, version=query_version, + channel=channel, product=product) + + new_features, known_issues = release.notes() + return l10n_utils.render( + request, 'firefox/releases/notes.html', { + 'version': version, + 'major_version': version.split('.', 1)[0], + 'release': release, + 'new_features': new_features, + 'known_issues': known_issues}) + + +def system_requirements(request, version, channel='Release', + product='Firefox'): + if len(version.split('.')) == 2: + query_version = version + '.0' + else: + query_version = version + release = get_object_or_404(Release, version=query_version, + channel=channel, product=product) + return l10n_utils.render( + request, 'firefox/releases/system_requirements.html', + {'release': release, 'version': version}) diff --git a/bedrock/settings/base.py b/bedrock/settings/base.py index 2521dc373f7..3d3d08d66eb 100644 --- a/bedrock/settings/base.py +++ b/bedrock/settings/base.py @@ -788,8 +788,10 @@ def JINJA_CONFIG(): '%s.facebookapps' % PROJECT_MODULE, # libs + 'django_extensions', 'lib.l10n_utils', 'captcha', + 'rna', )) LOCALE_PATHS = ( @@ -973,3 +975,9 @@ def facebook_tab_url_lazy(): # Use bedrock Gruntfile.js for live reload USE_GRUNT_LIVERELOAD = False + +# Publishing system config +RNA = { + 'BASE_URL': os.environ.get('RNA_BASE_URL', 'https://nucleus.mozilla.org/rna/'), + 'LEGACY_API': os.environ.get('RNA_LEGACY_API', False), +} diff --git a/requirements/dev.txt b/requirements/dev.txt index b252109f7e2..41740221e5b 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -14,6 +14,7 @@ mock==1.0.1 -e git://github.com/jbalogh/django-nose.git#egg=django_nose -e git://github.com/jbalogh/test-utils.git#egg=test-utils pyquery==1.0 +factory_boy==2.2.1 # L10n translate-toolkit==1.8.0 From d2adaa184f83c4a4900ae93ee6860797597dcaee Mon Sep 17 00:00:00 2001 From: Craig Cook <craigcook@gmail.com> Date: Tue, 7 Jan 2014 10:07:27 -0800 Subject: [PATCH 12/23] Bug 939975 - style the release notes template --- .../templates/firefox/releases/notes.html | 80 ++++++-- media/css/firefox/releasenotes.less | 184 +++++++++++++----- 2 files changed, 201 insertions(+), 63 deletions(-) diff --git a/bedrock/firefox/templates/firefox/releases/notes.html b/bedrock/firefox/templates/firefox/releases/notes.html index cd0c4f37941..28bb03f0ea1 100644 --- a/bedrock/firefox/templates/firefox/releases/notes.html +++ b/bedrock/firefox/templates/firefox/releases/notes.html @@ -25,10 +25,13 @@ <h2>{{ _('First offered to release channel users on {date}')|f(date=release.rele <p> {% trans feedback='https://input.mozilla.org/feedback', - bugzilla='https://bugzilla.mozilla.org/' %} + bugzilla='https://bugzilla.mozilla.org/', + buglist='link-to-bugzilla-search' %} As always, you’re encouraged to <a href="{{ feedback }}">tell us what you think</a>, or <a href="{{ bugzilla }}">file a bug in Bugzilla</a>. + If interested, please see the <a href="{{ buglist }}">complete list of changes</a> + in this release. {% endtrans %} </p> </header> @@ -37,37 +40,78 @@ <h2>{{ _('First offered to release channel users on {date}')|f(date=release.rele <article class="main-column"> <section class="notes-section" id="new-features"> <h3>{{ _('New Features') }}</h3> - <ul class="section-items"> + <ul class="section-items tagged"> {% for note in new_features %} - <li> - <small>{{ note.tag.text }}</small> - <p>{{ note.html|safe }}</p> - </li> + <li {% if not note.tag.text %}class="untagged"{% endif %}> + <p> + {% if note.tag.text %} + <b class="tag tag-{{ note.tag.text.lower() }}">{{ note.tag.text }}</b> + {% endif %} + {{ note.html|safe }} + </p> + </li> {% endfor %} </ul> </section> <section class="notes-section" id="known-issues"> <h3>{{ _('Known Issues') }}</h3> - <ul class="section-items"> + <ul class="section-items tagged"> {% for note in known_issues %} <li> - <small>{{ _('UNRESOLVED') }}</small> - <p>{{ note.html|safe }}</p> - {% if not note.fixed_in_version is none %} - <small>{{ _('Unresolved in v{version_number}')|f(version_number=major_version) }}</small> - <small> - <a href="{{ url('firefox.releasenotes', '{major_version}.0'|f(major_version=note.fixed_in_version)) }}"> - {{ _('Resolved in v{version_number}')|f(version_number=note.fixed_in_version) }} - </a> - </small> - {% endif %} + <p> + <b class="tag tag-unresolved">{{ _('unresolved') }}</b> + {{ note.html|safe }} + </p> + {% if not note.fixed_in_version is none %} + <p class="note"> + <a href="{{ url('firefox.releasenotes', '{major_version}.0'|f(major_version=note.fixed_in_version)) }}"> + {{ _('Resolved in v{version_number}')|f(version_number=note.fixed_in_version) }} + </a> + </p> + {% endif %} </li> {% endfor %} </ul> </section> </article> - <aside id="sidebar" class="sidebar"></aside> + + {% block sidebar %} + <aside id="sidebar" class="sidebar"> + <section id="try"> + <h3>{{ _('Try Firefox') }}</h3> + <ol> + <li class="try1"><a href="/firefox/26.0/system-requirements/">{{ _('Check') }}</a></li> + <li class="try2"><a href="/firefox/">{{ _('Download') }}</a></li> + <li class="try3"><a href="https://support.mozilla.org/kb/Installing%20Firefox">{{ _('Install') }}</a></li> + <li class="try4"><a href="https://addons.mozilla.org/firefox/">{{ _('Customize') }}</a></li> + </ol> + </section> + + <section id="get-involved"> + <h3>{{ _('Want to get involved?') }}</h3> + <p>{{ _('Did you know that most of the content in Firefox Support was written by volunteers?') }}<br> + <a href="{{ url('mozorg.contribute') }}">{{ _('Find out more') }}</a></p> + </section> + + <section id="problems"> + <h3>{{ _('Having Problems?') }}</h3> + <ol> + <li><a href="http://support.mozilla.org/">{{ _('Search for answers on the Firefox Support page') }}</a></li> + <li><a href="#knownissues">{{ _('Look at the known issues list and see if we already know about the problem') }}</a></li> + <li><a href="https://bugzilla.mozilla.org/enter_bug.cgi">{{ _('If you can’t find reference to your issue, please consider filing a technical bug report') }}</a></li> + </ol> + </section> + + + <section id="other"> + <h3>{{ _('Other Resources') }}</h3> + <p><a href="https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/{{ major_version }}">{{ _('Developer Information') }}</a></p> + <p><a href="https://blog.mozilla.com/futurereleases/">{{ _('Future of Firefox Blog') }}</a></p> + </section> + </aside> + {% endblock %} + </div> {% endblock %} diff --git a/media/css/firefox/releasenotes.less b/media/css/firefox/releasenotes.less index 956dbdf9b18..9958e009a78 100644 --- a/media/css/firefox/releasenotes.less +++ b/media/css/firefox/releasenotes.less @@ -6,49 +6,64 @@ @import "template-resp.less"; #main-feature { - h1, h2, p { - .span(7); - } - h1 { - margin-bottom: .15em; - } - h2 { - font-size: 20px; - margin-bottom: .75em; - } - p { - margin-bottom: 1em; - } + h1, + h2, + p { + .span(7); + } + + h1 { + margin-bottom: .15em; + } + + h2 { + font-size: 20px; + margin-bottom: .75em; + } + + p { + margin-bottom: 1em; + } } -a.go:after { - content: " »"; - white-space: nowrap; +a.go:after, +.sidebar a:after { + content: " »"; + white-space: nowrap; } .notes-section { - padding: @baseLine @gridGutterWidth; - margin: 0 -@gridGutterWidth @baseLine; - @shadow: 0 0 0 1px #fff inset; .box-shadow(@shadow); + @shadow: 0 0 0 1px #fff inset; background: #fff; border-bottom: 1px solid #ddd; + margin: 0 -@gridGutterWidth @baseLine; + padding: @baseLine @gridGutterWidth; } .section-items { list-style: none; margin: 0; + > li { + border-top: 1px solid @borderColor; margin: 0; padding: .714rem 0 .5rem; - border-top: 1px solid @borderColor; position: relative; } + h4 { font-size: 18px; margin: 0 0 .25em; } + + p { + margin: 0 0 .25em; + } + .note { + font-size: 12px; + color: @textColorSecondary; margin: 0 0 .25em; } } @@ -56,53 +71,65 @@ a.go:after { .section-items.tagged { > li { padding-left: 160px; + + &.untagged { + padding-left: 0; + } } + .tag { - display: inline-block; - padding: 4px 2px 4px 33px; - width: 102px; - position: absolute; - left: 0; - top: .714rem; + background: #f3f3f3 url(/media/img/firefox/releasenotes/tags.png) 0 0 no-repeat; border-right: 3px solid #ccc; - text-transform: uppercase; + box-shadow: 0 1px 1px rgba(0,0,0,0.05), 0 -1px 0 rgba(0,0,0,0.05) inset; + display: inline-block; font-size: 11px; font-style: normal; line-height: 14px; - background: #f3f3f3 url(/media/img/firefox/releasenotes/tags.png) 0 0 no-repeat; + padding: 4px 2px 4px 33px; + position: absolute; + top: .714rem; + left: 0; text-shadow: 1px 1px 0 #fff; - box-shadow: 0 1px 1px rgba(0,0,0,0.05), 0 -1px 0 rgba(0,0,0,0.05) inset; + text-transform: uppercase; + width: 102px; } + .tag-new { background-color: #ffedcf; background-position: 0 -50px; border-color: #f90; } + .tag-changed { background-color: #e9cfff; background-position: 0 -100px; border-color: #8106e0; } + .tag-fixed { background-color: #f0ffe1; background-position: 0 -150px; border-color: #5ba622; } + .tag-html5 { background-color: #f8dfd8; background-position: 0 -200px; border-color: #d85027; } + .tag-resolved { background-color: #dcf6ff; background-position: 0 -250px; border-color: #038fc0; } + .tag-unresolved { background-color: #ffc8c8; background-position: 0 -300px; border-color: #c00; } + .tag-developer { background-color: #e7e7e7; background-position: 0 -350px; @@ -110,23 +137,88 @@ a.go:after { } } -#sidebar section { - border-bottom: 1px dotted @borderColor; +.sidebar section { + border-bottom: 1px dotted darken(@borderColor, 10%); margin-bottom: @baseLine; + h3 { font-size: 22px; } } +#try { + .box-shadow(@shadow); + @shadow: 0 0 0 1px #fff inset; + background: #fff; + border-bottom: 1px solid #ddd; + margin: 0 -@gridGutterWidth @baseLine; + padding: @baseLine @gridGutterWidth; + + ol { + list-style: none; + margin: 0; + padding: 0; + } + + li { + font-size: 1.125rem; + margin: 0; + padding: .5em 0 .5em 40px; + position: relative; + + &:before { + display: block; + width: 1.25em; + height: 1.5em; + padding: 0 .15em; + background: #09c; + color: #fff; + text-shadow: 0 1px 1px rgba(0, 0, 0, .2); + box-shadow: 0 1px 1px rgba(0, 0, 0, .2); + position: absolute; + left: 0; + top: 50%; + margin-top: -.75em; + text-align: center; + line-height: 1.5em; + vertical-align: middle; + border-radius: 50%; + } + + &.try1:before { + content: '1'; + } + &.try2:before { + content: '2'; + } + &.try3:before { + content: '3'; + } + &.try4:before { + content: '4'; + } + } +} + +#problems li { + margin: 0 0 .5em 20px; +} + +#other p + p { + margin-top: -.5em; +} + /* Tablet Layout: 760px */ @media only screen and (min-width: @breakTablet) and (max-width: @breakDesktop) { - #main-feature { - h1, h2, p { - .span_narrow(7); + #main-feature { + h1, + h2, + p { + .span_narrow(7); + } } - } } @@ -135,23 +227,25 @@ a.go:after { @media only screen and (max-width: @breakTablet) { #main-feature { - h1, h2, p { - .span-all(); - } + h1, + h2, + p { + .span-all(); + } } - + .section-items { > li { - padding-left: 0; + padding-left: 0; } + .tag { - position: static; - display: block; - width: auto; - margin: 0 0 .75em; + position: static; + display: block; + width: auto; + margin: 0 0 .75em; } } - } From c9ca7fb5c990ea36fd8e4c5743914b5515722b88 Mon Sep 17 00:00:00 2001 From: Josh Mize <jgmize@gmail.com> Date: Thu, 9 Jan 2014 22:31:57 +0000 Subject: [PATCH 13/23] Update rna to commit 080d7997b59b4 --- vendor-local/lib/python/rna/admin.py | 17 ++- vendor-local/lib/python/rna/clients.py | 14 +- ...elease__add_field_note_tag_num__add_fie.py | 126 ++++++++++++++++ .../rna/migrations/0004_migrate_old_data.py | 140 ++++++++++++++++++ ...ion__del_field_note_first_channel__del_.py | 109 ++++++++++++++ ...auto__del_tag__del_channel__del_product.py | 78 ++++++++++ .../0007_auto__add_field_release_is_public.py | 49 ++++++ ...008_auto__add_field_note_is_known_issue.py | 50 +++++++ vendor-local/lib/python/rna/models.py | 103 ++++++++----- vendor-local/lib/python/rna/tests.py | 122 +++++++++------ vendor-local/lib/python/rna/urls.py | 3 - vendor-local/lib/python/rna/views.py | 12 -- 12 files changed, 718 insertions(+), 105 deletions(-) create mode 100644 vendor-local/lib/python/rna/migrations/0003_auto__add_field_note_fixed_in_release__add_field_note_tag_num__add_fie.py create mode 100644 vendor-local/lib/python/rna/migrations/0004_migrate_old_data.py create mode 100644 vendor-local/lib/python/rna/migrations/0005_auto__del_field_note_first_version__del_field_note_first_channel__del_.py create mode 100644 vendor-local/lib/python/rna/migrations/0006_auto__del_tag__del_channel__del_product.py create mode 100644 vendor-local/lib/python/rna/migrations/0007_auto__add_field_release_is_public.py create mode 100644 vendor-local/lib/python/rna/migrations/0008_auto__add_field_note_is_known_issue.py diff --git a/vendor-local/lib/python/rna/admin.py b/vendor-local/lib/python/rna/admin.py index df1a7f72e89..2b631a87b96 100644 --- a/vendor-local/lib/python/rna/admin.py +++ b/vendor-local/lib/python/rna/admin.py @@ -7,7 +7,16 @@ from . import models -admin.site.register(models.Channel) -admin.site.register(models.Product) -admin.site.register(models.Tag) -admin.site.register(models.Note) +class NoteAdmin(admin.ModelAdmin): + list_display = ('bug', 'tag', 'html') + list_display_links = ('html',) + filter_horizontal = ('releases',) + + +class ReleaseAdmin(admin.ModelAdmin): + list_display = ('version', 'product', 'channel', 'is_public', + 'release_date', 'text') + + +admin.site.register(models.Note, NoteAdmin) +admin.site.register(models.Release, ReleaseAdmin) diff --git a/vendor-local/lib/python/rna/clients.py b/vendor-local/lib/python/rna/clients.py index 5a88b993345..57eb66f68f4 100644 --- a/vendor-local/lib/python/rna/clients.py +++ b/vendor-local/lib/python/rna/clients.py @@ -90,6 +90,16 @@ def restore(self, serializer, data, save=False, modified=False): url = data.pop(field.name, None) if url: data[field.name] = self.hypermodel(url, field.rel.to, save) + + # ManyToManyFields + for field in serializer.Meta.model._meta.many_to_many: + urls = data.pop(field.name, None) + if urls: + data[field.name] = [ + self.hypermodel(url, field.rel.to, save) + for url in urls + ] + instance = serializer.restore_object(data) if save: serializer.save_object(instance, modified=modified) @@ -134,11 +144,9 @@ def hypermodel(self, url, model_class, save): class RNAModelClient(RestModelClient): model_map = { - 'channels': models.Channel, 'notes': models.Note, - 'products': models.Product, 'releases': models.Release, - 'tags': models.Tag} + } class LegacyRNAModelClient(RNAModelClient): diff --git a/vendor-local/lib/python/rna/migrations/0003_auto__add_field_note_fixed_in_release__add_field_note_tag_num__add_fie.py b/vendor-local/lib/python/rna/migrations/0003_auto__add_field_note_fixed_in_release__add_field_note_tag_num__add_fie.py new file mode 100644 index 00000000000..374b2f11c37 --- /dev/null +++ b/vendor-local/lib/python/rna/migrations/0003_auto__add_field_note_fixed_in_release__add_field_note_tag_num__add_fie.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Note.fixed_in_release' + db.add_column('rna_note', 'fixed_in_release', + self.gf('django.db.models.fields.related.ForeignKey')(related_name='fixed_note_set', null=True, to=orm['rna.Release']), + keep_default=False) + + # Adding field 'Note.tag_num' + db.add_column('rna_note', 'tag_num', + self.gf('django.db.models.fields.IntegerField')(null=True), + keep_default=False) + + # Adding M2M table for field releases on 'Note' + m2m_table_name = db.shorten_name('rna_note_releases') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('note', models.ForeignKey(orm['rna.note'], null=False)), + ('release', models.ForeignKey(orm['rna.release'], null=False)) + )) + db.create_unique(m2m_table_name, ['note_id', 'release_id']) + + # Adding field 'Release.product_num' + db.add_column('rna_release', 'product_num', + self.gf('django.db.models.fields.IntegerField')(default=0), + keep_default=False) + + # Adding field 'Release.channel_num' + db.add_column('rna_release', 'channel_num', + self.gf('django.db.models.fields.IntegerField')(default=0), + keep_default=False) + + # Adding field 'Release.version_str' + db.add_column('rna_release', 'version_str', + self.gf('django.db.models.fields.CharField')(default='1.0', max_length=255), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Note.fixed_in_release' + db.delete_column('rna_note', 'fixed_in_release_id') + + # Deleting field 'Note.tag_num' + db.delete_column('rna_note', 'tag_num') + + # Removing M2M table for field releases on 'Note' + db.delete_table(db.shorten_name('rna_note_releases')) + + # Deleting field 'Release.product_num' + db.delete_column('rna_release', 'product_num') + + # Deleting field 'Release.channel_num' + db.delete_column('rna_release', 'channel_num') + + # Deleting field 'Release.version_str' + db.delete_column('rna_release', 'version_str') + + + models = { + 'rna.channel': { + 'Meta': {'object_name': 'Channel'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + }, + 'rna.note': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, + 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'first_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'first_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), + 'first_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'fixed_in_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'fixed_in_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), + 'fixed_in_release': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fixed_note_set'", 'null': 'True', 'to': "orm['rna.Release']"}), + 'fixed_in_subversion': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'fixed_in_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']", 'null': 'True', 'blank': 'True'}), + 'releases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['rna.Release']", 'symmetrical': 'False'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Tag']", 'null': 'True', 'blank': 'True'}), + 'tag_num': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) + }, + 'rna.product': { + 'Meta': {'object_name': 'Product'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'rna.release': { + 'Meta': {'object_name': 'Release'}, + 'channel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Channel']"}), + 'channel_num': ('django.db.models.fields.IntegerField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']"}), + 'product_num': ('django.db.models.fields.IntegerField', [], {}), + 'release_date': ('django.db.models.fields.DateTimeField', [], {}), + 'sub_version': ('django.db.models.fields.IntegerField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'version': ('django.db.models.fields.IntegerField', [], {}), + 'version_str': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'rna.tag': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Tag'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}) + } + } + + complete_apps = ['rna'] \ No newline at end of file diff --git a/vendor-local/lib/python/rna/migrations/0004_migrate_old_data.py b/vendor-local/lib/python/rna/migrations/0004_migrate_old_data.py new file mode 100644 index 00000000000..25d61b1db46 --- /dev/null +++ b/vendor-local/lib/python/rna/migrations/0004_migrate_old_data.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +class Migration(DataMigration): + + def forwards(self, orm): + PRODUCTS = { + 'FIREFOX': 0, + 'FENNEC': 1, + 'ESR': 2, + } + + CHANNELS = { + 'NIGHTLY': 0, + 'AURORA': 1, + 'BETA': 2, + 'RELEASE': 3, + } + + TAGS = { + 'NEW': 0, + 'CHANGED': 1, + 'HTML5': 2, + 'FIXED': 3, + 'DEVELOPER': 4, + } + + # Hard-coded product IDs. Sadface. + DB_PRODUCTS = { + 1: PRODUCTS['FIREFOX'], + 2: PRODUCTS['FENNEC'], + 3: PRODUCTS['ESR'], + } + + for release in orm.Release.objects.all(): + release.version_str = '{0}.0.{1}'.format(release.version, release.sub_version) + + if release.channel.name == 'ESR': + release.product_num = PRODUCTS['ESR'] + release.channel_num = CHANNELS['RELEASE'] + else: + release.product_num = DB_PRODUCTS[release.product.id] + release.channel_num = CHANNELS[release.channel.name.upper()] + release.save() + + for note in orm.Note.objects.all(): + if note.tag: + note.tag_num = TAGS[note.tag.text.upper()] + + # Migrate to fixed_in_release + if note.fixed_in_version: + version = '{0}.0.{1}'.format(note.fixed_in_version, note.fixed_in_subversion or 0) + filters = {'version_str': version} + + if note.fixed_in_channel: + if note.fixed_in_channel.name.upper() == 'ESR': + filters['product_num'] = PRODUCTS['ESR'] + filters['channel_num'] = CHANNELS['RELEASE'] + else: + filters['channel_num'] = CHANNELS[note.fixed_in_channel.name.upper()] + + if note.product: + filters['product_num'] = DB_PRODUCTS[note.product.id] + + try: + note.fixed_in_release = orm.Release.objects.get(**filters) + except (orm.Release.DoesNotExist, orm.Release.MultipleObjectsReturned): + note.fixed_in_release = None + + note.save() + + def backwards(self, orm): + """No going backwards, as this migration is going to be deleted someday anyway.""" + + + models = { + 'rna.channel': { + 'Meta': {'object_name': 'Channel'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + }, + 'rna.note': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, + 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'first_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'first_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), + 'first_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'fixed_in_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'fixed_in_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), + 'fixed_in_release': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fixed_note_set'", 'null': 'True', 'to': "orm['rna.Release']"}), + 'fixed_in_subversion': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'fixed_in_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']", 'null': 'True', 'blank': 'True'}), + 'releases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['rna.Release']", 'symmetrical': 'False'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Tag']", 'null': 'True', 'blank': 'True'}), + 'tag_num': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) + }, + 'rna.product': { + 'Meta': {'object_name': 'Product'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'rna.release': { + 'Meta': {'object_name': 'Release'}, + 'channel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Channel']"}), + 'channel_num': ('django.db.models.fields.IntegerField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']"}), + 'product_num': ('django.db.models.fields.IntegerField', [], {}), + 'release_date': ('django.db.models.fields.DateTimeField', [], {}), + 'sub_version': ('django.db.models.fields.IntegerField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'version': ('django.db.models.fields.IntegerField', [], {}), + 'version_str': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'rna.tag': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Tag'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}) + } + } + + complete_apps = ['rna'] + symmetrical = True diff --git a/vendor-local/lib/python/rna/migrations/0005_auto__del_field_note_first_version__del_field_note_first_channel__del_.py b/vendor-local/lib/python/rna/migrations/0005_auto__del_field_note_first_version__del_field_note_first_channel__del_.py new file mode 100644 index 00000000000..2a3fbea2cba --- /dev/null +++ b/vendor-local/lib/python/rna/migrations/0005_auto__del_field_note_first_version__del_field_note_first_channel__del_.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting field 'Note.first_version' + db.delete_column('rna_note', 'first_version') + + # Deleting field 'Note.first_channel' + db.delete_column('rna_note', 'first_channel_id') + + # Deleting field 'Note.fixed_in_version' + db.delete_column('rna_note', 'fixed_in_version') + + # Deleting field 'Note.fixed_in_subversion' + db.delete_column('rna_note', 'fixed_in_subversion') + + # Deleting field 'Note.product' + db.delete_column('rna_note', 'product_id') + + # Deleting field 'Note.fixed_in_channel' + db.delete_column('rna_note', 'fixed_in_channel_id') + + # Deleting field 'Note.tag_id' + db.delete_column('rna_note', 'tag_id') + + # Renaming column for 'Note.tag_num'. + db.rename_column('rna_note', 'tag_num', 'tag') + + # Deleting field 'Release.sub_version' + db.delete_column('rna_release', 'sub_version') + + # Deleting field 'Release.channel_id' + db.delete_column('rna_release', 'channel_id') + + # Deleting field 'Release.product_num' + db.delete_column('rna_release', 'product_id') + + # Deleting field 'Release.version_str' + db.delete_column('rna_release', 'version') + + # Renaming column for 'Release.product_str'. + db.rename_column('rna_release', 'product_num', 'product') + + # Renaming column for 'Release.version_str'. + db.rename_column('rna_release', 'version_str', 'version') + + # Renaming column for 'Release.channel_num'. + db.rename_column('rna_release', 'channel_num', 'channel') + + + def backwards(self, orm): + raise RuntimeError("Cannot reverse this migration.") + + models = { + 'rna.channel': { + 'Meta': {'object_name': 'Channel'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + }, + 'rna.note': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, + 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'fixed_in_release': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fixed_note_set'", 'null': 'True', 'to': "orm['rna.Release']"}), + 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'releases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['rna.Release']", 'symmetrical': 'False'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'tag': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) + }, + 'rna.product': { + 'Meta': {'object_name': 'Product'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + 'rna.release': { + 'Meta': {'object_name': 'Release'}, + 'channel': ('django.db.models.fields.IntegerField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'product': ('django.db.models.fields.IntegerField', [], {}), + 'release_date': ('django.db.models.fields.DateTimeField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'rna.tag': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Tag'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}) + } + } + + complete_apps = ['rna'] diff --git a/vendor-local/lib/python/rna/migrations/0006_auto__del_tag__del_channel__del_product.py b/vendor-local/lib/python/rna/migrations/0006_auto__del_tag__del_channel__del_product.py new file mode 100644 index 00000000000..971952075ee --- /dev/null +++ b/vendor-local/lib/python/rna/migrations/0006_auto__del_tag__del_channel__del_product.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting model 'Tag' + db.delete_table('rna_tag') + + # Deleting model 'Channel' + db.delete_table('rna_channel') + + # Deleting model 'Product' + db.delete_table('rna_product') + + + def backwards(self, orm): + # Adding model 'Tag' + db.create_table('rna_tag', ( + ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), + ('text', self.gf('django.db.models.fields.TextField')()), + ('modified', self.gf('django.db.models.fields.DateTimeField')(blank=True, db_index=True)), + ('sort_num', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('rna', ['Tag']) + + # Adding model 'Channel' + db.create_table('rna_channel', ( + ('name', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(blank=True, db_index=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), + )) + db.send_create_signal('rna', ['Channel']) + + # Adding model 'Product' + db.create_table('rna_product', ( + ('name', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)), + ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), + ('text', self.gf('django.db.models.fields.TextField')(blank=True)), + ('modified', self.gf('django.db.models.fields.DateTimeField')(blank=True, db_index=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('rna', ['Product']) + + + models = { + 'rna.note': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, + 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'fixed_in_release': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fixed_note_set'", 'null': 'True', 'to': "orm['rna.Release']"}), + 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'releases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['rna.Release']", 'symmetrical': 'False'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'tag': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) + }, + 'rna.release': { + 'Meta': {'object_name': 'Release'}, + 'channel': ('django.db.models.fields.IntegerField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'product': ('django.db.models.fields.IntegerField', [], {}), + 'release_date': ('django.db.models.fields.DateTimeField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + } + } + + complete_apps = ['rna'] \ No newline at end of file diff --git a/vendor-local/lib/python/rna/migrations/0007_auto__add_field_release_is_public.py b/vendor-local/lib/python/rna/migrations/0007_auto__add_field_release_is_public.py new file mode 100644 index 00000000000..198f980a103 --- /dev/null +++ b/vendor-local/lib/python/rna/migrations/0007_auto__add_field_release_is_public.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Release.is_public' + db.add_column('rna_release', 'is_public', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Release.is_public' + db.delete_column('rna_release', 'is_public') + + + models = { + 'rna.note': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, + 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'fixed_in_release': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'fixed_note_set'", 'null': 'True', 'to': "orm['rna.Release']"}), + 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'releases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['rna.Release']", 'symmetrical': 'False', 'blank': 'True'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'tag': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) + }, + 'rna.release': { + 'Meta': {'ordering': "('product', '-version', 'channel')", 'object_name': 'Release'}, + 'channel': ('django.db.models.fields.IntegerField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'product': ('django.db.models.fields.IntegerField', [], {}), + 'release_date': ('django.db.models.fields.DateTimeField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + } + } + + complete_apps = ['rna'] \ No newline at end of file diff --git a/vendor-local/lib/python/rna/migrations/0008_auto__add_field_note_is_known_issue.py b/vendor-local/lib/python/rna/migrations/0008_auto__add_field_note_is_known_issue.py new file mode 100644 index 00000000000..b38166f5e0c --- /dev/null +++ b/vendor-local/lib/python/rna/migrations/0008_auto__add_field_note_is_known_issue.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Note.is_known_issue' + db.add_column('rna_note', 'is_known_issue', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Note.is_known_issue' + db.delete_column('rna_note', 'is_known_issue') + + + models = { + 'rna.note': { + 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, + 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'fixed_in_release': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'fixed_note_set'", 'null': 'True', 'to': "orm['rna.Release']"}), + 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_known_issue': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'releases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['rna.Release']", 'symmetrical': 'False', 'blank': 'True'}), + 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'tag': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) + }, + 'rna.release': { + 'Meta': {'ordering': "('product', '-version', 'channel')", 'object_name': 'Release'}, + 'channel': ('django.db.models.fields.IntegerField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), + 'product': ('django.db.models.fields.IntegerField', [], {}), + 'release_date': ('django.db.models.fields.DateTimeField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + } + } + + complete_apps = ['rna'] \ No newline at end of file diff --git a/vendor-local/lib/python/rna/models.py b/vendor-local/lib/python/rna/models.py index 0435162d8ea..8938de6c341 100644 --- a/vendor-local/lib/python/rna/models.py +++ b/vendor-local/lib/python/rna/models.py @@ -27,60 +27,87 @@ def save(self, *args, **kwargs): super(TimeStampedModel, self).save(*args, **kwargs) -class Channel(TimeStampedModel): - name = models.CharField(unique=True, max_length=255) +class Release(TimeStampedModel): + NIGHTLY = 0 + AURORA = 1 + BETA = 2 + RELEASE = 3 + CHANNELS = ( + (NIGHTLY, 'Nightly'), + (AURORA, 'Aurora'), + (BETA, 'Beta'), + (RELEASE, 'Release'), + ) + + FIREFOX = 0 + FENNEC = 1 + ESR = 2 + PRODUCTS = ( + (FIREFOX, 'Firefox'), + (FENNEC, 'Firefox for Android'), + (ESR, 'Firefox Extended Support Release'), + ) + + product = models.IntegerField(choices=PRODUCTS) + channel = models.IntegerField(choices=CHANNELS) + version = models.CharField(max_length=255) + release_date = models.DateTimeField() + text = models.TextField(blank=True) + is_public = models.BooleanField(default=False) - def __unicode__(self): - return self.name + def notes(self): + """ + Retrieve a list of Note instances that should be shown for this + release, grouped as either new features or known issues. + """ + notes = self.note_set.all() + new_features = (note for note in notes if + not note.is_known_issue_for(self)) + known_issues = (note for note in notes if + note.is_known_issue_for(self)) -class Product(TimeStampedModel): - name = models.CharField(unique=True, max_length=255) - text = models.TextField(blank=True) + return new_features, known_issues def __unicode__(self): - return self.name - - -class Tag(TimeStampedModel): - text = models.TextField() - sort_num = models.IntegerField(null=True, blank=True) + return '{product} v{version} {channel}'.format( + product=self.get_product_display(), + version=self.version, + channel=self.get_channel_display() + ) class Meta: - ordering = ('sort_num',) - - def __unicode__(self): - return self.text + ordering = ('product', '-version', 'channel') class Note(TimeStampedModel): + NEW = 0 + CHANGED = 1 + HTML5 = 2 + FIXED = 3 + DEVELOPER = 4 + TAGS = ( + (NEW, 'New'), + (CHANGED, 'Changed'), + (HTML5, 'HTML5'), + (FIXED, 'Fixed'), + (DEVELOPER, 'Developer'), + ) + bug = models.IntegerField(null=True, blank=True) html = models.TextField(blank=True) - first_version = models.IntegerField(null=True, blank=True) - first_channel = models.ForeignKey( - Channel, null=True, blank=True, related_name='first_channel_notes') - fixed_in_version = models.IntegerField(null=True, blank=True) - fixed_in_channel = models.ForeignKey( - Channel, null=True, blank=True, related_name='fixed_in_channel_notes') - tag = models.ForeignKey(Tag, null=True, blank=True) - product = models.ForeignKey(Product, null=True, blank=True) + releases = models.ManyToManyField(Release, blank=True) + is_known_issue = models.BooleanField(default=False) + fixed_in_release = models.ForeignKey(Release, null=True, blank=True, + related_name='fixed_note_set') + tag = models.IntegerField(null=True, choices=TAGS) sort_num = models.IntegerField(null=True, blank=True) - fixed_in_subversion = models.IntegerField(null=True, blank=True) + + def is_known_issue_for(self, release): + return self.is_known_issue and self.fixed_in_release != release class Meta: ordering = ('sort_num',) def __unicode__(self): return self.html - - -class Release(TimeStampedModel): - product = models.ForeignKey(Product) - channel = models.ForeignKey(Channel) - version = models.IntegerField() - sub_version = models.IntegerField() - release_date = models.DateTimeField() - text = models.TextField(blank=True) - - def __unicode__(self): - return self.text diff --git a/vendor-local/lib/python/rna/tests.py b/vendor-local/lib/python/rna/tests.py index 7add0895d98..83d36b741a3 100644 --- a/vendor-local/lib/python/rna/tests.py +++ b/vendor-local/lib/python/rna/tests.py @@ -14,16 +14,6 @@ from .management.commands import rnasync -class AdminTest(TestCase): - @patch('django.contrib.admin.site.register') - def test_register(self, mock_register): - import rna.rna.admin # NOQA - mock_register.assert_any_call(models.Channel) - mock_register.assert_any_call(models.Product) - mock_register.assert_any_call(models.Tag) - mock_register.assert_any_call(models.Note) - - class TimeStampedModelTest(TestCase): @patch('rna.rna.models.models.Model.save') def test_default_modified(self, mock_super_save): @@ -42,40 +32,42 @@ def test_unmodified(self, mock_super_save): mock_super_save.assert_called_once_with(db='test') -class ChannelTest(TestCase): +class NoteTest(TestCase): def test_unicode(self): """ - Should equal name + Should equal description """ - channel = models.Channel(name='test') - eq_(unicode(channel), 'test') - + note = models.Note(html='test') + eq_(unicode(note), 'test') -class ProductTest(TestCase): - def test_unicode(self): + def test_is_known_issue_for_not_known(self): """ - Should equal name + Should be False if is_known_issue is False. """ - product = models.Product(name='test') - eq_(unicode(product), 'test') + note = models.Note(is_known_issue=False) + release = Mock(spec=models.Release()) + eq_(note.is_known_issue_for(release), False) - -class NoteTest(TestCase): - def test_unicode(self): + def test_is_known_issue_for_wrong_release(self): """ - Should equal description + Should be True if is_known_issue is True but fixed_in_release + doesn't match given release. """ - note = models.Note(html='test') - eq_(unicode(note), 'test') - + fixed_release = Mock(spec=models.Release()) + release = Mock(spec=models.Release()) + note = models.Note(is_known_issue=True, + fixed_in_release=fixed_release) + eq_(note.is_known_issue_for(release), True) -class TagTest(TestCase): - def test_unicode(self): + def test_is_known_issue_for(self): """ - Should equal text + Should be False if is_known_issue is True and fixed_in_release + matches the given release. """ - tag = models.Tag(text='test') - eq_(unicode(tag), 'test') + release = Mock(spec=models.Release()) + note = models.Note(is_known_issue=True, + fixed_in_release=release) + eq_(note.is_known_issue_for(release), False) class ReleaseTest(TestCase): @@ -83,8 +75,28 @@ def test_unicode(self): """ Should equal name """ - release = models.Release(text='test') - eq_(unicode(release), 'test') + release = models.Release(product=models.Release.FIREFOX, + channel=models.Release.RELEASE, + version='12.0.1') + eq_(unicode(release), 'Firefox v12.0.1 Release') + + def test_notes(self): + """ + Should split notes into new features and known issues. + """ + new_feature_1 = Mock(**{'is_known_issue_for.return_value': False}) + new_feature_2 = Mock(**{'is_known_issue_for.return_value': False}) + known_issue_1 = Mock(**{'is_known_issue_for.return_value': True}) + known_issue_2 = Mock(**{'is_known_issue_for.return_value': True}) + + with patch.object(models.Release, 'note_set') as note_set: + release = models.Release() + note_set.all.return_value = [new_feature_1, new_feature_2, + known_issue_1, known_issue_2] + new_features, known_issues = release.notes() + + eq_(set(new_features), set([new_feature_1, new_feature_2])) + eq_(set(known_issues), set([known_issue_1, known_issue_2])) class ISO8601DateTimeFieldTest(TestCase): @@ -433,24 +445,46 @@ def test_restore(self, mock_hypermodel): """ Should return instance from serializer.restore_object Should remove url field from data - Should use hypermodel method on FK fields + Should use hypermodel method on FK and M2M fields """ mock_fk_field = Mock(spec=models.models.ForeignKey) mock_fk_field.name = 'fk' mock_fk_field.rel = Mock(to='to') + mock_fk_field_not_in_data = Mock(spec=models.models.ForeignKey) mock_fk_field_not_in_data.name = 'no data' - fields = [mock_fk_field, 'non_fk_field', mock_fk_field_not_in_data] - mock_serializer = Mock() - mock_serializer.Meta.model._meta.fields = fields - data = {'url': 'http://remove.me', 'fk': 'http://thedu.de'} + mock_m2m_field = Mock(spec=models.models.ManyToManyField) + mock_m2m_field.name = 'm2m' + mock_m2m_field.rel = Mock(to='to2') + + mock_serializer = Mock() + mock_serializer.Meta.model._meta.fields = [ + mock_fk_field, + 'non_fk_field', + mock_fk_field_not_in_data + ] + mock_serializer.Meta.model._meta.many_to_many = [mock_m2m_field] + + data = { + 'url': 'http://remove.me', + 'fk': 'http://thedu.de', + 'm2m': ['http://example.com/foo', 'http://example.com/bar'], + } rc = clients.RestModelClient() instance = rc.restore(mock_serializer, data) + eq_(instance, mock_serializer.restore_object.return_value) - mock_hypermodel.assert_called_once_with('http://thedu.de', 'to', False) - mock_serializer.restore_object.assert_called_once_with( - {'fk': mock_hypermodel.return_value}) + + mock_hypermodel.assert_any_call('http://thedu.de', 'to', False) + mock_hypermodel.assert_any_call('http://example.com/foo', 'to2', False) + mock_hypermodel.assert_any_call('http://example.com/bar', 'to2', False) + + hyper_return = mock_hypermodel.return_value + mock_serializer.restore_object.assert_called_with({ + 'fk': hyper_return, + 'm2m': [hyper_return, hyper_return], + }) eq_(mock_serializer.save_object.called, 0) @patch('rna.rna.clients.RestModelClient.hypermodel') @@ -460,6 +494,7 @@ def test_restore_save_modified(self, mock_hypermodel): """ mock_serializer = Mock() mock_serializer.Meta.model._meta.fields = [] + mock_serializer.Meta.model._meta.many_to_many = [] rc = clients.RestModelClient() instance = rc.restore(mock_serializer, {}, save=True, modified=True) @@ -708,11 +743,8 @@ class URLsTest(TestCase): @patch('rest_framework.routers.DefaultRouter.urls') def test_urls(self, mock_urls, mock_register): from . import urls - mock_register.assert_any_call('channels', views.ChannelViewSet) mock_register.assert_any_call('notes', views.NoteViewSet) - mock_register.assert_any_call('products', views.ProductViewSet) mock_register.assert_any_call('releases', views.ReleaseViewSet) - mock_register.assert_any_call('tags', views.TagViewSet) eq_(urls.urlpatterns, mock_urls) diff --git a/vendor-local/lib/python/rna/urls.py b/vendor-local/lib/python/rna/urls.py index dc78428a694..74cc93890ad 100644 --- a/vendor-local/lib/python/rna/urls.py +++ b/vendor-local/lib/python/rna/urls.py @@ -8,10 +8,7 @@ router = routers.DefaultRouter() -router.register('channels', views.ChannelViewSet) router.register('notes', views.NoteViewSet) -router.register('products', views.ProductViewSet) router.register('releases', views.ReleaseViewSet) -router.register('tags', views.TagViewSet) urlpatterns = router.urls diff --git a/vendor-local/lib/python/rna/views.py b/vendor-local/lib/python/rna/views.py index 609faf22053..28dd166bb38 100644 --- a/vendor-local/lib/python/rna/views.py +++ b/vendor-local/lib/python/rna/views.py @@ -7,18 +7,6 @@ from . import models -class ChannelViewSet(ModelViewSet): - model = models.Channel - - -class ProductViewSet(ModelViewSet): - model = models.Product - - -class TagViewSet(ModelViewSet): - model = models.Tag - - class NoteViewSet(ModelViewSet): model = models.Note From c8c7e1901e54d0718c1db9ae10a8322d17f772a4 Mon Sep 17 00:00:00 2001 From: Josh Mize <jgmize@gmail.com> Date: Wed, 22 Jan 2014 21:07:29 +0000 Subject: [PATCH 14/23] Upgrade south to 0.8.4 Use bug_list and bug_search_url fields in template Add jingo_markdown Upgrade RNA (4ae910da) Add firefox.system_requirements view using RNA Use latest RNA as submodule instead of pip install Adjust views, settings, templates to use latest RNA Restore lib/l10n_utils/helpers.py and tests from rebase mistake Move django-extensions to submodule Cleanup old rna egg-info Move django-rest-framework to submodule Move requests to submodule Move Python-Markdown to submodule Move jingo-markdown to submodule Move six to submodule Test RNA views + flake8 fixes Fix flake8 Try to fix Jenkins test breakage Clean up templates Cleanup template some more Reword test docstring and add comments Update requiremnts/prod.txt to match submodules Use settings.LANGUAGE_CODE for default locale Try to make Jenkins happy --- .gitmodules | 21 + .../templates/firefox/releases/notes.html | 41 +- .../firefox/releases/system_requirements.html | 2 +- bedrock/firefox/tests/__init__.py | 49 - bedrock/firefox/tests/test_views.py | 112 +- bedrock/firefox/urls.py | 7 +- bedrock/firefox/views.py | 36 +- bedrock/settings/base.py | 8 +- lib/l10n_utils/helpers.py | 24 + lib/l10n_utils/tests/test_helpers.py | 73 +- requirements/prod.txt | 6 +- .../PKG-INFO | 22 - .../SOURCES.txt | 156 - .../dependency_links.txt | 1 - .../installed-files.txt | 220 - .../requires.txt | 1 - .../top_level.txt | 1 - .../lib/python/django_extensions/__init__.py | 13 - .../django_extensions/admin/__init__.py | 145 - .../python/django_extensions/admin/widgets.py | 96 - .../conf/app_template/__init__.py.tmpl | 0 .../conf/app_template/forms.py.tmpl | 3 - .../conf/app_template/models.py.tmpl | 3 - .../conf/app_template/urls.py.tmpl | 6 - .../conf/app_template/views.py.tmpl | 1 - .../management/__init__.py.tmpl | 0 .../management/commands/__init__.py.tmpl | 0 .../management/commands/sample.py.tmpl | 7 - .../conf/jobs_template/jobs/__init__.py.tmpl | 0 .../jobs_template/jobs/daily/__init__.py.tmpl | 0 .../jobs/hourly/__init__.py.tmpl | 0 .../jobs/monthly/__init__.py.tmpl | 0 .../conf/jobs_template/jobs/sample.py.tmpl | 8 - .../jobs/weekly/__init__.py.tmpl | 0 .../jobs/yearly/__init__.py.tmpl | 0 .../python/django_extensions/db/__init__.py | 0 .../django_extensions/db/fields/__init__.py | 287 - .../django_extensions/db/fields/encrypted.py | 136 - .../django_extensions/db/fields/json.py | 102 - .../lib/python/django_extensions/db/models.py | 78 - .../python/django_extensions/future_1_5.py | 16 - .../python/django_extensions/jobs/__init__.py | 0 .../django_extensions/jobs/daily/__init__.py | 0 .../jobs/daily/cache_cleanup.py | 50 - .../jobs/daily/daily_cleanup.py | 16 - .../django_extensions/jobs/hourly/__init__.py | 0 .../jobs/monthly/__init__.py | 0 .../django_extensions/jobs/weekly/__init__.py | 0 .../django_extensions/jobs/yearly/__init__.py | 0 .../django_extensions/management/__init__.py | 0 .../django_extensions/management/base.py | 53 - .../django_extensions/management/color.py | 16 - .../management/commands/__init__.py | 0 .../management/commands/clean_pyc.py | 44 - .../management/commands/compile_pyc.py | 38 - .../management/commands/create_app.py | 138 - .../management/commands/create_command.py | 81 - .../management/commands/create_jobs.py | 56 - .../management/commands/describe_form.py | 66 - .../management/commands/dumpscript.py | 751 --- .../management/commands/export_emails.py | 133 - .../management/commands/find_template.py | 35 - .../commands/generate_secret_key.py | 11 - .../management/commands/graph_models.py | 71 - .../management/commands/mail_debug.py | 80 - .../management/commands/notes.py | 48 - .../management/commands/passwd.py | 42 - .../management/commands/pipchecker.py | 246 - .../management/commands/print_settings.py | 72 - .../commands/print_user_for_session.py | 51 - .../management/commands/reset_db.py | 177 - .../management/commands/runjob.py | 60 - .../management/commands/runjobs.py | 97 - .../management/commands/runprofileserver.py | 287 - .../management/commands/runscript.py | 158 - .../management/commands/runserver_plus.py | 235 - .../management/commands/set_fake_emails.py | 81 - .../management/commands/set_fake_passwords.py | 49 - .../management/commands/shell_plus.py | 166 - .../management/commands/show_templatetags.py | 100 - .../management/commands/show_urls.py | 103 - .../management/commands/sqlcreate.py | 89 - .../management/commands/sqldiff.py | 678 --- .../management/commands/sync_media_s3.py | 340 -- .../management/commands/syncdata.py | 210 - .../management/commands/unreferenced_files.py | 47 - .../management/commands/update_permissions.py | 21 - .../management/commands/validate_templates.py | 71 - .../django_extensions/management/jobs.py | 177 - .../django_extensions/management/modelviz.py | 274 - .../management/notebook_extension.py | 6 - .../django_extensions/management/shells.py | 58 - .../django_extensions/management/signals.py | 12 - .../management/technical_response.py | 6 - .../django_extensions/management/utils.py | 55 - .../migrations/0001_empty.py | 17 - .../django_extensions/migrations/__init__.py | 0 .../lib/python/django_extensions/models.py | 0 .../django_extensions/mongodb/__init__.py | 0 .../mongodb/fields/__init__.py | 248 - .../mongodb/fields/encrypted.py | 61 - .../django_extensions/mongodb/fields/json.py | 77 - .../django_extensions/mongodb/models.py | 69 - .../lib/python/django_extensions/settings.py | 7 - .../css/jquery.autocomplete.css | 43 - .../django_extensions/img/indicator.gif | Bin 1553 -> 0 bytes .../django_extensions/js/jquery.ajaxQueue.js | 119 - .../js/jquery.autocomplete.js | 762 --- .../js/jquery.bgiframe.min.js | 10 - .../static/django_extensions/js/jquery.js | 3558 ------------ .../django_extensions/graph_models/body.html | 34 - .../django_extensions/graph_models/head.html | 15 - .../django_extensions/graph_models/rel.html | 15 - .../django_extensions/graph_models/tail.html | 1 - .../widgets/foreignkey_searchinput.html | 60 - .../templatetags/__init__.py | 0 .../templatetags/highlighting.py | 91 - .../templatetags/syntax_color.py | 97 - .../templatetags/truncate_letters.py | 28 - .../django_extensions/templatetags/widont.py | 62 - .../django_extensions/tests/__init__.py | 19 - .../tests/encrypted_fields.py | 74 - .../python/django_extensions/tests/fields.py | 105 - .../django_extensions/tests/json_field.py | 37 - .../tests/management/__init__.py | 0 .../tests/management/commands/__init__.py | 0 .../commands/error_raising_command.py | 10 - .../tests/management_command.py | 60 - .../python/django_extensions/tests/models.py | 36 - .../tests/test_dumpscript.py | 95 - .../python/django_extensions/tests/urls.py | 0 .../python/django_extensions/tests/utils.py | 76 - .../django_extensions/tests/uuid_field.py | 58 - .../django_extensions/utils/__init__.py | 0 .../django_extensions/utils/dia2django.py | 215 - .../python/django_extensions/utils/text.py | 23 - .../utils/validatingtemplatetags.py | 91 - .../PKG-INFO | 19 - .../SOURCES.txt | 113 - .../dependency_links.txt | 1 - .../installed-files.txt | 201 - .../top_level.txt | 8 - .../requests-2.0.1-py2.7.egg-info/PKG-INFO | 851 --- .../requests-2.0.1-py2.7.egg-info/SOURCES.txt | 86 - .../dependency_links.txt | 1 - .../installed-files.txt | 149 - .../not-zip-safe | 1 - .../top_level.txt | 1 - vendor-local/lib/python/requests/__init__.py | 77 - vendor-local/lib/python/requests/adapters.py | 374 -- vendor-local/lib/python/requests/api.py | 120 - vendor-local/lib/python/requests/auth.py | 180 - vendor-local/lib/python/requests/cacert.pem | 4966 ----------------- vendor-local/lib/python/requests/certs.py | 24 - vendor-local/lib/python/requests/compat.py | 115 - vendor-local/lib/python/requests/cookies.py | 412 -- .../lib/python/requests/exceptions.py | 63 - vendor-local/lib/python/requests/hooks.py | 45 - vendor-local/lib/python/requests/models.py | 733 --- .../lib/python/requests/packages/__init__.py | 3 - .../requests/packages/charade/__init__.py | 66 - .../requests/packages/charade/__main__.py | 7 - .../requests/packages/charade/big5freq.py | 925 --- .../requests/packages/charade/big5prober.py | 42 - .../packages/charade/chardistribution.py | 231 - .../packages/charade/charsetgroupprober.py | 106 - .../packages/charade/charsetprober.py | 62 - .../packages/charade/codingstatemachine.py | 61 - .../requests/packages/charade/compat.py | 34 - .../requests/packages/charade/constants.py | 39 - .../requests/packages/charade/cp949prober.py | 44 - .../requests/packages/charade/escprober.py | 86 - .../python/requests/packages/charade/escsm.py | 242 - .../requests/packages/charade/eucjpprober.py | 90 - .../requests/packages/charade/euckrfreq.py | 596 -- .../requests/packages/charade/euckrprober.py | 42 - .../requests/packages/charade/euctwfreq.py | 428 -- .../requests/packages/charade/euctwprober.py | 41 - .../requests/packages/charade/gb2312freq.py | 472 -- .../requests/packages/charade/gb2312prober.py | 41 - .../requests/packages/charade/hebrewprober.py | 283 - .../requests/packages/charade/jisfreq.py | 569 -- .../requests/packages/charade/jpcntx.py | 219 - .../packages/charade/langbulgarianmodel.py | 229 - .../packages/charade/langcyrillicmodel.py | 329 -- .../packages/charade/langgreekmodel.py | 225 - .../packages/charade/langhebrewmodel.py | 201 - .../packages/charade/langhungarianmodel.py | 225 - .../packages/charade/langthaimodel.py | 200 - .../requests/packages/charade/latin1prober.py | 139 - .../packages/charade/mbcharsetprober.py | 86 - .../packages/charade/mbcsgroupprober.py | 54 - .../requests/packages/charade/mbcssm.py | 575 -- .../packages/charade/sbcharsetprober.py | 120 - .../packages/charade/sbcsgroupprober.py | 69 - .../requests/packages/charade/sjisprober.py | 91 - .../packages/charade/universaldetector.py | 168 - .../requests/packages/charade/utf8prober.py | 76 - .../requests/packages/urllib3/__init__.py | 58 - .../requests/packages/urllib3/_collections.py | 94 - .../requests/packages/urllib3/connection.py | 107 - .../packages/urllib3/connectionpool.py | 674 --- .../packages/urllib3/contrib/__init__.py | 0 .../packages/urllib3/contrib/ntlmpool.py | 120 - .../packages/urllib3/contrib/pyopenssl.py | 346 -- .../requests/packages/urllib3/exceptions.py | 121 - .../requests/packages/urllib3/fields.py | 177 - .../requests/packages/urllib3/filepost.py | 101 - .../packages/urllib3/packages/__init__.py | 4 - .../packages/urllib3/packages/ordered_dict.py | 260 - .../requests/packages/urllib3/packages/six.py | 385 -- .../packages/ssl_match_hostname/__init__.py | 98 - .../requests/packages/urllib3/poolmanager.py | 259 - .../requests/packages/urllib3/request.py | 142 - .../requests/packages/urllib3/response.py | 301 - .../python/requests/packages/urllib3/util.py | 635 --- vendor-local/lib/python/requests/sessions.py | 531 -- .../lib/python/requests/status_codes.py | 88 - .../lib/python/requests/structures.py | 128 - vendor-local/lib/python/requests/utils.py | 582 -- .../lib/python/rest_framework/__init__.py | 9 - .../python/rest_framework/authentication.py | 348 -- .../rest_framework/authtoken/__init__.py | 0 .../python/rest_framework/authtoken/admin.py | 11 - .../authtoken/migrations/0001_initial.py | 67 - .../authtoken/migrations/__init__.py | 0 .../python/rest_framework/authtoken/models.py | 35 - .../rest_framework/authtoken/serializers.py | 24 - .../python/rest_framework/authtoken/views.py | 26 - .../lib/python/rest_framework/compat.py | 557 -- .../lib/python/rest_framework/decorators.py | 129 - .../lib/python/rest_framework/exceptions.py | 88 - .../lib/python/rest_framework/fields.py | 968 ---- .../lib/python/rest_framework/filters.py | 142 - .../lib/python/rest_framework/generics.py | 499 -- .../lib/python/rest_framework/mixins.py | 184 - .../lib/python/rest_framework/models.py | 1 - .../lib/python/rest_framework/negotiation.py | 89 - .../lib/python/rest_framework/pagination.py | 94 - .../lib/python/rest_framework/parsers.py | 292 - .../lib/python/rest_framework/permissions.py | 174 - .../lib/python/rest_framework/relations.py | 633 --- .../lib/python/rest_framework/renderers.py | 584 -- .../lib/python/rest_framework/request.py | 389 -- .../lib/python/rest_framework/response.py | 84 - .../lib/python/rest_framework/reverse.py | 23 - .../lib/python/rest_framework/routers.py | 272 - .../rest_framework/runtests/__init__.py | 0 .../rest_framework/runtests/runcoverage.py | 78 - .../rest_framework/runtests/runtests.py | 48 - .../rest_framework/runtests/settings.py | 151 - .../python/rest_framework/runtests/urls.py | 7 - .../lib/python/rest_framework/serializers.py | 968 ---- .../lib/python/rest_framework/settings.py | 200 - vendor-local/lib/python/rest_framework/six.py | 389 -- .../rest_framework/css/bootstrap-tweaks.css | 185 - .../rest_framework/css/bootstrap.min.css | 841 --- .../static/rest_framework/css/default.css | 71 - .../static/rest_framework/css/prettify.css | 30 - .../img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes .../img/glyphicons-halflings.png | Bin 12762 -> 0 bytes .../static/rest_framework/img/grid.png | Bin 1458 -> 0 bytes .../static/rest_framework/js/bootstrap.min.js | 7 - .../static/rest_framework/js/default.js | 13 - .../lib/python/rest_framework/status.py | 53 - .../templates/rest_framework/api.html | 3 - .../templates/rest_framework/base.html | 236 - .../templates/rest_framework/form.html | 13 - .../templates/rest_framework/login.html | 3 - .../templates/rest_framework/login_base.html | 53 - .../rest_framework/templatetags/__init__.py | 0 .../templatetags/rest_framework.py | 273 - .../lib/python/rest_framework/test.py | 157 - .../python/rest_framework/tests/__init__.py | 0 .../rest_framework/tests/description.py | 26 - .../rest_framework/tests/extras/__init__.py | 0 .../rest_framework/tests/extras/bad_import.py | 1 - .../lib/python/rest_framework/tests/models.py | 169 - .../tests/test_authentication.py | 635 --- .../rest_framework/tests/test_breadcrumbs.py | 73 - .../rest_framework/tests/test_decorators.py | 157 - .../rest_framework/tests/test_description.py | 109 - .../rest_framework/tests/test_fields.py | 898 --- .../python/rest_framework/tests/test_files.py | 51 - .../rest_framework/tests/test_filters.py | 474 -- .../tests/test_genericrelations.py | 100 - .../rest_framework/tests/test_generics.py | 544 -- .../rest_framework/tests/test_htmlrenderer.py | 118 - .../tests/test_hyperlinkedserializers.py | 333 -- .../tests/test_multitable_inheritance.py | 67 - .../rest_framework/tests/test_negotiation.py | 45 - .../rest_framework/tests/test_pagination.py | 385 -- .../rest_framework/tests/test_parsers.py | 115 - .../rest_framework/tests/test_permissions.py | 188 - .../rest_framework/tests/test_relations.py | 100 - .../tests/test_relations_hyperlink.py | 524 -- .../tests/test_relations_nested.py | 107 - .../rest_framework/tests/test_relations_pk.py | 542 -- .../tests/test_relations_slug.py | 257 - .../rest_framework/tests/test_renderers.py | 539 -- .../rest_framework/tests/test_request.py | 314 -- .../rest_framework/tests/test_response.py | 278 - .../rest_framework/tests/test_reverse.py | 27 - .../rest_framework/tests/test_routers.py | 216 - .../rest_framework/tests/test_serializer.py | 1645 ------ .../tests/test_serializer_bulk_update.py | 278 - .../tests/test_serializer_nested.py | 246 - .../rest_framework/tests/test_settings.py | 22 - .../rest_framework/tests/test_testing.py | 115 - .../rest_framework/tests/test_throttling.py | 277 - .../rest_framework/tests/test_urlpatterns.py | 76 - .../rest_framework/tests/test_validation.py | 85 - .../python/rest_framework/tests/test_views.py | 101 - .../lib/python/rest_framework/tests/tests.py | 16 - .../lib/python/rest_framework/throttling.py | 229 - .../lib/python/rest_framework/urlpatterns.py | 62 - .../lib/python/rest_framework/urls.py | 24 - .../python/rest_framework/utils/__init__.py | 0 .../rest_framework/utils/breadcrumbs.py | 54 - .../python/rest_framework/utils/encoders.py | 97 - .../python/rest_framework/utils/formatting.py | 80 - .../python/rest_framework/utils/mediatypes.py | 88 - .../lib/python/rest_framework/views.py | 357 -- .../lib/python/rest_framework/viewsets.py | 139 - .../python/rna-0.0.1-py2.7.egg-info/PKG-INFO | 15 - .../rna-0.0.1-py2.7.egg-info/SOURCES.txt | 22 - .../dependency_links.txt | 1 - .../installed-files.txt | 38 - .../rna-0.0.1-py2.7.egg-info/requires.txt | 4 - .../rna-0.0.1-py2.7.egg-info/top_level.txt | 1 - vendor-local/lib/python/rna/__init__.py | 0 vendor-local/lib/python/rna/admin.py | 22 - vendor-local/lib/python/rna/clients.py | 159 - vendor-local/lib/python/rna/fields.py | 8 - vendor-local/lib/python/rna/filters.py | 46 - .../lib/python/rna/management/__init__.py | 0 .../rna/management/commands/__init__.py | 0 .../python/rna/management/commands/rnasync.py | 35 - .../lib/python/rna/migrations/0001_initial.py | 115 - .../rna/migrations/0002_auto__add_release.py | 85 - ...elease__add_field_note_tag_num__add_fie.py | 126 - .../rna/migrations/0004_migrate_old_data.py | 140 - ...ion__del_field_note_first_channel__del_.py | 109 - ...auto__del_tag__del_channel__del_product.py | 78 - .../0007_auto__add_field_release_is_public.py | 49 - ...008_auto__add_field_note_is_known_issue.py | 50 - .../lib/python/rna/migrations/__init__.py | 0 vendor-local/lib/python/rna/models.py | 113 - vendor-local/lib/python/rna/serializers.py | 48 - vendor-local/lib/python/rna/tests.py | 762 --- vendor-local/lib/python/rna/urls.py | 14 - vendor-local/lib/python/rna/views.py | 15 - .../python/six-1.4.1-py2.7.egg-info/PKG-INFO | 32 - .../six-1.4.1-py2.7.egg-info/SOURCES.txt | 6 - .../dependency_links.txt | 1 - .../installed-files.txt | 7 - .../six-1.4.1-py2.7.egg-info/top_level.txt | 1 - vendor-local/lib/python/six.py | 577 -- vendor-local/lib/python/south/__init__.py | 2 +- .../lib/python/south/creator/actions.py | 25 +- .../lib/python/south/creator/changes.py | 28 +- vendor-local/lib/python/south/db/__init__.py | 3 +- vendor-local/lib/python/south/db/firebird.py | 39 +- vendor-local/lib/python/south/db/generic.py | 18 +- vendor-local/lib/python/south/db/mysql.py | 23 +- vendor-local/lib/python/south/db/oracle.py | 63 +- .../lib/python/south/db/sql_server/pyodbc.py | 13 +- vendor-local/lib/python/south/db/sqlite3.py | 48 +- vendor-local/lib/python/south/exceptions.py | 7 +- .../lib/python/south/hacks/django_1_0.py | 3 +- .../management/commands/datamigration.py | 21 +- .../management/commands/schemamigration.py | 7 +- .../south/management/commands/syncdb.py | 2 + .../lib/python/south/migration/__init__.py | 6 +- .../lib/python/south/migration/migrators.py | 38 +- .../lib/python/south/modelsinspector.py | 1 + vendor-local/lib/python/south/orm.py | 16 +- vendor-local/lib/python/south/signals.py | 6 +- vendor-local/lib/python/south/test_shim.py | 6 + .../lib/python/south/tests/__init__.py | 1 + .../lib/python/south/tests/autodetection.py | 9 +- vendor-local/lib/python/south/tests/db.py | 124 +- .../lib/python/south/tests/db_firebird.py | 39 + .../lib/python/south/utils/__init__.py | 6 +- vendor-local/lib/python/south/utils/py3.py | 7 + vendor-local/lib/python/south/v2.py | 8 +- vendor-local/src/Python-Markdown | 1 + vendor-local/src/django-extensions | 1 + vendor-local/src/django-rest-framework | 1 + vendor-local/src/jingo-markdown | 1 + vendor-local/src/requests | 1 + vendor-local/src/rna | 1 + vendor-local/src/six | 1 + vendor-local/vendor.pth | 13 +- 394 files changed, 632 insertions(+), 58396 deletions(-) delete mode 100644 vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/PKG-INFO delete mode 100644 vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/SOURCES.txt delete mode 100644 vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/dependency_links.txt delete mode 100644 vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/installed-files.txt delete mode 100644 vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/requires.txt delete mode 100644 vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/top_level.txt delete mode 100644 vendor-local/lib/python/django_extensions/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/admin/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/admin/widgets.py delete mode 100644 vendor-local/lib/python/django_extensions/conf/app_template/__init__.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/app_template/forms.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/app_template/models.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/app_template/urls.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/app_template/views.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/command_template/management/__init__.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/command_template/management/commands/__init__.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/command_template/management/commands/sample.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/__init__.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/daily/__init__.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/hourly/__init__.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/monthly/__init__.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/sample.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/weekly/__init__.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/yearly/__init__.py.tmpl delete mode 100644 vendor-local/lib/python/django_extensions/db/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/db/fields/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/db/fields/encrypted.py delete mode 100644 vendor-local/lib/python/django_extensions/db/fields/json.py delete mode 100644 vendor-local/lib/python/django_extensions/db/models.py delete mode 100644 vendor-local/lib/python/django_extensions/future_1_5.py delete mode 100644 vendor-local/lib/python/django_extensions/jobs/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/jobs/daily/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/jobs/daily/cache_cleanup.py delete mode 100644 vendor-local/lib/python/django_extensions/jobs/daily/daily_cleanup.py delete mode 100644 vendor-local/lib/python/django_extensions/jobs/hourly/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/jobs/monthly/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/jobs/weekly/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/jobs/yearly/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/management/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/management/base.py delete mode 100644 vendor-local/lib/python/django_extensions/management/color.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/clean_pyc.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/compile_pyc.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/create_app.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/create_command.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/create_jobs.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/describe_form.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/dumpscript.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/export_emails.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/find_template.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/generate_secret_key.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/graph_models.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/mail_debug.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/notes.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/passwd.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/pipchecker.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/print_settings.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/print_user_for_session.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/reset_db.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/runjob.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/runjobs.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/runprofileserver.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/runscript.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/runserver_plus.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/set_fake_emails.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/set_fake_passwords.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/shell_plus.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/show_templatetags.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/show_urls.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/sqlcreate.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/sqldiff.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/sync_media_s3.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/syncdata.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/unreferenced_files.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/update_permissions.py delete mode 100644 vendor-local/lib/python/django_extensions/management/commands/validate_templates.py delete mode 100644 vendor-local/lib/python/django_extensions/management/jobs.py delete mode 100644 vendor-local/lib/python/django_extensions/management/modelviz.py delete mode 100644 vendor-local/lib/python/django_extensions/management/notebook_extension.py delete mode 100644 vendor-local/lib/python/django_extensions/management/shells.py delete mode 100644 vendor-local/lib/python/django_extensions/management/signals.py delete mode 100644 vendor-local/lib/python/django_extensions/management/technical_response.py delete mode 100644 vendor-local/lib/python/django_extensions/management/utils.py delete mode 100644 vendor-local/lib/python/django_extensions/migrations/0001_empty.py delete mode 100644 vendor-local/lib/python/django_extensions/migrations/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/models.py delete mode 100644 vendor-local/lib/python/django_extensions/mongodb/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/mongodb/fields/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/mongodb/fields/encrypted.py delete mode 100644 vendor-local/lib/python/django_extensions/mongodb/fields/json.py delete mode 100644 vendor-local/lib/python/django_extensions/mongodb/models.py delete mode 100644 vendor-local/lib/python/django_extensions/settings.py delete mode 100644 vendor-local/lib/python/django_extensions/static/django_extensions/css/jquery.autocomplete.css delete mode 100644 vendor-local/lib/python/django_extensions/static/django_extensions/img/indicator.gif delete mode 100644 vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.ajaxQueue.js delete mode 100644 vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.autocomplete.js delete mode 100644 vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.bgiframe.min.js delete mode 100644 vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.js delete mode 100644 vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/body.html delete mode 100644 vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/head.html delete mode 100644 vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/rel.html delete mode 100644 vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/tail.html delete mode 100644 vendor-local/lib/python/django_extensions/templates/django_extensions/widgets/foreignkey_searchinput.html delete mode 100644 vendor-local/lib/python/django_extensions/templatetags/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/templatetags/highlighting.py delete mode 100644 vendor-local/lib/python/django_extensions/templatetags/syntax_color.py delete mode 100644 vendor-local/lib/python/django_extensions/templatetags/truncate_letters.py delete mode 100644 vendor-local/lib/python/django_extensions/templatetags/widont.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/encrypted_fields.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/fields.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/json_field.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/management/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/management/commands/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/management/commands/error_raising_command.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/management_command.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/models.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/test_dumpscript.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/urls.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/utils.py delete mode 100644 vendor-local/lib/python/django_extensions/tests/uuid_field.py delete mode 100644 vendor-local/lib/python/django_extensions/utils/__init__.py delete mode 100644 vendor-local/lib/python/django_extensions/utils/dia2django.py delete mode 100644 vendor-local/lib/python/django_extensions/utils/text.py delete mode 100644 vendor-local/lib/python/django_extensions/utils/validatingtemplatetags.py delete mode 100644 vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/PKG-INFO delete mode 100644 vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/SOURCES.txt delete mode 100644 vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/dependency_links.txt delete mode 100644 vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/installed-files.txt delete mode 100644 vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/top_level.txt delete mode 100644 vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/PKG-INFO delete mode 100644 vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/SOURCES.txt delete mode 100644 vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/dependency_links.txt delete mode 100644 vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/installed-files.txt delete mode 100644 vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/not-zip-safe delete mode 100644 vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/top_level.txt delete mode 100644 vendor-local/lib/python/requests/__init__.py delete mode 100644 vendor-local/lib/python/requests/adapters.py delete mode 100644 vendor-local/lib/python/requests/api.py delete mode 100644 vendor-local/lib/python/requests/auth.py delete mode 100644 vendor-local/lib/python/requests/cacert.pem delete mode 100644 vendor-local/lib/python/requests/certs.py delete mode 100644 vendor-local/lib/python/requests/compat.py delete mode 100644 vendor-local/lib/python/requests/cookies.py delete mode 100644 vendor-local/lib/python/requests/exceptions.py delete mode 100644 vendor-local/lib/python/requests/hooks.py delete mode 100644 vendor-local/lib/python/requests/models.py delete mode 100644 vendor-local/lib/python/requests/packages/__init__.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/__init__.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/__main__.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/big5freq.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/big5prober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/chardistribution.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/charsetgroupprober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/charsetprober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/codingstatemachine.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/compat.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/constants.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/cp949prober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/escprober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/escsm.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/eucjpprober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/euckrfreq.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/euckrprober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/euctwfreq.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/euctwprober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/gb2312freq.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/gb2312prober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/hebrewprober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/jisfreq.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/jpcntx.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/langbulgarianmodel.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/langcyrillicmodel.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/langgreekmodel.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/langhebrewmodel.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/langhungarianmodel.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/langthaimodel.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/latin1prober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/mbcharsetprober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/mbcsgroupprober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/mbcssm.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/sbcharsetprober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/sbcsgroupprober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/sjisprober.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/universaldetector.py delete mode 100644 vendor-local/lib/python/requests/packages/charade/utf8prober.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/__init__.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/_collections.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/connection.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/connectionpool.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/contrib/__init__.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/contrib/ntlmpool.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/contrib/pyopenssl.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/exceptions.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/fields.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/filepost.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/packages/__init__.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/packages/ordered_dict.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/packages/six.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/poolmanager.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/request.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/response.py delete mode 100644 vendor-local/lib/python/requests/packages/urllib3/util.py delete mode 100644 vendor-local/lib/python/requests/sessions.py delete mode 100644 vendor-local/lib/python/requests/status_codes.py delete mode 100644 vendor-local/lib/python/requests/structures.py delete mode 100644 vendor-local/lib/python/requests/utils.py delete mode 100644 vendor-local/lib/python/rest_framework/__init__.py delete mode 100644 vendor-local/lib/python/rest_framework/authentication.py delete mode 100644 vendor-local/lib/python/rest_framework/authtoken/__init__.py delete mode 100644 vendor-local/lib/python/rest_framework/authtoken/admin.py delete mode 100644 vendor-local/lib/python/rest_framework/authtoken/migrations/0001_initial.py delete mode 100644 vendor-local/lib/python/rest_framework/authtoken/migrations/__init__.py delete mode 100644 vendor-local/lib/python/rest_framework/authtoken/models.py delete mode 100644 vendor-local/lib/python/rest_framework/authtoken/serializers.py delete mode 100644 vendor-local/lib/python/rest_framework/authtoken/views.py delete mode 100644 vendor-local/lib/python/rest_framework/compat.py delete mode 100644 vendor-local/lib/python/rest_framework/decorators.py delete mode 100644 vendor-local/lib/python/rest_framework/exceptions.py delete mode 100644 vendor-local/lib/python/rest_framework/fields.py delete mode 100644 vendor-local/lib/python/rest_framework/filters.py delete mode 100644 vendor-local/lib/python/rest_framework/generics.py delete mode 100644 vendor-local/lib/python/rest_framework/mixins.py delete mode 100644 vendor-local/lib/python/rest_framework/models.py delete mode 100644 vendor-local/lib/python/rest_framework/negotiation.py delete mode 100644 vendor-local/lib/python/rest_framework/pagination.py delete mode 100644 vendor-local/lib/python/rest_framework/parsers.py delete mode 100644 vendor-local/lib/python/rest_framework/permissions.py delete mode 100644 vendor-local/lib/python/rest_framework/relations.py delete mode 100644 vendor-local/lib/python/rest_framework/renderers.py delete mode 100644 vendor-local/lib/python/rest_framework/request.py delete mode 100644 vendor-local/lib/python/rest_framework/response.py delete mode 100644 vendor-local/lib/python/rest_framework/reverse.py delete mode 100644 vendor-local/lib/python/rest_framework/routers.py delete mode 100644 vendor-local/lib/python/rest_framework/runtests/__init__.py delete mode 100644 vendor-local/lib/python/rest_framework/runtests/runcoverage.py delete mode 100644 vendor-local/lib/python/rest_framework/runtests/runtests.py delete mode 100644 vendor-local/lib/python/rest_framework/runtests/settings.py delete mode 100644 vendor-local/lib/python/rest_framework/runtests/urls.py delete mode 100644 vendor-local/lib/python/rest_framework/serializers.py delete mode 100644 vendor-local/lib/python/rest_framework/settings.py delete mode 100644 vendor-local/lib/python/rest_framework/six.py delete mode 100644 vendor-local/lib/python/rest_framework/static/rest_framework/css/bootstrap-tweaks.css delete mode 100644 vendor-local/lib/python/rest_framework/static/rest_framework/css/bootstrap.min.css delete mode 100644 vendor-local/lib/python/rest_framework/static/rest_framework/css/default.css delete mode 100644 vendor-local/lib/python/rest_framework/static/rest_framework/css/prettify.css delete mode 100644 vendor-local/lib/python/rest_framework/static/rest_framework/img/glyphicons-halflings-white.png delete mode 100644 vendor-local/lib/python/rest_framework/static/rest_framework/img/glyphicons-halflings.png delete mode 100644 vendor-local/lib/python/rest_framework/static/rest_framework/img/grid.png delete mode 100644 vendor-local/lib/python/rest_framework/static/rest_framework/js/bootstrap.min.js delete mode 100644 vendor-local/lib/python/rest_framework/static/rest_framework/js/default.js delete mode 100644 vendor-local/lib/python/rest_framework/status.py delete mode 100644 vendor-local/lib/python/rest_framework/templates/rest_framework/api.html delete mode 100644 vendor-local/lib/python/rest_framework/templates/rest_framework/base.html delete mode 100644 vendor-local/lib/python/rest_framework/templates/rest_framework/form.html delete mode 100644 vendor-local/lib/python/rest_framework/templates/rest_framework/login.html delete mode 100644 vendor-local/lib/python/rest_framework/templates/rest_framework/login_base.html delete mode 100644 vendor-local/lib/python/rest_framework/templatetags/__init__.py delete mode 100644 vendor-local/lib/python/rest_framework/templatetags/rest_framework.py delete mode 100644 vendor-local/lib/python/rest_framework/test.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/__init__.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/description.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/extras/__init__.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/extras/bad_import.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/models.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_authentication.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_breadcrumbs.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_decorators.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_description.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_fields.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_files.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_filters.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_genericrelations.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_generics.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_htmlrenderer.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_hyperlinkedserializers.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_multitable_inheritance.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_negotiation.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_pagination.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_parsers.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_permissions.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_relations.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_relations_hyperlink.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_relations_nested.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_relations_pk.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_relations_slug.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_renderers.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_request.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_response.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_reverse.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_routers.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_serializer.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_serializer_bulk_update.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_serializer_nested.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_settings.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_testing.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_throttling.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_urlpatterns.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_validation.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/test_views.py delete mode 100644 vendor-local/lib/python/rest_framework/tests/tests.py delete mode 100644 vendor-local/lib/python/rest_framework/throttling.py delete mode 100644 vendor-local/lib/python/rest_framework/urlpatterns.py delete mode 100644 vendor-local/lib/python/rest_framework/urls.py delete mode 100644 vendor-local/lib/python/rest_framework/utils/__init__.py delete mode 100644 vendor-local/lib/python/rest_framework/utils/breadcrumbs.py delete mode 100644 vendor-local/lib/python/rest_framework/utils/encoders.py delete mode 100644 vendor-local/lib/python/rest_framework/utils/formatting.py delete mode 100644 vendor-local/lib/python/rest_framework/utils/mediatypes.py delete mode 100644 vendor-local/lib/python/rest_framework/views.py delete mode 100644 vendor-local/lib/python/rest_framework/viewsets.py delete mode 100644 vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/PKG-INFO delete mode 100644 vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/SOURCES.txt delete mode 100644 vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/dependency_links.txt delete mode 100644 vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/installed-files.txt delete mode 100644 vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/requires.txt delete mode 100644 vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/top_level.txt delete mode 100644 vendor-local/lib/python/rna/__init__.py delete mode 100644 vendor-local/lib/python/rna/admin.py delete mode 100644 vendor-local/lib/python/rna/clients.py delete mode 100644 vendor-local/lib/python/rna/fields.py delete mode 100644 vendor-local/lib/python/rna/filters.py delete mode 100644 vendor-local/lib/python/rna/management/__init__.py delete mode 100644 vendor-local/lib/python/rna/management/commands/__init__.py delete mode 100644 vendor-local/lib/python/rna/management/commands/rnasync.py delete mode 100644 vendor-local/lib/python/rna/migrations/0001_initial.py delete mode 100644 vendor-local/lib/python/rna/migrations/0002_auto__add_release.py delete mode 100644 vendor-local/lib/python/rna/migrations/0003_auto__add_field_note_fixed_in_release__add_field_note_tag_num__add_fie.py delete mode 100644 vendor-local/lib/python/rna/migrations/0004_migrate_old_data.py delete mode 100644 vendor-local/lib/python/rna/migrations/0005_auto__del_field_note_first_version__del_field_note_first_channel__del_.py delete mode 100644 vendor-local/lib/python/rna/migrations/0006_auto__del_tag__del_channel__del_product.py delete mode 100644 vendor-local/lib/python/rna/migrations/0007_auto__add_field_release_is_public.py delete mode 100644 vendor-local/lib/python/rna/migrations/0008_auto__add_field_note_is_known_issue.py delete mode 100644 vendor-local/lib/python/rna/migrations/__init__.py delete mode 100644 vendor-local/lib/python/rna/models.py delete mode 100644 vendor-local/lib/python/rna/serializers.py delete mode 100644 vendor-local/lib/python/rna/tests.py delete mode 100644 vendor-local/lib/python/rna/urls.py delete mode 100644 vendor-local/lib/python/rna/views.py delete mode 100644 vendor-local/lib/python/six-1.4.1-py2.7.egg-info/PKG-INFO delete mode 100644 vendor-local/lib/python/six-1.4.1-py2.7.egg-info/SOURCES.txt delete mode 100644 vendor-local/lib/python/six-1.4.1-py2.7.egg-info/dependency_links.txt delete mode 100644 vendor-local/lib/python/six-1.4.1-py2.7.egg-info/installed-files.txt delete mode 100644 vendor-local/lib/python/six-1.4.1-py2.7.egg-info/top_level.txt delete mode 100644 vendor-local/lib/python/six.py create mode 100644 vendor-local/lib/python/south/test_shim.py create mode 100644 vendor-local/lib/python/south/tests/db_firebird.py create mode 160000 vendor-local/src/Python-Markdown create mode 160000 vendor-local/src/django-extensions create mode 160000 vendor-local/src/django-rest-framework create mode 160000 vendor-local/src/jingo-markdown create mode 160000 vendor-local/src/requests create mode 160000 vendor-local/src/rna create mode 160000 vendor-local/src/six diff --git a/.gitmodules b/.gitmodules index 96b2b01ffbd..13758b13935 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,24 @@ [submodule "vendor-local/src/django-waffle"] path = vendor-local/src/django-waffle url = https://github.com/jsocol/django-waffle.git +[submodule "vendor-local/src/rna"] + path = vendor-local/src/rna + url = git://github.com/mozilla/rna +[submodule "vendor-local/src/django-extensions"] + path = vendor-local/src/django-extensions + url = https://github.com/django-extensions/django-extensions.git +[submodule "vendor-local/src/django-rest-framework"] + path = vendor-local/src/django-rest-framework + url = https://github.com/tomchristie/django-rest-framework.git +[submodule "vendor-local/src/requests"] + path = vendor-local/src/requests + url = https://github.com/kennethreitz/requests.git +[submodule "vendor-local/src/Python-Markdown"] + path = vendor-local/src/Python-Markdown + url = https://github.com/waylan/Python-Markdown.git +[submodule "vendor-local/src/jingo-markdown"] + path = vendor-local/src/jingo-markdown + url = https://github.com/monkeywarrior/jingo-markdown.git +[submodule "vendor-local/src/six"] + path = vendor-local/src/six + url = https://github.com/kelp404/six.git diff --git a/bedrock/firefox/templates/firefox/releases/notes.html b/bedrock/firefox/templates/firefox/releases/notes.html index 28bb03f0ea1..12fdd7983e7 100644 --- a/bedrock/firefox/templates/firefox/releases/notes.html +++ b/bedrock/firefox/templates/firefox/releases/notes.html @@ -2,7 +2,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #} -{% extends "firefox/fxos-base.html" %} +{% extends "firefox/base-resp.html" %} {% block page_title_prefix %}{% endblock %} {% block page_title %}{{ _('Firefox — {version} Notes')|f(version=version) }}{% endblock %} @@ -15,8 +15,6 @@ {{ css('firefox_releasenotes') }} {% endblock %} -{% block extrahead %}{% endblock %} - {% block content %} <header id="main-feature"> <h1>{{ _('Firefox {version} Notes')|f(version=version) }}</h1> @@ -25,14 +23,23 @@ <h2>{{ _('First offered to release channel users on {date}')|f(date=release.rele <p> {% trans feedback='https://input.mozilla.org/feedback', - bugzilla='https://bugzilla.mozilla.org/', - buglist='link-to-bugzilla-search' %} + bugzilla='https://bugzilla.mozilla.org/' %} As always, you’re encouraged to <a href="{{ feedback }}">tell us what you think</a>, or <a href="{{ bugzilla }}">file a bug in Bugzilla</a>. - If interested, please see the <a href="{{ buglist }}">complete list of changes</a> - in this release. {% endtrans %} + {% if release.bug_search_url %} + {% trans bug_search_url=release.bug_search_url %} + If interested, please see the <a href="{{ bug_search_url }}">complete list of changes</a> + in this release. + {% endtrans %} + {% elif release.bug_list %} + <form action="https://bugzilla.mozilla.org/buglist.cgi" method="post"> + <input type="hidden" name="limit" value="0"> + <input type="hidden" name="bug_id" value="{{ release.bug_list }}"> + <p>{{ _('If interested, please see the <input type="submit" value="complete list of changes"> in this release.') }}</p> + </form> + {% endif %} </p> </header> @@ -42,12 +49,12 @@ <h2>{{ _('First offered to release channel users on {date}')|f(date=release.rele <h3>{{ _('New Features') }}</h3> <ul class="section-items tagged"> {% for note in new_features %} - <li {% if not note.tag.text %}class="untagged"{% endif %}> + <li {% if not note.tag %}class="untagged"{% endif %}> <p> - {% if note.tag.text %} - <b class="tag tag-{{ note.tag.text.lower() }}">{{ note.tag.text }}</b> + {% if note.tag %} + <b class="tag tag-{{ note.tag.lower() }}">{{ note.tag }}</b> {% endif %} - {{ note.html|safe }} + {{ note.note|markdown|safe }} </p> </li> {% endfor %} @@ -61,12 +68,12 @@ <h3>{{ _('Known Issues') }}</h3> <li> <p> <b class="tag tag-unresolved">{{ _('unresolved') }}</b> - {{ note.html|safe }} + {{ note.note|markdown|safe }} </p> - {% if not note.fixed_in_version is none %} + {% if note.fixed_in_release %} <p class="note"> - <a href="{{ url('firefox.releasenotes', '{major_version}.0'|f(major_version=note.fixed_in_version)) }}"> - {{ _('Resolved in v{version_number}')|f(version_number=note.fixed_in_version) }} + <a href="{{ url('firefox.releasenotes', '{major_version}.0'|f(major_version=note.fixed_in_release.version)) }}"> + {{ _('Resolved in v{version_number}')|f(version_number=note.fixed_in_release.version) }} </a> </p> {% endif %} @@ -81,8 +88,8 @@ <h3>{{ _('Known Issues') }}</h3> <section id="try"> <h3>{{ _('Try Firefox') }}</h3> <ol> - <li class="try1"><a href="/firefox/26.0/system-requirements/">{{ _('Check') }}</a></li> - <li class="try2"><a href="/firefox/">{{ _('Download') }}</a></li> + <li class="try1"><a href="{{ url('firefox.system_requirements', version) }}">{{ _('Check') }}</a></li> + <li class="try2"><a href="{{ url('firefox') }}">{{ _('Download') }}</a></li> <li class="try3"><a href="https://support.mozilla.org/kb/Installing%20Firefox">{{ _('Install') }}</a></li> <li class="try4"><a href="https://addons.mozilla.org/firefox/">{{ _('Customize') }}</a></li> </ol> diff --git a/bedrock/firefox/templates/firefox/releases/system_requirements.html b/bedrock/firefox/templates/firefox/releases/system_requirements.html index 67f271b80c0..e443e46435f 100644 --- a/bedrock/firefox/templates/firefox/releases/system_requirements.html +++ b/bedrock/firefox/templates/firefox/releases/system_requirements.html @@ -24,7 +24,7 @@ <h1>{{ _('Firefox {version} System Requirements')|f(version=version) }}</h1> <div id="main-content"> <article class="main-column"> - {{ release.system_requirements|markdown()|safe }} + {{ release.system_requirements|markdown|safe }} </article> </div> {% block sidebar %}{% endblock %} diff --git a/bedrock/firefox/tests/__init__.py b/bedrock/firefox/tests/__init__.py index 02631b87624..e69de29bb2d 100644 --- a/bedrock/firefox/tests/__init__.py +++ b/bedrock/firefox/tests/__init__.py @@ -1,49 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -from datetime import datetime - -import rna.models -from factory import DjangoModelFactory, LazyAttribute, Sequence, SubFactory -from factory.fuzzy import FuzzyNaiveDateTime, FuzzyInteger - - -class ChannelFactory(DjangoModelFactory): - FACTORY_FOR = rna.models.Channel - name = Sequence(lambda n: 'Channel {0}'.format(n)) - - -class ProductFactory(DjangoModelFactory): - FACTORY_FOR = rna.models.Product - name = Sequence(lambda n: 'Product {0}'.format(n)) - text = Sequence(lambda n: 'Text {0}'.format(n)) - - -class ReleaseFactory(DjangoModelFactory): - FACTORY_FOR = rna.models.Release - product = SubFactory(ProductFactory) - channel = SubFactory(ChannelFactory) - version = FuzzyInteger(0) - sub_version = 0 - release_date = FuzzyNaiveDateTime(datetime(2013, 12, 2)) - text = '' - - -class TagFactory(DjangoModelFactory): - FACTORY_FOR = rna.models.Tag - text = Sequence(lambda n: 'Tag {0}'.format(n)) - sort_num = Sequence(lambda n: n) - - -class NoteFactory(DjangoModelFactory): - FACTORY_FOR = rna.models.Note - bug = None - html = '<p>Note!</p>' - first_version = Sequence(lambda n: n) - first_channel = SubFactory(ChannelFactory) - fixed_in_version = LazyAttribute(lambda n: n.first_version + 2) - fixed_in_channel = SubFactory(ChannelFactory) - tag = SubFactory(TagFactory) - product = SubFactory(ProductFactory) - sort_num = Sequence(lambda n: n) - fixed_in_subversion = None diff --git a/bedrock/firefox/tests/test_views.py b/bedrock/firefox/tests/test_views.py index c812d2b862d..96895b2cc0f 100644 --- a/bedrock/firefox/tests/test_views.py +++ b/bedrock/firefox/tests/test_views.py @@ -8,11 +8,10 @@ from rna.models import Release from bedrock.firefox import views -from bedrock.firefox.tests import NoteFactory, ProductFactory, ReleaseFactory from bedrock.mozorg.tests import TestCase -class TestReleaseNotesView(TestCase): +class TestRNAViews(TestCase): def setUp(self): self.factory = RequestFactory() self.request = self.factory.get('/') @@ -31,83 +30,40 @@ def last_ctx(self): """ return self.mock_render.call_args[0][2] - def test_missing_minor_version(self): + @patch('bedrock.firefox.views.get_object_or_404') + def test_release_notes(self, get_object_or_404): """ - If the minor version is missing in the URL, it should default to - 0. + Should use release returned from get_object_or_404 with the + correct params and pass the correct context variables and + template to l10n_utils.render """ - ReleaseFactory.create(version=18, sub_version=0, channel__name='Release', - product__name='Firefox') - - views.release_notes(self.request, '18.0') - eq_(self.last_ctx['minor_version'], 0) - - def test_no_release_404(self): - """ - Fetch the release using get_object_or_404, so that an Http404 is - raised when the release isn't found. - """ - with patch('bedrock.firefox.views.get_object_or_404') as get_object_or_404: - views.release_notes(self.request, '18.0') - eq_(self.last_ctx['release'], get_object_or_404.return_value) - get_object_or_404.assert_called_with(Release, version=18, sub_version=0, - channel__name='Release', product__name='Firefox') - - def test_note_first_version_not_fixed(self): + mock_release = get_object_or_404.return_value + mock_release.notes.return_value = ('mock new_features', + 'mock known_issues') + + views.release_notes(self.request, '27.0') + # Should use fixed version for query + get_object_or_404.assert_called_with( + Release, version='27.0.0', channel='Release', product='Firefox') + # Should use original version for context variable + eq_(self.last_ctx['version'], '27.0') + eq_(self.last_ctx['major_version'], '27') + eq_(self.last_ctx['release'], mock_release) + eq_(self.last_ctx['new_features'], 'mock new_features') + eq_(self.last_ctx['known_issues'], 'mock known_issues') + eq_(self.mock_render.call_args[0][1], 'firefox/releases/notes.html') + + @patch('bedrock.firefox.views.get_object_or_404') + def test_system_requirements(self, get_object_or_404): """ - If a note started on or before the current version, and has yet - to be fixed, include it in known issues. + Should use release returned from get_object_or_404, with a + default channel of Release and default product of Firefox, + and pass the version to l10n_utils.render """ - product = ProductFactory.create(name='Firefox') - ReleaseFactory.create(version=19, sub_version=0, channel__name='Release', product=product) - note1 = NoteFactory.create(first_version=18, fixed_in_version=None, product=product) - note2 = NoteFactory.create(first_version=19, fixed_in_version=None, product=product) - - views.release_notes(self.request, '19.0') - eq_(set([note1, note2]), set(self.last_ctx['known_issues'])) - - def test_note_first_version_fixed(self): - """ - If a note started on or before the current version, and was - fixed on this version, include it in new features. If it was - fixed after this version, include it in known issues. - """ - product = ProductFactory.create(name='Firefox') - ReleaseFactory.create(version=19, sub_version=0, channel__name='Release', product=product) - note1 = NoteFactory.create(first_version=18, fixed_in_version=19, product=product) - note2 = NoteFactory.create(first_version=19, fixed_in_version=19, product=product) - note3 = NoteFactory.create(first_version=18, fixed_in_version=20, product=product) - note4 = NoteFactory.create(first_version=19, fixed_in_version=20, product=product) - - views.release_notes(self.request, '19.0') - eq_(set([note1, note2]), set(self.last_ctx['new_features'])) - eq_(set([note3, note4]), set(self.last_ctx['known_issues'])) - - def test_note_fixed_no_first_version(self): - """ - If a note started has no first version but was fixed in the - current version, include it in new features. - """ - product = ProductFactory.create(name='Firefox') - ReleaseFactory.create(version=19, sub_version=0, channel__name='Release', product=product) - note1 = NoteFactory.create(first_version=None, fixed_in_version=19, product=product) - - views.release_notes(self.request, '19.0') - eq_(set([note1]), set(self.last_ctx['new_features'])) - - def test_note_fixed_product_name(self): - """ - If a note does has no product or "Firefox" as the product, - include it. - """ - product = ProductFactory.create(name='Firefox') - ReleaseFactory.create(version=19, sub_version=0, channel__name='Release', product=product) - note1 = NoteFactory.create(first_version=None, fixed_in_version=19, product=product) - note2 = NoteFactory.create(first_version=None, fixed_in_version=19, product=None) - - # Notes that shouldn't appear. - NoteFactory.create(first_version=None, fixed_in_version=19, product__name='Fennec') - NoteFactory.create(first_version=None, fixed_in_version=19, product__name='FirefoxOS') - - views.release_notes(self.request, '19.0') - eq_(set([note1, note2]), set(self.last_ctx['new_features'])) + views.system_requirements(self.request, '27.0.1') + get_object_or_404.assert_called_with( + Release, version='27.0.1', channel='Release', product='Firefox') + eq_(self.last_ctx['release'], get_object_or_404.return_value) + eq_(self.last_ctx['version'], '27.0.1') + eq_(self.mock_render.call_args[0][1], + 'firefox/releases/system_requirements.html') diff --git a/bedrock/firefox/urls.py b/bedrock/firefox/urls.py index 8fb7c257326..eb8118770d2 100644 --- a/bedrock/firefox/urls.py +++ b/bedrock/firefox/urls.py @@ -16,6 +16,7 @@ product_re = '(?P<product>firefox|mobile)' channel_re = '(?P<channel>beta|aurora|organizations)' releasenotes_re = latest_re % (version_re, 'releasenotes') +sysreq_re = latest_re % (version_re, 'releasenotes/system-requirements') urlpatterns = patterns('', @@ -80,8 +81,10 @@ page('mwc', 'firefox/os/mwc-2014-preview.html'), page('firefox/os/devices', 'firefox/os/devices.html'), - url(releasenotes_re, views.release_notes, name='firefox.releasenotes'), - # temporary URL for Aurora 29 survey page('firefox/aurora/up-to-date', 'firefox/whatsnew-aurora-29-survey.html'), + + url(releasenotes_re, views.release_notes, name='firefox.releasenotes'), + url(sysreq_re, views.system_requirements, + name='firefox.system_requirements'), ) diff --git a/bedrock/firefox/views.py b/bedrock/firefox/views.py index 1933656da40..d87b245489a 100644 --- a/bedrock/firefox/views.py +++ b/bedrock/firefox/views.py @@ -410,32 +410,36 @@ def get_template_names(self): return template -def release_notes(request, version, channel='Release', product='Firefox'): - if len(version.split('.')) == 2: - query_version = version + '.0' +def fix_fx_version(fx_version): + if len(fx_version.split('.')) == 2: + return fx_version + '.0' else: - query_version = version - release = get_object_or_404(Release, version=query_version, - channel=channel, product=product) + return fx_version + + +def release_notes_template(channel, product): + #TODO: if product == 'Firefox OS': + #TODO: different templates based on channel with default + return 'firefox/releases/notes.html' + +def release_notes(request, fx_version, channel='Release', product='Firefox'): + release = get_object_or_404(Release, version=fix_fx_version(fx_version), + channel=channel, product=product) new_features, known_issues = release.notes() return l10n_utils.render( - request, 'firefox/releases/notes.html', { - 'version': version, - 'major_version': version.split('.', 1)[0], + request, release_notes_template(channel, product), { + 'version': fx_version, + 'major_version': fx_version.split('.', 1)[0], 'release': release, 'new_features': new_features, 'known_issues': known_issues}) -def system_requirements(request, version, channel='Release', +def system_requirements(request, fx_version, channel='Release', product='Firefox'): - if len(version.split('.')) == 2: - query_version = version + '.0' - else: - query_version = version - release = get_object_or_404(Release, version=query_version, + release = get_object_or_404(Release, version=fix_fx_version(fx_version), channel=channel, product=product) return l10n_utils.render( request, 'firefox/releases/system_requirements.html', - {'release': release, 'version': version}) + {'release': release, 'version': fx_version}) diff --git a/bedrock/settings/base.py b/bedrock/settings/base.py index 3d3d08d66eb..208b2ac896c 100644 --- a/bedrock/settings/base.py +++ b/bedrock/settings/base.py @@ -82,7 +82,8 @@ def JINJA_CONFIG(): 'extensions': [ 'lib.l10n_utils.template.i18n', 'jinja2.ext.do', 'jinja2.ext.with_', 'jinja2.ext.loopcontrols', 'lib.l10n_utils.template.l10n_blocks', - 'lib.l10n_utils.template.lang_blocks' + 'lib.l10n_utils.template.lang_blocks', + 'jingo_markdown.extensions.MarkdownExtension', ], # Make None in templates render as '' 'finalize': lambda x: x if x is not None else '', @@ -758,6 +759,7 @@ def JINJA_CONFIG(): 'djcelery', ), append=( # Local apps + 'jingo_markdown', 'jingo_minify', 'django_statsd', 'waffle', @@ -979,5 +981,7 @@ def facebook_tab_url_lazy(): # Publishing system config RNA = { 'BASE_URL': os.environ.get('RNA_BASE_URL', 'https://nucleus.mozilla.org/rna/'), - 'LEGACY_API': os.environ.get('RNA_LEGACY_API', False), + + # default False as temporary workaround for bug 973499 + 'VERIFY_SSL_CERT': os.environ.get('VERIFY_SSL_CERT', False), } diff --git a/lib/l10n_utils/helpers.py b/lib/l10n_utils/helpers.py index 37a690efc76..efc0ee3eb41 100644 --- a/lib/l10n_utils/helpers.py +++ b/lib/l10n_utils/helpers.py @@ -4,8 +4,11 @@ import jingo import jinja2 +from babel.core import Locale, UnknownLocaleError +from babel.dates import format_date from django.conf import settings +from django.utils.translation import get_language from dotlang import translate, lang_file_has_tag @@ -70,3 +73,24 @@ def l10n_has_tag(ctx, tag, langfile=None): """Return boolean whether the given lang file has the given tag.""" langfile = langfile or ctx.get('langfile') return lang_file_has_tag(langfile, tag=tag) + + +def current_locale(): + """ + Return the current Locale object (from Babel). Defaults to locale + based on settings.LANGUAGE_CODE if locale does not exist. + """ + try: + return Locale.parse(get_language(), sep='-') + except (UnknownLocaleError, ValueError): + return Locale(*settings.LANGUAGE_CODE.split('-')) + + +@jingo.register.filter +def l10n_format_date(date, format='long'): + """ + Formats a date according to the current locale. Wraps around + babel.dates.format_date. + """ + locale = current_locale() + return format_date(date, locale=locale, format=format) diff --git a/lib/l10n_utils/tests/test_helpers.py b/lib/l10n_utils/tests/test_helpers.py index 33fa3cd2107..6cfca53ba70 100644 --- a/lib/l10n_utils/tests/test_helpers.py +++ b/lib/l10n_utils/tests/test_helpers.py @@ -3,11 +3,13 @@ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. - -from mock import patch import jingo +from babel.core import UnknownLocaleError +from mock import patch +from nose.tools import eq_ from bedrock.mozorg.tests import TestCase +from l10n_utils import helpers def render(s, context=None): @@ -15,18 +17,57 @@ def render(s, context=None): return t.render(context or {}) -@patch('lib.l10n_utils.helpers.lang_file_has_tag') class TestL10nHasTag(TestCase): - def test_gets_right_langfile(self, lfht_mock): - lfht_mock.return_value = True - res = render('{{ "nihilist" if l10n_has_tag("abide") }}', - {'langfile': 'dude'}) - self.assertEqual(res, 'nihilist') - lfht_mock.assert_called_with('dude', tag='abide') - - def test_override_langfile(self, lfht_mock): - lfht_mock.return_value = True - res = render('{{ "nihilist" if l10n_has_tag("abide", "uli") }}', - {'langfile': 'dude'}) - self.assertEqual(res, 'nihilist') - lfht_mock.assert_called_with('uli', tag='abide') + def test_gets_right_langfile(self): + with patch('lib.l10n_utils.helpers.lang_file_has_tag') as lfht_mock: + lfht_mock.return_value = True + res = render('{{ "nihilist" if l10n_has_tag("abide") }}', + {'langfile': 'dude'}) + self.assertEqual(res, 'nihilist') + lfht_mock.assert_called_with('dude', tag='abide') + + def test_override_langfile(self): + with patch('lib.l10n_utils.helpers.lang_file_has_tag') as lfht_mock: + lfht_mock.return_value = True + res = render('{{ "nihilist" if l10n_has_tag("abide", "uli") }}', + {'langfile': 'dude'}) + self.assertEqual(res, 'nihilist') + lfht_mock.assert_called_with('uli', tag='abide') + + +class TestCurrentLocale(TestCase): + @patch('l10n_utils.helpers.Locale') + def test_unknown_locale(self, Locale): + """ + If Locale.parse raises an UnknownLocaleError, return the en-US + locale object. + """ + Locale.parse.side_effect = UnknownLocaleError('foo') + eq_(helpers.current_locale(), Locale.return_value) + Locale.assert_called_with('en', 'US') + + @patch('l10n_utils.helpers.Locale') + def test_value_error(self, Locale): + """ + If Locale.parse raises a ValueError, return the en-US locale + object. + """ + Locale.parse.side_effect = ValueError + eq_(helpers.current_locale(), Locale.return_value) + Locale.assert_called_with('en', 'US') + + @patch('l10n_utils.helpers.get_language') + @patch('l10n_utils.helpers.Locale') + def test_success(self, Locale, get_language): + eq_(helpers.current_locale(), Locale.parse.return_value) + Locale.parse.assert_called_with(get_language.return_value, sep='-') + + +class TestL10nFormatDate(TestCase): + @patch('l10n_utils.helpers.current_locale') + @patch('l10n_utils.helpers.format_date') + def test_success(self, format_date, current_locale): + eq_(helpers.l10n_format_date('somedate', format='long'), + format_date.return_value) + format_date.assert_called_with( + 'somedate', locale=current_locale.return_value, format='long') diff --git a/requirements/prod.txt b/requirements/prod.txt index a25a9ce07df..89d3c44e6b3 100644 --- a/requirements/prod.txt +++ b/requirements/prod.txt @@ -1,6 +1,6 @@ -# Django 1.4.5 is also in vendor, but needs to be kept here so packages that +# Django 1.4.8 is also in vendor, but needs to be kept here so packages that # depend on Django do not install a newer version -Django==1.4.5 +Django==1.4.8 # Templates -e git://github.com/jbalogh/jingo.git#egg=jingo @@ -29,4 +29,4 @@ python-memcached==1.53 django-statsd-mozilla==0.3.5 # Publishing system -git+git://github.com/mozilla/rna.git@2b9dd508197ab2ef2b74c02a16fa8ef6c3fbab0d +git+git://github.com/mozilla/rna.git@39e9260428560a677f59db8d12dde8073f7fe7a9 diff --git a/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/PKG-INFO b/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/PKG-INFO deleted file mode 100644 index 2ffb8ea7b5f..00000000000 --- a/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/PKG-INFO +++ /dev/null @@ -1,22 +0,0 @@ -Metadata-Version: 1.1 -Name: django-extensions -Version: 1.2.0 -Summary: Extensions for Django -Home-page: http://github.com/django-extensions/django-extensions -Author: Bas van Oostveen -Author-email: v.oostveen@gmail.com -License: New BSD License -Description: django-extensions bundles several useful - additions for Django projects. See the project page for more information: - http://github.com/django-extensions/django-extensions -Platform: any -Classifier: Development Status :: 4 - Beta -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Django -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Topic :: Utilities diff --git a/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/SOURCES.txt b/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/SOURCES.txt deleted file mode 100644 index 269a79ba48f..00000000000 --- a/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/SOURCES.txt +++ /dev/null @@ -1,156 +0,0 @@ -LICENSE -MANIFEST.in -README.rst -setup.cfg -setup.py -django_extensions/__init__.py -django_extensions/future_1_5.py -django_extensions/models.py -django_extensions/settings.py -django_extensions.egg-info/PKG-INFO -django_extensions.egg-info/SOURCES.txt -django_extensions.egg-info/dependency_links.txt -django_extensions.egg-info/requires.txt -django_extensions.egg-info/top_level.txt -django_extensions/admin/__init__.py -django_extensions/admin/widgets.py -django_extensions/conf/app_template/__init__.py.tmpl -django_extensions/conf/app_template/forms.py.tmpl -django_extensions/conf/app_template/models.py.tmpl -django_extensions/conf/app_template/urls.py.tmpl -django_extensions/conf/app_template/views.py.tmpl -django_extensions/conf/command_template/management/__init__.py.tmpl -django_extensions/conf/command_template/management/commands/__init__.py.tmpl -django_extensions/conf/command_template/management/commands/sample.py.tmpl -django_extensions/conf/jobs_template/jobs/__init__.py.tmpl -django_extensions/conf/jobs_template/jobs/sample.py.tmpl -django_extensions/conf/jobs_template/jobs/daily/__init__.py.tmpl -django_extensions/conf/jobs_template/jobs/hourly/__init__.py.tmpl -django_extensions/conf/jobs_template/jobs/monthly/__init__.py.tmpl -django_extensions/conf/jobs_template/jobs/weekly/__init__.py.tmpl -django_extensions/conf/jobs_template/jobs/yearly/__init__.py.tmpl -django_extensions/db/__init__.py -django_extensions/db/models.py -django_extensions/db/fields/__init__.py -django_extensions/db/fields/encrypted.py -django_extensions/db/fields/json.py -django_extensions/jobs/__init__.py -django_extensions/jobs/daily/__init__.py -django_extensions/jobs/daily/cache_cleanup.py -django_extensions/jobs/daily/daily_cleanup.py -django_extensions/jobs/hourly/__init__.py -django_extensions/jobs/monthly/__init__.py -django_extensions/jobs/weekly/__init__.py -django_extensions/jobs/yearly/__init__.py -django_extensions/management/__init__.py -django_extensions/management/base.py -django_extensions/management/color.py -django_extensions/management/jobs.py -django_extensions/management/modelviz.py -django_extensions/management/notebook_extension.py -django_extensions/management/shells.py -django_extensions/management/signals.py -django_extensions/management/technical_response.py -django_extensions/management/utils.py -django_extensions/management/commands/__init__.py -django_extensions/management/commands/clean_pyc.py -django_extensions/management/commands/compile_pyc.py -django_extensions/management/commands/create_app.py -django_extensions/management/commands/create_command.py -django_extensions/management/commands/create_jobs.py -django_extensions/management/commands/describe_form.py -django_extensions/management/commands/dumpscript.py -django_extensions/management/commands/export_emails.py -django_extensions/management/commands/find_template.py -django_extensions/management/commands/generate_secret_key.py -django_extensions/management/commands/graph_models.py -django_extensions/management/commands/mail_debug.py -django_extensions/management/commands/notes.py -django_extensions/management/commands/passwd.py -django_extensions/management/commands/pipchecker.py -django_extensions/management/commands/print_settings.py -django_extensions/management/commands/print_user_for_session.py -django_extensions/management/commands/reset_db.py -django_extensions/management/commands/runjob.py -django_extensions/management/commands/runjobs.py -django_extensions/management/commands/runprofileserver.py -django_extensions/management/commands/runscript.py -django_extensions/management/commands/runserver_plus.py -django_extensions/management/commands/set_fake_emails.py -django_extensions/management/commands/set_fake_passwords.py -django_extensions/management/commands/shell_plus.py -django_extensions/management/commands/show_templatetags.py -django_extensions/management/commands/show_urls.py -django_extensions/management/commands/sqlcreate.py -django_extensions/management/commands/sqldiff.py -django_extensions/management/commands/sync_media_s3.py -django_extensions/management/commands/syncdata.py -django_extensions/management/commands/unreferenced_files.py -django_extensions/management/commands/update_permissions.py -django_extensions/management/commands/validate_templates.py -django_extensions/migrations/0001_empty.py -django_extensions/migrations/__init__.py -django_extensions/mongodb/__init__.py -django_extensions/mongodb/models.py -django_extensions/mongodb/fields/__init__.py -django_extensions/mongodb/fields/encrypted.py -django_extensions/mongodb/fields/json.py -django_extensions/static/django_extensions/css/jquery.autocomplete.css -django_extensions/static/django_extensions/img/indicator.gif -django_extensions/static/django_extensions/js/jquery.ajaxQueue.js -django_extensions/static/django_extensions/js/jquery.autocomplete.js -django_extensions/static/django_extensions/js/jquery.bgiframe.min.js -django_extensions/static/django_extensions/js/jquery.js -django_extensions/templates/django_extensions/graph_models/body.html -django_extensions/templates/django_extensions/graph_models/head.html -django_extensions/templates/django_extensions/graph_models/rel.html -django_extensions/templates/django_extensions/graph_models/tail.html -django_extensions/templates/django_extensions/widgets/foreignkey_searchinput.html -django_extensions/templatetags/__init__.py -django_extensions/templatetags/highlighting.py -django_extensions/templatetags/syntax_color.py -django_extensions/templatetags/truncate_letters.py -django_extensions/templatetags/widont.py -django_extensions/tests/__init__.py -django_extensions/tests/encrypted_fields.py -django_extensions/tests/fields.py -django_extensions/tests/json_field.py -django_extensions/tests/management_command.py -django_extensions/tests/models.py -django_extensions/tests/test_dumpscript.py -django_extensions/tests/urls.py -django_extensions/tests/utils.py -django_extensions/tests/uuid_field.py -django_extensions/tests/management/__init__.py -django_extensions/tests/management/commands/__init__.py -django_extensions/tests/management/commands/error_raising_command.py -django_extensions/utils/__init__.py -django_extensions/utils/dia2django.py -django_extensions/utils/text.py -django_extensions/utils/validatingtemplatetags.py -docs/AUTHORS -docs/Makefile -docs/admin_extensions.rst -docs/command_extension_ideas.rst -docs/command_extensions.rst -docs/conf.py -docs/create_app.rst -docs/creating_release.txt -docs/dumpscript.rst -docs/export_emails.rst -docs/field_extensions.rst -docs/graph_models.rst -docs/index.rst -docs/installation_instructions.rst -docs/jobs_scheduling.rst -docs/model_extensions.rst -docs/namespace_proposal.rst -docs/print_settings.rst -docs/runprofileserver.rst -docs/runscript.rst -docs/runserver_plus.rst -docs/shell_plus.rst -docs/sqlcreate.rst -docs/sqldiff.rst -docs/sync_media_s3.rst -docs/validate_templates.rst \ No newline at end of file diff --git a/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/dependency_links.txt b/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/dependency_links.txt deleted file mode 100644 index 8b137891791..00000000000 --- a/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/installed-files.txt b/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/installed-files.txt deleted file mode 100644 index 56cf048eeec..00000000000 --- a/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/installed-files.txt +++ /dev/null @@ -1,220 +0,0 @@ -../django_extensions/__init__.py -../django_extensions/future_1_5.py -../django_extensions/models.py -../django_extensions/settings.py -../django_extensions/admin/__init__.py -../django_extensions/admin/widgets.py -../django_extensions/db/__init__.py -../django_extensions/db/models.py -../django_extensions/db/fields/__init__.py -../django_extensions/db/fields/encrypted.py -../django_extensions/db/fields/json.py -../django_extensions/jobs/__init__.py -../django_extensions/jobs/daily/__init__.py -../django_extensions/jobs/daily/cache_cleanup.py -../django_extensions/jobs/daily/daily_cleanup.py -../django_extensions/jobs/hourly/__init__.py -../django_extensions/jobs/monthly/__init__.py -../django_extensions/jobs/weekly/__init__.py -../django_extensions/jobs/yearly/__init__.py -../django_extensions/management/__init__.py -../django_extensions/management/base.py -../django_extensions/management/color.py -../django_extensions/management/jobs.py -../django_extensions/management/modelviz.py -../django_extensions/management/notebook_extension.py -../django_extensions/management/shells.py -../django_extensions/management/signals.py -../django_extensions/management/technical_response.py -../django_extensions/management/utils.py -../django_extensions/management/commands/__init__.py -../django_extensions/management/commands/clean_pyc.py -../django_extensions/management/commands/compile_pyc.py -../django_extensions/management/commands/create_app.py -../django_extensions/management/commands/create_command.py -../django_extensions/management/commands/create_jobs.py -../django_extensions/management/commands/describe_form.py -../django_extensions/management/commands/dumpscript.py -../django_extensions/management/commands/export_emails.py -../django_extensions/management/commands/find_template.py -../django_extensions/management/commands/generate_secret_key.py -../django_extensions/management/commands/graph_models.py -../django_extensions/management/commands/mail_debug.py -../django_extensions/management/commands/notes.py -../django_extensions/management/commands/passwd.py -../django_extensions/management/commands/pipchecker.py -../django_extensions/management/commands/print_settings.py -../django_extensions/management/commands/print_user_for_session.py -../django_extensions/management/commands/reset_db.py -../django_extensions/management/commands/runjob.py -../django_extensions/management/commands/runjobs.py -../django_extensions/management/commands/runprofileserver.py -../django_extensions/management/commands/runscript.py -../django_extensions/management/commands/runserver_plus.py -../django_extensions/management/commands/set_fake_emails.py -../django_extensions/management/commands/set_fake_passwords.py -../django_extensions/management/commands/shell_plus.py -../django_extensions/management/commands/show_templatetags.py -../django_extensions/management/commands/show_urls.py -../django_extensions/management/commands/sqlcreate.py -../django_extensions/management/commands/sqldiff.py -../django_extensions/management/commands/sync_media_s3.py -../django_extensions/management/commands/syncdata.py -../django_extensions/management/commands/unreferenced_files.py -../django_extensions/management/commands/update_permissions.py -../django_extensions/management/commands/validate_templates.py -../django_extensions/migrations/0001_empty.py -../django_extensions/migrations/__init__.py -../django_extensions/mongodb/__init__.py -../django_extensions/mongodb/models.py -../django_extensions/mongodb/fields/__init__.py -../django_extensions/mongodb/fields/encrypted.py -../django_extensions/mongodb/fields/json.py -../django_extensions/templatetags/__init__.py -../django_extensions/templatetags/highlighting.py -../django_extensions/templatetags/syntax_color.py -../django_extensions/templatetags/truncate_letters.py -../django_extensions/templatetags/widont.py -../django_extensions/tests/__init__.py -../django_extensions/tests/encrypted_fields.py -../django_extensions/tests/fields.py -../django_extensions/tests/json_field.py -../django_extensions/tests/management_command.py -../django_extensions/tests/models.py -../django_extensions/tests/test_dumpscript.py -../django_extensions/tests/urls.py -../django_extensions/tests/utils.py -../django_extensions/tests/uuid_field.py -../django_extensions/tests/management/__init__.py -../django_extensions/tests/management/commands/__init__.py -../django_extensions/tests/management/commands/error_raising_command.py -../django_extensions/utils/__init__.py -../django_extensions/utils/dia2django.py -../django_extensions/utils/text.py -../django_extensions/utils/validatingtemplatetags.py -../django_extensions/__init__.pyc -../django_extensions/future_1_5.pyc -../django_extensions/models.pyc -../django_extensions/settings.pyc -../django_extensions/admin/__init__.pyc -../django_extensions/admin/widgets.pyc -../django_extensions/db/__init__.pyc -../django_extensions/db/models.pyc -../django_extensions/db/fields/__init__.pyc -../django_extensions/db/fields/encrypted.pyc -../django_extensions/db/fields/json.pyc -../django_extensions/jobs/__init__.pyc -../django_extensions/jobs/daily/__init__.pyc -../django_extensions/jobs/daily/cache_cleanup.pyc -../django_extensions/jobs/daily/daily_cleanup.pyc -../django_extensions/jobs/hourly/__init__.pyc -../django_extensions/jobs/monthly/__init__.pyc -../django_extensions/jobs/weekly/__init__.pyc -../django_extensions/jobs/yearly/__init__.pyc -../django_extensions/management/__init__.pyc -../django_extensions/management/base.pyc -../django_extensions/management/color.pyc -../django_extensions/management/jobs.pyc -../django_extensions/management/modelviz.pyc -../django_extensions/management/notebook_extension.pyc -../django_extensions/management/shells.pyc -../django_extensions/management/signals.pyc -../django_extensions/management/technical_response.pyc -../django_extensions/management/utils.pyc -../django_extensions/management/commands/__init__.pyc -../django_extensions/management/commands/clean_pyc.pyc -../django_extensions/management/commands/compile_pyc.pyc -../django_extensions/management/commands/create_app.pyc -../django_extensions/management/commands/create_command.pyc -../django_extensions/management/commands/create_jobs.pyc -../django_extensions/management/commands/describe_form.pyc -../django_extensions/management/commands/dumpscript.pyc -../django_extensions/management/commands/export_emails.pyc -../django_extensions/management/commands/find_template.pyc -../django_extensions/management/commands/generate_secret_key.pyc -../django_extensions/management/commands/graph_models.pyc -../django_extensions/management/commands/mail_debug.pyc -../django_extensions/management/commands/notes.pyc -../django_extensions/management/commands/passwd.pyc -../django_extensions/management/commands/pipchecker.pyc -../django_extensions/management/commands/print_settings.pyc -../django_extensions/management/commands/print_user_for_session.pyc -../django_extensions/management/commands/reset_db.pyc -../django_extensions/management/commands/runjob.pyc -../django_extensions/management/commands/runjobs.pyc -../django_extensions/management/commands/runprofileserver.pyc -../django_extensions/management/commands/runscript.pyc -../django_extensions/management/commands/runserver_plus.pyc -../django_extensions/management/commands/set_fake_emails.pyc -../django_extensions/management/commands/set_fake_passwords.pyc -../django_extensions/management/commands/shell_plus.pyc -../django_extensions/management/commands/show_templatetags.pyc -../django_extensions/management/commands/show_urls.pyc -../django_extensions/management/commands/sqlcreate.pyc -../django_extensions/management/commands/sqldiff.pyc -../django_extensions/management/commands/sync_media_s3.pyc -../django_extensions/management/commands/syncdata.pyc -../django_extensions/management/commands/unreferenced_files.pyc -../django_extensions/management/commands/update_permissions.pyc -../django_extensions/management/commands/validate_templates.pyc -../django_extensions/migrations/0001_empty.pyc -../django_extensions/migrations/__init__.pyc -../django_extensions/mongodb/__init__.pyc -../django_extensions/mongodb/models.pyc -../django_extensions/mongodb/fields/__init__.pyc -../django_extensions/mongodb/fields/encrypted.pyc -../django_extensions/mongodb/fields/json.pyc -../django_extensions/templatetags/__init__.pyc -../django_extensions/templatetags/highlighting.pyc -../django_extensions/templatetags/syntax_color.pyc -../django_extensions/templatetags/truncate_letters.pyc -../django_extensions/templatetags/widont.pyc -../django_extensions/tests/__init__.pyc -../django_extensions/tests/encrypted_fields.pyc -../django_extensions/tests/fields.pyc -../django_extensions/tests/json_field.pyc -../django_extensions/tests/management_command.pyc -../django_extensions/tests/models.pyc -../django_extensions/tests/test_dumpscript.pyc -../django_extensions/tests/urls.pyc -../django_extensions/tests/utils.pyc -../django_extensions/tests/uuid_field.pyc -../django_extensions/tests/management/__init__.pyc -../django_extensions/tests/management/commands/__init__.pyc -../django_extensions/tests/management/commands/error_raising_command.pyc -../django_extensions/utils/__init__.pyc -../django_extensions/utils/dia2django.pyc -../django_extensions/utils/text.pyc -../django_extensions/utils/validatingtemplatetags.pyc -../django_extensions/conf/app_template/__init__.py.tmpl -../django_extensions/conf/app_template/forms.py.tmpl -../django_extensions/conf/app_template/models.py.tmpl -../django_extensions/conf/app_template/urls.py.tmpl -../django_extensions/conf/app_template/views.py.tmpl -../django_extensions/conf/command_template/management/__init__.py.tmpl -../django_extensions/conf/command_template/management/commands/__init__.py.tmpl -../django_extensions/conf/command_template/management/commands/sample.py.tmpl -../django_extensions/conf/jobs_template/jobs/__init__.py.tmpl -../django_extensions/conf/jobs_template/jobs/sample.py.tmpl -../django_extensions/conf/jobs_template/jobs/daily/__init__.py.tmpl -../django_extensions/conf/jobs_template/jobs/hourly/__init__.py.tmpl -../django_extensions/conf/jobs_template/jobs/monthly/__init__.py.tmpl -../django_extensions/conf/jobs_template/jobs/weekly/__init__.py.tmpl -../django_extensions/conf/jobs_template/jobs/yearly/__init__.py.tmpl -../django_extensions/static/django_extensions/css/jquery.autocomplete.css -../django_extensions/static/django_extensions/img/indicator.gif -../django_extensions/static/django_extensions/js/jquery.ajaxQueue.js -../django_extensions/static/django_extensions/js/jquery.autocomplete.js -../django_extensions/static/django_extensions/js/jquery.bgiframe.min.js -../django_extensions/static/django_extensions/js/jquery.js -../django_extensions/templates/django_extensions/graph_models/body.html -../django_extensions/templates/django_extensions/graph_models/head.html -../django_extensions/templates/django_extensions/graph_models/rel.html -../django_extensions/templates/django_extensions/graph_models/tail.html -../django_extensions/templates/django_extensions/widgets/foreignkey_searchinput.html -./ -dependency_links.txt -PKG-INFO -requires.txt -SOURCES.txt -top_level.txt diff --git a/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/requires.txt b/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/requires.txt deleted file mode 100644 index 64c56a36401..00000000000 --- a/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/requires.txt +++ /dev/null @@ -1 +0,0 @@ -six \ No newline at end of file diff --git a/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/top_level.txt b/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/top_level.txt deleted file mode 100644 index ee493865233..00000000000 --- a/vendor-local/lib/python/django_extensions-1.2.0-py2.7.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -django_extensions diff --git a/vendor-local/lib/python/django_extensions/__init__.py b/vendor-local/lib/python/django_extensions/__init__.py deleted file mode 100644 index 3426dc37398..00000000000 --- a/vendor-local/lib/python/django_extensions/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ - -VERSION = (1, 2, 0) - -# Dynamically calculate the version based on VERSION tuple -if len(VERSION) > 2 and VERSION[2] is not None: - if isinstance(VERSION[2], int): - str_version = "%s.%s.%s" % VERSION[:3] - else: - str_version = "%s.%s_%s" % VERSION[:3] -else: - str_version = "%s.%s" % VERSION[:2] - -__version__ = str_version diff --git a/vendor-local/lib/python/django_extensions/admin/__init__.py b/vendor-local/lib/python/django_extensions/admin/__init__.py deleted file mode 100644 index 7564ea65e38..00000000000 --- a/vendor-local/lib/python/django_extensions/admin/__init__.py +++ /dev/null @@ -1,145 +0,0 @@ -# -# Autocomplete feature for admin panel -# -# Most of the code has been written by Jannis Leidel and was updated a bit -# for django_extensions. -# http://jannisleidel.com/2008/11/autocomplete-form-widget-foreignkey-model-fields/ -# -# to_string_function, Satchmo adaptation and some comments added by emes -# (Michal Salaban) -# - -import six -import operator -from six.moves import reduce -from django.http import HttpResponse, HttpResponseNotFound -from django.db import models -from django.db.models.query import QuerySet -from django.utils.encoding import smart_str -from django.utils.translation import ugettext as _ -from django.utils.text import get_text_list -try: - from functools import update_wrapper - assert update_wrapper -except ImportError: - from django.utils.functional import update_wrapper - -from django_extensions.admin.widgets import ForeignKeySearchInput - -from django.conf import settings - -if 'reversion' in settings.INSTALLED_APPS: - from reversion.admin import VersionAdmin as ModelAdmin - assert ModelAdmin -else: - from django.contrib.admin import ModelAdmin - - -class ForeignKeyAutocompleteAdmin(ModelAdmin): - """Admin class for models using the autocomplete feature. - - There are two additional fields: - - related_search_fields: defines fields of managed model that - have to be represented by autocomplete input, together with - a list of target model fields that are searched for - input string, e.g.: - - related_search_fields = { - 'author': ('first_name', 'email'), - } - - - related_string_functions: contains optional functions which - take target model instance as only argument and return string - representation. By default __unicode__() method of target - object is used. - """ - - related_search_fields = {} - related_string_functions = {} - - def get_urls(self): - try: - from django.conf.urls import patterns, url - except ImportError: # django < 1.4 - from django.conf.urls.defaults import patterns, url - - def wrap(view): - def wrapper(*args, **kwargs): - return self.admin_site.admin_view(view)(*args, **kwargs) - return update_wrapper(wrapper, view) - - info = self.model._meta.app_label, self.model._meta.module_name - - urlpatterns = patterns('', url(r'foreignkey_autocomplete/$', wrap(self.foreignkey_autocomplete), name='%s_%s_autocomplete' % info)) - urlpatterns += super(ForeignKeyAutocompleteAdmin, self).get_urls() - return urlpatterns - - def foreignkey_autocomplete(self, request): - """ - Searches in the fields of the given related model and returns the - result as a simple string to be used by the jQuery Autocomplete plugin - """ - query = request.GET.get('q', None) - app_label = request.GET.get('app_label', None) - model_name = request.GET.get('model_name', None) - search_fields = request.GET.get('search_fields', None) - object_pk = request.GET.get('object_pk', None) - try: - to_string_function = self.related_string_functions[model_name] - except KeyError: - to_string_function = lambda x: x.__unicode__() - if search_fields and app_label and model_name and (query or object_pk): - def construct_search(field_name): - # use different lookup methods depending on the notation - if field_name.startswith('^'): - return "%s__istartswith" % field_name[1:] - elif field_name.startswith('='): - return "%s__iexact" % field_name[1:] - elif field_name.startswith('@'): - return "%s__search" % field_name[1:] - else: - return "%s__icontains" % field_name - model = models.get_model(app_label, model_name) - queryset = model._default_manager.all() - data = '' - if query: - for bit in query.split(): - or_queries = [models.Q(**{construct_search(smart_str(field_name)): smart_str(bit)}) for field_name in search_fields.split(',')] - other_qs = QuerySet(model) - other_qs.dup_select_related(queryset) - other_qs = other_qs.filter(reduce(operator.or_, or_queries)) - queryset = queryset & other_qs - data = ''.join([six.u('%s|%s\n' % (to_string_function(f), f.pk)) for f in queryset]) - elif object_pk: - try: - obj = queryset.get(pk=object_pk) - except: - pass - else: - data = to_string_function(obj) - return HttpResponse(data) - return HttpResponseNotFound() - - def get_help_text(self, field_name, model_name): - searchable_fields = self.related_search_fields.get(field_name, None) - if searchable_fields: - help_kwargs = { - 'model_name': model_name, - 'field_list': get_text_list(searchable_fields, _('and')), - } - return _('Use the left field to do %(model_name)s lookups in the fields %(field_list)s.') % help_kwargs - return '' - - def formfield_for_dbfield(self, db_field, **kwargs): - """ - Overrides the default widget for Foreignkey fields if they are - specified in the related_search_fields class attribute. - """ - if (isinstance(db_field, models.ForeignKey) and db_field.name in self.related_search_fields): - model_name = db_field.rel.to._meta.object_name - help_text = self.get_help_text(db_field.name, model_name) - if kwargs.get('help_text'): - help_text = six.u('%s %s' % (kwargs['help_text'], help_text)) - kwargs['widget'] = ForeignKeySearchInput(db_field.rel, self.related_search_fields[db_field.name]) - kwargs['help_text'] = help_text - return super(ForeignKeyAutocompleteAdmin, self).formfield_for_dbfield(db_field, **kwargs) diff --git a/vendor-local/lib/python/django_extensions/admin/widgets.py b/vendor-local/lib/python/django_extensions/admin/widgets.py deleted file mode 100644 index 6a2a4af9590..00000000000 --- a/vendor-local/lib/python/django_extensions/admin/widgets.py +++ /dev/null @@ -1,96 +0,0 @@ -import six -import django -from django import forms -from django.conf import settings -from django.contrib.admin.sites import site -from django.utils.safestring import mark_safe -if django.get_version() >= "1.4": - from django.utils.text import Truncator -else: - from django.utils.text import truncate_words -from django.template.loader import render_to_string -from django.contrib.admin.widgets import ForeignKeyRawIdWidget - - -class ForeignKeySearchInput(ForeignKeyRawIdWidget): - """ - A Widget for displaying ForeignKeys in an autocomplete search input - instead in a <select> box. - """ - # Set in subclass to render the widget with a different template - widget_template = None - # Set this to the patch of the search view - search_path = '../foreignkey_autocomplete/' - - def _media(self): - js_files = ['django_extensions/js/jquery.bgiframe.min.js', - 'django_extensions/js/jquery.ajaxQueue.js', - 'django_extensions/js/jquery.autocomplete.js'] - if django.get_version() < "1.3": - js_files.append('django_extensions/js/jquery.js') - return forms.Media(css={'all': ('django_extensions/css/jquery.autocomplete.css',)}, - js=js_files) - - media = property(_media) - - def label_for_value(self, value): - key = self.rel.get_related_field().name - obj = self.rel.to._default_manager.get(**{key: value}) - if django.get_version() >= "1.4": - return Truncator(obj).words(14, truncate='...') - else: - return truncate_words(obj, 14) - - def __init__(self, rel, search_fields, attrs=None): - self.search_fields = search_fields - if django.get_version() >= "1.4": - super(ForeignKeySearchInput, self).__init__(rel, site, attrs) - else: - super(ForeignKeySearchInput, self).__init__(rel, attrs) - - def render(self, name, value, attrs=None): - if attrs is None: - attrs = {} - #output = [super(ForeignKeySearchInput, self).render(name, value, attrs)] - opts = self.rel.to._meta - app_label = opts.app_label - model_name = opts.object_name.lower() - related_url = '../../../%s/%s/' % (app_label, model_name) - params = self.url_parameters() - if params: - url = '?' + '&'.join(['%s=%s' % (k, v) for k, v in params.items()]) - else: - url = '' - if not 'class' in attrs: - attrs['class'] = 'vForeignKeyRawIdAdminField' - # Call the TextInput render method directly to have more control - output = [forms.TextInput.render(self, name, value, attrs)] - if value: - label = self.label_for_value(value) - else: - label = six.u('') - - try: - admin_media_prefix = settings.ADMIN_MEDIA_PREFIX - except AttributeError: - admin_media_prefix = settings.STATIC_URL + "admin/" - - context = { - 'url': url, - 'related_url': related_url, - 'admin_media_prefix': admin_media_prefix, - 'search_path': self.search_path, - 'search_fields': ','.join(self.search_fields), - 'model_name': model_name, - 'app_label': app_label, - 'label': label, - 'name': name, - 'pre_django_14': (django.VERSION[:2] < (1, 4)), - } - output.append(render_to_string(self.widget_template or ( - 'django_extensions/widgets/%s/%s/foreignkey_searchinput.html' % (app_label, model_name), - 'django_extensions/widgets/%s/foreignkey_searchinput.html' % app_label, - 'django_extensions/widgets/foreignkey_searchinput.html', - ), context)) - output.reverse() - return mark_safe(six.u(''.join(output))) diff --git a/vendor-local/lib/python/django_extensions/conf/app_template/__init__.py.tmpl b/vendor-local/lib/python/django_extensions/conf/app_template/__init__.py.tmpl deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/conf/app_template/forms.py.tmpl b/vendor-local/lib/python/django_extensions/conf/app_template/forms.py.tmpl deleted file mode 100644 index 6b477f9e467..00000000000 --- a/vendor-local/lib/python/django_extensions/conf/app_template/forms.py.tmpl +++ /dev/null @@ -1,3 +0,0 @@ -from django import forms - -# place form definition here \ No newline at end of file diff --git a/vendor-local/lib/python/django_extensions/conf/app_template/models.py.tmpl b/vendor-local/lib/python/django_extensions/conf/app_template/models.py.tmpl deleted file mode 100644 index 71a83623907..00000000000 --- a/vendor-local/lib/python/django_extensions/conf/app_template/models.py.tmpl +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/vendor-local/lib/python/django_extensions/conf/app_template/urls.py.tmpl b/vendor-local/lib/python/django_extensions/conf/app_template/urls.py.tmpl deleted file mode 100644 index 96ef53f2cf4..00000000000 --- a/vendor-local/lib/python/django_extensions/conf/app_template/urls.py.tmpl +++ /dev/null @@ -1,6 +0,0 @@ -try: - from django.conf.urls import * -except ImportError: # django < 1.4 - from django.conf.urls.defaults import * - -# place app url patterns here diff --git a/vendor-local/lib/python/django_extensions/conf/app_template/views.py.tmpl b/vendor-local/lib/python/django_extensions/conf/app_template/views.py.tmpl deleted file mode 100644 index 60f00ef0ef3..00000000000 --- a/vendor-local/lib/python/django_extensions/conf/app_template/views.py.tmpl +++ /dev/null @@ -1 +0,0 @@ -# Create your views here. diff --git a/vendor-local/lib/python/django_extensions/conf/command_template/management/__init__.py.tmpl b/vendor-local/lib/python/django_extensions/conf/command_template/management/__init__.py.tmpl deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/conf/command_template/management/commands/__init__.py.tmpl b/vendor-local/lib/python/django_extensions/conf/command_template/management/commands/__init__.py.tmpl deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/conf/command_template/management/commands/sample.py.tmpl b/vendor-local/lib/python/django_extensions/conf/command_template/management/commands/sample.py.tmpl deleted file mode 100644 index eb9df1b9a15..00000000000 --- a/vendor-local/lib/python/django_extensions/conf/command_template/management/commands/sample.py.tmpl +++ /dev/null @@ -1,7 +0,0 @@ -from django.core.management.base import {{ base_command }} - -class Command({{ base_command }}): - help = "My shiny new management command." - - def {{ handle_method }}: - raise NotImplementedError() \ No newline at end of file diff --git a/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/__init__.py.tmpl b/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/__init__.py.tmpl deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/daily/__init__.py.tmpl b/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/daily/__init__.py.tmpl deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/hourly/__init__.py.tmpl b/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/hourly/__init__.py.tmpl deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/monthly/__init__.py.tmpl b/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/monthly/__init__.py.tmpl deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/sample.py.tmpl b/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/sample.py.tmpl deleted file mode 100644 index 1a1517986c5..00000000000 --- a/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/sample.py.tmpl +++ /dev/null @@ -1,8 +0,0 @@ -from django_extensions.management.jobs import BaseJob - -class Job(BaseJob): - help = "My sample job." - - def execute(self): - # executing empty sample job - pass diff --git a/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/weekly/__init__.py.tmpl b/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/weekly/__init__.py.tmpl deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/yearly/__init__.py.tmpl b/vendor-local/lib/python/django_extensions/conf/jobs_template/jobs/yearly/__init__.py.tmpl deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/db/__init__.py b/vendor-local/lib/python/django_extensions/db/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/db/fields/__init__.py b/vendor-local/lib/python/django_extensions/db/fields/__init__.py deleted file mode 100644 index 337ddd2c272..00000000000 --- a/vendor-local/lib/python/django_extensions/db/fields/__init__.py +++ /dev/null @@ -1,287 +0,0 @@ -""" -Django Extensions additional model fields -""" -import re -import six -try: - import uuid - HAS_UUID = True -except ImportError: - HAS_UUID = False - -from django.core.exceptions import ImproperlyConfigured -from django.template.defaultfilters import slugify -from django.db.models import DateTimeField, CharField, SlugField - -try: - from django.utils.timezone import now as datetime_now - assert datetime_now -except ImportError: - import datetime - datetime_now = datetime.datetime.now - -try: - from django.utils.encoding import force_unicode # NOQA -except ImportError: - from django.utils.encoding import force_text as force_unicode # NOQA - - -class AutoSlugField(SlugField): - """ AutoSlugField - - By default, sets editable=False, blank=True. - - Required arguments: - - populate_from - Specifies which field or list of fields the slug is populated from. - - Optional arguments: - - separator - Defines the used separator (default: '-') - - overwrite - If set to True, overwrites the slug on every save (default: False) - - Inspired by SmileyChris' Unique Slugify snippet: - http://www.djangosnippets.org/snippets/690/ - """ - def __init__(self, *args, **kwargs): - kwargs.setdefault('blank', True) - kwargs.setdefault('editable', False) - - populate_from = kwargs.pop('populate_from', None) - if populate_from is None: - raise ValueError("missing 'populate_from' argument") - else: - self._populate_from = populate_from - self.separator = kwargs.pop('separator', six.u('-')) - self.overwrite = kwargs.pop('overwrite', False) - self.allow_duplicates = kwargs.pop('allow_duplicates', False) - super(AutoSlugField, self).__init__(*args, **kwargs) - - def _slug_strip(self, value): - """ - Cleans up a slug by removing slug separator characters that occur at - the beginning or end of a slug. - - If an alternate separator is used, it will also replace any instances - of the default '-' separator with the new separator. - """ - re_sep = '(?:-|%s)' % re.escape(self.separator) - value = re.sub('%s+' % re_sep, self.separator, value) - return re.sub(r'^%s+|%s+$' % (re_sep, re_sep), '', value) - - def get_queryset(self, model_cls, slug_field): - for field, model in model_cls._meta.get_fields_with_model(): - if model and field == slug_field: - return model._default_manager.all() - return model_cls._default_manager.all() - - def slugify_func(self, content): - if content: - return slugify(content) - return '' - - def create_slug(self, model_instance, add): - # get fields to populate from and slug field to set - if not isinstance(self._populate_from, (list, tuple)): - self._populate_from = (self._populate_from, ) - slug_field = model_instance._meta.get_field(self.attname) - - if add or self.overwrite: - # slugify the original field content and set next step to 2 - slug_for_field = lambda field: self.slugify_func(getattr(model_instance, field)) - slug = self.separator.join(map(slug_for_field, self._populate_from)) - next = 2 - else: - # get slug from the current model instance - slug = getattr(model_instance, self.attname) - # model_instance is being modified, and overwrite is False, - # so instead of doing anything, just return the current slug - return slug - - # strip slug depending on max_length attribute of the slug field - # and clean-up - slug_len = slug_field.max_length - if slug_len: - slug = slug[:slug_len] - slug = self._slug_strip(slug) - original_slug = slug - - if self.allow_duplicates: - return slug - - # exclude the current model instance from the queryset used in finding - # the next valid slug - queryset = self.get_queryset(model_instance.__class__, slug_field) - if model_instance.pk: - queryset = queryset.exclude(pk=model_instance.pk) - - # form a kwarg dict used to impliment any unique_together contraints - kwargs = {} - for params in model_instance._meta.unique_together: - if self.attname in params: - for param in params: - kwargs[param] = getattr(model_instance, param, None) - kwargs[self.attname] = slug - - # increases the number while searching for the next valid slug - # depending on the given slug, clean-up - while not slug or queryset.filter(**kwargs): - slug = original_slug - end = '%s%s' % (self.separator, next) - end_len = len(end) - if slug_len and len(slug) + end_len > slug_len: - slug = slug[:slug_len - end_len] - slug = self._slug_strip(slug) - slug = '%s%s' % (slug, end) - kwargs[self.attname] = slug - next += 1 - return slug - - def pre_save(self, model_instance, add): - value = force_unicode(self.create_slug(model_instance, add)) - setattr(model_instance, self.attname, value) - return value - - def get_internal_type(self): - return "SlugField" - - def south_field_triple(self): - "Returns a suitable description of this field for South." - # We'll just introspect the _actual_ field. - from south.modelsinspector import introspector - field_class = '%s.AutoSlugField' % self.__module__ - args, kwargs = introspector(self) - kwargs.update({ - 'populate_from': repr(self._populate_from), - 'separator': repr(self.separator), - 'overwrite': repr(self.overwrite), - 'allow_duplicates': repr(self.allow_duplicates), - }) - # That's our definition! - return (field_class, args, kwargs) - - -class CreationDateTimeField(DateTimeField): - """ CreationDateTimeField - - By default, sets editable=False, blank=True, default=datetime.now - """ - - def __init__(self, *args, **kwargs): - kwargs.setdefault('editable', False) - kwargs.setdefault('blank', True) - kwargs.setdefault('default', datetime_now) - DateTimeField.__init__(self, *args, **kwargs) - - def get_internal_type(self): - return "DateTimeField" - - def south_field_triple(self): - "Returns a suitable description of this field for South." - # We'll just introspect ourselves, since we inherit. - from south.modelsinspector import introspector - field_class = "django.db.models.fields.DateTimeField" - args, kwargs = introspector(self) - return (field_class, args, kwargs) - - -class ModificationDateTimeField(CreationDateTimeField): - """ ModificationDateTimeField - - By default, sets editable=False, blank=True, default=datetime.now - - Sets value to datetime.now() on each save of the model. - """ - - def pre_save(self, model, add): - value = datetime_now() - setattr(model, self.attname, value) - return value - - def get_internal_type(self): - return "DateTimeField" - - def south_field_triple(self): - "Returns a suitable description of this field for South." - # We'll just introspect ourselves, since we inherit. - from south.modelsinspector import introspector - field_class = "django.db.models.fields.DateTimeField" - args, kwargs = introspector(self) - return (field_class, args, kwargs) - - -class UUIDVersionError(Exception): - pass - - -class UUIDField(CharField): - """ UUIDField - - By default uses UUID version 4 (randomly generated UUID). - - The field support all uuid versions which are natively supported by the uuid python module, except version 2. - For more information see: http://docs.python.org/lib/module-uuid.html - """ - - def __init__(self, verbose_name=None, name=None, auto=True, version=4, node=None, clock_seq=None, namespace=None, **kwargs): - if not HAS_UUID: - raise ImproperlyConfigured("'uuid' module is required for UUIDField. (Do you have Python 2.5 or higher installed ?)") - kwargs.setdefault('max_length', 36) - if auto: - self.empty_strings_allowed = False - kwargs['blank'] = True - kwargs.setdefault('editable', False) - self.auto = auto - self.version = version - if version == 1: - self.node, self.clock_seq = node, clock_seq - elif version == 3 or version == 5: - self.namespace, self.name = namespace, name - CharField.__init__(self, verbose_name, name, **kwargs) - - def get_internal_type(self): - return CharField.__name__ - - def create_uuid(self): - if not self.version or self.version == 4: - return uuid.uuid4() - elif self.version == 1: - return uuid.uuid1(self.node, self.clock_seq) - elif self.version == 2: - raise UUIDVersionError("UUID version 2 is not supported.") - elif self.version == 3: - return uuid.uuid3(self.namespace, self.name) - elif self.version == 5: - return uuid.uuid5(self.namespace, self.name) - else: - raise UUIDVersionError("UUID version %s is not valid." % self.version) - - def pre_save(self, model_instance, add): - value = super(UUIDField, self).pre_save(model_instance, add) - if self.auto and add and value is None: - value = force_unicode(self.create_uuid()) - setattr(model_instance, self.attname, value) - return value - else: - if self.auto and not value: - value = force_unicode(self.create_uuid()) - setattr(model_instance, self.attname, value) - return value - - def formfield(self, **kwargs): - if self.auto: - return None - return super(UUIDField, self).formfield(**kwargs) - - def south_field_triple(self): - "Returns a suitable description of this field for South." - # We'll just introspect the _actual_ field. - from south.modelsinspector import introspector - field_class = "django.db.models.fields.CharField" - args, kwargs = introspector(self) - # That's our definition! - return (field_class, args, kwargs) diff --git a/vendor-local/lib/python/django_extensions/db/fields/encrypted.py b/vendor-local/lib/python/django_extensions/db/fields/encrypted.py deleted file mode 100644 index f897598a96a..00000000000 --- a/vendor-local/lib/python/django_extensions/db/fields/encrypted.py +++ /dev/null @@ -1,136 +0,0 @@ -import six -from django.db import models -from django.core.exceptions import ImproperlyConfigured -from django import forms -from django.conf import settings -import warnings - -try: - from keyczar import keyczar -except ImportError: - raise ImportError('Using an encrypted field requires the Keyczar module. ' - 'You can obtain Keyczar from http://www.keyczar.org/.') - - -class EncryptionWarning(RuntimeWarning): - pass - - -class BaseEncryptedField(models.Field): - prefix = 'enc_str:::' - - def __init__(self, *args, **kwargs): - if not hasattr(settings, 'ENCRYPTED_FIELD_KEYS_DIR'): - raise ImproperlyConfigured('You must set the ENCRYPTED_FIELD_KEYS_DIR ' - 'setting to your Keyczar keys directory.') - - crypt_class = self.get_crypt_class() - self.crypt = crypt_class.Read(settings.ENCRYPTED_FIELD_KEYS_DIR) - - # Encrypted size is larger than unencrypted - self.unencrypted_length = max_length = kwargs.get('max_length', None) - if max_length: - max_length = len(self.prefix) + len(self.crypt.Encrypt('x' * max_length)) - # TODO: Re-examine if this logic will actually make a large-enough - # max-length for unicode strings that have non-ascii characters in them. - kwargs['max_length'] = max_length - - super(BaseEncryptedField, self).__init__(*args, **kwargs) - - def get_crypt_class(self): - """ - Get the Keyczar class to use. - - The class can be customized with the ENCRYPTED_FIELD_MODE setting. By default, - this setting is DECRYPT_AND_ENCRYPT. Set this to ENCRYPT to disable decryption. - This is necessary if you are only providing public keys to Keyczar. - - Returns: - keyczar.Encrypter if ENCRYPTED_FIELD_MODE is ENCRYPT. - keyczar.Crypter if ENCRYPTED_FIELD_MODE is DECRYPT_AND_ENCRYPT. - - Override this method to customize the type of Keyczar class returned. - """ - - crypt_type = getattr(settings, 'ENCRYPTED_FIELD_MODE', 'DECRYPT_AND_ENCRYPT') - if crypt_type == 'ENCRYPT': - crypt_class_name = 'Encrypter' - elif crypt_type == 'DECRYPT_AND_ENCRYPT': - crypt_class_name = 'Crypter' - else: - raise ImproperlyConfigured( - 'ENCRYPTED_FIELD_MODE must be either DECRYPT_AND_ENCRYPT ' - 'or ENCRYPT, not %s.' % crypt_type) - return getattr(keyczar, crypt_class_name) - - def to_python(self, value): - if isinstance(self.crypt.primary_key, keyczar.keys.RsaPublicKey): - retval = value - elif value and (value.startswith(self.prefix)): - retval = self.crypt.Decrypt(value[len(self.prefix):]) - if retval: - retval = retval.decode('utf-8') - else: - retval = value - return retval - - def get_db_prep_value(self, value, connection, prepared=False): - if value and not value.startswith(self.prefix): - # We need to encode a unicode string into a byte string, first. - # keyczar expects a bytestring, not a unicode string. - if type(value) == six.types.UnicodeType: - value = value.encode('utf-8') - # Truncated encrypted content is unreadable, - # so truncate before encryption - max_length = self.unencrypted_length - if max_length and len(value) > max_length: - warnings.warn("Truncating field %s from %d to %d bytes" % ( - self.name, len(value), max_length), EncryptionWarning - ) - value = value[:max_length] - - value = self.prefix + self.crypt.Encrypt(value) - return value - - -class EncryptedTextField(six.with_metaclass(models.SubfieldBase, - BaseEncryptedField)): - def get_internal_type(self): - return 'TextField' - - def formfield(self, **kwargs): - defaults = {'widget': forms.Textarea} - defaults.update(kwargs) - return super(EncryptedTextField, self).formfield(**defaults) - - def south_field_triple(self): - "Returns a suitable description of this field for South." - # We'll just introspect the _actual_ field. - from south.modelsinspector import introspector - field_class = "django.db.models.fields.TextField" - args, kwargs = introspector(self) - # That's our definition! - return (field_class, args, kwargs) - - -class EncryptedCharField(six.with_metaclass(models.SubfieldBase, - BaseEncryptedField)): - def __init__(self, *args, **kwargs): - super(EncryptedCharField, self).__init__(*args, **kwargs) - - def get_internal_type(self): - return "CharField" - - def formfield(self, **kwargs): - defaults = {'max_length': self.max_length} - defaults.update(kwargs) - return super(EncryptedCharField, self).formfield(**defaults) - - def south_field_triple(self): - "Returns a suitable description of this field for South." - # We'll just introspect the _actual_ field. - from south.modelsinspector import introspector - field_class = "django.db.models.fields.CharField" - args, kwargs = introspector(self) - # That's our definition! - return (field_class, args, kwargs) diff --git a/vendor-local/lib/python/django_extensions/db/fields/json.py b/vendor-local/lib/python/django_extensions/db/fields/json.py deleted file mode 100644 index 51d5b1dd520..00000000000 --- a/vendor-local/lib/python/django_extensions/db/fields/json.py +++ /dev/null @@ -1,102 +0,0 @@ -""" -JSONField automatically serializes most Python terms to JSON data. -Creates a TEXT field with a default value of "{}". See test_json.py for -more information. - - from django.db import models - from django_extensions.db.fields import json - - class LOL(models.Model): - extra = json.JSONField() -""" - -import six -import datetime -from decimal import Decimal -from django.db import models -from django.conf import settings -from django.utils import simplejson - - -class JSONEncoder(simplejson.JSONEncoder): - def default(self, obj): - if isinstance(obj, Decimal): - return str(obj) - elif isinstance(obj, datetime.datetime): - assert settings.TIME_ZONE == 'UTC' - return obj.strftime('%Y-%m-%dT%H:%M:%SZ') - return simplejson.JSONEncoder.default(self, obj) - - -def dumps(value): - return JSONEncoder().encode(value) - - -def loads(txt): - value = simplejson.loads( - txt, - parse_float=Decimal, - encoding=settings.DEFAULT_CHARSET - ) - return value - - -class JSONDict(dict): - """ - Hack so repr() called by dumpdata will output JSON instead of - Python formatted data. This way fixtures will work! - """ - def __repr__(self): - return dumps(self) - - -class JSONList(list): - """ - As above - """ - def __repr__(self): - return dumps(self) - - -class JSONField(six.with_metaclass(models.SubfieldBase, models.TextField)): - """JSONField is a generic textfield that neatly serializes/unserializes - JSON objects seamlessly. Main thingy must be a dict object.""" - - def __init__(self, *args, **kwargs): - default = kwargs.get('default', None) - if default is None: - kwargs['default'] = '{}' - elif isinstance(default, (list, dict)): - kwargs['default'] = dumps(default) - models.TextField.__init__(self, *args, **kwargs) - - def to_python(self, value): - """Convert our string value to JSON after we load it from the DB""" - if value is None or value == '': - return {} - elif isinstance(value, six.string_types): - res = loads(value) - if isinstance(res, dict): - return JSONDict(**res) - else: - return JSONList(res) - - else: - return value - - def get_db_prep_save(self, value, connection): - """Convert our JSON object to a string before we save""" - if not isinstance(value, (list, dict)): - return super(JSONField, self).get_db_prep_save("", connection=connection) - else: - return super(JSONField, self).get_db_prep_save(dumps(value), - connection=connection) - - def south_field_triple(self): - "Returns a suitable description of this field for South." - # We'll just introspect the _actual_ field. - from south.modelsinspector import introspector - field_class = "django.db.models.fields.TextField" - args, kwargs = introspector(self) - # That's our definition! - return (field_class, args, kwargs) diff --git a/vendor-local/lib/python/django_extensions/db/models.py b/vendor-local/lib/python/django_extensions/db/models.py deleted file mode 100644 index 6f21b098aeb..00000000000 --- a/vendor-local/lib/python/django_extensions/db/models.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -Django Extensions abstract base model classes. -""" -from django.db import models -from django.utils.translation import ugettext_lazy as _ -from django_extensions.db.fields import (ModificationDateTimeField, - CreationDateTimeField, AutoSlugField) - -try: - from django.utils.timezone import now as datetime_now - assert datetime_now -except ImportError: - import datetime - datetime_now = datetime.datetime.now - - -class TimeStampedModel(models.Model): - """ TimeStampedModel - An abstract base class model that provides self-managed "created" and - "modified" fields. - """ - created = CreationDateTimeField(_('created')) - modified = ModificationDateTimeField(_('modified')) - - class Meta: - get_latest_by = 'modified' - ordering = ('-modified', '-created',) - abstract = True - - -class TitleSlugDescriptionModel(models.Model): - """ TitleSlugDescriptionModel - An abstract base class model that provides title and description fields - and a self-managed "slug" field that populates from the title. - """ - title = models.CharField(_('title'), max_length=255) - slug = AutoSlugField(_('slug'), populate_from='title') - description = models.TextField(_('description'), blank=True, null=True) - - class Meta: - abstract = True - - -class ActivatorModelManager(models.Manager): - """ ActivatorModelManager - Manager to return instances of ActivatorModel: SomeModel.objects.active() / .inactive() - """ - def active(self): - """ Returns active instances of ActivatorModel: SomeModel.objects.active() """ - return self.get_query_set().filter(status=ActivatorModel.ACTIVE_STATUS) - - def inactive(self): - """ Returns inactive instances of ActivatorModel: SomeModel.objects.inactive() """ - return self.get_query_set().filter(status=ActivatorModel.INACTIVE_STATUS) - - -class ActivatorModel(models.Model): - """ ActivatorModel - An abstract base class model that provides activate and deactivate fields. - """ - INACTIVE_STATUS, ACTIVE_STATUS = range(2) - STATUS_CHOICES = ( - (INACTIVE_STATUS, _('Inactive')), - (ACTIVE_STATUS, _('Active')), - ) - status = models.IntegerField(_('status'), choices=STATUS_CHOICES, default=ACTIVE_STATUS) - activate_date = models.DateTimeField(blank=True, null=True, help_text=_('keep empty for an immediate activation')) - deactivate_date = models.DateTimeField(blank=True, null=True, help_text=_('keep empty for indefinite activation')) - objects = ActivatorModelManager() - - class Meta: - ordering = ('status', '-activate_date',) - abstract = True - - def save(self, *args, **kwargs): - if not self.activate_date: - self.activate_date = datetime_now() - super(ActivatorModel, self).save(*args, **kwargs) diff --git a/vendor-local/lib/python/django_extensions/future_1_5.py b/vendor-local/lib/python/django_extensions/future_1_5.py deleted file mode 100644 index d7144ca3835..00000000000 --- a/vendor-local/lib/python/django_extensions/future_1_5.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -A forwards compatibility module. - -Implements some features of Django 1.5 related to the 'Custom User Model' feature -when the application is run with a lower version of Django. -""" -from __future__ import unicode_literals - -from django.contrib.auth.models import User - -User.USERNAME_FIELD = "username" -User.get_username = lambda self: self.username - - -def get_user_model(): - return User diff --git a/vendor-local/lib/python/django_extensions/jobs/__init__.py b/vendor-local/lib/python/django_extensions/jobs/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/jobs/daily/__init__.py b/vendor-local/lib/python/django_extensions/jobs/daily/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/jobs/daily/cache_cleanup.py b/vendor-local/lib/python/django_extensions/jobs/daily/cache_cleanup.py deleted file mode 100644 index 2faac9f7945..00000000000 --- a/vendor-local/lib/python/django_extensions/jobs/daily/cache_cleanup.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -Daily cleanup job. - -Can be run as a cronjob to clean out old data from the database (only expired -sessions at the moment). -""" - -from django_extensions.management.jobs import DailyJob - - -class Job(DailyJob): - help = "Cache (db) cleanup Job" - - def execute(self): - from django.conf import settings - from django.db import transaction - import os - - try: - from django.utils import timezone - except ImportError: - timezone = None - - if hasattr(settings, 'CACHES') and timezone: - from django.core.cache import get_cache - from django.db import router, connections - - for cache_name, cache_options in settings.CACHES.iteritems(): - if cache_options['BACKEND'].endswith("DatabaseCache"): - cache = get_cache(cache_name) - db = router.db_for_write(cache.cache_model_class) - cursor = connections[db].cursor() - now = timezone.now() - cache._cull(db, cursor, now) - transaction.commit_unless_managed(using=db) - return - - if hasattr(settings, 'CACHE_BACKEND'): - if settings.CACHE_BACKEND.startswith('db://'): - from django.db import connection - os.environ['TZ'] = settings.TIME_ZONE - table_name = settings.CACHE_BACKEND[5:] - cursor = connection.cursor() - cursor.execute( - "DELETE FROM %s WHERE %s < current_timestamp;" % ( - connection.ops.quote_name(table_name), - connection.ops.quote_name('expires') - ) - ) - transaction.commit_unless_managed() diff --git a/vendor-local/lib/python/django_extensions/jobs/daily/daily_cleanup.py b/vendor-local/lib/python/django_extensions/jobs/daily/daily_cleanup.py deleted file mode 100644 index 8e7172cd5cd..00000000000 --- a/vendor-local/lib/python/django_extensions/jobs/daily/daily_cleanup.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -Daily cleanup job. - -Can be run as a cronjob to clean out old data from the database (only expired -sessions at the moment). -""" - -from django_extensions.management.jobs import DailyJob - - -class Job(DailyJob): - help = "Django Daily Cleanup Job" - - def execute(self): - from django.core import management - management.call_command("cleanup") diff --git a/vendor-local/lib/python/django_extensions/jobs/hourly/__init__.py b/vendor-local/lib/python/django_extensions/jobs/hourly/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/jobs/monthly/__init__.py b/vendor-local/lib/python/django_extensions/jobs/monthly/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/jobs/weekly/__init__.py b/vendor-local/lib/python/django_extensions/jobs/weekly/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/jobs/yearly/__init__.py b/vendor-local/lib/python/django_extensions/jobs/yearly/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/management/__init__.py b/vendor-local/lib/python/django_extensions/management/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/management/base.py b/vendor-local/lib/python/django_extensions/management/base.py deleted file mode 100644 index 6da68b234c6..00000000000 --- a/vendor-local/lib/python/django_extensions/management/base.py +++ /dev/null @@ -1,53 +0,0 @@ -import sys - -from django.core.management.base import BaseCommand -from django.utils.log import getLogger - - -logger = getLogger('django.commands') - - -class LoggingBaseCommand(BaseCommand): - """ - A subclass of BaseCommand that logs run time errors to `django.commands`. - To use this, create a management command subclassing LoggingBaseCommand: - - from django_extensions.management.base import LoggingBaseCommand - - class Command(LoggingBaseCommand): - help = 'Test error' - - def handle(self, *args, **options): - raise Exception - - - And then define a logging handler in settings.py: - - LOGGING = { - ... # Other stuff here - - 'handlers': { - 'mail_admins': { - 'level': 'ERROR', - 'filters': ['require_debug_false'], - 'class': 'django.utils.log.AdminEmailHandler' - }, - }, - 'loggers': { - 'django.commands': { - 'handlers': ['mail_admins'], - 'level': 'ERROR', - 'propagate': False, - }, - } - - } - - """ - - def execute(self, *args, **options): - try: - super(LoggingBaseCommand, self).execute(*args, **options) - except Exception as e: - logger.error(e, exc_info=sys.exc_info(), extra={'status_code': 500}) - raise diff --git a/vendor-local/lib/python/django_extensions/management/color.py b/vendor-local/lib/python/django_extensions/management/color.py deleted file mode 100644 index 99fead35174..00000000000 --- a/vendor-local/lib/python/django_extensions/management/color.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -Sets up the terminal color scheme. -""" - -from django.core.management import color -from django.utils import termcolors - - -def color_style(): - style = color.color_style() - if color.supports_color(): - style.URL = termcolors.make_style(fg='green', opts=('bold',)) - style.MODULE = termcolors.make_style(fg='yellow') - style.MODULE_NAME = termcolors.make_style(opts=('bold',)) - style.URL_NAME = termcolors.make_style(fg='red') - return style diff --git a/vendor-local/lib/python/django_extensions/management/commands/__init__.py b/vendor-local/lib/python/django_extensions/management/commands/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/management/commands/clean_pyc.py b/vendor-local/lib/python/django_extensions/management/commands/clean_pyc.py deleted file mode 100644 index f9625da2183..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/clean_pyc.py +++ /dev/null @@ -1,44 +0,0 @@ -from django.core.management.base import NoArgsCommand -from django_extensions.management.utils import get_project_root -from optparse import make_option -from os.path import join as _j -import os - - -class Command(NoArgsCommand): - option_list = NoArgsCommand.option_list + ( - make_option('--optimize', '-o', '-O', action='store_true', dest='optimize', - help='Remove optimized python bytecode files'), - make_option('--path', '-p', action='store', dest='path', - help='Specify path to recurse into'), - ) - help = "Removes all python bytecode compiled files from the project." - - requires_model_validation = False - - def handle_noargs(self, **options): - project_root = options.get("path", None) - if not project_root: - project_root = get_project_root() - exts = options.get("optimize", False) and [".pyc", ".pyo"] or [".pyc"] - verbose = int(options.get("verbosity", 1)) - - if verbose > 1: - print("Project Root: %s" % project_root) - - for root, dirs, files in os.walk(project_root): - for file in files: - ext = os.path.splitext(file)[1] - if ext in exts: - full_path = _j(root, file) - if verbose > 1: - print(full_path) - os.remove(full_path) - -# Backwards compatibility for Django r9110 -if not [opt for opt in Command.option_list if opt.dest == 'verbosity']: - Command.option_list += ( - make_option('--verbosity', '-v', action="store", dest="verbosity", - default='1', type='choice', choices=['0', '1', '2'], - help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), - ) diff --git a/vendor-local/lib/python/django_extensions/management/commands/compile_pyc.py b/vendor-local/lib/python/django_extensions/management/commands/compile_pyc.py deleted file mode 100644 index 2d75772932c..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/compile_pyc.py +++ /dev/null @@ -1,38 +0,0 @@ -from django.core.management.base import NoArgsCommand -from django_extensions.management.utils import get_project_root -from optparse import make_option -from os.path import join as _j -import py_compile -import os - - -class Command(NoArgsCommand): - option_list = NoArgsCommand.option_list + ( - make_option('--path', '-p', action='store', dest='path', help='Specify path to recurse into'), - ) - help = "Compile python bytecode files for the project." - - requires_model_validation = False - - def handle_noargs(self, **options): - project_root = options.get("path", None) - if not project_root: - project_root = get_project_root() - verbose = int(options.get("verbosity", 1)) > 1 - - for root, dirs, files in os.walk(project_root): - for file in files: - ext = os.path.splitext(file)[1] - if ext == ".py": - full_path = _j(root, file) - if verbose: - print("%sc" % full_path) - py_compile.compile(full_path) - -# Backwards compatibility for Django r9110 -if not [opt for opt in Command.option_list if opt.dest == 'verbosity']: - Command.option_list += ( - make_option('--verbosity', '-v', action="store", dest="verbosity", - default='1', type='choice', choices=['0', '1', '2'], - help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), - ) diff --git a/vendor-local/lib/python/django_extensions/management/commands/create_app.py b/vendor-local/lib/python/django_extensions/management/commands/create_app.py deleted file mode 100644 index a27913c86a4..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/create_app.py +++ /dev/null @@ -1,138 +0,0 @@ -import os -import re -import sys -import django_extensions -from django.conf import settings -from django.db import connection -from django.core.management.base import CommandError, LabelCommand -from django.template import Template, Context -from django_extensions.settings import REPLACEMENTS -from django_extensions.utils.dia2django import dia2django -from django_extensions.management.utils import _make_writeable -from optparse import make_option - - -class Command(LabelCommand): - option_list = LabelCommand.option_list + ( - make_option('--template', '-t', action='store', dest='app_template', - help='The path to the app template'), - make_option('--parent_path', '-p', action='store', dest='parent_path', - help='The parent path of the application to be created'), - make_option('-d', action='store_true', dest='dia_parse', - help='Generate model.py and admin.py from [APP_NAME].dia file'), - make_option('--diagram', action='store', dest='dia_path', - help='The diagram path of the app to be created. -d is implied'), - ) - - help = ("Creates an application directory structure for the specified application name.") - args = "APP_NAME" - label = 'application name' - - requires_model_validation = False - can_import_settings = True - - def handle_label(self, label, **options): - project_dir = os.getcwd() - project_name = os.path.split(project_dir)[-1] - app_name = label - app_template = options.get('app_template') or os.path.join(django_extensions.__path__[0], 'conf', 'app_template') - app_dir = os.path.join(options.get('parent_path') or project_dir, app_name) - dia_path = options.get('dia_path') or os.path.join(project_dir, '%s.dia' % app_name) - - if not os.path.exists(app_template): - raise CommandError("The template path, %r, does not exist." % app_template) - - if not re.search(r'^\w+$', label): - raise CommandError("%r is not a valid application name. Please use only numbers, letters and underscores." % label) - - dia_parse = options.get('dia_path') or options.get('dia_parse') - if dia_parse: - if not os.path.exists(dia_path): - raise CommandError("The diagram path, %r, does not exist." % dia_path) - if app_name in settings.INSTALLED_APPS: - raise CommandError("The application %s should not be defined in the settings file. Please remove %s now, and add it after using this command." % (app_name, app_name)) - tables = [name for name in connection.introspection.table_names() if name.startswith('%s_' % app_name)] - if tables: - raise CommandError("%r application has tables in the database. Please delete them." % app_name) - - try: - os.makedirs(app_dir) - except OSError as e: - raise CommandError(e) - - copy_template(app_template, app_dir, project_name, app_name) - - if dia_parse: - generate_models_and_admin(dia_path, app_dir, project_name, app_name) - print("Application %r created." % app_name) - print("Please add now %r and any other dependent application in settings.INSTALLED_APPS, and run 'manage syncdb'" % app_name) - - -def copy_template(app_template, copy_to, project_name, app_name): - """copies the specified template directory to the copy_to location""" - import shutil - - app_template = os.path.normpath(app_template) - # walks the template structure and copies it - for d, subdirs, files in os.walk(app_template): - relative_dir = d[len(app_template) + 1:] - d_new = os.path.join(copy_to, relative_dir).replace('app_name', app_name) - if relative_dir and not os.path.exists(d_new): - os.mkdir(d_new) - for i, subdir in enumerate(subdirs): - if subdir.startswith('.'): - del subdirs[i] - replacements = {'app_name': app_name, 'project_name': project_name} - replacements.update(REPLACEMENTS) - for f in files: - if f.endswith('.pyc') or f.startswith('.DS_Store'): - continue - path_old = os.path.join(d, f) - path_new = os.path.join(d_new, f.replace('app_name', app_name)) - if os.path.exists(path_new): - path_new = os.path.join(d_new, f) - if os.path.exists(path_new): - continue - if path_new.endswith('.tmpl'): - path_new = path_new[:-5] - fp_old = open(path_old, 'r') - fp_new = open(path_new, 'w') - fp_new.write(Template(fp_old.read()).render(Context(replacements))) - fp_old.close() - fp_new.close() - try: - shutil.copymode(path_old, path_new) - _make_writeable(path_new) - except OSError: - sys.stderr.write("Notice: Couldn't set permission bits on %s. You're probably using an uncommon filesystem setup. No problem.\n" % path_new) - - -def generate_models_and_admin(dia_path, app_dir, project_name, app_name): - """Generates the models.py and admin.py files""" - - def format_text(string, indent=False): - """format string in lines of 80 or less characters""" - retval = '' - while string: - line = string[:77] - last_space = line.rfind(' ') - if last_space != -1 and len(string) > 77: - retval += "%s \\\n" % string[:last_space] - string = string[last_space + 1:] - else: - retval += "%s\n" % string - string = '' - if string and indent: - string = ' %s' % string - return retval - - model_path = os.path.join(app_dir, 'models.py') - admin_path = os.path.join(app_dir, 'admin.py') - - models_txt = 'from django.db import models\n' + dia2django(dia_path) - open(model_path, 'w').write(models_txt) - - classes = re.findall('class (\w+)', models_txt) - admin_txt = 'from django.contrib.admin import site, ModelAdmin\n' + format_text('from %s.%s.models import %s' % (project_name, app_name, ', '.join(classes)), indent=True) - admin_txt += format_text('\n\n%s' % '\n'.join(map((lambda t: 'site.register(%s)' % t), classes))) - open(admin_path, 'w').write(admin_txt) diff --git a/vendor-local/lib/python/django_extensions/management/commands/create_command.py b/vendor-local/lib/python/django_extensions/management/commands/create_command.py deleted file mode 100644 index 8b4b21aa930..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/create_command.py +++ /dev/null @@ -1,81 +0,0 @@ -import os -import sys -from django.core.management.base import CommandError, AppCommand -from django_extensions.management.utils import _make_writeable -from optparse import make_option - - -class Command(AppCommand): - option_list = AppCommand.option_list + ( - make_option('--name', '-n', action='store', dest='command_name', default='sample', - help='The name to use for the management command'), - make_option('--base', '-b', action='store', dest='base_command', default='Base', - help='The base class used for implementation of this command. Should be one of Base, App, Label, or NoArgs'), - ) - - help = ("Creates a Django management command directory structure for the given app name" - " in the current directory.") - args = "[appname]" - label = 'application name' - - requires_model_validation = False - # Can't import settings during this command, because they haven't - # necessarily been created. - can_import_settings = True - - def handle_app(self, app, **options): - directory = os.getcwd() - app_name = app.__name__.split('.')[-2] - project_dir = os.path.join(directory, app_name) - if not os.path.exists(project_dir): - try: - os.mkdir(project_dir) - except OSError as e: - raise CommandError(e) - - copy_template('command_template', project_dir, options.get('command_name'), '%sCommand' % options.get('base_command')) - - -def copy_template(template_name, copy_to, command_name, base_command): - """copies the specified template directory to the copy_to location""" - import django_extensions - import shutil - - template_dir = os.path.join(django_extensions.__path__[0], 'conf', template_name) - - handle_method = "handle(self, *args, **options)" - if base_command == 'AppCommand': - handle_method = "handle_app(self, app, **options)" - elif base_command == 'LabelCommand': - handle_method = "handle_label(self, label, **options)" - elif base_command == 'NoArgsCommand': - handle_method = "handle_noargs(self, **options)" - - # walks the template structure and copies it - for d, subdirs, files in os.walk(template_dir): - relative_dir = d[len(template_dir) + 1:] - if relative_dir and not os.path.exists(os.path.join(copy_to, relative_dir)): - os.mkdir(os.path.join(copy_to, relative_dir)) - for i, subdir in enumerate(subdirs): - if subdir.startswith('.'): - del subdirs[i] - for f in files: - if f.endswith('.pyc') or f.startswith('.DS_Store'): - continue - path_old = os.path.join(d, f) - path_new = os.path.join(copy_to, relative_dir, f.replace('sample', command_name)) - if os.path.exists(path_new): - path_new = os.path.join(copy_to, relative_dir, f) - if os.path.exists(path_new): - continue - path_new = path_new.rstrip(".tmpl") - fp_old = open(path_old, 'r') - fp_new = open(path_new, 'w') - fp_new.write(fp_old.read().replace('{{ command_name }}', command_name).replace('{{ base_command }}', base_command).replace('{{ handle_method }}', handle_method)) - fp_old.close() - fp_new.close() - try: - shutil.copymode(path_old, path_new) - _make_writeable(path_new) - except OSError: - sys.stderr.write("Notice: Couldn't set permission bits on %s. You're probably using an uncommon filesystem setup. No problem.\n" % path_new) diff --git a/vendor-local/lib/python/django_extensions/management/commands/create_jobs.py b/vendor-local/lib/python/django_extensions/management/commands/create_jobs.py deleted file mode 100644 index c0ce48b3f49..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/create_jobs.py +++ /dev/null @@ -1,56 +0,0 @@ -import os -import sys -from django.core.management.base import AppCommand -from django_extensions.management.utils import _make_writeable - - -class Command(AppCommand): - help = ("Creates a Django jobs command directory structure for the given app name in the current directory.") - args = "[appname]" - label = 'application name' - - requires_model_validation = False - # Can't import settings during this command, because they haven't - # necessarily been created. - can_import_settings = True - - def handle_app(self, app, **options): - app_dir = os.path.dirname(app.__file__) - copy_template('jobs_template', app_dir) - - -def copy_template(template_name, copy_to): - """copies the specified template directory to the copy_to location""" - import django_extensions - import shutil - - template_dir = os.path.join(django_extensions.__path__[0], 'conf', template_name) - - # walks the template structure and copies it - for d, subdirs, files in os.walk(template_dir): - relative_dir = d[len(template_dir) + 1:] - if relative_dir and not os.path.exists(os.path.join(copy_to, relative_dir)): - os.mkdir(os.path.join(copy_to, relative_dir)) - for i, subdir in enumerate(subdirs): - if subdir.startswith('.'): - del subdirs[i] - for f in files: - if f.endswith('.pyc') or f.startswith('.DS_Store'): - continue - path_old = os.path.join(d, f) - path_new = os.path.join(copy_to, relative_dir, f) - if os.path.exists(path_new): - path_new = os.path.join(copy_to, relative_dir, f) - if os.path.exists(path_new): - continue - path_new = path_new.rstrip(".tmpl") - fp_old = open(path_old, 'r') - fp_new = open(path_new, 'w') - fp_new.write(fp_old.read()) - fp_old.close() - fp_new.close() - try: - shutil.copymode(path_old, path_new) - _make_writeable(path_new) - except OSError: - sys.stderr.write("Notice: Couldn't set permission bits on %s. You're probably using an uncommon filesystem setup. No problem.\n" % path_new) diff --git a/vendor-local/lib/python/django_extensions/management/commands/describe_form.py b/vendor-local/lib/python/django_extensions/management/commands/describe_form.py deleted file mode 100644 index 9e6d46449d0..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/describe_form.py +++ /dev/null @@ -1,66 +0,0 @@ -from django.core.management.base import LabelCommand, CommandError -from django.utils.encoding import force_unicode - - -class Command(LabelCommand): - help = "Outputs the specified model as a form definition to the shell." - args = "[app.model]" - label = 'application name and model name' - - requires_model_validation = True - can_import_settings = True - - def handle_label(self, label, **options): - return describe_form(label) - - -def describe_form(label, fields=None): - """ - Returns a string describing a form based on the model - """ - from django.db.models.loading import get_model - try: - app_name, model_name = label.split('.')[-2:] - except (IndexError, ValueError): - raise CommandError("Need application and model name in the form: appname.model") - model = get_model(app_name, model_name) - - opts = model._meta - field_list = [] - for f in opts.fields + opts.many_to_many: - if not f.editable: - continue - if fields and not f.name in fields: - continue - formfield = f.formfield() - if not '__dict__' in dir(formfield): - continue - attrs = {} - valid_fields = ['required', 'initial', 'max_length', 'min_length', 'max_value', 'min_value', 'max_digits', 'decimal_places', 'choices', 'help_text', 'label'] - for k, v in formfield.__dict__.items(): - if k in valid_fields and v is not None: - # ignore defaults, to minimize verbosity - if k == 'required' and v: - continue - if k == 'help_text' and not v: - continue - if k == 'widget': - attrs[k] = v.__class__ - elif k in ['help_text', 'label']: - attrs[k] = force_unicode(v).strip() - else: - attrs[k] = v - - params = ', '.join(['%s=%r' % (k, v) for k, v in attrs.items()]) - field_list.append(' %(field_name)s = forms.%(field_type)s(%(params)s)' % { - 'field_name': f.name, - 'field_type': formfield.__class__.__name__, - 'params': params - }) - return ''' -from django import forms -from %(app_name)s.models import %(object_name)s - -class %(object_name)sForm(forms.Form): -%(field_list)s -''' % {'app_name': app_name, 'object_name': opts.object_name, 'field_list': '\n'.join(field_list)} diff --git a/vendor-local/lib/python/django_extensions/management/commands/dumpscript.py b/vendor-local/lib/python/django_extensions/management/commands/dumpscript.py deleted file mode 100644 index 5caf40efa34..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/dumpscript.py +++ /dev/null @@ -1,751 +0,0 @@ -#!/usr/bin/env python -# -*- coding: UTF-8 -*- -""" - Title: Dumpscript management command - Project: Hardytools (queryset-refactor version) - Author: Will Hardy (http://willhardy.com.au) - Date: June 2008 - Usage: python manage.py dumpscript appname > scripts/scriptname.py - $Revision: 217 $ - -Description: - Generates a Python script that will repopulate the database using objects. - The advantage of this approach is that it is easy to understand, and more - flexible than directly populating the database, or using XML. - - * It also allows for new defaults to take effect and only transfers what is - needed. - * If a new database schema has a NEW ATTRIBUTE, it is simply not - populated (using a default value will make the transition smooth :) - * If a new database schema REMOVES AN ATTRIBUTE, it is simply ignored - and the data moves across safely (I'm assuming we don't want this - attribute anymore. - * Problems may only occur if there is a new model and is now a required - ForeignKey for an existing model. But this is easy to fix by editing the - populate script. Half of the job is already done as all ForeingKey - lookups occur though the locate_object() function in the generated script. - -Improvements: - See TODOs and FIXMEs scattered throughout :-) - -""" - -import sys -import datetime -import six - -import django -from django.db.models import AutoField, BooleanField, FileField, ForeignKey -from django.core.exceptions import ObjectDoesNotExist -from django.core.management.base import BaseCommand - -# conditional import, force_unicode was renamed in Django 1.5 -from django.contrib.contenttypes.models import ContentType -try: - from django.utils.encoding import smart_unicode, force_unicode # NOQA -except ImportError: - from django.utils.encoding import smart_text as smart_unicode, force_text as force_unicode # NOQA - - -def orm_item_locator(orm_obj): - """ - This function is called every time an object that will not be exported is required. - Where orm_obj is the referred object. - We postpone the lookup to locate_object() which will be run on the generated script - - """ - - the_class = orm_obj._meta.object_name - original_class = the_class - pk_name = orm_obj._meta.pk.name - original_pk_name = pk_name - pk_value = getattr(orm_obj, pk_name) - - while hasattr(pk_value, "_meta") and hasattr(pk_value._meta, "pk") and hasattr(pk_value._meta.pk, "name"): - the_class = pk_value._meta.object_name - pk_name = pk_value._meta.pk.name - pk_value = getattr(pk_value, pk_name) - - clean_dict = make_clean_dict(orm_obj.__dict__) - - for key in clean_dict: - v = clean_dict[key] - if v is not None and not isinstance(v, (six.string_types, six.integer_types, float, datetime.datetime)): - clean_dict[key] = six.u("%s" % v) - - output = """ importer.locate_object(%s, "%s", %s, "%s", %s, %s ) """ % ( - original_class, original_pk_name, - the_class, pk_name, pk_value, clean_dict - ) - return output - - -class Command(BaseCommand): - help = 'Dumps the data as a customised python script.' - args = '[appname ...]' - - def handle(self, *app_labels, **options): - - # Get the models we want to export - models = get_models(app_labels) - - # A dictionary is created to keep track of all the processed objects, - # so that foreign key references can be made using python variable names. - # This variable "context" will be passed around like the town bicycle. - context = {} - - # Create a dumpscript object and let it format itself as a string - self.stdout.write(str(Script(models=models, context=context, stdout=self.stdout, stderr=self.stderr))) - self.stdout.write("\n") - - -def get_models(app_labels): - """ Gets a list of models for the given app labels, with some exceptions. - TODO: If a required model is referenced, it should also be included. - Or at least discovered with a get_or_create() call. - """ - - from django.db.models import get_app, get_apps, get_model - from django.db.models import get_models as get_all_models - - # These models are not to be output, e.g. because they can be generated automatically - # TODO: This should be "appname.modelname" string - EXCLUDED_MODELS = (ContentType, ) - - models = [] - - # If no app labels are given, return all - if not app_labels: - for app in get_apps(): - models += [m for m in get_all_models(app) if m not in EXCLUDED_MODELS] - - # Get all relevant apps - for app_label in app_labels: - # If a specific model is mentioned, get only that model - if "." in app_label: - app_label, model_name = app_label.split(".", 1) - models.append(get_model(app_label, model_name)) - # Get all models for a given app - else: - models += [m for m in get_all_models(get_app(app_label)) if m not in EXCLUDED_MODELS] - - return models - - -class Code(object): - """ A snippet of python script. - This keeps track of import statements and can be output to a string. - In the future, other features such as custom indentation might be included - in this class. - """ - - def __init__(self, indent=-1, stdout=None, stderr=None): - - if not stdout: - stdout = sys.stdout - if not stderr: - stderr = sys.stderr - - self.indent = indent - self.stdout = stdout - self.stderr = stderr - - def __str__(self): - """ Returns a string representation of this script. - """ - if self.imports: - self.stderr.write(repr(self.import_lines)) - return flatten_blocks([""] + self.import_lines + [""] + self.lines, num_indents=self.indent) - else: - return flatten_blocks(self.lines, num_indents=self.indent) - - def get_import_lines(self): - """ Takes the stored imports and converts them to lines - """ - if self.imports: - return ["from %s import %s" % (value, key) for key, value in self.imports.items()] - else: - return [] - import_lines = property(get_import_lines) - - -class ModelCode(Code): - " Produces a python script that can recreate data for a given model class. " - - def __init__(self, model, context=None, stdout=None, stderr=None): - super(ModelCode, self).__init__(indent=0, stdout=stdout, stderr=stderr) - self.model = model - if context is None: - context = {} - self.context = context - self.instances = [] - - def get_imports(self): - """ Returns a dictionary of import statements, with the variable being - defined as the key. - """ - return {self.model.__name__: smart_unicode(self.model.__module__)} - imports = property(get_imports) - - def get_lines(self): - """ Returns a list of lists or strings, representing the code body. - Each list is a block, each string is a statement. - """ - code = [] - - for counter, item in enumerate(self.model._default_manager.all()): - instance = InstanceCode(instance=item, id=counter + 1, context=self.context, stdout=self.stdout, stderr=self.stderr) - self.instances.append(instance) - if instance.waiting_list: - code += instance.lines - - # After each instance has been processed, try again. - # This allows self referencing fields to work. - for instance in self.instances: - if instance.waiting_list: - code += instance.lines - - return code - - lines = property(get_lines) - - -class InstanceCode(Code): - " Produces a python script that can recreate data for a given model instance. " - - def __init__(self, instance, id, context=None, stdout=None, stderr=None): - """ We need the instance in question and an id """ - - super(InstanceCode, self).__init__(indent=0, stdout=stdout, stderr=stderr) - self.imports = {} - - self.instance = instance - self.model = self.instance.__class__ - if context is None: - context = {} - self.context = context - self.variable_name = "%s_%s" % (self.instance._meta.db_table, id) - self.skip_me = None - self.instantiated = False - - self.waiting_list = list(self.model._meta.fields) - - self.many_to_many_waiting_list = {} - for field in self.model._meta.many_to_many: - self.many_to_many_waiting_list[field] = list(getattr(self.instance, field.name).all()) - - def get_lines(self, force=False): - """ Returns a list of lists or strings, representing the code body. - Each list is a block, each string is a statement. - - force (True or False): if an attribute object cannot be included, - it is usually skipped to be processed later. With 'force' set, there - will be no waiting: a get_or_create() call is written instead. - """ - code_lines = [] - - # Don't return anything if this is an instance that should be skipped - if self.skip(): - return [] - - # Initialise our new object - # e.g. model_name_35 = Model() - code_lines += self.instantiate() - - # Add each field - # e.g. model_name_35.field_one = 1034.91 - # model_name_35.field_two = "text" - code_lines += self.get_waiting_list() - - if force: - # TODO: Check that M2M are not affected - code_lines += self.get_waiting_list(force=force) - - # Print the save command for our new object - # e.g. model_name_35.save() - if code_lines: - code_lines.append("%s = importer.save_or_locate(%s)\n" % (self.variable_name, self.variable_name)) - - code_lines += self.get_many_to_many_lines(force=force) - - return code_lines - lines = property(get_lines) - - def skip(self): - """ Determine whether or not this object should be skipped. - If this model instance is a parent of a single subclassed - instance, skip it. The subclassed instance will create this - parent instance for us. - - TODO: Allow the user to force its creation? - """ - - if self.skip_me is not None: - return self.skip_me - - def get_skip_version(): - """ Return which version of the skip code should be run - - Django's deletion code was refactored in r14507 which - was just two days before 1.3 alpha 1 (r14519) - """ - if not hasattr(self, '_SKIP_VERSION'): - version = django.VERSION - # no, it isn't lisp. I swear. - self._SKIP_VERSION = ( - version[0] > 1 or ( # django 2k... someday :) - version[0] == 1 and ( # 1.x - version[1] >= 4 or # 1.4+ - version[1] == 3 and not ( # 1.3.x - (version[3] == 'alpha' and version[1] == 0) - ) - ) - ) - ) and 2 or 1 # NOQA - return self._SKIP_VERSION - - if get_skip_version() == 1: - try: - # Django trunk since r7722 uses CollectedObjects instead of dict - from django.db.models.query import CollectedObjects - sub_objects = CollectedObjects() - except ImportError: - # previous versions don't have CollectedObjects - sub_objects = {} - self.instance._collect_sub_objects(sub_objects) - sub_objects = sub_objects.keys() - - elif get_skip_version() == 2: - from django.db.models.deletion import Collector - from django.db import router - cls = self.instance.__class__ - using = router.db_for_write(cls, instance=self.instance) - collector = Collector(using=using) - collector.collect([self.instance], collect_related=False) - - # collector stores its instances in two places. I *think* we - # only need collector.data, but using the batches is needed - # to perfectly emulate the old behaviour - # TODO: check if batches are really needed. If not, remove them. - sub_objects = sum([list(i) for i in collector.data.values()], []) - - for batch in collector.batches.values(): - # batch.values can be sets, which must be converted to lists - sub_objects += sum([list(i) for i in batch.values()], []) - - sub_objects_parents = [so._meta.parents for so in sub_objects] - if [self.model in p for p in sub_objects_parents].count(True) == 1: - # since this instance isn't explicitly created, it's variable name - # can't be referenced in the script, so record None in context dict - pk_name = self.instance._meta.pk.name - key = '%s_%s' % (self.model.__name__, getattr(self.instance, pk_name)) - self.context[key] = None - self.skip_me = True - else: - self.skip_me = False - - return self.skip_me - - def instantiate(self): - " Write lines for instantiation " - # e.g. model_name_35 = Model() - code_lines = [] - - if not self.instantiated: - code_lines.append("%s = %s()" % (self.variable_name, self.model.__name__)) - self.instantiated = True - - # Store our variable name for future foreign key references - pk_name = self.instance._meta.pk.name - key = '%s_%s' % (self.model.__name__, getattr(self.instance, pk_name)) - self.context[key] = self.variable_name - - return code_lines - - def get_waiting_list(self, force=False): - " Add lines for any waiting fields that can be completed now. " - - code_lines = [] - - # Process normal fields - for field in list(self.waiting_list): - try: - # Find the value, add the line, remove from waiting list and move on - value = get_attribute_value(self.instance, field, self.context, force=force) - code_lines.append('%s.%s = %s' % (self.variable_name, field.name, value)) - self.waiting_list.remove(field) - except SkipValue: - # Remove from the waiting list and move on - self.waiting_list.remove(field) - continue - except DoLater: - # Move on, maybe next time - continue - - return code_lines - - def get_many_to_many_lines(self, force=False): - """ Generates lines that define many to many relations for this instance. """ - - lines = [] - - for field, rel_items in self.many_to_many_waiting_list.items(): - for rel_item in list(rel_items): - try: - pk_name = rel_item._meta.pk.name - key = '%s_%s' % (rel_item.__class__.__name__, getattr(rel_item, pk_name)) - value = "%s" % self.context[key] - lines.append('%s.%s.add(%s)' % (self.variable_name, field.name, value)) - self.many_to_many_waiting_list[field].remove(rel_item) - except KeyError: - if force: - item_locator = orm_item_locator(rel_item) - self.context["__extra_imports"][rel_item._meta.object_name] = rel_item.__module__ - lines.append('%s.%s.add( %s )' % (self.variable_name, field.name, item_locator)) - self.many_to_many_waiting_list[field].remove(rel_item) - - if lines: - lines.append("") - - return lines - - -class Script(Code): - " Produces a complete python script that can recreate data for the given apps. " - - def __init__(self, models, context=None, stdout=None, stderr=None): - super(Script, self).__init__(stdout=stdout, stderr=stderr) - self.imports = {} - - self.models = models - if context is None: - context = {} - self.context = context - - self.context["__avaliable_models"] = set(models) - self.context["__extra_imports"] = {} - - def _queue_models(self, models, context): - """ Works an an appropriate ordering for the models. - This isn't essential, but makes the script look nicer because - more instances can be defined on their first try. - """ - - # Max number of cycles allowed before we call it an infinite loop. - MAX_CYCLES = 5 - - model_queue = [] - number_remaining_models = len(models) - allowed_cycles = MAX_CYCLES - - while number_remaining_models > 0: - previous_number_remaining_models = number_remaining_models - - model = models.pop(0) - - # If the model is ready to be processed, add it to the list - if check_dependencies(model, model_queue, context["__avaliable_models"]): - model_class = ModelCode(model=model, context=context, stdout=self.stdout, stderr=self.stderr) - model_queue.append(model_class) - - # Otherwise put the model back at the end of the list - else: - models.append(model) - - # Check for infinite loops. - # This means there is a cyclic foreign key structure - # That cannot be resolved by re-ordering - number_remaining_models = len(models) - if number_remaining_models == previous_number_remaining_models: - allowed_cycles -= 1 - if allowed_cycles <= 0: - # Add the remaining models, but do not remove them from the model list - missing_models = [ModelCode(model=m, context=context, stdout=self.stdout, stderr=self.stderr) for m in models] - model_queue += missing_models - # Replace the models with the model class objects - # (sure, this is a little bit of hackery) - models[:] = missing_models - break - else: - allowed_cycles = MAX_CYCLES - - return model_queue - - def get_lines(self): - """ Returns a list of lists or strings, representing the code body. - Each list is a block, each string is a statement. - """ - code = [self.FILE_HEADER.strip()] - - # Queue and process the required models - for model_class in self._queue_models(self.models, context=self.context): - msg = 'Processing model: %s\n' % model_class.model.__name__ - self.stderr.write(msg) - code.append(" #" + msg) - code.append(model_class.import_lines) - code.append("") - code.append(model_class.lines) - - # Process left over foreign keys from cyclic models - for model in self.models: - msg = 'Re-processing model: %s\n' % model.model.__name__ - self.stderr.write(msg) - code.append(" #" + msg) - for instance in model.instances: - if instance.waiting_list or instance.many_to_many_waiting_list: - code.append(instance.get_lines(force=True)) - - code.insert(1, " #initial imports") - code.insert(2, "") - for key, value in self.context["__extra_imports"].items(): - code.insert(2, " from %s import %s" % (value, key)) - - return code - - lines = property(get_lines) - - # A user-friendly file header - FILE_HEADER = """ - -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# This file has been automatically generated. -# Instead of changing it, create a file called import_helper.py -# and put there a class called ImportHelper(object) in it. -# -# This class will be specially casted so that instead of extending object, -# it will actually extend the class BasicImportHelper() -# -# That means you just have to overload the methods you want to -# change, leaving the other ones inteact. -# -# Something that you might want to do is use transactions, for example. -# -# Also, don't forget to add the necessary Django imports. -# -# This file was generated with the following command: -# %s -# -# to restore it, run -# manage.py runscript module_name.this_script_name -# -# example: if manage.py is at ./manage.py -# and the script is at ./some_folder/some_script.py -# you must make sure ./some_folder/__init__.py exists -# and run ./manage.py runscript some_folder.some_script - -from django.db import transaction - -class BasicImportHelper(object): - - def pre_import(self): - pass - - # You probably want to uncomment on of these two lines - # @transaction.atomic # Django 1.6 - # @transaction.commit_on_success # Django <1.6 - def run_import(self, import_data): - import_data() - - def post_import(self): - pass - - def locate_similar(self, current_object, search_data): - #you will probably want to call this method from save_or_locate() - #example: - #new_obj = self.locate_similar(the_obj, {"national_id": the_obj.national_id } ) - - the_obj = current_object.__class__.objects.get(**search_data) - return the_obj - - def locate_object(self, original_class, original_pk_name, the_class, pk_name, pk_value, obj_content): - #You may change this function to do specific lookup for specific objects - # - #original_class class of the django orm's object that needs to be located - #original_pk_name the primary key of original_class - #the_class parent class of original_class which contains obj_content - #pk_name the primary key of original_class - #pk_value value of the primary_key - #obj_content content of the object which was not exported. - # - #you should use obj_content to locate the object on the target db - # - #and example where original_class and the_class are different is - #when original_class is Farmer and - #the_class is Person. The table may refer to a Farmer but you will actually - #need to locate Person in order to instantiate that Farmer - # - #example: - #if the_class == SurveyResultFormat or the_class == SurveyType or the_class == SurveyState: - # pk_name="name" - # pk_value=obj_content[pk_name] - #if the_class == StaffGroup: - # pk_value=8 - - search_data = { pk_name: pk_value } - the_obj = the_class.objects.get(**search_data) - #print(the_obj) - return the_obj - - - def save_or_locate(self, the_obj): - #change this if you want to locate the object in the database - try: - the_obj.save() - except: - print("---------------") - print("Error saving the following object:") - print(the_obj.__class__) - print(" ") - print(the_obj.__dict__) - print(" ") - print(the_obj) - print(" ") - print("---------------") - - raise - return the_obj - - -importer = None -try: - import import_helper - #we need this so ImportHelper can extend BasicImportHelper, although import_helper.py - #has no knowlodge of this class - importer = type("DynamicImportHelper", (import_helper.ImportHelper, BasicImportHelper ) , {} )() -except ImportError as e: - if str(e) == "No module named import_helper": - importer = BasicImportHelper() - else: - raise - -import datetime -from decimal import Decimal -from django.contrib.contenttypes.models import ContentType - -def run(): - importer.pre_import() - importer.run_import(import_data) - importer.post_import() - -def import_data(): - -""" % " ".join(sys.argv) - - -# HELPER FUNCTIONS -#------------------------------------------------------------------------------- - -def flatten_blocks(lines, num_indents=-1): - """ Takes a list (block) or string (statement) and flattens it into a string - with indentation. - """ - - # The standard indent is four spaces - INDENTATION = " " * 4 - - if not lines: - return "" - - # If this is a string, add the indentation and finish here - if isinstance(lines, six.string_types): - return INDENTATION * num_indents + lines - - # If this is not a string, join the lines and recurse - return "\n".join([flatten_blocks(line, num_indents + 1) for line in lines]) - - -def get_attribute_value(item, field, context, force=False): - """ Gets a string version of the given attribute's value, like repr() might. """ - - # Find the value of the field, catching any database issues - try: - value = getattr(item, field.name) - except ObjectDoesNotExist: - raise SkipValue('Could not find object for %s.%s, ignoring.\n' % (item.__class__.__name__, field.name)) - - # AutoField: We don't include the auto fields, they'll be automatically recreated - if isinstance(field, AutoField): - raise SkipValue() - - # Some databases (eg MySQL) might store boolean values as 0/1, this needs to be cast as a bool - elif isinstance(field, BooleanField) and value is not None: - return repr(bool(value)) - - # Post file-storage-refactor, repr() on File/ImageFields no longer returns the path - elif isinstance(field, FileField): - return repr(force_unicode(value)) - - # ForeignKey fields, link directly using our stored python variable name - elif isinstance(field, ForeignKey) and value is not None: - - # Special case for contenttype foreign keys: no need to output any - # content types in this script, as they can be generated again - # automatically. - # NB: Not sure if "is" will always work - if field.rel.to is ContentType: - return 'ContentType.objects.get(app_label="%s", model="%s")' % (value.app_label, value.model) - - # Generate an identifier (key) for this foreign object - pk_name = value._meta.pk.name - key = '%s_%s' % (value.__class__.__name__, getattr(value, pk_name)) - - if key in context: - variable_name = context[key] - # If the context value is set to None, this should be skipped. - # This identifies models that have been skipped (inheritance) - if variable_name is None: - raise SkipValue() - # Return the variable name listed in the context - return "%s" % variable_name - elif value.__class__ not in context["__avaliable_models"] or force: - context["__extra_imports"][value._meta.object_name] = value.__module__ - item_locator = orm_item_locator(value) - return item_locator - else: - raise DoLater('(FK) %s.%s\n' % (item.__class__.__name__, field.name)) - - # A normal field (e.g. a python built-in) - else: - return repr(value) - - -def make_clean_dict(the_dict): - if "_state" in the_dict: - clean_dict = the_dict.copy() - del clean_dict["_state"] - return clean_dict - return the_dict - - -def check_dependencies(model, model_queue, avaliable_models): - " Check that all the depenedencies for this model are already in the queue. " - - # A list of allowed links: existing fields, itself and the special case ContentType - allowed_links = [m.model.__name__ for m in model_queue] + [model.__name__, 'ContentType'] - - # For each ForeignKey or ManyToMany field, check that a link is possible - - for field in model._meta.fields: - if field.rel and field.rel.to.__name__ not in allowed_links: - if field.rel.to not in avaliable_models: - continue - return False - - for field in model._meta.many_to_many: - if field.rel and field.rel.to.__name__ not in allowed_links: - return False - - return True - - -# EXCEPTIONS -#------------------------------------------------------------------------------- - -class SkipValue(Exception): - """ Value could not be parsed or should simply be skipped. """ - - -class DoLater(Exception): - """ Value could not be parsed or should simply be skipped. """ diff --git a/vendor-local/lib/python/django_extensions/management/commands/export_emails.py b/vendor-local/lib/python/django_extensions/management/commands/export_emails.py deleted file mode 100644 index 05a8689b057..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/export_emails.py +++ /dev/null @@ -1,133 +0,0 @@ -from django.core.management.base import BaseCommand, CommandError -try: - from django.contrib.auth import get_user_model # Django 1.5 -except ImportError: - from django_extensions.future_1_5 import get_user_model -from django.contrib.auth.models import Group -from optparse import make_option -from sys import stdout -from csv import writer -import six - -FORMATS = [ - 'address', - 'emails', - 'google', - 'outlook', - 'linkedin', - 'vcard', -] - - -def full_name(first_name, last_name, username, **extra): - name = six.u(" ").join(n for n in [first_name, last_name] if n) - if not name: - return username - return name - - -class Command(BaseCommand): - option_list = BaseCommand.option_list + ( - make_option('--group', '-g', action='store', dest='group', default=None, - help='Limit to users which are part of the supplied group name'), - make_option('--format', '-f', action='store', dest='format', default=FORMATS[0], - help="output format. May be one of '" + "', '".join(FORMATS) + "'."), - ) - - help = ("Export user email address list in one of a number of formats.") - args = "[output file]" - label = 'filename to save to' - - requires_model_validation = True - can_import_settings = True - encoding = 'utf-8' # RED_FLAG: add as an option -DougN - - def handle(self, *args, **options): - if len(args) > 1: - raise CommandError("extra arguments supplied") - group = options['group'] - if group and not Group.objects.filter(name=group).count() == 1: - names = six.u("', '").join(g['name'] for g in Group.objects.values('name')).encode('utf-8') - if names: - names = "'" + names + "'." - raise CommandError("Unknown group '" + group + "'. Valid group names are: " + names) - if len(args) and args[0] != '-': - outfile = open(args[0], 'w') - else: - outfile = stdout - - User = get_user_model() - qs = User.objects.all().order_by('last_name', 'first_name', 'username', 'email') - if group: - qs = qs.filter(group__name=group).distinct() - qs = qs.values('last_name', 'first_name', 'username', 'email') - getattr(self, options['format'])(qs, outfile) - - def address(self, qs, out): - """simple single entry per line in the format of: - "full name" <my@address.com>; - """ - out.write(six.u("\n").join(six.u('"%s" <%s>;' % (full_name(**ent), ent['email'])) - for ent in qs).encode(self.encoding)) - out.write("\n") - - def emails(self, qs, out): - """simpler single entry with email only in the format of: - my@address.com, - """ - out.write(six.u(",\n").join(six.u('%s' % (ent['email'])) for ent in qs).encode(self.encoding)) - out.write("\n") - - def google(self, qs, out): - """CSV format suitable for importing into google GMail - """ - csvf = writer(out) - csvf.writerow(['Name', 'Email']) - for ent in qs: - csvf.writerow([full_name(**ent).encode(self.encoding), - ent['email'].encode(self.encoding)]) - - def outlook(self, qs, out): - """CSV format suitable for importing into outlook - """ - csvf = writer(out) - columns = ['Name', 'E-mail Address', 'Notes', 'E-mail 2 Address', 'E-mail 3 Address', - 'Mobile Phone', 'Pager', 'Company', 'Job Title', 'Home Phone', 'Home Phone 2', - 'Home Fax', 'Home Address', 'Business Phone', 'Business Phone 2', - 'Business Fax', 'Business Address', 'Other Phone', 'Other Fax', 'Other Address'] - csvf.writerow(columns) - empty = [''] * (len(columns) - 2) - for ent in qs: - csvf.writerow([full_name(**ent).encode(self.encoding), - ent['email'].encode(self.encoding)] + empty) - - def linkedin(self, qs, out): - """CSV format suitable for importing into linkedin Groups. - perfect for pre-approving members of a linkedin group. - """ - csvf = writer(out) - csvf.writerow(['First Name', 'Last Name', 'Email']) - for ent in qs: - csvf.writerow([ent['first_name'].encode(self.encoding), - ent['last_name'].encode(self.encoding), - ent['email'].encode(self.encoding)]) - - def vcard(self, qs, out): - try: - import vobject - except ImportError: - print(self.style.ERROR("Please install python-vobject to use the vcard export format.")) - import sys - sys.exit(1) - for ent in qs: - card = vobject.vCard() - card.add('fn').value = full_name(**ent) - if not ent['last_name'] and not ent['first_name']: - # fallback to fullname, if both first and lastname are not declared - card.add('n').value = vobject.vcard.Name(full_name(**ent)) - else: - card.add('n').value = vobject.vcard.Name(ent['last_name'], ent['first_name']) - emailpart = card.add('email') - emailpart.value = ent['email'] - emailpart.type_param = 'INTERNET' - out.write(card.serialize().encode(self.encoding)) diff --git a/vendor-local/lib/python/django_extensions/management/commands/find_template.py b/vendor-local/lib/python/django_extensions/management/commands/find_template.py deleted file mode 100644 index 15137793657..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/find_template.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.core.management.base import LabelCommand -from django.template import loader -from django.template import TemplateDoesNotExist -import sys - - -def get_template_path(path): - try: - template = loader.find_template(path) - if template[1]: - return template[1].name - # work arround https://code.djangoproject.com/ticket/17199 issue - for template_loader in loader.template_source_loaders: - try: - source, origin = template_loader.load_template_source(path) - return origin - except TemplateDoesNotExist: - pass - raise TemplateDoesNotExist(path) - except TemplateDoesNotExist: - return None - - -class Command(LabelCommand): - help = "Finds the location of the given template by resolving its path" - args = "[template_path]" - label = 'template path' - - def handle_label(self, template_path, **options): - path = get_template_path(template_path) - if path is None: - sys.stderr.write("No template found\n") - sys.exit(1) - else: - print(path) diff --git a/vendor-local/lib/python/django_extensions/management/commands/generate_secret_key.py b/vendor-local/lib/python/django_extensions/management/commands/generate_secret_key.py deleted file mode 100644 index 1d9ed25403b..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/generate_secret_key.py +++ /dev/null @@ -1,11 +0,0 @@ -from random import choice -from django.core.management.base import NoArgsCommand - - -class Command(NoArgsCommand): - help = "Generates a new SECRET_KEY that can be used in a project settings file." - - requires_model_validation = False - - def handle_noargs(self, **options): - return ''.join([choice('abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)') for i in range(50)]) diff --git a/vendor-local/lib/python/django_extensions/management/commands/graph_models.py b/vendor-local/lib/python/django_extensions/management/commands/graph_models.py deleted file mode 100644 index 59403e248c5..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/graph_models.py +++ /dev/null @@ -1,71 +0,0 @@ -from django.core.management.base import BaseCommand, CommandError -from optparse import make_option -from django_extensions.management.modelviz import generate_dot - - -class Command(BaseCommand): - option_list = BaseCommand.option_list + ( - make_option('--disable-fields', '-d', action='store_true', dest='disable_fields', - help='Do not show the class member fields'), - make_option('--group-models', '-g', action='store_true', dest='group_models', - help='Group models together respective to their application'), - make_option('--all-applications', '-a', action='store_true', dest='all_applications', - help='Automatically include all applications from INSTALLED_APPS'), - make_option('--output', '-o', action='store', dest='outputfile', - help='Render output file. Type of output dependend on file extensions. Use png or jpg to render graph to image.'), - make_option('--layout', '-l', action='store', dest='layout', default='dot', - help='Layout to be used by GraphViz for visualization. Layouts: circo dot fdp neato nop nop1 nop2 twopi'), - make_option('--verbose-names', '-n', action='store_true', dest='verbose_names', - help='Use verbose_name of models and fields'), - make_option('--language', '-L', action='store', dest='language', - help='Specify language used for verbose_name localization'), - make_option('--exclude-columns', '-x', action='store', dest='exclude_columns', - help='Exclude specific column(s) from the graph. Can also load exclude list from file.'), - make_option('--exclude-models', '-X', action='store', dest='exclude_models', - help='Exclude specific model(s) from the graph. Can also load exclude list from file.'), - make_option('--inheritance', '-e', action='store_true', dest='inheritance', - help='Include inheritance arrows'), - ) - - help = ("Creates a GraphViz dot file for the specified app names. You can pass multiple app names and they will all be combined into a single model. Output is usually directed to a dot file.") - args = "[appname]" - label = 'application name' - - requires_model_validation = True - can_import_settings = True - - def handle(self, *args, **options): - if len(args) < 1 and not options['all_applications']: - raise CommandError("need one or more arguments for appname") - - dotdata = generate_dot(args, **options) - if options['outputfile']: - self.render_output(dotdata, **options) - else: - self.print_output(dotdata) - - def print_output(self, dotdata): - print(dotdata.encode('utf-8')) - - def render_output(self, dotdata, **kwargs): - try: - import pygraphviz - except ImportError: - raise CommandError("You need to install pygraphviz python module") - - vizdata = ' '.join(dotdata.split("\n")).strip().encode('utf-8') - version = pygraphviz.__version__.rstrip("-svn") - try: - if tuple(int(v) for v in version.split('.')) < (0, 36): - # HACK around old/broken AGraph before version 0.36 (ubuntu ships with this old version) - import tempfile - tmpfile = tempfile.NamedTemporaryFile() - tmpfile.write(vizdata) - tmpfile.seek(0) - vizdata = tmpfile.name - except ValueError: - pass - - graph = pygraphviz.AGraph(vizdata) - graph.layout(prog=kwargs['layout']) - graph.draw(kwargs['outputfile']) diff --git a/vendor-local/lib/python/django_extensions/management/commands/mail_debug.py b/vendor-local/lib/python/django_extensions/management/commands/mail_debug.py deleted file mode 100644 index cd834d97092..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/mail_debug.py +++ /dev/null @@ -1,80 +0,0 @@ -from django_extensions.management.utils import setup_logger -from django.core.management.base import BaseCommand, CommandError -from optparse import make_option -from smtpd import SMTPServer -import sys -import asyncore -from logging import getLogger - - -logger = getLogger(__name__) - - -class ExtensionDebuggingServer(SMTPServer): - """Duplication of smtpd.DebuggingServer, but using logging instead of print.""" - # Do something with the gathered message - def process_message(self, peer, mailfrom, rcpttos, data): - """Output will be sent to the module logger at INFO level.""" - inheaders = 1 - lines = data.split('\n') - logger.info('---------- MESSAGE FOLLOWS ----------') - for line in lines: - # headers first - if inheaders and not line: - logger.info('X-Peer: %s' % peer[0]) - inheaders = 0 - logger.info(line) - logger.info('------------ END MESSAGE ------------') - - -class Command(BaseCommand): - option_list = BaseCommand.option_list + ( - make_option('--output', dest='output_file', default=None, - help='Specifies an output file to send a copy of all messages (not flushed immediately).'), - make_option('--use-settings', dest='use_settings', - action='store_true', default=False, - help='Uses EMAIL_HOST and HOST_PORT from Django settings.'), - ) - help = "Starts a test mail server for development." - args = '[optional port number or ippaddr:port]' - - requires_model_validation = False - - def handle(self, addrport='', *args, **options): - if args: - raise CommandError('Usage is mail_debug %s' % self.args) - if not addrport: - if options.get('use_settings', False): - from django.conf import settings - addr = getattr(settings, 'EMAIL_HOST', '') - port = str(getattr(settings, 'EMAIL_PORT', '1025')) - else: - addr = '' - port = '1025' - else: - try: - addr, port = addrport.split(':') - except ValueError: - addr, port = '', addrport - if not addr: - addr = '127.0.0.1' - - if not port.isdigit(): - raise CommandError("%r is not a valid port number." % port) - else: - port = int(port) - - # Add console handler - setup_logger(logger, stream=self.stdout, filename=options.get('output_file', None)) - - def inner_run(): - quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C' - print("Now accepting mail at %s:%s -- use %s to quit" % (addr, port, quit_command)) - - ExtensionDebuggingServer((addr, port), None) - asyncore.loop() - - try: - inner_run() - except KeyboardInterrupt: - pass diff --git a/vendor-local/lib/python/django_extensions/management/commands/notes.py b/vendor-local/lib/python/django_extensions/management/commands/notes.py deleted file mode 100644 index cdd2ec1814d..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/notes.py +++ /dev/null @@ -1,48 +0,0 @@ -from __future__ import with_statement -from django.core.management.base import BaseCommand -from django.conf import settings -import os -import re - -ANNOTATION_RE = re.compile("\{?#[\s]*?(TODO|FIXME|BUG|HACK|WARNING|NOTE|XXX)[\s:]?(.+)") -ANNOTATION_END_RE = re.compile("(.*)#\}(.*)") - - -class Command(BaseCommand): - help = 'Show all annotations like TODO, FIXME, BUG, HACK, WARNING, NOTE or XXX in your py and HTML files.' - args = 'tag' - label = 'annotation tag (TODO, FIXME, BUG, HACK, WARNING, NOTE, XXX)' - - def handle(self, *args, **options): - # don't add django internal code - apps = filter(lambda app: not app.startswith('django.contrib'), settings.INSTALLED_APPS) - template_dirs = getattr(settings, 'TEMPLATE_DIRS', []) - if template_dirs: - apps += template_dirs - for app_dir in apps: - app_dir = app_dir.replace(".", "/") - for top, dirs, files in os.walk(app_dir): - for f in files: - if os.path.splitext(f)[1] in ('.py', '.html'): - fpath = os.path.join(top, f) - annotation_lines = [] - with open(fpath, 'r') as f: - i = 0 - for line in f.readlines(): - i += 1 - if ANNOTATION_RE.search(line): - tag, msg = ANNOTATION_RE.findall(line)[0] - if len(args) == 1: - search_for_tag = args[0].upper() - if not search_for_tag == tag: - break - - if ANNOTATION_END_RE.search(msg.strip()): - msg = ANNOTATION_END_RE.findall(msg.strip())[0][0] - - annotation_lines.append("[%3s] %-5s %s" % (i, tag, msg.strip())) - if annotation_lines: - print("%s:" % fpath) - for annotation in annotation_lines: - print(" * %s" % annotation) - print("") diff --git a/vendor-local/lib/python/django_extensions/management/commands/passwd.py b/vendor-local/lib/python/django_extensions/management/commands/passwd.py deleted file mode 100644 index 6f084b143d5..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/passwd.py +++ /dev/null @@ -1,42 +0,0 @@ -from django.core.management.base import BaseCommand, CommandError -try: - from django.contrib.auth import get_user_model # Django 1.5 -except ImportError: - from django_extensions.future_1_5 import get_user_model -import getpass - - -class Command(BaseCommand): - help = "Clone of the UNIX program ``passwd'', for django.contrib.auth." - - requires_model_validation = False - - def handle(self, *args, **options): - if len(args) > 1: - raise CommandError("need exactly one or zero arguments for username") - - if args: - username, = args - else: - username = getpass.getuser() - - User = get_user_model() - try: - u = User.objects.get(username=username) - except User.DoesNotExist: - raise CommandError("user %s does not exist" % username) - - print("Changing password for user: %s" % u.username) - p1 = p2 = "" - while "" in (p1, p2) or p1 != p2: - p1 = getpass.getpass() - p2 = getpass.getpass("Password (again): ") - if p1 != p2: - print("Passwords do not match, try again") - elif "" in (p1, p2): - raise CommandError("aborted") - - u.set_password(p1) - u.save() - - return "Password changed successfully for user %s\n" % u.username diff --git a/vendor-local/lib/python/django_extensions/management/commands/pipchecker.py b/vendor-local/lib/python/django_extensions/management/commands/pipchecker.py deleted file mode 100644 index 0cc7b3e27d0..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/pipchecker.py +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/env python -import os -import pip -import sys -import json -import urllib2 -import urlparse -import xmlrpclib -from distutils.version import LooseVersion - -try: - import requests -except ImportError: - print("""The requests library is not installed. To continue: - pip install requests""") - -from optparse import make_option - -from django.core.management.base import NoArgsCommand - -from pip.req import parse_requirements - - -class Command(NoArgsCommand): - option_list = NoArgsCommand.option_list + ( - make_option( - "-t", "--github-api-token", action="store", dest="github_api_token", - help="A github api authentication token." - ), - make_option( - "-r", "--requirement", action="append", dest="requirements", - default=[], metavar="FILENAME", - help="Check all the packages listed in the given requirements file. " - "This option can be used multiple times." - ), - make_option( - "-n", "--newer", action="store_true", dest="show_newer", - help="Also show when newer version then available is installed." - ), - ) - help = "Scan pip requirement files for out-of-date packages." - - def handle_noargs(self, **options): - self.options = options - if options["requirements"]: - req_files = options["requirements"] - elif os.path.exists("requirements.txt"): - req_files = ["requirements.txt"] - elif os.path.exists("requirements"): - req_files = ["requirements/{0}".format(f) for f in os.listdir("requirements") - if os.path.isfile(os.path.join("requirements", f)) and - f.lower().endswith(".txt")] - else: - sys.exit("requirements not found") - - self.reqs = {} - for filename in req_files: - class Object(object): - pass - mockoptions = Object() - mockoptions.default_vcs = "git" - mockoptions.skip_requirements_regex = None - for req in parse_requirements(filename, options=mockoptions): - self.reqs[req.name] = { - "pip_req": req, - "url": req.url, - } - - if options["github_api_token"]: - self.github_api_token = options["github_api_token"] - elif os.environ.get("GITHUB_API_TOKEN"): - self.github_api_token = os.environ.get("GITHUB_API_TOKEN") - else: - self.github_api_token = None # only 50 requests per hour - - self.check_pypi() - self.check_github() - self.check_other() - - def _urlopen_as_json(self, url, headers=None): - """Shorcut for return contents as json""" - req = urllib2.Request(url, headers=headers) - return json.loads(urllib2.urlopen(req).read()) - - def check_pypi(self): - """ - If the requirement is frozen to pypi, check for a new version. - """ - for dist in pip.get_installed_distributions(): - name = dist.project_name - if name in self.reqs.keys(): - self.reqs[name]["dist"] = dist - - pypi = xmlrpclib.ServerProxy("http://pypi.python.org/pypi") - for name, req in self.reqs.items(): - if req["url"]: - continue # skipping github packages. - elif "dist" in req: - dist = req["dist"] - dist_version = LooseVersion(dist.version) - available = pypi.package_releases(req["pip_req"].url_name) - try: - available_version = LooseVersion(available[0]) - except IndexError: - available_version = None - - if not available_version: - msg = "release is not on pypi (check capitalization and/or --extra-index-url)" - elif self.options['show_newer'] and dist_version > available_version: - msg = "{0} available (newer installed)".format(available_version) - elif available_version > dist_version: - msg = "{0} available".format(available_version) - else: - msg = "up to date" - del self.reqs[name] - continue - pkg_info = "{dist.project_name} {dist.version}".format(dist=dist) - else: - msg = "not installed" - pkg_info = name - print("{pkg_info:40} {msg}".format(pkg_info=pkg_info, msg=msg)) - del self.reqs[name] - - def check_github(self): - """ - If the requirement is frozen to a github url, check for new commits. - - API Tokens - ---------- - For more than 50 github api calls per hour, pipchecker requires - authentication with the github api by settings the environemnt - variable ``GITHUB_API_TOKEN`` or setting the command flag - --github-api-token='mytoken'``. - - To create a github api token for use at the command line:: - curl -u 'rizumu' -d '{"scopes":["repo"], "note":"pipchecker"}' https://api.github.com/authorizations - - For more info on github api tokens: - https://help.github.com/articles/creating-an-oauth-token-for-command-line-use - http://developer.github.com/v3/oauth/#oauth-authorizations-api - - Requirement Format - ------------------ - Pipchecker gets the sha of frozen repo and checks if it is - found at the head of any branches. If it is not found then - the requirement is considered to be out of date. - - Therefore, freezing at the commit hash will provide the expected - results, but if freezing at a branch or tag name, pipchecker will - not be able to determine with certainty if the repo is out of date. - - Freeze at the commit hash (sha):: - git+git://github.com/django/django.git@393c268e725f5b229ecb554f3fac02cfc250d2df#egg=Django - - Freeze with a branch name:: - git+git://github.com/django/django.git@master#egg=Django - - Freeze with a tag:: - git+git://github.com/django/django.git@1.5b2#egg=Django - - Do not freeze:: - git+git://github.com/django/django.git#egg=Django - - """ - for name, req in self.reqs.items(): - req_url = req["url"] - if req_url.startswith("git") and "github.com/" not in req_url: - continue - - headers = { - "content-type": "application/json", - } - if self.github_api_token: - headers["Authorization"] = "token {0}".format(self.github_api_token) - try: - user, repo = urlparse.urlparse(req_url).path.split("#")[0].strip("/").rstrip("/").split("/") - except (ValueError, IndexError) as e: - print("\nFailed to parse %r: %s\n" % (req_url, e)) - continue - - try: - #test_auth = self._urlopen_as_json("https://api.github.com/django/", headers=headers) - test_auth = requests.get("https://api.github.com/django/", headers=headers).json() - except urllib2.HTTPError as e: - print("\n%s\n" % str(e)) - return - - if "message" in test_auth and test_auth["message"] == "Bad credentials": - print("\nGithub API: Bad credentials. Aborting!\n") - return - elif "message" in test_auth and test_auth["message"].startswith("API Rate Limit Exceeded"): - print("\nGithub API: Rate Limit Exceeded. Aborting!\n") - return - - if ".git" in repo: - repo_name, frozen_commit_full = repo.split(".git") - if frozen_commit_full.startswith("@"): - frozen_commit_sha = frozen_commit_full[1:] - elif "@" in repo: - repo_name, frozen_commit_sha = repo.split("@") - else: - frozen_commit_sha = None - msg = "repo is not frozen" - - if frozen_commit_sha: - branch_url = "https://api.github.com/repos/{0}/{1}/branches".format(user, repo_name) - #branch_data = self._urlopen_as_json(branch_url, headers=headers) - branch_data = requests.get(branch_url, headers=headers).json() - - frozen_commit_url = "https://api.github.com/repos/{0}/{1}/commits/{2}".format( - user, repo_name, frozen_commit_sha - ) - #frozen_commit_data = self._urlopen_as_json(frozen_commit_url, headers=headers) - frozen_commit_data = requests.get(frozen_commit_url, headers=headers).json() - - if "message" in frozen_commit_data and frozen_commit_data["message"] == "Not Found": - msg = "{0} not found in {1}. Repo may be private.".format(frozen_commit_sha[:10], name) - elif frozen_commit_sha in [branch["commit"]["sha"] for branch in branch_data]: - msg = "up to date" - else: - msg = "{0} is not the head of any branch".format(frozen_commit_data["sha"][:10]) - - if "dist" in req: - pkg_info = "{dist.project_name} {dist.version}".format(dist=req["dist"]) - else: - pkg_info = "{0} {1}".format(name, frozen_commit_sha[:10]) - print("{pkg_info:40} {msg}".format(pkg_info=pkg_info, msg=msg)) - del self.reqs[name] - - def check_other(self): - """ - If the requirement is frozen somewhere other than pypi or github, skip. - - If you have a private pypi or use --extra-index-url, consider contributing - support here. - """ - if self.reqs: - print("\nOnly pypi and github based requirements are supported:") - for name, req in self.reqs.items(): - if "dist" in req: - pkg_info = "{dist.project_name} {dist.version}".format(dist=req["dist"]) - elif "url" in req: - pkg_info = "{url}".format(url=req["url"]) - else: - pkg_info = "unknown package" - print("{pkg_info:40} is not a pypi or github requirement".format(pkg_info=pkg_info)) diff --git a/vendor-local/lib/python/django_extensions/management/commands/print_settings.py b/vendor-local/lib/python/django_extensions/management/commands/print_settings.py deleted file mode 100644 index be23510749f..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/print_settings.py +++ /dev/null @@ -1,72 +0,0 @@ -""" -print_settings -============== - -Django command similar to 'diffsettings' but shows all active Django settings. -""" - -from django.core.management.base import NoArgsCommand -from django.conf import settings -from optparse import make_option - - -class Command(NoArgsCommand): - """print_settings command""" - - help = "Print the active Django settings." - - option_list = NoArgsCommand.option_list + ( - make_option('--format', default='simple', dest='format', - help='Specifies output format.'), - make_option('--indent', default=4, dest='indent', type='int', - help='Specifies indent level for JSON and YAML'), - ) - - def handle_noargs(self, **options): - a_dict = {} - - for attr in dir(settings): - if self.include_attr(attr): - value = getattr(settings, attr) - a_dict[attr] = value - - output_format = options.get('format', 'json') - indent = options.get('indent', 4) - - if output_format == 'json': - json = self.import_json() - print(json.dumps(a_dict, indent=indent)) - elif output_format == 'yaml': - import yaml # requires PyYAML - print(yaml.dump(a_dict, indent=indent)) - elif output_format == 'pprint': - from pprint import pprint - pprint(a_dict) - else: - self.print_simple(a_dict) - - @staticmethod - def include_attr(attr): - """Whether or not to include attribute in output""" - - if attr.startswith('__'): - return False - else: - return True - - @staticmethod - def print_simple(a_dict): - """A very simple output format""" - - for key, value in a_dict.items(): - print('%-40s = %r' % (key, value)) - - @staticmethod - def import_json(): - """Import a module for JSON""" - - try: - import json - except ImportError: - import simplejson as json # NOQA - return json diff --git a/vendor-local/lib/python/django_extensions/management/commands/print_user_for_session.py b/vendor-local/lib/python/django_extensions/management/commands/print_user_for_session.py deleted file mode 100644 index 000453aa813..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/print_user_for_session.py +++ /dev/null @@ -1,51 +0,0 @@ -from django.core.management.base import BaseCommand, CommandError -try: - from django.contrib.auth import get_user_model # Django 1.5 -except ImportError: - from django_extensions.future_1_5 import get_user_model -from django.contrib.sessions.models import Session -import re - -SESSION_RE = re.compile("^[0-9a-f]{20,40}$") - - -class Command(BaseCommand): - help = ("print the user information for the provided session key. " - "this is very helpful when trying to track down the person who " - "experienced a site crash.") - args = "session_key" - label = 'session key for the user' - - requires_model_validation = True - can_import_settings = True - - def handle(self, *args, **options): - if len(args) > 1: - raise CommandError("extra arguments supplied") - if len(args) < 1: - raise CommandError("session_key argument missing") - key = args[0].lower() - if not SESSION_RE.match(key): - raise CommandError("malformed session key") - try: - session = Session.objects.get(pk=key) - except Session.DoesNotExist: - print("Session Key does not exist. Expired?") - return - - data = session.get_decoded() - print('Session to Expire: %s' % session.expire_date) - print('Raw Data: %s' % data) - uid = data.get('_auth_user_id', None) - if uid is None: - print('No user associated with session') - return - print("User id: %s" % uid) - User = get_user_model() - try: - user = User.objects.get(pk=uid) - except User.DoesNotExist: - print("No user associated with that id.") - return - for key in ['username', 'email', 'first_name', 'last_name']: - print("%s: %s" % (key, getattr(user, key))) diff --git a/vendor-local/lib/python/django_extensions/management/commands/reset_db.py b/vendor-local/lib/python/django_extensions/management/commands/reset_db.py deleted file mode 100644 index e3f3fad3b6a..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/reset_db.py +++ /dev/null @@ -1,177 +0,0 @@ -""" -originally from http://www.djangosnippets.org/snippets/828/ by dnordberg -""" - -from six.moves import input -from django.conf import settings -from django.core.management.base import CommandError, BaseCommand -import django -import logging -import re -from optparse import make_option - - -class Command(BaseCommand): - option_list = BaseCommand.option_list + ( - make_option('--noinput', action='store_false', - dest='interactive', default=True, - help='Tells Django to NOT prompt the user for input of any kind.'), - make_option('--no-utf8', action='store_true', - dest='no_utf8_support', default=False, - help='Tells Django to not create a UTF-8 charset database'), - make_option('-U', '--user', action='store', - dest='user', default=None, - help='Use another user for the database then defined in settings.py'), - make_option('-P', '--password', action='store', - dest='password', default=None, - help='Use another password for the database then defined in settings.py'), - make_option('-D', '--dbname', action='store', - dest='dbname', default=None, - help='Use another database name then defined in settings.py (For PostgreSQL this defaults to "template1")'), - make_option('-R', '--router', action='store', - dest='router', default=None, - help='Use this router-database other then defined in settings.py'), - ) - help = "Resets the database for this project." - - def set_db_settings(self, *args, **options): - if django.get_version() >= "1.2": - router = options.get('router') - if router is None: - return False - - # retrieve this with the 'using' argument - dbinfo = settings.DATABASES.get(router) - settings.DATABASE_ENGINE = dbinfo.get('ENGINE').split('.')[-1] - settings.DATABASE_USER = dbinfo.get('USER') - settings.DATABASE_PASSWORD = dbinfo.get('PASSWORD') - settings.DATABASE_NAME = dbinfo.get('NAME') - settings.DATABASE_HOST = dbinfo.get('HOST') - settings.DATABASE_PORT = dbinfo.get('PORT') - return True - else: - # settings are set for django < 1.2 no modification needed - return True - - def handle(self, *args, **options): - """ - Resets the database for this project. - - Note: Transaction wrappers are in reverse as a work around for - autocommit, anybody know how to do this the right way? - """ - - if django.get_version() >= "1.2": - got_db_settings = self.set_db_settings(*args, **options) - if not got_db_settings: - raise CommandError("You are using Django %s which requires to specify the db-router.\nPlease specify the router by adding --router=<routername> to this command." % django.get_version()) - return - - verbosity = int(options.get('verbosity', 1)) - if options.get('interactive'): - confirm = input(""" -You have requested a database reset. -This will IRREVERSIBLY DESTROY -ALL data in the database "%s". -Are you sure you want to do this? - -Type 'yes' to continue, or 'no' to cancel: """ % (settings.DATABASE_NAME,)) - else: - confirm = 'yes' - - if confirm != 'yes': - print("Reset cancelled.") - return - - postgis = re.compile('.*postgis') - engine = settings.DATABASE_ENGINE - user = options.get('user', settings.DATABASE_USER) - if user is None: - user = settings.DATABASE_USER - password = options.get('password', settings.DATABASE_PASSWORD) - if password is None: - password = settings.DATABASE_PASSWORD - - if engine in ('sqlite3', 'spatialite'): - import os - try: - logging.info("Unlinking %s database" % engine) - os.unlink(settings.DATABASE_NAME) - except OSError: - pass - elif engine == 'mysql': - import MySQLdb as Database - kwargs = { - 'user': user, - 'passwd': password, - } - if settings.DATABASE_HOST.startswith('/'): - kwargs['unix_socket'] = settings.DATABASE_HOST - else: - kwargs['host'] = settings.DATABASE_HOST - if settings.DATABASE_PORT: - kwargs['port'] = int(settings.DATABASE_PORT) - - connection = Database.connect(**kwargs) - drop_query = 'DROP DATABASE IF EXISTS `%s`' % settings.DATABASE_NAME - utf8_support = options.get('no_utf8_support', False) and '' or 'CHARACTER SET utf8' - create_query = 'CREATE DATABASE `%s` %s' % (settings.DATABASE_NAME, utf8_support) - logging.info('Executing... "' + drop_query + '"') - connection.query(drop_query) - logging.info('Executing... "' + create_query + '"') - connection.query(create_query) - - elif engine == 'postgresql' or engine == 'postgresql_psycopg2' or postgis.match(engine): - if engine == 'postgresql': - import psycopg as Database # NOQA - elif engine == 'postgresql_psycopg2' or postgis.match(engine): - import psycopg2 as Database # NOQA - - if settings.DATABASE_NAME == '': - from django.core.exceptions import ImproperlyConfigured - raise ImproperlyConfigured("You need to specify DATABASE_NAME in your Django settings file.") - - database_name = options.get('dbname', 'template1') - if options.get('dbname') is None: - database_name = 'template1' - conn_string = "dbname=%s" % database_name - if settings.DATABASE_USER: - conn_string += " user=%s" % user - if settings.DATABASE_PASSWORD: - conn_string += " password='%s'" % password - if settings.DATABASE_HOST: - conn_string += " host=%s" % settings.DATABASE_HOST - if settings.DATABASE_PORT: - conn_string += " port=%s" % settings.DATABASE_PORT - - connection = Database.connect(conn_string) - connection.set_isolation_level(0) # autocommit false - cursor = connection.cursor() - drop_query = 'DROP DATABASE %s' % settings.DATABASE_NAME - logging.info('Executing... "' + drop_query + '"') - - try: - cursor.execute(drop_query) - except Database.ProgrammingError as e: - logging.info("Error: %s" % str(e)) - - # Encoding should be SQL_ASCII (7-bit postgres default) or prefered UTF8 (8-bit) - create_query = "CREATE DATABASE %s" % settings.DATABASE_NAME - if settings.DATABASE_USER: - create_query += " WITH OWNER = %s " % settings.DATABASE_USER - create_query += " ENCODING = 'UTF8'" - - if postgis.match(engine): - create_query += ' TEMPLATE = template_postgis' - if settings.DEFAULT_TABLESPACE: - create_query += ' TABLESPACE = %s;' % settings.DEFAULT_TABLESPACE - else: - create_query += ';' - logging.info('Executing... "' + create_query + '"') - cursor.execute(create_query) - - else: - raise CommandError("Unknown database engine %s" % engine) - - if verbosity >= 2 or options.get('interactive'): - print("Reset successful.") diff --git a/vendor-local/lib/python/django_extensions/management/commands/runjob.py b/vendor-local/lib/python/django_extensions/management/commands/runjob.py deleted file mode 100644 index 858f6549720..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/runjob.py +++ /dev/null @@ -1,60 +0,0 @@ -from django.core.management.base import LabelCommand -from optparse import make_option -from django_extensions.management.jobs import get_job, print_jobs - - -class Command(LabelCommand): - option_list = LabelCommand.option_list + ( - make_option('--list', '-l', action="store_true", dest="list_jobs", - help="List all jobs with their description"), - ) - help = "Run a single maintenance job." - args = "[app_name] job_name" - label = "" - - requires_model_validation = True - - def runjob(self, app_name, job_name, options): - verbosity = int(options.get('verbosity', 1)) - if verbosity > 1: - print("Executing job: %s (app: %s)" % (job_name, app_name)) - try: - job = get_job(app_name, job_name) - except KeyError: - if app_name: - print("Error: Job %s for applabel %s not found" % (app_name, job_name)) - else: - print("Error: Job %s not found" % job_name) - print("Use -l option to view all the available jobs") - return - try: - job().execute() - except Exception: - import traceback - print("ERROR OCCURED IN JOB: %s (APP: %s)" % (job_name, app_name)) - print("START TRACEBACK:") - traceback.print_exc() - print("END TRACEBACK\n") - - def handle(self, *args, **options): - app_name = None - job_name = None - if len(args) == 1: - job_name = args[0] - elif len(args) == 2: - app_name, job_name = args - if options.get('list_jobs'): - print_jobs(only_scheduled=False, show_when=True, show_appname=True) - else: - if not job_name: - print("Run a single maintenance job. Please specify the name of the job.") - return - self.runjob(app_name, job_name, options) - -# Backwards compatibility for Django r9110 -if not [opt for opt in Command.option_list if opt.dest == 'verbosity']: - Command.option_list += ( - make_option('--verbosity', '-v', action="store", dest="verbosity", - default='1', type='choice', choices=['0', '1', '2'], - help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), - ) diff --git a/vendor-local/lib/python/django_extensions/management/commands/runjobs.py b/vendor-local/lib/python/django_extensions/management/commands/runjobs.py deleted file mode 100644 index 063f8ec4a96..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/runjobs.py +++ /dev/null @@ -1,97 +0,0 @@ -from django.core.management.base import LabelCommand -from optparse import make_option -from django_extensions.management.jobs import get_jobs, print_jobs - - -class Command(LabelCommand): - option_list = LabelCommand.option_list + ( - make_option('--list', '-l', action="store_true", dest="list_jobs", - help="List all jobs with their description"), - ) - help = "Runs scheduled maintenance jobs." - args = "[minutely quarter_hourly hourly daily weekly monthly yearly]" - label = "" - - requires_model_validation = True - - def usage_msg(self): - print("Run scheduled jobs. Please specify 'minutely', 'quarter_hourly', 'hourly', 'daily', 'weekly', 'monthly' or 'yearly'") - - def runjobs(self, when, options): - verbosity = int(options.get('verbosity', 1)) - jobs = get_jobs(when, only_scheduled=True) - list = jobs.keys() - list.sort() - for app_name, job_name in list: - job = jobs[(app_name, job_name)] - if verbosity > 1: - print("Executing %s job: %s (app: %s)" % (when, job_name, app_name)) - try: - job().execute() - except Exception: - import traceback - print("ERROR OCCURED IN %s JOB: %s (APP: %s)" % (when.upper(), job_name, app_name)) - print("START TRACEBACK:") - traceback.print_exc() - print("END TRACEBACK\n") - - def runjobs_by_signals(self, when, options): - """ Run jobs from the signals """ - # Thanks for Ian Holsman for the idea and code - from django_extensions.management import signals - from django.db import models - from django.conf import settings - - verbosity = int(options.get('verbosity', 1)) - for app_name in settings.INSTALLED_APPS: - try: - __import__(app_name + '.management', '', '', ['']) - except ImportError: - pass - - for app in models.get_apps(): - if verbosity > 1: - app_name = '.'.join(app.__name__.rsplit('.')[:-1]) - print("Sending %s job signal for: %s" % (when, app_name)) - if when == 'minutely': - signals.run_minutely_jobs.send(sender=app, app=app) - elif when == 'quarter_hourly': - signals.run_quarter_hourly_jobs.send(sender=app, app=app) - elif when == 'hourly': - signals.run_hourly_jobs.send(sender=app, app=app) - elif when == 'daily': - signals.run_daily_jobs.send(sender=app, app=app) - elif when == 'weekly': - signals.run_weekly_jobs.send(sender=app, app=app) - elif when == 'monthly': - signals.run_monthly_jobs.send(sender=app, app=app) - elif when == 'yearly': - signals.run_yearly_jobs.send(sender=app, app=app) - - def handle(self, *args, **options): - when = None - if len(args) > 1: - self.usage_msg() - return - elif len(args) == 1: - if not args[0] in ['minutely', 'quarter_hourly', 'hourly', 'daily', 'weekly', 'monthly', 'yearly']: - self.usage_msg() - return - else: - when = args[0] - if options.get('list_jobs'): - print_jobs(when, only_scheduled=True, show_when=True, show_appname=True) - else: - if not when: - self.usage_msg() - return - self.runjobs(when, options) - self.runjobs_by_signals(when, options) - -# Backwards compatibility for Django r9110 -if not [opt for opt in Command.option_list if opt.dest == 'verbosity']: - Command.option_list += ( - make_option('--verbosity', '-v', action="store", dest="verbosity", - default='1', type='choice', choices=['0', '1', '2'], - help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), - ) diff --git a/vendor-local/lib/python/django_extensions/management/commands/runprofileserver.py b/vendor-local/lib/python/django_extensions/management/commands/runprofileserver.py deleted file mode 100644 index 7798a284e6c..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/runprofileserver.py +++ /dev/null @@ -1,287 +0,0 @@ -""" -runprofileserver.py - - Starts a lightweight Web server with profiling enabled. - -Credits for kcachegrind support taken from lsprofcalltree.py go to: - David Allouche - Jp Calderone & Itamar Shtull-Trauring - Johan Dahlin -""" - -from django.core.management.base import BaseCommand, CommandError -from optparse import make_option -from datetime import datetime -from django.conf import settings -import sys - -try: - from django.contrib.staticfiles.handlers import StaticFilesHandler - USE_STATICFILES = 'django.contrib.staticfiles' in settings.INSTALLED_APPS -except ImportError as e: - USE_STATICFILES = False - -try: - any -except NameError: - # backwards compatibility for <2.5 - def any(iterable): - for element in iterable: - if element: - return True - return False - - -def label(code): - if isinstance(code, str): - return ('~', 0, code) # built-in functions ('~' sorts at the end) - else: - return '%s %s:%d' % (code.co_name, - code.co_filename, - code.co_firstlineno) - - -class KCacheGrind(object): - def __init__(self, profiler): - self.data = profiler.getstats() - self.out_file = None - - def output(self, out_file): - self.out_file = out_file - self.out_file.write('events: Ticks\n') - self._print_summary() - for entry in self.data: - self._entry(entry) - - def _print_summary(self): - max_cost = 0 - for entry in self.data: - totaltime = int(entry.totaltime * 1000) - max_cost = max(max_cost, totaltime) - self.out_file.write('summary: %d\n' % (max_cost,)) - - def _entry(self, entry): - out_file = self.out_file - - code = entry.code - #print >> out_file, 'ob=%s' % (code.co_filename,) - if isinstance(code, str): - out_file.write('fi=~\n') - else: - out_file.write('fi=%s\n' % (code.co_filename,)) - out_file.write('fn=%s\n' % (label(code),)) - - inlinetime = int(entry.inlinetime * 1000) - if isinstance(code, str): - out_file.write('0 %s\n' % inlinetime) - else: - out_file.write('%d %d\n' % (code.co_firstlineno, inlinetime)) - - # recursive calls are counted in entry.calls - if entry.calls: - calls = entry.calls - else: - calls = [] - - if isinstance(code, str): - lineno = 0 - else: - lineno = code.co_firstlineno - - for subentry in calls: - self._subentry(lineno, subentry) - out_file.write("\n") - - def _subentry(self, lineno, subentry): - out_file = self.out_file - code = subentry.code - #out_file.write('cob=%s\n' % (code.co_filename,)) - out_file.write('cfn=%s\n' % (label(code),)) - if isinstance(code, str): - out_file.write('cfi=~\n') - out_file.write('calls=%d 0\n' % (subentry.callcount,)) - else: - out_file.write('cfi=%s\n' % (code.co_filename,)) - out_file.write('calls=%d %d\n' % (subentry.callcount, code.co_firstlineno)) - - totaltime = int(subentry.totaltime * 1000) - out_file.write('%d %d\n' % (lineno, totaltime)) - - -class Command(BaseCommand): - option_list = BaseCommand.option_list + ( - make_option('--noreload', action='store_false', dest='use_reloader', default=True, - help='Tells Django to NOT use the auto-reloader.'), - make_option('--adminmedia', dest='admin_media_path', default='', - help='Specifies the directory from which to serve admin media.'), - make_option('--prof-path', dest='prof_path', default='/tmp', - help='Specifies the directory which to save profile information in.'), - make_option('--prof-file', dest='prof_file', default='{path}.{duration:06d}ms.{time}', - help='Set filename format, default if "{path}.{duration:06d}ms.{time}".'), - make_option('--nomedia', action='store_true', dest='no_media', default=False, - help='Do not profile MEDIA_URL and ADMIN_MEDIA_URL'), - make_option('--use-cprofile', action='store_true', dest='use_cprofile', default=False, - help='Use cProfile if available, this is disabled per default because of incompatibilities.'), - make_option('--kcachegrind', action='store_true', dest='use_lsprof', default=False, - help='Create kcachegrind compatible lsprof files, this requires and automatically enables cProfile.'), - ) - if USE_STATICFILES: - option_list += ( - make_option('--nostatic', action="store_false", dest='use_static_handler', default=True, - help='Tells Django to NOT automatically serve static files at STATIC_URL.'), - make_option('--insecure', action="store_true", dest='insecure_serving', default=False, - help='Allows serving static files even if DEBUG is False.'), - ) - help = "Starts a lightweight Web server with profiling enabled." - args = '[optional port number, or ipaddr:port]' - - # Validation is called explicitly each time the server is reloaded. - requires_model_validation = False - - def handle(self, addrport='', *args, **options): - import django - from django.core.servers.basehttp import run, WSGIServerException - try: - from django.core.servers.basehttp import AdminMediaHandler - HAS_ADMINMEDIAHANDLER = True - except ImportError: - HAS_ADMINMEDIAHANDLER = False - from django.core.handlers.wsgi import WSGIHandler - - if args: - raise CommandError('Usage is runserver %s' % self.args) - if not addrport: - addr = '' - port = '8000' - else: - try: - addr, port = addrport.split(':') - except ValueError: - addr, port = '', addrport - if not addr: - addr = '127.0.0.1' - - if not port.isdigit(): - raise CommandError("%r is not a valid port number." % port) - - use_reloader = options.get('use_reloader', True) - shutdown_message = options.get('shutdown_message', '') - no_media = options.get('no_media', False) - quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C' - - def inner_run(): - import os - import time - import hotshot - USE_CPROFILE = options.get('use_cprofile', False) - USE_LSPROF = options.get('use_lsprof', False) - if USE_LSPROF: - USE_CPROFILE = True - if USE_CPROFILE: - try: - import cProfile - USE_CPROFILE = True - except ImportError: - print("cProfile disabled, module cannot be imported!") - USE_CPROFILE = False - if USE_LSPROF and not USE_CPROFILE: - raise SystemExit("Kcachegrind compatible output format required cProfile from Python 2.5") - prof_path = options.get('prof_path', '/tmp') - - prof_file = options.get('prof_file', '{path}.{duration:06d}ms.{time}') - if not prof_file.format(path='1', duration=2, time=3): - prof_file = '{path}.{duration:06d}ms.{time}' - print("Filename format is wrong. Default format used: '{path}.{duration:06d}ms.{time}'.") - - def get_exclude_paths(): - exclude_paths = [] - media_url = getattr(settings, 'MEDIA_URL', None) - if media_url: - exclude_paths.append(media_url) - static_url = getattr(settings, 'STATIC_URL', None) - if static_url: - exclude_paths.append(static_url) - admin_media_prefix = getattr(settings, 'ADMIN_MEDIA_PREFIX', None) - if admin_media_prefix: - exclude_paths.append(admin_media_prefix) - return exclude_paths - - def make_profiler_handler(inner_handler): - def handler(environ, start_response): - path_info = environ['PATH_INFO'] - # when using something like a dynamic site middleware is could be necessary - # to refetch the exclude_paths every time since they could change per site. - if no_media and any(path_info.startswith(p) for p in get_exclude_paths()): - return inner_handler(environ, start_response) - path_name = path_info.strip("/").replace('/', '.') or "root" - profname = "%s.%d.prof" % (path_name, time.time()) - profname = os.path.join(prof_path, profname) - if USE_CPROFILE: - prof = cProfile.Profile() - else: - prof = hotshot.Profile(profname) - start = datetime.now() - try: - return prof.runcall(inner_handler, environ, start_response) - finally: - # seeing how long the request took is important! - elap = datetime.now() - start - elapms = elap.seconds * 1000.0 + elap.microseconds / 1000.0 - if USE_LSPROF: - kg = KCacheGrind(prof) - kg.output(open(profname, 'w')) - elif USE_CPROFILE: - prof.dump_stats(profname) - profname2 = prof_file.format(path=path_name, duration=int(elapms), time=int(time.time())) - profname2 = os.path.join(prof_path, "%s.prof" % profname2) - if not USE_CPROFILE: - prof.close() - os.rename(profname, profname2) - return handler - - print("Validating models...") - self.validate(display_num_errors=True) - print("\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE)) - print("Development server is running at http://%s:%s/" % (addr, port)) - print("Quit the server with %s." % quit_command) - path = options.get('admin_media_path', '') - if not path: - admin_media_path = os.path.join(django.__path__[0], 'contrib/admin/static/admin') - if os.path.isdir(admin_media_path): - path = admin_media_path - else: - path = os.path.join(django.__path__[0], 'contrib/admin/media') - try: - handler = WSGIHandler() - if HAS_ADMINMEDIAHANDLER: - handler = AdminMediaHandler(handler, path) - if USE_STATICFILES: - use_static_handler = options.get('use_static_handler', True) - insecure_serving = options.get('insecure_serving', False) - if (use_static_handler and (settings.DEBUG or insecure_serving)): - handler = StaticFilesHandler(handler) - handler = make_profiler_handler(handler) - run(addr, int(port), handler) - except WSGIServerException as e: - # Use helpful error messages instead of ugly tracebacks. - ERRORS = { - 13: "You don't have permission to access that port.", - 98: "That port is already in use.", - 99: "That IP address can't be assigned-to.", - } - try: - error_text = ERRORS[e.args[0].args[0]] - except (AttributeError, KeyError): - error_text = str(e) - sys.stderr.write(self.style.ERROR("Error: %s" % error_text) + '\n') - # Need to use an OS exit because sys.exit doesn't work in a thread - os._exit(1) - except KeyboardInterrupt: - if shutdown_message: - print(shutdown_message) - sys.exit(0) - if use_reloader: - from django.utils import autoreload - autoreload.main(inner_run) - else: - inner_run() diff --git a/vendor-local/lib/python/django_extensions/management/commands/runscript.py b/vendor-local/lib/python/django_extensions/management/commands/runscript.py deleted file mode 100644 index a34080fc472..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/runscript.py +++ /dev/null @@ -1,158 +0,0 @@ -from django.core.management.base import BaseCommand -from optparse import make_option -import imp - - -def vararg_callback(option, opt_str, opt_value, parser): - parser.rargs.insert(0, opt_value) - value = [] - for arg in parser.rargs: - # stop on --foo like options - if arg[:2] == "--" and len(arg) > 2: - break - # stop on -a like options - if arg[:1] == "-": - break - value.append(arg) - - del parser.rargs[:len(value)] - setattr(parser.values, option.dest, value) - - -class Command(BaseCommand): - option_list = BaseCommand.option_list + ( - make_option('--fixtures', action='store_true', dest='infixtures', default=False, - help='Only look in app.fixtures subdir'), - make_option('--noscripts', action='store_true', dest='noscripts', default=False, - help='Look in app.scripts subdir'), - make_option('-s', '--silent', action='store_true', dest='silent', default=False, - help='Run silently, do not show errors and tracebacks'), - make_option('--no-traceback', action='store_true', dest='no_traceback', default=False, - help='Do not show tracebacks'), - make_option('--script-args', action='callback', callback=vararg_callback, type='string', - help='Space-separated argument list to be passed to the scripts. Note that the ' - 'same arguments will be passed to all named scripts.'), - ) - help = 'Runs a script in django context.' - args = "script [script ...]" - - def handle(self, *scripts, **options): - from django.db.models import get_apps - - NOTICE = self.style.SQL_TABLE - NOTICE2 = self.style.SQL_FIELD - ERROR = self.style.ERROR - ERROR2 = self.style.NOTICE - - subdirs = [] - - if not options.get('noscripts'): - subdirs.append('scripts') - if options.get('infixtures'): - subdirs.append('fixtures') - verbosity = int(options.get('verbosity', 1)) - show_traceback = options.get('traceback', True) - if show_traceback is None: - # XXX: traceback is set to None from Django ? - show_traceback = True - no_traceback = options.get('no_traceback', False) - if no_traceback: - show_traceback = False - silent = options.get('silent', False) - if silent: - verbosity = 0 - - if len(subdirs) < 1: - print(NOTICE("No subdirs to run left.")) - return - - if len(scripts) < 1: - print(ERROR("Script name required.")) - return - - def run_script(mod, *script_args): - try: - mod.run(*script_args) - except Exception: - if silent: - return - if verbosity > 0: - print(ERROR("Exception while running run() in '%s'" % mod.__name__)) - if show_traceback: - raise - - def my_import(mod): - if verbosity > 1: - print(NOTICE("Check for %s" % mod)) - # check if module exists before importing - try: - path = None - for package in mod.split('.')[:-1]: - module_tuple = imp.find_module(package, path) - path = imp.load_module(package, *module_tuple).__path__ - imp.find_module(mod.split('.')[-1], path) - except (ImportError, AttributeError): - return False - - t = __import__(mod, [], [], [" "]) - #if verbosity > 1: - # print(NOTICE("Found script %s ..." % mod)) - if hasattr(t, "run"): - if verbosity > 1: - print(NOTICE2("Found script '%s' ..." % mod)) - #if verbosity > 1: - # print(NOTICE("found run() in %s. executing..." % mod)) - return t - else: - if verbosity > 1: - print(ERROR2("Find script '%s' but no run() function found." % mod)) - - def find_modules_for_script(script): - """ find script module which contains 'run' attribute """ - modules = [] - # first look in apps - for app in get_apps(): - app_name = app.__name__.split(".")[:-1] # + ['fixtures'] - for subdir in subdirs: - mod = my_import(".".join(app_name + [subdir, script])) - if mod: - modules.append(mod) - - # try app.DIR.script import - sa = script.split(".") - for subdir in subdirs: - nn = ".".join(sa[:-1] + [subdir, sa[-1]]) - mod = my_import(nn) - if mod: - modules.append(mod) - - # try direct import - if script.find(".") != -1: - mod = my_import(script) - if mod: - modules.append(mod) - - return modules - - if options.get('script_args'): - script_args = options['script_args'] - else: - script_args = [] - for script in scripts: - modules = find_modules_for_script(script) - if not modules: - if verbosity > 0 and not silent: - print(ERROR("No module for script '%s' found" % script)) - for mod in modules: - if verbosity > 1: - print(NOTICE2("Running script '%s' ..." % mod.__name__)) - run_script(mod, *script_args) - - -# Backwards compatibility for Django r9110 -if not [opt for opt in Command.option_list if opt.dest == 'verbosity']: - Command.option_list += ( - make_option('--verbosity', '-v', action="store", dest="verbosity", - default='1', type='choice', choices=['0', '1', '2'], - help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), - ) diff --git a/vendor-local/lib/python/django_extensions/management/commands/runserver_plus.py b/vendor-local/lib/python/django_extensions/management/commands/runserver_plus.py deleted file mode 100644 index 678e8eb91b9..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/runserver_plus.py +++ /dev/null @@ -1,235 +0,0 @@ -from django.conf import settings -from django.core.management.base import BaseCommand, CommandError -from django_extensions.management.utils import setup_logger, RedirectHandler -from optparse import make_option -import os -import re -import socket -import sys -import time - -try: - if 'django.contrib.staticfiles' in settings.INSTALLED_APPS: - from django.contrib.staticfiles.handlers import StaticFilesHandler - USE_STATICFILES = True - elif 'staticfiles' in settings.INSTALLED_APPS: - from staticfiles.handlers import StaticFilesHandler # noqa - USE_STATICFILES = True - else: - USE_STATICFILES = False -except ImportError: - USE_STATICFILES = False - -naiveip_re = re.compile(r"""^(?: -(?P<addr> - (?P<ipv4>\d{1,3}(?:\.\d{1,3}){3}) | # IPv4 address - (?P<ipv6>\[[a-fA-F0-9:]+\]) | # IPv6 address - (?P<fqdn>[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*) # FQDN -):)?(?P<port>\d+)$""", re.X) -DEFAULT_PORT = "8000" - -import logging -logger = logging.getLogger(__name__) - -from django_extensions.management.technical_response import null_technical_500_response - - -class Command(BaseCommand): - option_list = BaseCommand.option_list + ( - make_option('--ipv6', '-6', action='store_true', dest='use_ipv6', default=False, - help='Tells Django to use a IPv6 address.'), - make_option('--noreload', action='store_false', dest='use_reloader', default=True, - help='Tells Django to NOT use the auto-reloader.'), - make_option('--browser', action='store_true', dest='open_browser', - help='Tells Django to open a browser.'), - make_option('--adminmedia', dest='admin_media_path', default='', - help='Specifies the directory from which to serve admin media.'), - make_option('--threaded', action='store_true', dest='threaded', - help='Run in multithreaded mode.'), - make_option('--output', dest='output_file', default=None, - help='Specifies an output file to send a copy of all messages (not flushed immediately).'), - make_option('--print-sql', action='store_true', default=False, - help="Print SQL queries as they're executed"), - make_option('--cert', dest='cert_path', action="store", type="string", - help='To use SSL, specify certificate path.'), - - ) - if USE_STATICFILES: - option_list += ( - make_option('--nostatic', action="store_false", dest='use_static_handler', default=True, - help='Tells Django to NOT automatically serve static files at STATIC_URL.'), - make_option('--insecure', action="store_true", dest='insecure_serving', default=False, - help='Allows serving static files even if DEBUG is False.'), - ) - help = "Starts a lightweight Web server for development." - args = '[optional port number, or ipaddr:port]' - - # Validation is called explicitly each time the server is reloaded. - requires_model_validation = False - - def handle(self, addrport='', *args, **options): - import django - - setup_logger(logger, self.stderr, filename=options.get('output_file', None)) # , fmt="[%(name)s] %(message)s") - logredirect = RedirectHandler(__name__) - - # Redirect werkzeug log items - werklogger = logging.getLogger('werkzeug') - werklogger.setLevel(logging.INFO) - werklogger.addHandler(logredirect) - werklogger.propagate = False - - if options.get("print_sql", False): - from django.db.backends import util - try: - import sqlparse - except ImportError: - sqlparse = None # noqa - - class PrintQueryWrapper(util.CursorDebugWrapper): - def execute(self, sql, params=()): - starttime = time.time() - try: - return self.cursor.execute(sql, params) - finally: - raw_sql = self.db.ops.last_executed_query(self.cursor, sql, params) - execution_time = time.time() - starttime - therest = ' -- [Execution time: %.6fs] [Database: %s]' % (execution_time, self.db.alias) - if sqlparse: - logger.info(sqlparse.format(raw_sql, reindent=True) + therest) - else: - logger.info(raw_sql + therest) - - util.CursorDebugWrapper = PrintQueryWrapper - - try: - from django.core.servers.basehttp import AdminMediaHandler - USE_ADMINMEDIAHANDLER = True - except ImportError: - USE_ADMINMEDIAHANDLER = False - - try: - from django.core.servers.basehttp import get_internal_wsgi_application as WSGIHandler - except ImportError: - from django.core.handlers.wsgi import WSGIHandler # noqa - try: - from werkzeug import run_simple, DebuggedApplication - except ImportError: - raise CommandError("Werkzeug is required to use runserver_plus. Please visit http://werkzeug.pocoo.org/ or install via pip. (pip install Werkzeug)") - - # usurp django's handler - from django.views import debug - debug.technical_500_response = null_technical_500_response - - self.use_ipv6 = options.get('use_ipv6') - if self.use_ipv6 and not socket.has_ipv6: - raise CommandError('Your Python does not support IPv6.') - self._raw_ipv6 = False - if not addrport: - try: - addrport = settings.RUNSERVERPLUS_SERVER_ADDRESS_PORT - except AttributeError: - pass - if not addrport: - self.addr = '' - self.port = DEFAULT_PORT - else: - m = re.match(naiveip_re, addrport) - if m is None: - raise CommandError('"%s" is not a valid port number ' - 'or address:port pair.' % addrport) - self.addr, _ipv4, _ipv6, _fqdn, self.port = m.groups() - if not self.port.isdigit(): - raise CommandError("%r is not a valid port number." % - self.port) - if self.addr: - if _ipv6: - self.addr = self.addr[1:-1] - self.use_ipv6 = True - self._raw_ipv6 = True - elif self.use_ipv6 and not _fqdn: - raise CommandError('"%s" is not a valid IPv6 address.' - % self.addr) - if not self.addr: - self.addr = '::1' if self.use_ipv6 else '127.0.0.1' - - threaded = options.get('threaded', False) - use_reloader = options.get('use_reloader', True) - open_browser = options.get('open_browser', False) - cert_path = options.get("cert_path") - quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C' - bind_url = "http://%s:%s/" % ( - self.addr if not self._raw_ipv6 else '[%s]' % self.addr, self.port) - - def inner_run(): - print("Validating models...") - self.validate(display_num_errors=True) - print("\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE)) - print("Development server is running at %s" % (bind_url,)) - print("Using the Werkzeug debugger (http://werkzeug.pocoo.org/)") - print("Quit the server with %s." % quit_command) - path = options.get('admin_media_path', '') - if not path: - admin_media_path = os.path.join(django.__path__[0], 'contrib/admin/static/admin') - if os.path.isdir(admin_media_path): - path = admin_media_path - else: - path = os.path.join(django.__path__[0], 'contrib/admin/media') - handler = WSGIHandler() - if USE_ADMINMEDIAHANDLER: - handler = AdminMediaHandler(handler, path) - if USE_STATICFILES: - use_static_handler = options.get('use_static_handler', True) - insecure_serving = options.get('insecure_serving', False) - if use_static_handler and (settings.DEBUG or insecure_serving): - handler = StaticFilesHandler(handler) - if open_browser: - import webbrowser - webbrowser.open(bind_url) - if cert_path: - """ - OpenSSL is needed for SSL support. - - This will make flakes8 throw warning since OpenSSL is not used - directly, alas, this is the only way to show meaningful error - messages. See: - http://lucumr.pocoo.org/2011/9/21/python-import-blackbox/ - for more information on python imports. - """ - try: - import OpenSSL # NOQA - except ImportError: - raise CommandError("Python OpenSSL Library is " - "required to use runserver_plus with ssl support. " - "Install via pip (pip install pyOpenSSL).") - - dir_path, cert_file = os.path.split(cert_path) - if not dir_path: - dir_path = os.getcwd() - root, ext = os.path.splitext(cert_file) - certfile = os.path.join(dir_path, root + ".crt") - keyfile = os.path.join(dir_path, root + ".key") - try: - from werkzeug.serving import make_ssl_devcert - if os.path.exists(certfile) and \ - os.path.exists(keyfile): - ssl_context = (certfile, keyfile) - else: # Create cert, key files ourselves. - ssl_context = make_ssl_devcert( - os.path.join(dir_path, root), host='localhost') - except ImportError: - print("Werkzeug version is less than 0.9, trying adhoc certificate.") - ssl_context = "adhoc" - - else: - ssl_context = None - run_simple( - self.addr, - int(self.port), - DebuggedApplication(handler, True), - use_reloader=use_reloader, - use_debugger=True, - threaded=threaded, - ssl_context=ssl_context - ) - inner_run() diff --git a/vendor-local/lib/python/django_extensions/management/commands/set_fake_emails.py b/vendor-local/lib/python/django_extensions/management/commands/set_fake_emails.py deleted file mode 100644 index effeb476e2a..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/set_fake_emails.py +++ /dev/null @@ -1,81 +0,0 @@ -""" -set_fake_emails.py - - Give all users a new email account. Useful for testing in a - development environment. As such, this command is only available when - setting.DEBUG is True. - -""" -from optparse import make_option - -from django.conf import settings -from django.core.management.base import NoArgsCommand, CommandError - -DEFAULT_FAKE_EMAIL = '%(username)s@example.com' - - -class Command(NoArgsCommand): - option_list = NoArgsCommand.option_list + ( - make_option('--email', dest='default_email', default=DEFAULT_FAKE_EMAIL, - help='Use this as the new email format.'), - make_option('-a', '--no-admin', action="store_true", dest='no_admin', default=False, - help='Do not change administrator accounts'), - make_option('-s', '--no-staff', action="store_true", dest='no_staff', default=False, - help='Do not change staff accounts'), - make_option('--include', dest='include_regexp', default=None, - help='Include usernames matching this regexp.'), - make_option('--exclude', dest='exclude_regexp', default=None, - help='Exclude usernames matching this regexp.'), - make_option('--include-groups', dest='include_groups', default=None, - help='Include users matching this group. (use comma seperation for multiple groups)'), - make_option('--exclude-groups', dest='exclude_groups', default=None, - help='Exclude users matching this group. (use comma seperation for multiple groups)'), - ) - help = '''DEBUG only: give all users a new email based on their account data ("%s" by default). Possible parameters are: username, first_name, last_name''' % (DEFAULT_FAKE_EMAIL, ) - requires_model_validation = False - - def handle_noargs(self, **options): - if not settings.DEBUG: - raise CommandError('Only available in debug mode') - - try: - from django.contrib.auth import get_user_model # Django 1.5 - except ImportError: - from django_extensions.future_1_5 import get_user_model - from django.contrib.auth.models import Group - email = options.get('default_email', DEFAULT_FAKE_EMAIL) - include_regexp = options.get('include_regexp', None) - exclude_regexp = options.get('exclude_regexp', None) - include_groups = options.get('include_groups', None) - exclude_groups = options.get('exclude_groups', None) - no_admin = options.get('no_admin', False) - no_staff = options.get('no_staff', False) - - User = get_user_model() - users = User.objects.all() - if no_admin: - users = users.exclude(is_superuser=True) - if no_staff: - users = users.exclude(is_staff=True) - if exclude_groups: - groups = Group.objects.filter(name__in=exclude_groups.split(",")) - if groups: - users = users.exclude(groups__in=groups) - else: - raise CommandError("No group matches filter: %s" % exclude_groups) - if include_groups: - groups = Group.objects.filter(name__in=include_groups.split(",")) - if groups: - users = users.filter(groups__in=groups) - else: - raise CommandError("No groups matches filter: %s" % include_groups) - if exclude_regexp: - users = users.exclude(username__regex=exclude_regexp) - if include_regexp: - users = users.filter(username__regex=include_regexp) - for user in users: - user.email = email % {'username': user.username, - 'first_name': user.first_name, - 'last_name': user.last_name} - user.save() - print('Changed %d emails' % users.count()) diff --git a/vendor-local/lib/python/django_extensions/management/commands/set_fake_passwords.py b/vendor-local/lib/python/django_extensions/management/commands/set_fake_passwords.py deleted file mode 100644 index e502fbfdb46..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/set_fake_passwords.py +++ /dev/null @@ -1,49 +0,0 @@ -""" -set_fake_passwords.py - - Reset all user passwords to a common value. Useful for testing in a - development environment. As such, this command is only available when - setting.DEBUG is True. - -""" -from optparse import make_option - -from django.conf import settings -from django.core.management.base import NoArgsCommand, CommandError - -DEFAULT_FAKE_PASSWORD = 'password' - - -class Command(NoArgsCommand): - option_list = NoArgsCommand.option_list + ( - make_option('--prompt', dest='prompt_passwd', default=False, action='store_true', - help='Prompts for the new password to apply to all users'), - make_option('--password', dest='default_passwd', default=DEFAULT_FAKE_PASSWORD, - help='Use this as default password.'), - ) - help = 'DEBUG only: sets all user passwords to a common value ("%s" by default)' % (DEFAULT_FAKE_PASSWORD, ) - requires_model_validation = False - - def handle_noargs(self, **options): - if not settings.DEBUG: - raise CommandError('Only available in debug mode') - - try: - from django.contrib.auth import get_user_model # Django 1.5 - except ImportError: - from django_extensions.future_1_5 import get_user_model - - if options.get('prompt_passwd', False): - from getpass import getpass - passwd = getpass('Password: ') - if not passwd: - raise CommandError('You must enter a valid password') - else: - passwd = options.get('default_passwd', DEFAULT_FAKE_PASSWORD) - - User = get_user_model() - user = User() - user.set_password(passwd) - count = User.objects.all().update(password=user.password) - - print('Reset %d passwords' % count) diff --git a/vendor-local/lib/python/django_extensions/management/commands/shell_plus.py b/vendor-local/lib/python/django_extensions/management/commands/shell_plus.py deleted file mode 100644 index 0ab0cdda0b2..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/shell_plus.py +++ /dev/null @@ -1,166 +0,0 @@ -import os -import six -import time -from optparse import make_option - -from django.core.management.base import NoArgsCommand -from django.conf import settings - -from django_extensions.management.shells import import_objects - - -class Command(NoArgsCommand): - option_list = NoArgsCommand.option_list + ( - make_option('--plain', action='store_true', dest='plain', - help='Tells Django to use plain Python, not BPython nor IPython.'), - make_option('--bpython', action='store_true', dest='bpython', - help='Tells Django to use BPython, not IPython.'), - make_option('--ipython', action='store_true', dest='ipython', - help='Tells Django to use IPython, not BPython.'), - make_option('--notebook', action='store_true', dest='notebook', - help='Tells Django to use IPython Notebook.'), - make_option('--use-pythonrc', action='store_true', dest='use_pythonrc', - help='Tells Django to execute PYTHONSTARTUP file (BE CAREFULL WITH THIS!)'), - make_option('--print-sql', action='store_true', default=False, - help="Print SQL queries as they're executed"), - make_option('--dont-load', action='append', dest='dont_load', default=[], - help='Ignore autoloading of some apps/models. Can be used several times.'), - make_option('--quiet-load', action='store_true', default=False, dest='quiet_load', - help='Do not display loaded models messages'), - ) - help = "Like the 'shell' command but autoloads the models of all installed Django apps." - - requires_model_validation = True - - def handle_noargs(self, **options): - use_notebook = options.get('notebook', False) - use_ipython = options.get('ipython', False) - use_bpython = options.get('bpython', False) - use_plain = options.get('plain', False) - use_pythonrc = options.get('use_pythonrc', True) - - if options.get("print_sql", False): - # Code from http://gist.github.com/118990 - from django.db.backends import util - sqlparse = None - try: - import sqlparse - except ImportError: - pass - - class PrintQueryWrapper(util.CursorDebugWrapper): - def execute(self, sql, params=()): - starttime = time.time() - try: - return self.cursor.execute(sql, params) - finally: - execution_time = time.time() - starttime - raw_sql = self.db.ops.last_executed_query(self.cursor, sql, params) - if sqlparse: - print(sqlparse.format(raw_sql, reindent=True)) - else: - print(raw_sql) - print("") - print('Execution time: %.6fs [Database: %s]' % (execution_time, self.db.alias)) - print("") - - util.CursorDebugWrapper = PrintQueryWrapper - - def run_notebook(): - from django.conf import settings - from IPython.frontend.html.notebook import notebookapp - app = notebookapp.NotebookApp.instance() - ipython_arguments = getattr(settings, 'IPYTHON_ARGUMENTS', ['--ext', 'django_extensions.management.notebook_extension']) - app.initialize(ipython_arguments) - app.start() - - def run_plain(): - # Using normal Python shell - import code - imported_objects = import_objects(options, self.style) - try: - # Try activating rlcompleter, because it's handy. - import readline - except ImportError: - pass - else: - # We don't have to wrap the following import in a 'try', because - # we already know 'readline' was imported successfully. - import rlcompleter - readline.set_completer(rlcompleter.Completer(imported_objects).complete) - readline.parse_and_bind("tab:complete") - - # We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system - # conventions and get $PYTHONSTARTUP first then import user. - if use_pythonrc: - pythonrc = os.environ.get("PYTHONSTARTUP") - if pythonrc and os.path.isfile(pythonrc): - global_ns = {} - with open(pythonrc) as rcfile: - try: - six.exec_(compile(rcfile.read(), pythonrc, 'exec'), global_ns) - imported_objects.update(global_ns) - except NameError: - pass - # This will import .pythonrc.py as a side-effect - try: - import user # NOQA - except ImportError: - pass - code.interact(local=imported_objects) - - def run_bpython(): - from bpython import embed - imported_objects = import_objects(options, self.style) - embed(imported_objects) - - def run_ipython(): - try: - from IPython import embed - imported_objects = import_objects(options, self.style) - embed(user_ns=imported_objects) - except ImportError: - # IPython < 0.11 - # Explicitly pass an empty list as arguments, because otherwise - # IPython would use sys.argv from this script. - # Notebook not supported for IPython < 0.11. - from IPython.Shell import IPShell - imported_objects = import_objects(options, self.style) - shell = IPShell(argv=[], user_ns=imported_objects) - shell.mainloop() - - shells = ( - ('bpython', run_bpython), - ('ipython', run_ipython), - ('plain', run_plain), - ) - SETTINGS_SHELL_PLUS = getattr(settings, 'SHELL_PLUS', None) - - if use_notebook: - run_notebook() - elif use_plain: - run_plain() - elif use_ipython: - run_ipython() - elif use_bpython: - run_bpython() - elif SETTINGS_SHELL_PLUS: - try: - dict(shells)[SETTINGS_SHELL_PLUS]() - except ImportError: - import traceback - traceback.print_exc() - print(self.style.ERROR("Could not load '%s' Python environment." % SETTINGS_SHELL_PLUS)) - else: - for shell_name, func in shells: - try: - func() - except ImportError: - continue - else: - break - else: - import traceback - traceback.print_exc() - print(self.style.ERROR("Could not load any interactive Python environment.")) - diff --git a/vendor-local/lib/python/django_extensions/management/commands/show_templatetags.py b/vendor-local/lib/python/django_extensions/management/commands/show_templatetags.py deleted file mode 100644 index 63a5077f310..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/show_templatetags.py +++ /dev/null @@ -1,100 +0,0 @@ -from django.conf import settings -from django.template import get_library -import os -import inspect -from django.core.management.base import BaseCommand -from django.core.management import color -from django.utils import termcolors - - -def color_style(): - style = color.color_style() - style.FILTER = termcolors.make_style(fg='yellow', opts=('bold',)) - style.MODULE_NAME = termcolors.make_style(fg='green', opts=('bold',)) - style.TAG = termcolors.make_style(fg='red', opts=('bold',)) - style.TAGLIB = termcolors.make_style(fg='blue', opts=('bold',)) - return style - - -def format_block(block, nlspaces=0): - '''Format the given block of text, trimming leading/trailing - empty lines and any leading whitespace that is common to all lines. - The purpose is to let us list a code block as a multiline, - triple-quoted Python string, taking care of - indentation concerns. - http://code.activestate.com/recipes/145672/''' - - import re - - # separate block into lines - lines = str(block).split('\n') - - # remove leading/trailing empty lines - while lines and not lines[0]: - del lines[0] - while lines and not lines[-1]: - del lines[-1] - - # look at first line to see how much indentation to trim - ws = re.match(r'\s*', lines[0]).group(0) - if ws: - lines = map(lambda x: x.replace(ws, '', 1), lines) - - # remove leading/trailing blank lines (after leading ws removal) - # we do this again in case there were pure-whitespace lines - while lines and not lines[0]: - del lines[0] - while lines and not lines[-1]: - del lines[-1] - - # account for user-specified leading spaces - flines = ['%s%s' % (' ' * nlspaces, line) for line in lines] - - return '\n'.join(flines) + '\n' - - -class Command(BaseCommand): - help = "Displays template tags and filters available in the current project." - results = "" - - def add_result(self, s, depth=0): - self.results += '\n%s\n' % s.rjust(depth * 4 + len(s)) - - def handle(self, *args, **options): - if args: - appname, = args - - style = color_style() - - if settings.ADMIN_FOR: - settings_modules = [__import__(m, {}, {}, ['']) for m in settings.ADMIN_FOR] - else: - settings_modules = [settings] - - for settings_mod in settings_modules: - for app in settings_mod.INSTALLED_APPS: - try: - templatetag_mod = __import__(app + '.templatetags', {}, {}, ['']) - except ImportError: - continue - mod_path = inspect.getabsfile(templatetag_mod) - mod_files = os.listdir(os.path.dirname(mod_path)) - tag_files = [i.rstrip('.py') for i in mod_files if i.endswith('.py') and i[0] != '_'] - app_labeled = False - for taglib in tag_files: - try: - lib = get_library(taglib) - except: - continue - if not app_labeled: - self.add_result('\nApp: %s' % style.MODULE_NAME(app)) - app_labeled = True - self.add_result('load: %s' % style.TAGLIB(taglib), 1) - for items, label, style_func in [(lib.tags, 'Tag:', style.TAG), (lib.filters, 'Filter:', style.FILTER)]: - for item in items: - self.add_result('%s %s' % (label, style_func(item)), 2) - doc = inspect.getdoc(items[item]) - if doc: - self.add_result(format_block(doc, 12)) - return self.results - # return "\n".join(results) diff --git a/vendor-local/lib/python/django_extensions/management/commands/show_urls.py b/vendor-local/lib/python/django_extensions/management/commands/show_urls.py deleted file mode 100644 index 12123577482..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/show_urls.py +++ /dev/null @@ -1,103 +0,0 @@ -from django.conf import settings -from django.core.exceptions import ViewDoesNotExist -from django.core.urlresolvers import RegexURLPattern, RegexURLResolver -from django.core.management.base import BaseCommand -from optparse import make_option - -try: - # 2008-05-30 admindocs found in newforms-admin brand - from django.contrib.admindocs.views import simplify_regex - assert simplify_regex -except ImportError: - # fall back to trunk, pre-NFA merge - from django.contrib.admin.views.doc import simplify_regex -import re - -from django_extensions.management.color import color_style - - -def extract_views_from_urlpatterns(urlpatterns, base=''): - """ - Return a list of views from a list of urlpatterns. - - Each object in the returned list is a two-tuple: (view_func, regex) - """ - views = [] - for p in urlpatterns: - if isinstance(p, RegexURLPattern): - try: - views.append((p.callback, base + p.regex.pattern, p.name)) - except ViewDoesNotExist: - continue - elif isinstance(p, RegexURLResolver): - try: - patterns = p.url_patterns - except ImportError: - continue - views.extend(extract_views_from_urlpatterns(patterns, base + p.regex.pattern)) - elif hasattr(p, '_get_callback'): - try: - views.append((p._get_callback(), base + p.regex.pattern, p.name)) - except ViewDoesNotExist: - continue - elif hasattr(p, 'url_patterns') or hasattr(p, '_get_url_patterns'): - try: - patterns = p.url_patterns - except ImportError: - continue - views.extend(extract_views_from_urlpatterns(patterns, base + p.regex.pattern)) - else: - raise TypeError("%s does not appear to be a urlpattern object" % p) - return views - - -class Command(BaseCommand): - option_list = BaseCommand.option_list + ( - make_option("--unsorted", "-u", action="store_true", dest="unsorted", - help="Show urls unsorted but same order as found in url patterns"), - ) - - help = "Displays all of the url matching routes for the project." - - requires_model_validation = True - - def handle(self, *args, **options): - if args: - appname, = args - - style = color_style() - - if settings.ADMIN_FOR: - settings_modules = [__import__(m, {}, {}, ['']) for m in settings.ADMIN_FOR] - else: - settings_modules = [settings] - - views = [] - for settings_mod in settings_modules: - try: - urlconf = __import__(settings_mod.ROOT_URLCONF, {}, {}, ['']) - except Exception as e: - if options.get('traceback', None): - import traceback - traceback.print_exc() - print(style.ERROR("Error occurred while trying to load %s: %s" % (settings_mod.ROOT_URLCONF, str(e)))) - continue - view_functions = extract_views_from_urlpatterns(urlconf.urlpatterns) - for (func, regex, url_name) in view_functions: - if hasattr(func, '__name__'): - func_name = func.__name__ - elif hasattr(func, '__class__'): - func_name = '%s()' % func.__class__.__name__ - else: - func_name = re.sub(r' at 0x[0-9a-f]+', '', repr(func)) - views.append("%(url)s\t%(module)s.%(name)s\t%(url_name)s" % { - 'name': style.MODULE_NAME(func_name), - 'module': style.MODULE(func.__module__), - 'url_name': style.URL_NAME(url_name or ''), - 'url': style.URL(simplify_regex(regex)) - }) - - if not options.get('unsorted', False): - views = sorted(views) - - return "\n".join([v for v in views]) + "\n" diff --git a/vendor-local/lib/python/django_extensions/management/commands/sqlcreate.py b/vendor-local/lib/python/django_extensions/management/commands/sqlcreate.py deleted file mode 100644 index 8eacf127a6a..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/sqlcreate.py +++ /dev/null @@ -1,89 +0,0 @@ -from optparse import make_option -import sys -import socket - -import django -from django.core.management.base import CommandError, BaseCommand -from django.conf import settings - - -class Command(BaseCommand): - option_list = BaseCommand.option_list + ( - make_option('-R', '--router', action='store', - dest='router', default=None, - help='Use this router-database other then defined in settings.py'), - make_option('-D', '--drop', action='store_true', - dest='drop', default=False, - help='If given, includes commands to drop any existing user and database.'), - ) - help = """Generates the SQL to create your database for you, as specified in settings.py -The envisioned use case is something like this: - - ./manage.py sqlcreate [--router=<routername>] | mysql -u <db_administrator> -p - ./manage.py sqlcreate [--router=<routername>] | psql -U <db_administrator> -W""" - - requires_model_validation = False - can_import_settings = True - - @staticmethod - def set_db_settings(**options): - if django.get_version() >= "1.2": - router = options.get('router') - if router is None: - return False - - # retrieve this with the 'using' argument - dbinfo = settings.DATABASES.get(router) - settings.DATABASE_ENGINE = dbinfo.get('ENGINE').split('.')[-1] - settings.DATABASE_USER = dbinfo.get('USER') - settings.DATABASE_PASSWORD = dbinfo.get('PASSWORD') - settings.DATABASE_NAME = dbinfo.get('NAME') - settings.DATABASE_HOST = dbinfo.get('HOST') - settings.DATABASE_PORT = dbinfo.get('PORT') - return True - else: - # settings are set for django < 1.2 no modification needed - return True - - def handle(self, *args, **options): - - if django.get_version() >= "1.2": - got_db_settings = self.set_db_settings(**options) - if not got_db_settings: - raise CommandError("You are using Django %s which requires to specify the db-router.\nPlease specify the router by adding --router=<routername> to this command." % django.get_version()) - - #print("%s %s %s %s" % (settings.DATABASE_ENGINE, settings.DATABASE_NAME, settings.DATABASE_USER, settings.DATABASE_PASSWORD)) - engine = settings.DATABASE_ENGINE - dbname = settings.DATABASE_NAME - dbuser = settings.DATABASE_USER - dbpass = settings.DATABASE_PASSWORD - dbhost = settings.DATABASE_HOST - dbclient = socket.gethostname() - - # django settings file tells you that localhost should be specified by leaving - # the DATABASE_HOST blank - if not dbhost: - dbhost = 'localhost' - - if engine == 'mysql': - sys.stderr.write("""-- WARNING!: https://docs.djangoproject.com/en/dev/ref/databases/#collation-settings --- Please read this carefully! Collation will be set to utf8_bin to have case-sensitive data. -""") - print("CREATE DATABASE %s CHARACTER SET utf8 COLLATE utf8_bin;" % dbname) - print("GRANT ALL PRIVILEGES ON %s.* to '%s'@'%s' identified by '%s';" % ( - dbname, dbuser, dbclient, dbpass - )) - elif engine == 'postgresql_psycopg2': - if options.get('drop'): - print("DROP DATABASE IF EXISTS %s;" % (dbname,)) - print("DROP USER IF EXISTS %s;" % (dbuser,)) - print("CREATE USER %s WITH ENCRYPTED PASSWORD '%s' CREATEDB;" % (dbuser, dbpass)) - print("CREATE DATABASE %s WITH ENCODING 'UTF-8' OWNER \"%s\";" % (dbname, dbuser)) - print("GRANT ALL PRIVILEGES ON DATABASE %s TO %s;" % (dbname, dbuser)) - elif engine == 'sqlite3': - sys.stderr.write("-- manage.py syncdb will automatically create a sqlite3 database file.\n") - else: - # CREATE DATABASE is not SQL standard, but seems to be supported by most. - sys.stderr.write("-- Don't know how to handle '%s' falling back to SQL.\n" % engine) - print("CREATE DATABASE %s;" % dbname) - print("GRANT ALL PRIVILEGES ON DATABASE %s to %s" % (dbname, dbuser)) diff --git a/vendor-local/lib/python/django_extensions/management/commands/sqldiff.py b/vendor-local/lib/python/django_extensions/management/commands/sqldiff.py deleted file mode 100644 index d89d218eef4..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/sqldiff.py +++ /dev/null @@ -1,678 +0,0 @@ -""" -sqldiff.py - Prints the (approximated) difference between models and database - -TODO: - - better support for relations - - better support for constraints (mainly postgresql?) - - support for table spaces with postgresql - - when a table is not managed (meta.managed==False) then only do a one-way - sqldiff ? show differences from db->table but not the other way around since - it's not managed. - -KNOWN ISSUES: - - MySQL has by far the most problems with introspection. Please be - carefull when using MySQL with sqldiff. - - Booleans are reported back as Integers, so there's know way to know if - there was a real change. - - Varchar sizes are reported back without unicode support so their size - may change in comparison to the real length of the varchar. - - Some of the 'fixes' to counter these problems might create false - positives or false negatives. -""" - -from django.core.management.base import BaseCommand -from django.core.management import sql as _sql -from django.core.management import CommandError -from django.core.management.color import no_style -from django.db import transaction, connection -from django.db.models.fields import IntegerField -from optparse import make_option - -ORDERING_FIELD = IntegerField('_order', null=True) - - -def flatten(l, ltypes=(list, tuple)): - ltype = type(l) - l = list(l) - i = 0 - while i < len(l): - while isinstance(l[i], ltypes): - if not l[i]: - l.pop(i) - i -= 1 - break - else: - l[i:i + 1] = l[i] - i += 1 - return ltype(l) - - -def all_local_fields(meta): - all_fields = meta.local_fields[:] - for parent in meta.parents: - all_fields.extend(all_local_fields(parent._meta)) - return all_fields - - -class SQLDiff(object): - DATA_TYPES_REVERSE_OVERRIDE = {} - - DIFF_TYPES = [ - 'error', - 'comment', - 'table-missing-in-db', - 'field-missing-in-db', - 'field-missing-in-model', - 'index-missing-in-db', - 'index-missing-in-model', - 'unique-missing-in-db', - 'unique-missing-in-model', - 'field-type-differ', - 'field-parameter-differ', - 'notnull-differ', - ] - DIFF_TEXTS = { - 'error': 'error: %(0)s', - 'comment': 'comment: %(0)s', - 'table-missing-in-db': "table '%(0)s' missing in database", - 'field-missing-in-db': "field '%(1)s' defined in model but missing in database", - 'field-missing-in-model': "field '%(1)s' defined in database but missing in model", - 'index-missing-in-db': "field '%(1)s' INDEX defined in model but missing in database", - 'index-missing-in-model': "field '%(1)s' INDEX defined in database schema but missing in model", - 'unique-missing-in-db': "field '%(1)s' UNIQUE defined in model but missing in database", - 'unique-missing-in-model': "field '%(1)s' UNIQUE defined in database schema but missing in model", - 'field-type-differ': "field '%(1)s' not of same type: db='%(3)s', model='%(2)s'", - 'field-parameter-differ': "field '%(1)s' parameters differ: db='%(3)s', model='%(2)s'", - 'notnull-differ': "field '%(1)s' null differ: db='%(3)s', model='%(2)s'", - } - - SQL_FIELD_MISSING_IN_DB = lambda self, style, qn, args: "%s %s\n\t%s %s %s;" % (style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(qn(args[0])), style.SQL_KEYWORD('ADD'), style.SQL_FIELD(qn(args[1])), style.SQL_COLTYPE(args[2])) - SQL_FIELD_MISSING_IN_MODEL = lambda self, style, qn, args: "%s %s\n\t%s %s;" % (style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(qn(args[0])), style.SQL_KEYWORD('DROP COLUMN'), style.SQL_FIELD(qn(args[1]))) - SQL_INDEX_MISSING_IN_DB = lambda self, style, qn, args: "%s %s\n\t%s %s (%s);" % (style.SQL_KEYWORD('CREATE INDEX'), style.SQL_TABLE(qn("%s_idx" % '_'.join(args[0:2]))), style.SQL_KEYWORD('ON'), style.SQL_TABLE(qn(args[0])), style.SQL_FIELD(qn(args[1]))) - # FIXME: need to lookup index name instead of just appending _idx to table + fieldname - SQL_INDEX_MISSING_IN_MODEL = lambda self, style, qn, args: "%s %s;" % (style.SQL_KEYWORD('DROP INDEX'), style.SQL_TABLE(qn("%s_idx" % '_'.join(args[0:2])))) - SQL_UNIQUE_MISSING_IN_DB = lambda self, style, qn, args: "%s %s\n\t%s %s (%s);" % (style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(qn(args[0])), style.SQL_KEYWORD('ADD'), style.SQL_KEYWORD('UNIQUE'), style.SQL_FIELD(qn(args[1]))) - # FIXME: need to lookup unique constraint name instead of appending _key to table + fieldname - SQL_UNIQUE_MISSING_IN_MODEL = lambda self, style, qn, args: "%s %s\n\t%s %s %s;" % (style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(qn(args[0])), style.SQL_KEYWORD('DROP'), style.SQL_KEYWORD('CONSTRAINT'), style.SQL_TABLE(qn("%s_key" % ('_'.join(args[:2]))))) - SQL_FIELD_TYPE_DIFFER = lambda self, style, qn, args: "%s %s\n\t%s %s %s;" % (style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(qn(args[0])), style.SQL_KEYWORD("MODIFY"), style.SQL_FIELD(qn(args[1])), style.SQL_COLTYPE(args[2])) - SQL_FIELD_PARAMETER_DIFFER = lambda self, style, qn, args: "%s %s\n\t%s %s %s;" % (style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(qn(args[0])), style.SQL_KEYWORD("MODIFY"), style.SQL_FIELD(qn(args[1])), style.SQL_COLTYPE(args[2])) - SQL_NOTNULL_DIFFER = lambda self, style, qn, args: "%s %s\n\t%s %s %s %s;" % (style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(qn(args[0])), style.SQL_KEYWORD('MODIFY'), style.SQL_FIELD(qn(args[1])), style.SQL_KEYWORD(args[2]), style.SQL_KEYWORD('NOT NULL')) - SQL_ERROR = lambda self, style, qn, args: style.NOTICE('-- Error: %s' % style.ERROR(args[0])) - SQL_COMMENT = lambda self, style, qn, args: style.NOTICE('-- Comment: %s' % style.SQL_TABLE(args[0])) - SQL_TABLE_MISSING_IN_DB = lambda self, style, qn, args: style.NOTICE('-- Table missing: %s' % args[0]) - - def __init__(self, app_models, options): - self.app_models = app_models - self.options = options - self.dense = options.get('dense_output', False) - - try: - self.introspection = connection.introspection - except AttributeError: - from django.db import get_introspection_module - self.introspection = get_introspection_module() - - self.cursor = connection.cursor() - self.django_tables = self.get_django_tables(options.get('only_existing', True)) - self.db_tables = self.introspection.get_table_list(self.cursor) - self.differences = [] - self.unknown_db_fields = {} - - self.DIFF_SQL = { - 'error': self.SQL_ERROR, - 'comment': self.SQL_COMMENT, - 'table-missing-in-db': self.SQL_TABLE_MISSING_IN_DB, - 'field-missing-in-db': self.SQL_FIELD_MISSING_IN_DB, - 'field-missing-in-model': self.SQL_FIELD_MISSING_IN_MODEL, - 'index-missing-in-db': self.SQL_INDEX_MISSING_IN_DB, - 'index-missing-in-model': self.SQL_INDEX_MISSING_IN_MODEL, - 'unique-missing-in-db': self.SQL_UNIQUE_MISSING_IN_DB, - 'unique-missing-in-model': self.SQL_UNIQUE_MISSING_IN_MODEL, - 'field-type-differ': self.SQL_FIELD_TYPE_DIFFER, - 'field-parameter-differ': self.SQL_FIELD_PARAMETER_DIFFER, - 'notnull-differ': self.SQL_NOTNULL_DIFFER, - } - - def add_app_model_marker(self, app_label, model_name): - self.differences.append((app_label, model_name, [])) - - def add_difference(self, diff_type, *args): - assert diff_type in self.DIFF_TYPES, 'Unknown difference type' - self.differences[-1][-1].append((diff_type, args)) - - def get_django_tables(self, only_existing): - try: - django_tables = self.introspection.django_table_names(only_existing=only_existing) - except AttributeError: - # backwards compatibility for before introspection refactoring (r8296) - try: - django_tables = _sql.django_table_names(only_existing=only_existing) - except AttributeError: - # backwards compatibility for before svn r7568 - django_tables = _sql.django_table_list(only_existing=only_existing) - return django_tables - - def sql_to_dict(self, query, param): - """ sql_to_dict(query, param) -> list of dicts - - code from snippet at http://www.djangosnippets.org/snippets/1383/ - """ - cursor = connection.cursor() - cursor.execute(query, param) - fieldnames = [name[0] for name in cursor.description] - result = [] - for row in cursor.fetchall(): - rowset = [] - for field in zip(fieldnames, row): - rowset.append(field) - result.append(dict(rowset)) - return result - - def get_field_model_type(self, field): - return field.db_type(connection=connection) - - def get_field_db_type(self, description, field=None, table_name=None): - from django.db import models - # DB-API cursor.description - #(name, type_code, display_size, internal_size, precision, scale, null_ok) = description - type_code = description[1] - if type_code in self.DATA_TYPES_REVERSE_OVERRIDE: - reverse_type = self.DATA_TYPES_REVERSE_OVERRIDE[type_code] - else: - try: - try: - reverse_type = self.introspection.data_types_reverse[type_code] - except AttributeError: - # backwards compatibility for before introspection refactoring (r8296) - reverse_type = self.introspection.DATA_TYPES_REVERSE.get(type_code) - except KeyError: - reverse_type = self.get_field_db_type_lookup(type_code) - if not reverse_type: - # type_code not found in data_types_reverse map - key = (self.differences[-1][:2], description[:2]) - if key not in self.unknown_db_fields: - self.unknown_db_fields[key] = 1 - self.add_difference('comment', "Unknown database type for field '%s' (%s)" % (description[0], type_code)) - return None - - kwargs = {} - if isinstance(reverse_type, tuple): - kwargs.update(reverse_type[1]) - reverse_type = reverse_type[0] - - if reverse_type == "CharField" and description[3]: - kwargs['max_length'] = description[3] - - if reverse_type == "DecimalField": - kwargs['max_digits'] = description[4] - kwargs['decimal_places'] = description[5] and abs(description[5]) or description[5] - - if description[6]: - kwargs['blank'] = True - if not reverse_type in ('TextField', 'CharField'): - kwargs['null'] = True - - if '.' in reverse_type: - from django.utils import importlib - # TODO: when was importlib added to django.utils ? and do we - # need to add backwards compatibility code ? - module_path, package_name = reverse_type.rsplit('.', 1) - module = importlib.import_module(module_path) - field_db_type = getattr(module, package_name)(**kwargs).db_type(connection=connection) - else: - field_db_type = getattr(models, reverse_type)(**kwargs).db_type(connection=connection) - return field_db_type - - def get_field_db_type_lookup(self, type_code): - return None - - def strip_parameters(self, field_type): - if field_type and field_type != 'double precision': - return field_type.split(" ")[0].split("(")[0].lower() - return field_type - - def find_unique_missing_in_db(self, meta, table_indexes, table_name): - for field in all_local_fields(meta): - if field.unique: - attname = field.db_column or field.attname - if attname in table_indexes and table_indexes[attname]['unique']: - continue - self.add_difference('unique-missing-in-db', table_name, attname) - - def find_unique_missing_in_model(self, meta, table_indexes, table_name): - # TODO: Postgresql does not list unique_togethers in table_indexes - # MySQL does - fields = dict([(field.db_column or field.name, field.unique) for field in all_local_fields(meta)]) - for att_name, att_opts in table_indexes.iteritems(): - if att_opts['unique'] and att_name in fields and not fields[att_name]: - if att_name in flatten(meta.unique_together): - continue - self.add_difference('unique-missing-in-model', table_name, att_name) - - def find_index_missing_in_db(self, meta, table_indexes, table_name): - for field in all_local_fields(meta): - if field.db_index: - attname = field.db_column or field.attname - if not attname in table_indexes: - self.add_difference('index-missing-in-db', table_name, attname) - - def find_index_missing_in_model(self, meta, table_indexes, table_name): - fields = dict([(field.name, field) for field in all_local_fields(meta)]) - for att_name, att_opts in table_indexes.iteritems(): - if att_name in fields: - field = fields[att_name] - if field.db_index: - continue - if att_opts['primary_key'] and field.primary_key: - continue - if att_opts['unique'] and field.unique: - continue - if att_opts['unique'] and att_name in flatten(meta.unique_together): - continue - self.add_difference('index-missing-in-model', table_name, att_name) - - def find_field_missing_in_model(self, fieldmap, table_description, table_name): - for row in table_description: - if row[0] not in fieldmap: - self.add_difference('field-missing-in-model', table_name, row[0]) - - def find_field_missing_in_db(self, fieldmap, table_description, table_name): - db_fields = [row[0] for row in table_description] - for field_name, field in fieldmap.iteritems(): - if field_name not in db_fields: - self.add_difference('field-missing-in-db', table_name, field_name, field.db_type(connection=connection)) - - def find_field_type_differ(self, meta, table_description, table_name, func=None): - db_fields = dict([(row[0], row) for row in table_description]) - for field in all_local_fields(meta): - if field.name not in db_fields: - continue - description = db_fields[field.name] - - model_type = self.get_field_model_type(field) - db_type = self.get_field_db_type(description, field) - - # use callback function if defined - if func: - model_type, db_type = func(field, description, model_type, db_type) - - if not self.strip_parameters(db_type) == self.strip_parameters(model_type): - self.add_difference('field-type-differ', table_name, field.name, model_type, db_type) - - def find_field_parameter_differ(self, meta, table_description, table_name, func=None): - db_fields = dict([(row[0], row) for row in table_description]) - for field in all_local_fields(meta): - if field.name not in db_fields: - continue - description = db_fields[field.name] - - model_type = self.get_field_model_type(field) - db_type = self.get_field_db_type(description, field, table_name) - - if not self.strip_parameters(model_type) == self.strip_parameters(db_type): - continue - - # use callback function if defined - if func: - model_type, db_type = func(field, description, model_type, db_type) - - if not model_type == db_type: - self.add_difference('field-parameter-differ', table_name, field.name, model_type, db_type) - - @transaction.commit_manually - def find_differences(self): - cur_app_label = None - for app_model in self.app_models: - meta = app_model._meta - table_name = meta.db_table - app_label = meta.app_label - - if cur_app_label != app_label: - # Marker indicating start of difference scan for this table_name - self.add_app_model_marker(app_label, app_model.__name__) - - #if not table_name in self.django_tables: - if not table_name in self.db_tables: - # Table is missing from database - self.add_difference('table-missing-in-db', table_name) - continue - - table_indexes = self.introspection.get_indexes(self.cursor, table_name) - fieldmap = dict([(field.db_column or field.get_attname(), field) for field in all_local_fields(meta)]) - - # add ordering field if model uses order_with_respect_to - if meta.order_with_respect_to: - fieldmap['_order'] = ORDERING_FIELD - - try: - table_description = self.introspection.get_table_description(self.cursor, table_name) - except Exception as e: - self.add_difference('error', 'unable to introspect table: %s' % str(e).strip()) - transaction.rollback() # reset transaction - continue - else: - transaction.commit() - # Fields which are defined in database but not in model - # 1) find: 'unique-missing-in-model' - self.find_unique_missing_in_model(meta, table_indexes, table_name) - # 2) find: 'index-missing-in-model' - self.find_index_missing_in_model(meta, table_indexes, table_name) - # 3) find: 'field-missing-in-model' - self.find_field_missing_in_model(fieldmap, table_description, table_name) - - # Fields which are defined in models but not in database - # 4) find: 'field-missing-in-db' - self.find_field_missing_in_db(fieldmap, table_description, table_name) - # 5) find: 'unique-missing-in-db' - self.find_unique_missing_in_db(meta, table_indexes, table_name) - # 6) find: 'index-missing-in-db' - self.find_index_missing_in_db(meta, table_indexes, table_name) - - # Fields which have a different type or parameters - # 7) find: 'type-differs' - self.find_field_type_differ(meta, table_description, table_name) - # 8) find: 'type-parameter-differs' - self.find_field_parameter_differ(meta, table_description, table_name) - - def print_diff(self, style=no_style()): - """ print differences to stdout """ - if self.options.get('sql', True): - self.print_diff_sql(style) - else: - self.print_diff_text(style) - - def print_diff_text(self, style): - cur_app_label = None - for app_label, model_name, diffs in self.differences: - if not diffs: - continue - if not self.dense and cur_app_label != app_label: - print("%s %s" % (style.NOTICE("+ Application:"), style.SQL_TABLE(app_label))) - cur_app_label = app_label - if not self.dense: - print("%s %s" % (style.NOTICE("|-+ Differences for model:"), style.SQL_TABLE(model_name))) - for diff in diffs: - diff_type, diff_args = diff - text = self.DIFF_TEXTS[diff_type] % dict((str(i), style.SQL_TABLE(e)) for i, e in enumerate(diff_args)) - text = "'".join(i % 2 == 0 and style.ERROR(e) or e for i, e in enumerate(text.split("'"))) - if not self.dense: - print("%s %s" % (style.NOTICE("|--+"), text)) - else: - print("%s %s %s %s %s" % (style.NOTICE("App"), style.SQL_TABLE(app_label), style.NOTICE('Model'), style.SQL_TABLE(model_name), text)) - - def print_diff_sql(self, style): - cur_app_label = None - qn = connection.ops.quote_name - has_differences = max([len(diffs) for app_label, model_name, diffs in self.differences]) - if not has_differences: - if not self.dense: - print(style.SQL_KEYWORD("-- No differences")) - else: - print(style.SQL_KEYWORD("BEGIN;")) - for app_label, model_name, diffs in self.differences: - if not diffs: - continue - if not self.dense and cur_app_label != app_label: - print(style.NOTICE("-- Application: %s" % style.SQL_TABLE(app_label))) - cur_app_label = app_label - if not self.dense: - print(style.NOTICE("-- Model: %s" % style.SQL_TABLE(model_name))) - for diff in diffs: - diff_type, diff_args = diff - text = self.DIFF_SQL[diff_type](style, qn, diff_args) - if self.dense: - text = text.replace("\n\t", " ") - print(text) - print(style.SQL_KEYWORD("COMMIT;")) - - -class GenericSQLDiff(SQLDiff): - pass - - -class MySQLDiff(SQLDiff): - # All the MySQL hacks together create something of a problem - # Fixing one bug in MySQL creates another issue. So just keep in mind - # that this is way unreliable for MySQL atm. - def get_field_db_type(self, description, field=None, table_name=None): - from MySQLdb.constants import FIELD_TYPE - # weird bug? in mysql db-api where it returns three times the correct value for field length - # if i remember correctly it had something todo with unicode strings - # TODO: Fix this is a more meaningful and better understood manner - description = list(description) - if description[1] not in [FIELD_TYPE.TINY, FIELD_TYPE.SHORT]: # exclude tinyints from conversion. - description[3] = description[3] / 3 - description[4] = description[4] / 3 - db_type = super(MySQLDiff, self).get_field_db_type(description) - if not db_type: - return - if field: - if field.primary_key and (db_type == 'integer' or db_type == 'bigint'): - db_type += ' AUTO_INCREMENT' - # MySQL isn't really sure about char's and varchar's like sqlite - field_type = self.get_field_model_type(field) - # Fix char/varchar inconsistencies - if self.strip_parameters(field_type) == 'char' and self.strip_parameters(db_type) == 'varchar': - db_type = db_type.lstrip("var") - # They like to call 'bool's 'tinyint(1)' and introspection makes that a integer - # just convert it back to it's proper type, a bool is a bool and nothing else. - if db_type == 'integer' and description[1] == FIELD_TYPE.TINY and description[4] == 1: - db_type = 'bool' - if db_type == 'integer' and description[1] == FIELD_TYPE.SHORT: - db_type = 'smallint UNSIGNED' # FIXME: what about if it's not UNSIGNED ? - return db_type - - -class SqliteSQLDiff(SQLDiff): - # Unique does not seem to be implied on Sqlite for Primary_key's - # if this is more generic among databases this might be usefull - # to add to the superclass's find_unique_missing_in_db method - def find_unique_missing_in_db(self, meta, table_indexes, table_name): - for field in all_local_fields(meta): - if field.unique: - attname = field.db_column or field.attname - if attname in table_indexes and table_indexes[attname]['unique']: - continue - if attname in table_indexes and table_indexes[attname]['primary_key']: - continue - self.add_difference('unique-missing-in-db', table_name, attname) - - # Finding Indexes by using the get_indexes dictionary doesn't seem to work - # for sqlite. - def find_index_missing_in_db(self, meta, table_indexes, table_name): - pass - - def find_index_missing_in_model(self, meta, table_indexes, table_name): - pass - - def get_field_db_type(self, description, field=None, table_name=None): - db_type = super(SqliteSQLDiff, self).get_field_db_type(description) - if not db_type: - return - if field: - field_type = self.get_field_model_type(field) - # Fix char/varchar inconsistencies - if self.strip_parameters(field_type) == 'char' and self.strip_parameters(db_type) == 'varchar': - db_type = db_type.lstrip("var") - return db_type - - -class PostgresqlSQLDiff(SQLDiff): - DATA_TYPES_REVERSE_OVERRIDE = { - 1042: 'CharField', - # postgis types (TODO: support is very incomplete) - 17506: 'django.contrib.gis.db.models.fields.PointField', - 55902: 'django.contrib.gis.db.models.fields.MultiPolygonField', - } - - DATA_TYPES_REVERSE_NAME = { - 'hstore': 'django_hstore.hstore.DictionaryField', - } - - # Hopefully in the future we can add constraint checking and other more - # advanced checks based on this database. - SQL_LOAD_CONSTRAINTS = """ - SELECT nspname, relname, conname, attname, pg_get_constraintdef(pg_constraint.oid) - FROM pg_constraint - INNER JOIN pg_attribute ON pg_constraint.conrelid = pg_attribute.attrelid AND pg_attribute.attnum = any(pg_constraint.conkey) - INNER JOIN pg_class ON conrelid=pg_class.oid - INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace - ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END,contype,nspname,relname,conname; - """ - SQL_LOAD_NULL = """ - SELECT nspname, relname, attname, attnotnull - FROM pg_attribute - INNER JOIN pg_class ON attrelid=pg_class.oid - INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace; - """ - - SQL_FIELD_TYPE_DIFFER = lambda self, style, qn, args: "%s %s\n\t%s %s %s %s;" % (style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(qn(args[0])), style.SQL_KEYWORD('ALTER'), style.SQL_FIELD(qn(args[1])), style.SQL_KEYWORD("TYPE"), style.SQL_COLTYPE(args[2])) - SQL_FIELD_PARAMETER_DIFFER = lambda self, style, qn, args: "%s %s\n\t%s %s %s %s;" % (style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(qn(args[0])), style.SQL_KEYWORD('ALTER'), style.SQL_FIELD(qn(args[1])), style.SQL_KEYWORD("TYPE"), style.SQL_COLTYPE(args[2])) - SQL_NOTNULL_DIFFER = lambda self, style, qn, args: "%s %s\n\t%s %s %s %s;" % (style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(qn(args[0])), style.SQL_KEYWORD('ALTER COLUMN'), style.SQL_FIELD(qn(args[1])), style.SQL_KEYWORD(args[2]), style.SQL_KEYWORD('NOT NULL')) - - def __init__(self, app_models, options): - SQLDiff.__init__(self, app_models, options) - self.check_constraints = {} - self.null = {} - self.load_constraints() - self.load_null() - - def load_null(self): - for dct in self.sql_to_dict(self.SQL_LOAD_NULL, []): - key = (dct['nspname'], dct['relname'], dct['attname']) - self.null[key] = not dct['attnotnull'] - - def load_constraints(self): - for dct in self.sql_to_dict(self.SQL_LOAD_CONSTRAINTS, []): - key = (dct['nspname'], dct['relname'], dct['attname']) - if 'CHECK' in dct['pg_get_constraintdef']: - self.check_constraints[key] = dct - - def get_field_db_type(self, description, field=None, table_name=None): - db_type = super(PostgresqlSQLDiff, self).get_field_db_type(description) - if not db_type: - return - if field: - if field.primary_key: - if db_type == 'integer': - db_type = 'serial' - elif db_type == 'bigint': - db_type = 'bigserial' - if table_name: - tablespace = field.db_tablespace - if tablespace == "": - tablespace = "public" - check_constraint = self.check_constraints.get((tablespace, table_name, field.attname), {}).get('pg_get_constraintdef', None) - if check_constraint: - check_constraint = check_constraint.replace("((", "(") - check_constraint = check_constraint.replace("))", ")") - check_constraint = '("'.join([')' in e and '" '.join(e.split(" ", 1)) or e for e in check_constraint.split("(")]) - # TODO: might be more then one constraint in definition ? - db_type += ' ' + check_constraint - null = self.null.get((tablespace, table_name, field.attname), 'fixme') - if field.null != null: - action = field.null and 'DROP' or 'SET' - self.add_difference('notnull-differ', table_name, field.name, action) - return db_type - - @transaction.autocommit - def get_field_db_type_lookup(self, type_code): - try: - name = self.sql_to_dict("SELECT typname FROM pg_type WHERE typelem=%s;", [type_code])[0]['typname'] - return self.DATA_TYPES_REVERSE_NAME.get(name.strip('_')) - except (IndexError, KeyError): - pass - - """ - def find_field_type_differ(self, meta, table_description, table_name): - def callback(field, description, model_type, db_type): - if field.primary_key and db_type=='integer': - db_type = 'serial' - return model_type, db_type - super(PostgresqlSQLDiff, self).find_field_type_differ(meta, table_description, table_name, callback) - """ - -DATABASE_SQLDIFF_CLASSES = { - 'postgis': PostgresqlSQLDiff, - 'postgresql_psycopg2': PostgresqlSQLDiff, - 'postgresql': PostgresqlSQLDiff, - 'mysql': MySQLDiff, - 'sqlite3': SqliteSQLDiff, - 'oracle': GenericSQLDiff -} - - -class Command(BaseCommand): - option_list = BaseCommand.option_list + ( - make_option('--all-applications', '-a', action='store_true', dest='all_applications', - help="Automaticly include all application from INSTALLED_APPS."), - make_option('--not-only-existing', '-e', action='store_false', dest='only_existing', - help="Check all tables that exist in the database, not only tables that should exist based on models."), - make_option('--dense-output', '-d', action='store_true', dest='dense_output', - help="Shows the output in dense format, normally output is spreaded over multiple lines."), - make_option('--output_text', '-t', action='store_false', dest='sql', default=True, - help="Outputs the differences as descriptive text instead of SQL"), - ) - - help = """Prints the (approximated) difference between models and fields in the database for the given app name(s). - -It indicates how columns in the database are different from the sql that would -be generated by Django. This command is not a database migration tool. (Though -it can certainly help) It's purpose is to show the current differences as a way -to check/debug ur models compared to the real database tables and columns.""" - - output_transaction = False - args = '<appname appname ...>' - - def handle(self, *app_labels, **options): - from django import VERSION - if VERSION[:2] < (1, 0): - raise CommandError("SQLDiff only support Django 1.0 or higher!") - - from django.db import models - from django.conf import settings - - engine = None - if hasattr(settings, 'DATABASES'): - engine = settings.DATABASES['default']['ENGINE'] - else: - engine = settings.DATABASE_ENGINE - - if engine == 'dummy': - # This must be the "dummy" database backend, which means the user - # hasn't set DATABASE_ENGINE. - raise CommandError("""Django doesn't know which syntax to use for your SQL statements, -because you haven't specified the DATABASE_ENGINE setting. -Edit your settings file and change DATABASE_ENGINE to something like 'postgresql' or 'mysql'.""") - - if options.get('all_applications', False): - app_models = models.get_models() - else: - if not app_labels: - raise CommandError('Enter at least one appname.') - try: - app_list = [models.get_app(app_label) for app_label in app_labels] - except (models.ImproperlyConfigured, ImportError) as e: - raise CommandError("%s. Are you sure your INSTALLED_APPS setting is correct?" % e) - - app_models = [] - for app in app_list: - app_models.extend(models.get_models(app)) - - ## remove all models that are not managed by Django - #app_models = [model for model in app_models if getattr(model._meta, 'managed', True)] - - if not app_models: - raise CommandError('Unable to execute sqldiff no models founds.') - - if not engine: - engine = connection.__module__.split('.')[-2] - - if '.' in engine: - engine = engine.split('.')[-1] - - cls = DATABASE_SQLDIFF_CLASSES.get(engine, GenericSQLDiff) - sqldiff_instance = cls(app_models, options) - sqldiff_instance.find_differences() - sqldiff_instance.print_diff(self.style) - return diff --git a/vendor-local/lib/python/django_extensions/management/commands/sync_media_s3.py b/vendor-local/lib/python/django_extensions/management/commands/sync_media_s3.py deleted file mode 100644 index 2fc9411344f..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/sync_media_s3.py +++ /dev/null @@ -1,340 +0,0 @@ -""" -Sync Media to S3 -================ - -Django command that scans all files in your settings.MEDIA_ROOT folder and -uploads them to S3 with the same directory structure. - -This command can optionally do the following but it is off by default: -* gzip compress any CSS and Javascript files it finds and adds the appropriate - 'Content-Encoding' header. -* set a far future 'Expires' header for optimal caching. - -Note: This script requires the Python boto library and valid Amazon Web -Services API keys. - -Required settings.py variables: -AWS_ACCESS_KEY_ID = '' -AWS_SECRET_ACCESS_KEY = '' -AWS_BUCKET_NAME = '' - -When you call this command with the `--renamegzip` param, it will add -the '.gz' extension to the file name. But Safari just doesn't recognize -'.gz' files and your site won't work on it! To fix this problem, you can -set any other extension (like .jgz) in the `SYNC_S3_RENAME_GZIP_EXT` -variable. - -Command options are: - -p PREFIX, --prefix=PREFIX - The prefix to prepend to the path on S3. - --gzip Enables gzipping CSS and Javascript files. - --expires Enables setting a far future expires header. - --force Skip the file mtime check to force upload of all - files. - --filter-list Override default directory and file exclusion - filters. (enter as comma seperated line) - --renamegzip Enables renaming of gzipped files by appending '.gz'. - to the original file name. This way your original - assets will not be replaced by the gzipped ones. - You can change the extension setting the - `SYNC_S3_RENAME_GZIP_EXT` var in your settings.py - file. - --invalidate Invalidates the objects in CloudFront after uploaading - stuff to s3. - - -TODO: - * Use fnmatch (or regex) to allow more complex FILTER_LIST rules. - -""" -import datetime -import email -import mimetypes -from optparse import make_option -import os -import time -import gzip -try: - from cStringIO import StringIO - assert StringIO -except ImportError: - from StringIO import StringIO - - -from django.conf import settings -from django.core.management.base import BaseCommand, CommandError - -# Make sure boto is available -try: - import boto - import boto.exception -except ImportError: - raise ImportError("The boto Python library is not installed.") - - -class Command(BaseCommand): - # Extra variables to avoid passing these around - AWS_ACCESS_KEY_ID = '' - AWS_SECRET_ACCESS_KEY = '' - AWS_BUCKET_NAME = '' - AWS_CLOUDFRONT_DISTRIBUTION = '' - SYNC_S3_RENAME_GZIP_EXT = '' - - DIRECTORY = '' - FILTER_LIST = ['.DS_Store', '.svn', '.hg', '.git', 'Thumbs.db'] - GZIP_CONTENT_TYPES = ( - 'text/css', - 'application/javascript', - 'application/x-javascript', - 'text/javascript' - ) - - uploaded_files = [] - upload_count = 0 - skip_count = 0 - - option_list = BaseCommand.option_list + ( - make_option('-p', '--prefix', - dest='prefix', - default=getattr(settings, 'SYNC_MEDIA_S3_PREFIX', ''), - help="The prefix to prepend to the path on S3."), - make_option('-d', '--dir', - dest='dir', default=settings.MEDIA_ROOT, - help="The root directory to use instead of your MEDIA_ROOT"), - make_option('--gzip', - action='store_true', dest='gzip', default=False, - help="Enables gzipping CSS and Javascript files."), - make_option('--renamegzip', - action='store_true', dest='renamegzip', default=False, - help="Enables renaming of gzipped assets to have '.gz' appended to the filename."), - make_option('--expires', - action='store_true', dest='expires', default=False, - help="Enables setting a far future expires header."), - make_option('--force', - action='store_true', dest='force', default=False, - help="Skip the file mtime check to force upload of all files."), - make_option('--filter-list', dest='filter_list', - action='store', default='', - help="Override default directory and file exclusion filters. (enter as comma seperated line)"), - make_option('--invalidate', dest='invalidate', default=False, - action='store_true', - help='Invalidates the associated objects in CloudFront') - ) - - help = 'Syncs the complete MEDIA_ROOT structure and files to S3 into the given bucket name.' - args = 'bucket_name' - - can_import_settings = True - - def handle(self, *args, **options): - - # Check for AWS keys in settings - if not hasattr(settings, 'AWS_ACCESS_KEY_ID') or not hasattr(settings, 'AWS_SECRET_ACCESS_KEY'): - raise CommandError('Missing AWS keys from settings file. Please supply both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.') - else: - self.AWS_ACCESS_KEY_ID = settings.AWS_ACCESS_KEY_ID - self.AWS_SECRET_ACCESS_KEY = settings.AWS_SECRET_ACCESS_KEY - - if not hasattr(settings, 'AWS_BUCKET_NAME'): - raise CommandError('Missing bucket name from settings file. Please add the AWS_BUCKET_NAME to your settings file.') - else: - if not settings.AWS_BUCKET_NAME: - raise CommandError('AWS_BUCKET_NAME cannot be empty.') - self.AWS_BUCKET_NAME = settings.AWS_BUCKET_NAME - - if not hasattr(settings, 'MEDIA_ROOT'): - raise CommandError('MEDIA_ROOT must be set in your settings.') - else: - if not settings.MEDIA_ROOT: - raise CommandError('MEDIA_ROOT must be set in your settings.') - - self.AWS_CLOUDFRONT_DISTRIBUTION = getattr(settings, 'AWS_CLOUDFRONT_DISTRIBUTION', '') - - self.SYNC_S3_RENAME_GZIP_EXT = \ - getattr(settings, 'SYNC_S3_RENAME_GZIP_EXT', '.gz') - - self.verbosity = int(options.get('verbosity')) - self.prefix = options.get('prefix') - self.do_gzip = options.get('gzip') - self.rename_gzip = options.get('renamegzip') - self.do_expires = options.get('expires') - self.do_force = options.get('force') - self.invalidate = options.get('invalidate') - self.DIRECTORY = options.get('dir') - self.FILTER_LIST = getattr(settings, 'FILTER_LIST', self.FILTER_LIST) - filter_list = options.get('filter_list') - if filter_list: - # command line option overrides default filter_list and - # settings.filter_list - self.FILTER_LIST = filter_list.split(',') - - # Now call the syncing method to walk the MEDIA_ROOT directory and - # upload all files found. - self.sync_s3() - - # Sending the invalidation request to CloudFront if the user - # requested this action - if self.invalidate: - self.invalidate_objects_cf() - - print("") - print("%d files uploaded." % self.upload_count) - print("%d files skipped." % self.skip_count) - - def open_cf(self): - """ - Returns an open connection to CloudFront - """ - return boto.connect_cloudfront( - self.AWS_ACCESS_KEY_ID, self.AWS_SECRET_ACCESS_KEY) - - def invalidate_objects_cf(self): - """ - Split the invalidation request in groups of 1000 objects - """ - if not self.AWS_CLOUDFRONT_DISTRIBUTION: - raise CommandError( - 'An object invalidation was requested but the variable ' - 'AWS_CLOUDFRONT_DISTRIBUTION is not present in your settings.') - - # We can't send more than 1000 objects in the same invalidation - # request. - chunk = 1000 - - # Connecting to CloudFront - conn = self.open_cf() - - # Splitting the object list - objs = self.uploaded_files - chunks = [objs[i:i + chunk] for i in range(0, len(objs), chunk)] - - # Invalidation requests - for paths in chunks: - conn.create_invalidation_request( - self.AWS_CLOUDFRONT_DISTRIBUTION, paths) - - def sync_s3(self): - """ - Walks the media directory and syncs files to S3 - """ - bucket, key = self.open_s3() - os.path.walk(self.DIRECTORY, self.upload_s3, (bucket, key, self.AWS_BUCKET_NAME, self.DIRECTORY)) - - def compress_string(self, s): - """Gzip a given string.""" - zbuf = StringIO() - zfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=zbuf) - zfile.write(s) - zfile.close() - return zbuf.getvalue() - - def open_s3(self): - """ - Opens connection to S3 returning bucket and key - """ - conn = boto.connect_s3(self.AWS_ACCESS_KEY_ID, self.AWS_SECRET_ACCESS_KEY) - try: - bucket = conn.get_bucket(self.AWS_BUCKET_NAME) - except boto.exception.S3ResponseError: - bucket = conn.create_bucket(self.AWS_BUCKET_NAME) - return bucket, boto.s3.key.Key(bucket) - - def upload_s3(self, arg, dirname, names): - """ - This is the callback to os.path.walk and where much of the work happens - """ - bucket, key, bucket_name, root_dir = arg - - # Skip directories we don't want to sync - if os.path.basename(dirname) in self.FILTER_LIST: - # prevent walk from processing subfiles/subdirs below the ignored one - del names[:] - return - - # Later we assume the MEDIA_ROOT ends with a trailing slash - if not root_dir.endswith(os.path.sep): - root_dir = root_dir + os.path.sep - - for file in names: - headers = {} - - if file in self.FILTER_LIST: - continue # Skip files we don't want to sync - - filename = os.path.join(dirname, file) - if os.path.isdir(filename): - continue # Don't try to upload directories - - file_key = filename[len(root_dir):] - if self.prefix: - file_key = '%s/%s' % (self.prefix, file_key) - - # Check if file on S3 is older than local file, if so, upload - if not self.do_force: - s3_key = bucket.get_key(file_key) - if s3_key: - s3_datetime = datetime.datetime(*time.strptime( - s3_key.last_modified, '%a, %d %b %Y %H:%M:%S %Z')[0:6]) - local_datetime = datetime.datetime.utcfromtimestamp( - os.stat(filename).st_mtime) - if local_datetime < s3_datetime: - self.skip_count += 1 - if self.verbosity > 1: - print("File %s hasn't been modified since last being uploaded" % file_key) - continue - - # File is newer, let's process and upload - if self.verbosity > 0: - print("Uploading %s..." % file_key) - - content_type = mimetypes.guess_type(filename)[0] - if content_type: - headers['Content-Type'] = content_type - file_obj = open(filename, 'rb') - file_size = os.fstat(file_obj.fileno()).st_size - filedata = file_obj.read() - if self.do_gzip: - # Gzipping only if file is large enough (>1K is recommended) - # and only if file is a common text type (not a binary file) - if file_size > 1024 and content_type in self.GZIP_CONTENT_TYPES: - filedata = self.compress_string(filedata) - if self.rename_gzip: - # If rename_gzip is True, then rename the file - # by appending an extension (like '.gz)' to - # original filename. - file_key = '%s.%s' % ( - file_key, self.SYNC_S3_RENAME_GZIP_EXT) - headers['Content-Encoding'] = 'gzip' - if self.verbosity > 1: - print("\tgzipped: %dk to %dk" % (file_size / 1024, len(filedata) / 1024)) - if self.do_expires: - # HTTP/1.0 - headers['Expires'] = '%s GMT' % (email.Utils.formatdate(time.mktime((datetime.datetime.now() + datetime.timedelta(days=365 * 2)).timetuple()))) - # HTTP/1.1 - headers['Cache-Control'] = 'max-age %d' % (3600 * 24 * 365 * 2) - if self.verbosity > 1: - print("\texpires: %s" % headers['Expires']) - print("\tcache-control: %s" % headers['Cache-Control']) - - try: - key.name = file_key - key.set_contents_from_string(filedata, headers, replace=True) - key.set_acl('public-read') - except boto.exception.S3CreateError as e: - print("Failed: %s" % e) - except Exception as e: - print(e) - raise - else: - self.upload_count += 1 - self.uploaded_files.append(file_key) - - file_obj.close() - -# Backwards compatibility for Django r9110 -if not [opt for opt in Command.option_list if opt.dest == 'verbosity']: - Command.option_list += ( - make_option('-v', '--verbosity', - dest='verbosity', default=1, action='count', - help="Verbose mode. Multiple -v options increase the verbosity."), - ) diff --git a/vendor-local/lib/python/django_extensions/management/commands/syncdata.py b/vendor-local/lib/python/django_extensions/management/commands/syncdata.py deleted file mode 100644 index 0228ddd9388..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/syncdata.py +++ /dev/null @@ -1,210 +0,0 @@ -""" -SyncData -======== - -Django command similar to 'loaddata' but also deletes. -After 'syncdata' has run, the database will have the same data as the fixture - anything -missing will of been added, anything different will of been updated, -and anything extra will of been deleted. -""" - -import os -import sys -import six -from django.core.management.base import BaseCommand -from django.core.management.color import no_style -from optparse import make_option - - -class Command(BaseCommand): - """ syncdata command """ - - help = 'Makes the current database have the same data as the fixture(s), no more, no less.' - args = "fixture [fixture ...]" - - def remove_objects_not_in(self, objects_to_keep, verbosity): - """ - Deletes all the objects in the database that are not in objects_to_keep. - - objects_to_keep: A map where the keys are classes, and the values are a - set of the objects of that class we should keep. - """ - for class_ in objects_to_keep.keys(): - current = class_.objects.all() - current_ids = set([x.id for x in current]) - keep_ids = set([x.id for x in objects_to_keep[class_]]) - - remove_these_ones = current_ids.difference(keep_ids) - if remove_these_ones: - for obj in current: - if obj.id in remove_these_ones: - obj.delete() - if verbosity >= 2: - print("Deleted object: %s" % six.u(obj)) - - if verbosity > 0 and remove_these_ones: - num_deleted = len(remove_these_ones) - if num_deleted > 1: - type_deleted = six.u(class_._meta.verbose_name_plural) - else: - type_deleted = six.u(class_._meta.verbose_name) - - print("Deleted %s %s" % (str(num_deleted), type_deleted)) - - def handle(self, *fixture_labels, **options): - """ Main method of a Django command """ - from django.db.models import get_apps - from django.core import serializers - from django.db import connection, transaction - from django.conf import settings - - self.style = no_style() - - verbosity = int(options.get('verbosity', 1)) - show_traceback = options.get('traceback', False) - - # Keep a count of the installed objects and fixtures - fixture_count = 0 - object_count = 0 - objects_per_fixture = [] - models = set() - - humanize = lambda dirname: dirname and "'%s'" % dirname or 'absolute path' - - # Get a cursor (even though we don't need one yet). This has - # the side effect of initializing the test database (if - # it isn't already initialized). - cursor = connection.cursor() - - # Start transaction management. All fixtures are installed in a - # single transaction to ensure that all references are resolved. - transaction.commit_unless_managed() - transaction.enter_transaction_management() - transaction.managed(True) - - app_fixtures = [os.path.join(os.path.dirname(app.__file__), 'fixtures') for app in get_apps()] - for fixture_label in fixture_labels: - parts = fixture_label.split('.') - if len(parts) == 1: - fixture_name = fixture_label - formats = serializers.get_public_serializer_formats() - else: - fixture_name, format = '.'.join(parts[:-1]), parts[-1] - if format in serializers.get_public_serializer_formats(): - formats = [format] - else: - formats = [] - - if formats: - if verbosity > 1: - print("Loading '%s' fixtures..." % fixture_name) - else: - sys.stderr.write(self.style.ERROR("Problem installing fixture '%s': %s is not a known serialization format." % (fixture_name, format))) - transaction.rollback() - transaction.leave_transaction_management() - return - - if os.path.isabs(fixture_name): - fixture_dirs = [fixture_name] - else: - fixture_dirs = app_fixtures + list(settings.FIXTURE_DIRS) + [''] - - for fixture_dir in fixture_dirs: - if verbosity > 1: - print("Checking %s for fixtures..." % humanize(fixture_dir)) - - label_found = False - for format in formats: - #serializer = serializers.get_serializer(format) - if verbosity > 1: - print("Trying %s for %s fixture '%s'..." % (humanize(fixture_dir), format, fixture_name)) - try: - full_path = os.path.join(fixture_dir, '.'.join([fixture_name, format])) - fixture = open(full_path, 'r') - if label_found: - fixture.close() - print(self.style.ERROR("Multiple fixtures named '%s' in %s. Aborting." % (fixture_name, humanize(fixture_dir)))) - transaction.rollback() - transaction.leave_transaction_management() - return - else: - fixture_count += 1 - objects_per_fixture.append(0) - if verbosity > 0: - print("Installing %s fixture '%s' from %s." % (format, fixture_name, humanize(fixture_dir))) - try: - objects_to_keep = {} - objects = serializers.deserialize(format, fixture) - for obj in objects: - object_count += 1 - objects_per_fixture[-1] += 1 - - class_ = obj.object.__class__ - if not class_ in objects_to_keep: - objects_to_keep[class_] = set() - objects_to_keep[class_].add(obj.object) - - models.add(class_) - obj.save() - - self.remove_objects_not_in(objects_to_keep, verbosity) - - label_found = True - except (SystemExit, KeyboardInterrupt): - raise - except Exception: - import traceback - fixture.close() - transaction.rollback() - transaction.leave_transaction_management() - if show_traceback: - traceback.print_exc() - else: - sys.stderr.write(self.style.ERROR("Problem installing fixture '%s': %s\n" % (full_path, traceback.format_exc()))) - return - fixture.close() - except: - if verbosity > 1: - print("No %s fixture '%s' in %s." % (format, fixture_name, humanize(fixture_dir))) - - # If any of the fixtures we loaded contain 0 objects, assume that an - # error was encountered during fixture loading. - if 0 in objects_per_fixture: - sys.stderr.write( - self.style.ERROR("No fixture data found for '%s'. (File format may be invalid.)" % (fixture_name))) - transaction.rollback() - transaction.leave_transaction_management() - return - - # If we found even one object in a fixture, we need to reset the - # database sequences. - if object_count > 0: - sequence_sql = connection.ops.sequence_reset_sql(self.style, models) - if sequence_sql: - if verbosity > 1: - print("Resetting sequences") - for line in sequence_sql: - cursor.execute(line) - - transaction.commit() - transaction.leave_transaction_management() - - if object_count == 0: - if verbosity > 1: - print("No fixtures found.") - else: - if verbosity > 0: - print("Installed %d object(s) from %d fixture(s)" % (object_count, fixture_count)) - - # Close the DB connection. This is required as a workaround for an - # edge case in MySQL: if the same connection is used to - # create tables, load data, and query, the query can return - # incorrect results. See Django #7572, MySQL #37735. - connection.close() - -# Backwards compatibility for Django r9110 -if not [opt for opt in Command.option_list if opt.dest == 'verbosity']: - Command.option_list += ( - make_option('--verbosity', '-v', action="store", dest="verbosity", - default='1', type='choice', choices=['0', '1', '2'], - help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), - ) diff --git a/vendor-local/lib/python/django_extensions/management/commands/unreferenced_files.py b/vendor-local/lib/python/django_extensions/management/commands/unreferenced_files.py deleted file mode 100644 index 3f4dfae2f2f..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/unreferenced_files.py +++ /dev/null @@ -1,47 +0,0 @@ -from collections import defaultdict -import os -from django.conf import settings -from django.core.management.base import NoArgsCommand -from django.db import models -from django.db.models.loading import cache - - -class Command(NoArgsCommand): - help = "Prints a list of all files in MEDIA_ROOT that are not referenced in the database." - - def handle_noargs(self, **options): - - if settings.MEDIA_ROOT == '': - print("MEDIA_ROOT is not set, nothing to do") - return - - # Get a list of all files under MEDIA_ROOT - media = [] - for root, dirs, files in os.walk(settings.MEDIA_ROOT): - for f in files: - media.append(os.path.abspath(os.path.join(root, f))) - - # Get list of all fields (value) for each model (key) - # that is a FileField or subclass of a FileField - model_dict = defaultdict(list) - for app in cache.get_apps(): - model_list = cache.get_models(app) - for model in model_list: - for field in model._meta.fields: - if issubclass(field.__class__, models.FileField): - model_dict[model].append(field) - - # Get a list of all files referenced in the database - referenced = [] - for model in model_dict.iterkeys(): - all = model.objects.all().iterator() - for object in all: - for field in model_dict[model]: - target_file = getattr(object, field.name) - if target_file: - referenced.append(os.path.abspath(target_file.path)) - - # Print each file in MEDIA_ROOT that is not referenced in the database - for m in media: - if m not in referenced: - print(m) diff --git a/vendor-local/lib/python/django_extensions/management/commands/update_permissions.py b/vendor-local/lib/python/django_extensions/management/commands/update_permissions.py deleted file mode 100644 index 0a84627701c..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/update_permissions.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.core.management.base import BaseCommand -from django.db.models import get_models, get_app -from django.contrib.auth.management import create_permissions - - -class Command(BaseCommand): - args = '<app app ...>' - help = 'reloads permissions for specified apps, or all apps if no args are specified' - - def handle(self, *args, **options): - if not args: - apps = [] - for model in get_models(): - apps.append(get_app(model._meta.app_label)) - else: - apps = [] - for arg in args: - apps.append(get_app(arg)) - for app in apps: - create_permissions(app, get_models(), options.get('verbosity', 0)) - diff --git a/vendor-local/lib/python/django_extensions/management/commands/validate_templates.py b/vendor-local/lib/python/django_extensions/management/commands/validate_templates.py deleted file mode 100644 index 860c18e0858..00000000000 --- a/vendor-local/lib/python/django_extensions/management/commands/validate_templates.py +++ /dev/null @@ -1,71 +0,0 @@ -import os -from optparse import make_option -from django.core.management.base import BaseCommand, CommandError -from django.core.management.color import color_style -from django.template.base import add_to_builtins -from django.template.loaders.filesystem import Loader -from django_extensions.utils import validatingtemplatetags - -# -# TODO: Render the template with fake request object ? -# - - -class Command(BaseCommand): - args = '' - help = "Validate templates on syntax and compile errors" - option_list = BaseCommand.option_list + ( - make_option('--break', '-b', action='store_true', dest='break', - default=False, help="Break on first error."), - make_option('--check-urls', '-u', action='store_true', dest='check_urls', - default=False, help="Check url tag view names are quoted appropriately"), - make_option('--force-new-urls', '-n', action='store_true', dest='force_new_urls', - default=False, help="Error on usage of old style url tags (without {% load urls from future %}"), - make_option('--include', '-i', action='append', dest='includes', - default=[], help="Append these paths to TEMPLATE_DIRS") - ) - - def handle(self, *args, **options): - from django.conf import settings - style = color_style() - template_dirs = set(settings.TEMPLATE_DIRS) - template_dirs |= set(options.get('includes', [])) - template_dirs |= set(getattr(settings, 'VALIDATE_TEMPLATES_EXTRA_TEMPLATE_DIRS', [])) - settings.TEMPLATE_DIRS = list(template_dirs) - settings.TEMPLATE_DEBUG = True - verbosity = int(options.get('verbosity', 1)) - errors = 0 - - template_loader = Loader() - - # Replace built in template tags with our own validating versions - if options.get('check_urls', False): - add_to_builtins('django_extensions.utils.validatingtemplatetags') - - for template_dir in template_dirs: - for root, dirs, filenames in os.walk(template_dir): - for filename in filenames: - if filename.endswith(".swp"): - continue - if filename.endswith("~"): - continue - filepath = os.path.join(root, filename) - if verbosity > 1: - print(filepath) - validatingtemplatetags.before_new_template(options.get('force_new_urls', False)) - try: - template_loader.load_template(filename, [root]) - except Exception as e: - errors += 1 - print("%s: %s" % (filepath, style.ERROR("%s %s" % (e.__class__.__name__, str(e))))) - template_errors = validatingtemplatetags.get_template_errors() - for origin, line, message in template_errors: - errors += 1 - print("%s(%s): %s" % (origin, line, style.ERROR(message))) - if errors and options.get('break', False): - raise CommandError("Errors found") - - if errors: - raise CommandError("%s errors found" % errors) - print("%s errors found" % errors) - diff --git a/vendor-local/lib/python/django_extensions/management/jobs.py b/vendor-local/lib/python/django_extensions/management/jobs.py deleted file mode 100644 index 8bf01c23320..00000000000 --- a/vendor-local/lib/python/django_extensions/management/jobs.py +++ /dev/null @@ -1,177 +0,0 @@ -""" -django_extensions.management.jobs -""" - -import os -from imp import find_module - -_jobs = None - - -def noneimplementation(meth): - return None - - -class JobError(Exception): - pass - - -class BaseJob(object): - help = "undefined job description." - when = None - - def execute(self): - raise NotImplementedError("Job needs to implement the execute method") - - -class MinutelyJob(BaseJob): - when = "minutely" - - -class QuarterHourlyJob(BaseJob): - when = "quarter_hourly" - - -class HourlyJob(BaseJob): - when = "hourly" - - -class DailyJob(BaseJob): - when = "daily" - - -class WeeklyJob(BaseJob): - when = "weekly" - - -class MonthlyJob(BaseJob): - when = "monthly" - - -class YearlyJob(BaseJob): - when = "yearly" - - -def my_import(name): - imp = __import__(name) - mods = name.split('.') - if len(mods) > 1: - for mod in mods[1:]: - imp = getattr(imp, mod) - return imp - - -def find_jobs(jobs_dir): - try: - return [f[:-3] for f in os.listdir(jobs_dir) if not f.startswith('_') and f.endswith(".py")] - except OSError: - return [] - - -def find_job_module(app_name, when=None): - parts = app_name.split('.') - parts.append('jobs') - if when: - parts.append(when) - parts.reverse() - path = None - while parts: - part = parts.pop() - f, path, descr = find_module(part, path and [path] or None) - return path - - -def import_job(app_name, name, when=None): - jobmodule = "%s.jobs.%s%s" % (app_name, when and "%s." % when or "", name) - job_mod = my_import(jobmodule) - # todo: more friendly message for AttributeError if job_mod does not exist - try: - job = job_mod.Job - except: - raise JobError("Job module %s does not contain class instance named 'Job'" % jobmodule) - if when and not (job.when == when or job.when is None): - raise JobError("Job %s is not a %s job." % (jobmodule, when)) - return job - - -def get_jobs(when=None, only_scheduled=False): - """ - Returns a dictionary mapping of job names together with their respective - application class. - """ - # FIXME: HACK: make sure the project dir is on the path when executed as ./manage.py - import sys - try: - cpath = os.path.dirname(os.path.realpath(sys.argv[0])) - ppath = os.path.dirname(cpath) - if ppath not in sys.path: - sys.path.append(ppath) - except: - pass - _jobs = {} - if True: - from django.conf import settings - for app_name in settings.INSTALLED_APPS: - scandirs = (None, 'minutely', 'quarter_hourly', 'hourly', 'daily', 'weekly', 'monthly', 'yearly') - if when: - scandirs = None, when - for subdir in scandirs: - try: - path = find_job_module(app_name, subdir) - for name in find_jobs(path): - if (app_name, name) in _jobs: - raise JobError("Duplicate job %s" % name) - job = import_job(app_name, name, subdir) - if only_scheduled and job.when is None: - # only include jobs which are scheduled - continue - if when and job.when != when: - # generic job not in same schedule - continue - _jobs[(app_name, name)] = job - except ImportError: - # No job module -- continue scanning - pass - return _jobs - - -def get_job(app_name, job_name): - jobs = get_jobs() - if app_name: - return jobs[(app_name, job_name)] - else: - for a, j in jobs.keys(): - if j == job_name: - return jobs[(a, j)] - raise KeyError("Job not found: %s" % job_name) - - -def print_jobs(when=None, only_scheduled=False, show_when=True, show_appname=False, show_header=True): - jobmap = get_jobs(when, only_scheduled=only_scheduled) - print("Job List: %i jobs" % len(jobmap)) - jlist = jobmap.keys() - jlist.sort() - appname_spacer = "%%-%is" % max(len(e[0]) for e in jlist) - name_spacer = "%%-%is" % max(len(e[1]) for e in jlist) - when_spacer = "%%-%is" % max(len(e.when) for e in jobmap.values() if e.when) - if show_header: - line = " " - if show_appname: - line += appname_spacer % "appname" + " - " - line += name_spacer % "jobname" - if show_when: - line += " - " + when_spacer % "when" - line += " - help" - print(line) - print("-" * 80) - - for app_name, job_name in jlist: - job = jobmap[(app_name, job_name)] - line = " " - if show_appname: - line += appname_spacer % app_name + " - " - line += name_spacer % job_name - if show_when: - line += " - " + when_spacer % (job.when and job.when or "") - line += " - " + job.help - print(line) diff --git a/vendor-local/lib/python/django_extensions/management/modelviz.py b/vendor-local/lib/python/django_extensions/management/modelviz.py deleted file mode 100644 index 1d18d16972c..00000000000 --- a/vendor-local/lib/python/django_extensions/management/modelviz.py +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env python -""" -Django model to DOT (Graphviz) converter -by Antonio Cavedoni <antonio@cavedoni.org> - -Adapted to be used with django-extensions -""" - -__version__ = "0.9" -__license__ = "Python" -__author__ = "Antonio Cavedoni <http://cavedoni.com/>" -__contributors__ = [ - "Stefano J. Attardi <http://attardi.org/>", - "limodou <http://www.donews.net/limodou/>", - "Carlo C8E Miron", - "Andre Campos <cahenan@gmail.com>", - "Justin Findlay <jfindlay@gmail.com>", - "Alexander Houben <alexander@houben.ch>", - "Bas van Oostveen <v.oostveen@gmail.com>", - "Joern Hees <gitdev@joernhees.de>", -] - -import os - -from django.utils.translation import activate as activate_language -from django.utils.safestring import mark_safe -from django.template import Context, loader -from django.db import models -from django.db.models import get_models -from django.db.models.fields.related import \ - ForeignKey, OneToOneField, ManyToManyField, RelatedField - -try: - from django.db.models.fields.generic import GenericRelation - assert GenericRelation -except ImportError: - from django.contrib.contenttypes.generic import GenericRelation - - -def parse_file_or_list(arg): - if not arg: - return [] - if not ',' in arg and os.path.isfile(arg): - return [e.strip() for e in open(arg).readlines()] - return arg.split(',') - - -def generate_dot(app_labels, **kwargs): - disable_fields = kwargs.get('disable_fields', False) - include_models = parse_file_or_list(kwargs.get('include_models', "")) - all_applications = kwargs.get('all_applications', False) - use_subgraph = kwargs.get('group_models', False) - verbose_names = kwargs.get('verbose_names', False) - inheritance = kwargs.get('inheritance', False) - language = kwargs.get('language', None) - if language is not None: - activate_language(language) - exclude_columns = parse_file_or_list(kwargs.get('exclude_columns', "")) - exclude_models = parse_file_or_list(kwargs.get('exclude_models', "")) - - def skip_field(field): - if exclude_columns: - if verbose_names and field.verbose_name: - if field.verbose_name in exclude_columns: - return True - if field.name in exclude_columns: - return True - return False - - t = loader.get_template('django_extensions/graph_models/head.html') - c = Context({}) - dot = t.render(c) - - apps = [] - if all_applications: - apps = models.get_apps() - - for app_label in app_labels: - app = models.get_app(app_label) - if not app in apps: - apps.append(app) - - graphs = [] - for app in apps: - graph = Context({ - 'name': '"%s"' % app.__name__, - 'app_name': "%s" % '.'.join(app.__name__.split('.')[:-1]), - 'cluster_app_name': "cluster_%s" % app.__name__.replace(".", "_"), - 'disable_fields': disable_fields, - 'use_subgraph': use_subgraph, - 'models': [] - }) - - appmodels = get_models(app) - abstract_models = [] - for appmodel in appmodels: - abstract_models = abstract_models + [abstract_model for abstract_model in appmodel.__bases__ if hasattr(abstract_model, '_meta') and abstract_model._meta.abstract] - abstract_models = list(set(abstract_models)) # remove duplicates - appmodels = abstract_models + appmodels - - for appmodel in appmodels: - appmodel_abstracts = [abstract_model.__name__ for abstract_model in appmodel.__bases__ if hasattr(abstract_model, '_meta') and abstract_model._meta.abstract] - - # collect all attribs of abstract superclasses - def getBasesAbstractFields(c): - _abstract_fields = [] - for e in c.__bases__: - if hasattr(e, '_meta') and e._meta.abstract: - _abstract_fields.extend(e._meta.fields) - _abstract_fields.extend(getBasesAbstractFields(e)) - return _abstract_fields - abstract_fields = getBasesAbstractFields(appmodel) - - model = { - 'app_name': appmodel.__module__.replace(".", "_"), - 'name': appmodel.__name__, - 'abstracts': appmodel_abstracts, - 'fields': [], - 'relations': [] - } - - # consider given model name ? - def consider(model_name): - if exclude_models and model_name in exclude_models: - return False - return not include_models or model_name in include_models - - if not consider(appmodel._meta.object_name): - continue - - if verbose_names and appmodel._meta.verbose_name: - model['label'] = appmodel._meta.verbose_name - else: - model['label'] = model['name'] - - # model attributes - def add_attributes(field): - if verbose_names and field.verbose_name: - label = field.verbose_name - else: - label = field.name - - t = type(field).__name__ - if isinstance(field, (OneToOneField, ForeignKey)): - t += " ({0})".format(field.rel.field_name) - # TODO: ManyToManyField, GenericRelation - - model['fields'].append({ - 'name': field.name, - 'label': label, - 'type': t, - 'blank': field.blank, - 'abstract': field in abstract_fields, - }) - - # Find all the real attributes. Relations are depicted as graph edges instead of attributes - attributes = [field for field in appmodel._meta.local_fields if not isinstance(field, RelatedField)] - - # find primary key and print it first, ignoring implicit id if other pk exists - pk = appmodel._meta.pk - if not appmodel._meta.abstract and pk in attributes: - add_attributes(pk) - for field in attributes: - if skip_field(field): - continue - if not field.primary_key: - add_attributes(field) - - # FIXME: actually many_to_many fields aren't saved in this model's db table, so why should we add an attribute-line for them in the resulting graph? - #if appmodel._meta.many_to_many: - # for field in appmodel._meta.many_to_many: - # if skip_field(field): - # continue - # add_attributes(field) - - # relations - def add_relation(field, extras=""): - if verbose_names and field.verbose_name: - label = field.verbose_name - else: - label = field.name - - # show related field name - if hasattr(field, 'related_query_name'): - label += ' (%s)' % field.related_query_name() - - # handle self-relationships - if field.rel.to == 'self': - target_model = field.model - else: - target_model = field.rel.to - - _rel = { - 'target_app': target_model.__module__.replace('.', '_'), - 'target': target_model.__name__, - 'type': type(field).__name__, - 'name': field.name, - 'label': label, - 'arrows': extras, - 'needs_node': True - } - if _rel not in model['relations'] and consider(_rel['target']): - model['relations'].append(_rel) - - for field in appmodel._meta.local_fields: - if field.attname.endswith('_ptr_id'): # excluding field redundant with inheritance relation - continue - if field in abstract_fields: # excluding fields inherited from abstract classes. they too show as local_fields - continue - if skip_field(field): - continue - if isinstance(field, OneToOneField): - add_relation(field, '[arrowhead=none, arrowtail=none, dir=both]') - elif isinstance(field, ForeignKey): - add_relation(field, '[arrowhead=none, arrowtail=dot, dir=both]') - - for field in appmodel._meta.local_many_to_many: - if skip_field(field): - continue - if isinstance(field, ManyToManyField): - if (getattr(field, 'creates_table', False) or # django 1.1. - (hasattr(field.rel.through, '_meta') and field.rel.through._meta.auto_created)): # django 1.2 - add_relation(field, '[arrowhead=dot arrowtail=dot, dir=both]') - elif isinstance(field, GenericRelation): - add_relation(field, mark_safe('[style="dotted", arrowhead=normal, arrowtail=normal, dir=both]')) - - if inheritance: - # add inheritance arrows - for parent in appmodel.__bases__: - if hasattr(parent, "_meta"): # parent is a model - l = "multi-table" - if parent._meta.abstract: - l = "abstract" - if appmodel._meta.proxy: - l = "proxy" - l += r"\ninheritance" - _rel = { - 'target_app': parent.__module__.replace(".", "_"), - 'target': parent.__name__, - 'type': "inheritance", - 'name': "inheritance", - 'label': l, - 'arrows': '[arrowhead=empty, arrowtail=none, dir=both]', - 'needs_node': True - } - # TODO: seems as if abstract models aren't part of models.getModels, which is why they are printed by this without any attributes. - if _rel not in model['relations'] and consider(_rel['target']): - model['relations'].append(_rel) - - graph['models'].append(model) - graphs.append(graph) - - nodes = [] - for graph in graphs: - nodes.extend([e['name'] for e in graph['models']]) - - for graph in graphs: - # don't draw duplication nodes because of relations - for model in graph['models']: - for relation in model['relations']: - if relation['target'] in nodes: - relation['needs_node'] = False - # render templates - t = loader.get_template('django_extensions/graph_models/body.html') - dot += '\n' + t.render(graph) - - for graph in graphs: - t = loader.get_template('django_extensions/graph_models/rel.html') - dot += '\n' + t.render(graph) - - t = loader.get_template('django_extensions/graph_models/tail.html') - c = Context({}) - dot += '\n' + t.render(c) - return dot diff --git a/vendor-local/lib/python/django_extensions/management/notebook_extension.py b/vendor-local/lib/python/django_extensions/management/notebook_extension.py deleted file mode 100644 index 8fc806f79de..00000000000 --- a/vendor-local/lib/python/django_extensions/management/notebook_extension.py +++ /dev/null @@ -1,6 +0,0 @@ -def load_ipython_extension(ipython): - from django.core.management.color import no_style - from django_extensions.management.shells import import_objects - imported_objects = import_objects(options={'dont_load': []}, - style=no_style()) - ipython.push(imported_objects) diff --git a/vendor-local/lib/python/django_extensions/management/shells.py b/vendor-local/lib/python/django_extensions/management/shells.py deleted file mode 100644 index 8042f05e5fc..00000000000 --- a/vendor-local/lib/python/django_extensions/management/shells.py +++ /dev/null @@ -1,58 +0,0 @@ - - -class ObjectImportError(Exception): - pass - - -def import_objects(options, style): - # XXX: (Temporary) workaround for ticket #1796: force early loading of all - # models from installed apps. (this is fixed by now, but leaving it here - # for people using 0.96 or older trunk (pre [5919]) versions. - from django.db.models.loading import get_models, get_apps - loaded_models = get_models() # NOQA - - from django.conf import settings - imported_objects = {'settings': settings} - - dont_load_cli = options.get('dont_load') # optparse will set this to [] if it doensnt exists - dont_load_conf = getattr(settings, 'SHELL_PLUS_DONT_LOAD', []) - dont_load = dont_load_cli + dont_load_conf - quiet_load = options.get('quiet_load') - - model_aliases = getattr(settings, 'SHELL_PLUS_MODEL_ALIASES', {}) - - for app_mod in get_apps(): - app_models = get_models(app_mod) - if not app_models: - continue - - app_name = app_mod.__name__.split('.')[-2] - if app_name in dont_load: - continue - - app_aliases = model_aliases.get(app_name, {}) - model_labels = [] - - for model in app_models: - try: - imported_object = getattr(__import__(app_mod.__name__, {}, {}, model.__name__), model.__name__) - model_name = model.__name__ - - if "%s.%s" % (app_name, model_name) in dont_load: - continue - - alias = app_aliases.get(model_name, model_name) - imported_objects[alias] = imported_object - if model_name == alias: - model_labels.append(model_name) - else: - model_labels.append("%s (as %s)" % (model_name, alias)) - - except AttributeError as e: - if not quiet_load: - print(style.ERROR("Failed to import '%s' from '%s' reason: %s" % (model.__name__, app_name, str(e)))) - continue - if not quiet_load: - print(style.SQL_COLTYPE("From '%s' autoload: %s" % (app_mod.__name__.split('.')[-2], ", ".join(model_labels)))) - - return imported_objects diff --git a/vendor-local/lib/python/django_extensions/management/signals.py b/vendor-local/lib/python/django_extensions/management/signals.py deleted file mode 100644 index 6b198c0196b..00000000000 --- a/vendor-local/lib/python/django_extensions/management/signals.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -signals we use to trigger regular batch jobs -""" -from django.dispatch import Signal - -run_minutely_jobs = Signal() -run_quarter_hourly_jobs = Signal() -run_hourly_jobs = Signal() -run_daily_jobs = Signal() -run_weekly_jobs = Signal() -run_monthly_jobs = Signal() -run_yearly_jobs = Signal() diff --git a/vendor-local/lib/python/django_extensions/management/technical_response.py b/vendor-local/lib/python/django_extensions/management/technical_response.py deleted file mode 100644 index 3e34e9e5eea..00000000000 --- a/vendor-local/lib/python/django_extensions/management/technical_response.py +++ /dev/null @@ -1,6 +0,0 @@ -import six - - -def null_technical_500_response(request, exc_type, exc_value, tb): - six.reraise(exc_type, exc_value, tb) - diff --git a/vendor-local/lib/python/django_extensions/management/utils.py b/vendor-local/lib/python/django_extensions/management/utils.py deleted file mode 100644 index 3ffed0c5bbe..00000000000 --- a/vendor-local/lib/python/django_extensions/management/utils.py +++ /dev/null @@ -1,55 +0,0 @@ -from django.conf import settings -import os -import sys -import logging - - -def get_project_root(): - """ get the project root directory """ - settings_mod = __import__(settings.SETTINGS_MODULE, {}, {}, ['']) - return os.path.dirname(os.path.abspath(settings_mod.__file__)) - - -def _make_writeable(filename): - """ - Make sure that the file is writeable. Useful if our source is - read-only. - - """ - import stat - if sys.platform.startswith('java'): - # On Jython there is no os.access() - return - if not os.access(filename, os.W_OK): - st = os.stat(filename) - new_permissions = stat.S_IMODE(st.st_mode) | stat.S_IWUSR - os.chmod(filename, new_permissions) - - -def setup_logger(logger, stream, filename=None, fmt=None): - """Sets up a logger (if no handlers exist) for console output, - and file 'tee' output if desired.""" - if len(logger.handlers) < 1: - console = logging.StreamHandler(stream) - console.setLevel(logging.DEBUG) - console.setFormatter(logging.Formatter(fmt)) - logger.addHandler(console) - logger.setLevel(logging.DEBUG) - - if filename: - outfile = logging.FileHandler(filename) - outfile.setLevel(logging.INFO) - outfile.setFormatter(logging.Formatter("%(asctime)s " + (fmt if fmt else '%(message)s'))) - logger.addHandler(outfile) - - -class RedirectHandler(logging.Handler): - """Redirect logging sent to one logger (name) to another.""" - def __init__(self, name, level=logging.DEBUG): - # Contemplate feasibility of copying a destination (allow original handler) and redirecting. - logging.Handler.__init__(self, level) - self.name = name - self.logger = logging.getLogger(name) - - def emit(self, record): - self.logger.handle(record) diff --git a/vendor-local/lib/python/django_extensions/migrations/0001_empty.py b/vendor-local/lib/python/django_extensions/migrations/0001_empty.py deleted file mode 100644 index e631efd3667..00000000000 --- a/vendor-local/lib/python/django_extensions/migrations/0001_empty.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -from south.v2 import SchemaMigration - - -class Migration(SchemaMigration): - - def forwards(self, orm): - pass - - def backwards(self, orm): - pass - - models = { - - } - - complete_apps = ['django_extensions'] diff --git a/vendor-local/lib/python/django_extensions/migrations/__init__.py b/vendor-local/lib/python/django_extensions/migrations/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/models.py b/vendor-local/lib/python/django_extensions/models.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/mongodb/__init__.py b/vendor-local/lib/python/django_extensions/mongodb/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/mongodb/fields/__init__.py b/vendor-local/lib/python/django_extensions/mongodb/fields/__init__.py deleted file mode 100644 index d36ddb84051..00000000000 --- a/vendor-local/lib/python/django_extensions/mongodb/fields/__init__.py +++ /dev/null @@ -1,248 +0,0 @@ -""" -MongoDB model fields emulating Django Extensions' additional model fields - -These fields are essentially identical to existing Extensions fields, but South hooks have been removed (since mongo requires no schema migration) - -""" - -import six -from django.template.defaultfilters import slugify -from django import forms -from mongoengine.fields import StringField, DateTimeField -import datetime -import re -from django.utils.translation import ugettext_lazy as _ - -try: - import uuid - assert uuid -except ImportError: - from django_extensions.utils import uuid - - -class SlugField(StringField): - description = _("String (up to %(max_length)s)") - - def __init__(self, *args, **kwargs): - kwargs['max_length'] = kwargs.get('max_length', 50) - # Set db_index=True unless it's been set manually. - if 'db_index' not in kwargs: - kwargs['db_index'] = True - super(SlugField, self).__init__(*args, **kwargs) - - def get_internal_type(self): - return "SlugField" - - def formfield(self, **kwargs): - defaults = {'form_class': forms.SlugField} - defaults.update(kwargs) - return super(SlugField, self).formfield(**defaults) - - -class AutoSlugField(SlugField): - """ AutoSlugField, adapted for MongoDB - - By default, sets editable=False, blank=True. - - Required arguments: - - populate_from - Specifies which field or list of fields the slug is populated from. - - Optional arguments: - - separator - Defines the used separator (default: '-') - - overwrite - If set to True, overwrites the slug on every save (default: False) - - Inspired by SmileyChris' Unique Slugify snippet: - http://www.djangosnippets.org/snippets/690/ - """ - def __init__(self, *args, **kwargs): - kwargs.setdefault('blank', True) - kwargs.setdefault('editable', False) - - populate_from = kwargs.pop('populate_from', None) - if populate_from is None: - raise ValueError("missing 'populate_from' argument") - else: - self._populate_from = populate_from - self.separator = kwargs.pop('separator', six.u('-')) - self.overwrite = kwargs.pop('overwrite', False) - super(AutoSlugField, self).__init__(*args, **kwargs) - - def _slug_strip(self, value): - """ - Cleans up a slug by removing slug separator characters that occur at - the beginning or end of a slug. - - If an alternate separator is used, it will also replace any instances - of the default '-' separator with the new separator. - """ - re_sep = '(?:-|%s)' % re.escape(self.separator) - value = re.sub('%s+' % re_sep, self.separator, value) - return re.sub(r'^%s+|%s+$' % (re_sep, re_sep), '', value) - - def slugify_func(self, content): - return slugify(content) - - def create_slug(self, model_instance, add): - # get fields to populate from and slug field to set - if not isinstance(self._populate_from, (list, tuple)): - self._populate_from = (self._populate_from, ) - slug_field = model_instance._meta.get_field(self.attname) - - if add or self.overwrite: - # slugify the original field content and set next step to 2 - slug_for_field = lambda field: self.slugify_func(getattr(model_instance, field)) - slug = self.separator.join(map(slug_for_field, self._populate_from)) - next = 2 - else: - # get slug from the current model instance and calculate next - # step from its number, clean-up - slug = self._slug_strip(getattr(model_instance, self.attname)) - next = slug.split(self.separator)[-1] - if next.isdigit(): - slug = self.separator.join(slug.split(self.separator)[:-1]) - next = int(next) - else: - next = 2 - - # strip slug depending on max_length attribute of the slug field - # and clean-up - slug_len = slug_field.max_length - if slug_len: - slug = slug[:slug_len] - slug = self._slug_strip(slug) - original_slug = slug - - # exclude the current model instance from the queryset used in finding - # the next valid slug - queryset = model_instance.__class__._default_manager.all() - if model_instance.pk: - queryset = queryset.exclude(pk=model_instance.pk) - - # form a kwarg dict used to impliment any unique_together contraints - kwargs = {} - for params in model_instance._meta.unique_together: - if self.attname in params: - for param in params: - kwargs[param] = getattr(model_instance, param, None) - kwargs[self.attname] = slug - - # increases the number while searching for the next valid slug - # depending on the given slug, clean-up - while not slug or queryset.filter(**kwargs): - slug = original_slug - end = '%s%s' % (self.separator, next) - end_len = len(end) - if slug_len and len(slug) + end_len > slug_len: - slug = slug[:slug_len - end_len] - slug = self._slug_strip(slug) - slug = '%s%s' % (slug, end) - kwargs[self.attname] = slug - next += 1 - return slug - - def pre_save(self, model_instance, add): - value = six.u(self.create_slug(model_instance, add)) - setattr(model_instance, self.attname, value) - return value - - def get_internal_type(self): - return "SlugField" - - -class CreationDateTimeField(DateTimeField): - """ CreationDateTimeField - - By default, sets editable=False, blank=True, default=datetime.now - """ - - def __init__(self, *args, **kwargs): - kwargs.setdefault('default', datetime.datetime.now) - DateTimeField.__init__(self, *args, **kwargs) - - def get_internal_type(self): - return "DateTimeField" - - -class ModificationDateTimeField(CreationDateTimeField): - """ ModificationDateTimeField - - By default, sets editable=False, blank=True, default=datetime.now - - Sets value to datetime.now() on each save of the model. - """ - - def pre_save(self, model, add): - value = datetime.datetime.now() - setattr(model, self.attname, value) - return value - - def get_internal_type(self): - return "DateTimeField" - - -class UUIDVersionError(Exception): - pass - - -class UUIDField(StringField): - """ UUIDField - - By default uses UUID version 1 (generate from host ID, sequence number and current time) - - The field support all uuid versions which are natively supported by the uuid python module. - For more information see: http://docs.python.org/lib/module-uuid.html - """ - - def __init__(self, verbose_name=None, name=None, auto=True, version=1, node=None, clock_seq=None, namespace=None, **kwargs): - kwargs['max_length'] = 36 - self.auto = auto - self.version = version - if version == 1: - self.node, self.clock_seq = node, clock_seq - elif version == 3 or version == 5: - self.namespace, self.name = namespace, name - StringField.__init__(self, verbose_name, name, **kwargs) - - def get_internal_type(self): - return StringField.__name__ - - def contribute_to_class(self, cls, name): - if self.primary_key: - assert not cls._meta.has_auto_field, "A model can't have more than one AutoField: %s %s %s; have %s" % (self, cls, name, cls._meta.auto_field) - super(UUIDField, self).contribute_to_class(cls, name) - cls._meta.has_auto_field = True - cls._meta.auto_field = self - else: - super(UUIDField, self).contribute_to_class(cls, name) - - def create_uuid(self): - if not self.version or self.version == 4: - return uuid.uuid4() - elif self.version == 1: - return uuid.uuid1(self.node, self.clock_seq) - elif self.version == 2: - raise UUIDVersionError("UUID version 2 is not supported.") - elif self.version == 3: - return uuid.uuid3(self.namespace, self.name) - elif self.version == 5: - return uuid.uuid5(self.namespace, self.name) - else: - raise UUIDVersionError("UUID version %s is not valid." % self.version) - - def pre_save(self, model_instance, add): - if self.auto and add: - value = six.u(self.create_uuid()) - setattr(model_instance, self.attname, value) - return value - else: - value = super(UUIDField, self).pre_save(model_instance, add) - if self.auto and not value: - value = six.u(self.create_uuid()) - setattr(model_instance, self.attname, value) - return value diff --git a/vendor-local/lib/python/django_extensions/mongodb/fields/encrypted.py b/vendor-local/lib/python/django_extensions/mongodb/fields/encrypted.py deleted file mode 100644 index 2c8d7f782c8..00000000000 --- a/vendor-local/lib/python/django_extensions/mongodb/fields/encrypted.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -Encrypted fields from Django Extensions, modified for use with mongoDB -""" -from mongoengine.base import BaseField -from django.core.exceptions import ImproperlyConfigured -from django import forms -from django.conf import settings - -try: - from keyczar import keyczar -except ImportError: - raise ImportError('Using an encrypted field requires the Keyczar module. You can obtain Keyczar from http://www.keyczar.org/.') - - -class BaseEncryptedField(BaseField): - prefix = 'enc_str:::' - - def __init__(self, *args, **kwargs): - if not hasattr(settings, 'ENCRYPTED_FIELD_KEYS_DIR'): - raise ImproperlyConfigured('You must set settings.ENCRYPTED_FIELD_KEYS_DIR to your Keyczar keys directory.') - self.crypt = keyczar.Crypter.Read(settings.ENCRYPTED_FIELD_KEYS_DIR) - super(BaseEncryptedField, self).__init__(*args, **kwargs) - - def to_python(self, value): - if (value.startswith(self.prefix)): - retval = self.crypt.Decrypt(value[len(self.prefix):]) - else: - retval = value - - return retval - - def get_db_prep_value(self, value): - if not value.startswith(self.prefix): - value = self.prefix + self.crypt.Encrypt(value) - return value - - -class EncryptedTextField(BaseEncryptedField): - def get_internal_type(self): - return 'StringField' - - def formfield(self, **kwargs): - defaults = {'widget': forms.Textarea} - defaults.update(kwargs) - return super(EncryptedTextField, self).formfield(**defaults) - - -class EncryptedCharField(BaseEncryptedField): - def __init__(self, max_length=None, *args, **kwargs): - if max_length: - max_length += len(self.prefix) - - super(EncryptedCharField, self).__init__(max_length=max_length, *args, **kwargs) - - def get_internal_type(self): - return "StringField" - - def formfield(self, **kwargs): - defaults = {'max_length': self.max_length} - defaults.update(kwargs) - return super(EncryptedCharField, self).formfield(**defaults) diff --git a/vendor-local/lib/python/django_extensions/mongodb/fields/json.py b/vendor-local/lib/python/django_extensions/mongodb/fields/json.py deleted file mode 100644 index 5bccd4ef0c0..00000000000 --- a/vendor-local/lib/python/django_extensions/mongodb/fields/json.py +++ /dev/null @@ -1,77 +0,0 @@ -""" -JSONField automatically serializes most Python terms to JSON data. -Creates a TEXT field with a default value of "{}". See test_json.py for -more information. - - from django.db import models - from django_extensions.db.fields import json - - class LOL(models.Model): - extra = json.JSONField() -""" - -import six -import datetime -from decimal import Decimal -from django.conf import settings -from django.utils import simplejson -from mongoengine.fields import StringField - - -class JSONEncoder(simplejson.JSONEncoder): - def default(self, obj): - if isinstance(obj, Decimal): - return str(obj) - elif isinstance(obj, datetime.datetime): - assert settings.TIME_ZONE == 'UTC' - return obj.strftime('%Y-%m-%dT%H:%M:%SZ') - return simplejson.JSONEncoder.default(self, obj) - - -def dumps(value): - assert isinstance(value, dict) - return JSONEncoder().encode(value) - - -def loads(txt): - value = simplejson.loads(txt, parse_float=Decimal, encoding=settings.DEFAULT_CHARSET) - assert isinstance(value, dict) - return value - - -class JSONDict(dict): - """ - Hack so repr() called by dumpdata will output JSON instead of - Python formatted data. This way fixtures will work! - """ - def __repr__(self): - return dumps(self) - - -class JSONField(StringField): - """JSONField is a generic textfield that neatly serializes/unserializes - JSON objects seamlessly. Main thingy must be a dict object.""" - - def __init__(self, *args, **kwargs): - if 'default' not in kwargs: - kwargs['default'] = '{}' - StringField.__init__(self, *args, **kwargs) - - def to_python(self, value): - """Convert our string value to JSON after we load it from the DB""" - if not value: - return {} - elif isinstance(value, six.string_types): - res = loads(value) - assert isinstance(res, dict) - return JSONDict(**res) - else: - return value - - def get_db_prep_save(self, value): - """Convert our JSON object to a string before we save""" - if not value: - return super(JSONField, self).get_db_prep_save("") - else: - return super(JSONField, self).get_db_prep_save(dumps(value)) - diff --git a/vendor-local/lib/python/django_extensions/mongodb/models.py b/vendor-local/lib/python/django_extensions/mongodb/models.py deleted file mode 100644 index 11f114f67be..00000000000 --- a/vendor-local/lib/python/django_extensions/mongodb/models.py +++ /dev/null @@ -1,69 +0,0 @@ -""" -Django Extensions abstract base mongoengine Document classes. -""" -import datetime -from mongoengine.document import Document -from mongoengine.fields import StringField, IntField, DateTimeField -from mongoengine.queryset import QuerySetManager -from django.utils.translation import ugettext_lazy as _ -from django_extensions.mongodb.fields import ModificationDateTimeField, CreationDateTimeField, AutoSlugField - - -class TimeStampedModel(Document): - """ TimeStampedModel - An abstract base class model that provides self-managed "created" and - "modified" fields. - """ - created = CreationDateTimeField(_('created')) - modified = ModificationDateTimeField(_('modified')) - - class Meta: - abstract = True - - -class TitleSlugDescriptionModel(Document): - """ TitleSlugDescriptionModel - An abstract base class model that provides title and description fields - and a self-managed "slug" field that populates from the title. - """ - title = StringField(_('title'), max_length=255) - slug = AutoSlugField(_('slug'), populate_from='title') - description = StringField(_('description'), blank=True, null=True) - - class Meta: - abstract = True - - -class ActivatorModelManager(QuerySetManager): - """ ActivatorModelManager - Manager to return instances of ActivatorModel: SomeModel.objects.active() / .inactive() - """ - def active(self): - """ Returns active instances of ActivatorModel: SomeModel.objects.active() """ - return super(ActivatorModelManager, self).get_query_set().filter(status=1) - - def inactive(self): - """ Returns inactive instances of ActivatorModel: SomeModel.objects.inactive() """ - return super(ActivatorModelManager, self).get_query_set().filter(status=0) - - -class ActivatorModel(Document): - """ ActivatorModel - An abstract base class model that provides activate and deactivate fields. - """ - STATUS_CHOICES = ( - (0, _('Inactive')), - (1, _('Active')), - ) - status = IntField(_('status'), choices=STATUS_CHOICES, default=1) - activate_date = DateTimeField(blank=True, null=True, help_text=_('keep empty for an immediate activation')) - deactivate_date = DateTimeField(blank=True, null=True, help_text=_('keep empty for indefinite activation')) - objects = ActivatorModelManager() - - class Meta: - abstract = True - - def save(self, *args, **kwargs): - if not self.activate_date: - self.activate_date = datetime.datetime.now() - super(ActivatorModel, self).save(*args, **kwargs) diff --git a/vendor-local/lib/python/django_extensions/settings.py b/vendor-local/lib/python/django_extensions/settings.py deleted file mode 100644 index 9e7b5d45cc0..00000000000 --- a/vendor-local/lib/python/django_extensions/settings.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.conf import settings - -REPLACEMENTS = { -} -add_replacements = getattr(settings, 'EXTENSIONS_REPLACEMENTS', {}) -REPLACEMENTS.update(add_replacements) - diff --git a/vendor-local/lib/python/django_extensions/static/django_extensions/css/jquery.autocomplete.css b/vendor-local/lib/python/django_extensions/static/django_extensions/css/jquery.autocomplete.css deleted file mode 100644 index 27a58523ed0..00000000000 --- a/vendor-local/lib/python/django_extensions/static/django_extensions/css/jquery.autocomplete.css +++ /dev/null @@ -1,43 +0,0 @@ -/***************************************************************************** - * jQuery autocomplete - ****************************************************************************/ -.ac_results { - padding: 0px; - border: 1px solid #ccc; - background-color: #fff; - overflow: hidden; - z-index: 99999; - text-align: left; -} - -.ac_results ul { - width: 100%; - list-style-position: outside; - list-style: none; - padding: 0; - margin: 0; -} - -.ac_results li { - margin: 0px; - padding: 3px 5px; - cursor: default; - display: block; - font: menu; - font-size: 12px; - line-height: 14px; - overflow: hidden; -} - -.ac_loading { - background: white url('../img/indicator.gif') right center no-repeat; -} - -.ac_odd { - background-color: #eee; -} - -.ac_over { - background-color: #999; - color: white; -} diff --git a/vendor-local/lib/python/django_extensions/static/django_extensions/img/indicator.gif b/vendor-local/lib/python/django_extensions/static/django_extensions/img/indicator.gif deleted file mode 100644 index 085ccaecaf5fa5c34bc14cd2c2ed5cbbd8e25dcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 zcma)+TTl~c6vwlh>n<VLV61^sn`|N^0W=V(@iI19!X;{*a0v}4n9#t)qE(cNZLw}P zBrK?LQM6z?S|c(6DW=#WqtgyaK&kac#nC!4BieSLI*ymt;!A1Ljt{60JulzOch2ve z|9Adhjv-sK$coSq+8~WKJw5&4!Gp1}u`_4Rbai#LwY8BXSzB9MSy^c^ne=+STCGM= zR3H%01hjC3??;aR9g^v&Rau1vnL1-u+I$rq2q#LOF_`QyJvmY&(guxLE0$qEqwH57 z21*&1rPOix(v`P|1KqGX6!OzM^uQ4ETdu6EuSGj4nxc$0+~1FySgw;sDf5!mMXXtJ z_@XnE+69Z^;Ek6TFIK@@Sz3@Gt4mgcQFI0qB-Tm+h>b99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W<w2f#2 z9Zq52LnoAPWxjqFa17&!lIJ3lEbmY7(n(&LWmufC*Do^9<}hNtBbx^HGRL7u_650L z@3YLm0&zR;*(vvhKl4$5URv-j9V^8@CER$E{3R?ej5S0wuBLpg<mFJu{hL^H^4t$r zU$OthrOpL^Q8IHH&%vf!%?Er#xip35=vO%xYnERtD;U+bp7xwgQR+AR*m0vBC}cFa zUb#)xk?JZ+E=0W5WCO)wSBa>=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?<pD1q+$vd%8uP#+pdy-Ij6|<fF!&{iWt)`CPgH-zuTvcI zyfkA(+Q@rSV#=o>vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey<DIvb)X7FdCg3kq-^KY>?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNl<OIeBfYJ^OGoVC|jD zcj|NrO0)Z%BOuq3YT)!JC)v;7%cHj=+`Ob^2$Vkq`P{n^zZen9w+$o2yd>opDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MR<T&BR{~4JK$);*Lc}>X;0+p<?a4bIc*y(Xi3cp5d?^0LhPu<3u^J|nbF?~l z5p;s4bEF-J@g5$=A7ZajUFdkSSl>Y8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? diff --git a/vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.ajaxQueue.js b/vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.ajaxQueue.js deleted file mode 100644 index cd4492c13c4..00000000000 --- a/vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.ajaxQueue.js +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Ajax Queue Plugin - * - * Homepage: http://jquery.com/plugins/project/ajaxqueue - * Documentation: http://docs.jquery.com/AjaxQueue - */ - -/** - -<script> -$(function(){ - jQuery.ajaxQueue({ - url: "test.php", - success: function(html){ jQuery("ul").append(html); } - }); - jQuery.ajaxQueue({ - url: "test.php", - success: function(html){ jQuery("ul").append(html); } - }); - jQuery.ajaxSync({ - url: "test.php", - success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); } - }); - jQuery.ajaxSync({ - url: "test.php", - success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); } - }); -}); -</script> -<ul style="position: absolute; top: 5px; right: 5px;"></ul> - - */ -/* - * Queued Ajax requests. - * A new Ajax request won't be started until the previous queued - * request has finished. - */ - -/* - * Synced Ajax requests. - * The Ajax request will happen as soon as you call this method, but - * the callbacks (success/error/complete) won't fire until all previous - * synced requests have been completed. - */ - - -(function(jQuery) { - - var ajax = jQuery.ajax; - - var pendingRequests = {}; - - var synced = []; - var syncedData = []; - - jQuery.ajax = function(settings) { - // create settings for compatibility with ajaxSetup - settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings)); - - var port = settings.port; - - switch(settings.mode) { - case "abort": - if ( pendingRequests[port] ) { - pendingRequests[port].abort(); - } - return pendingRequests[port] = ajax.apply(this, arguments); - case "queue": - var _old = settings.complete; - settings.complete = function(){ - if ( _old ) - _old.apply( this, arguments ); - jQuery([ajax]).dequeue("ajax" + port );; - }; - - jQuery([ ajax ]).queue("ajax" + port, function(){ - ajax( settings ); - }); - return; - case "sync": - var pos = synced.length; - - synced[ pos ] = { - error: settings.error, - success: settings.success, - complete: settings.complete, - done: false - }; - - syncedData[ pos ] = { - error: [], - success: [], - complete: [] - }; - - settings.error = function(){ syncedData[ pos ].error = arguments; }; - settings.success = function(){ syncedData[ pos ].success = arguments; }; - settings.complete = function(){ - syncedData[ pos ].complete = arguments; - synced[ pos ].done = true; - - if ( pos == 0 || !synced[ pos-1 ] ) - for ( var i = pos; i < synced.length && synced[i].done; i++ ) { - if ( synced[i].error ) synced[i].error.apply( jQuery, syncedData[i].error ); - if ( synced[i].success ) synced[i].success.apply( jQuery, syncedData[i].success ); - if ( synced[i].complete ) synced[i].complete.apply( jQuery, syncedData[i].complete ); - - synced[i] = null; - syncedData[i] = null; - } - }; - } - return ajax.apply(this, arguments); - }; - -})((typeof window.jQuery == 'undefined' && typeof window.django != 'undefined') - ? django.jQuery - : jQuery -); diff --git a/vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.autocomplete.js b/vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.autocomplete.js deleted file mode 100644 index 63f4734eee1..00000000000 --- a/vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.autocomplete.js +++ /dev/null @@ -1,762 +0,0 @@ -/* - * Autocomplete - jQuery plugin 1.0.2 - * - * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - * Revision: $Id: jquery.autocomplete.js 5747 2008-06-25 18:30:55Z joern.zaefferer $ - * - */ - -;(function($) { - -$.fn.extend({ - autocomplete: function(urlOrData, options) { - var isUrl = typeof urlOrData == "string"; - options = $.extend({}, $.Autocompleter.defaults, { - url: isUrl ? urlOrData : null, - data: isUrl ? null : urlOrData, - delay: isUrl ? $.Autocompleter.defaults.delay : 10, - max: options && !options.scroll ? 10 : 150 - }, options); - - // if highlight is set to false, replace it with a do-nothing function - options.highlight = options.highlight || function(value) { return value; }; - - // if the formatMatch option is not specified, then use formatItem for backwards compatibility - options.formatMatch = options.formatMatch || options.formatItem; - - return this.each(function() { - new $.Autocompleter(this, options); - }); - }, - result: function(handler) { - return this.bind("result", handler); - }, - search: function(handler) { - return this.trigger("search", [handler]); - }, - flushCache: function() { - return this.trigger("flushCache"); - }, - setOptions: function(options){ - return this.trigger("setOptions", [options]); - }, - unautocomplete: function() { - return this.trigger("unautocomplete"); - } -}); - -$.Autocompleter = function(input, options) { - - var KEY = { - UP: 38, - DOWN: 40, - DEL: 46, - TAB: 9, - RETURN: 13, - ESC: 27, - COMMA: 188, - PAGEUP: 33, - PAGEDOWN: 34, - BACKSPACE: 8 - }; - - // Create $ object for input element - var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass); - - var timeout; - var previousValue = ""; - var cache = $.Autocompleter.Cache(options); - var hasFocus = 0; - var lastKeyPressCode; - var config = { - mouseDownOnSelect: false - }; - var select = $.Autocompleter.Select(options, input, selectCurrent, config); - - var blockSubmit; - - // prevent form submit in opera when selecting with return key - $.browser.opera && $(input.form).bind("submit.autocomplete", function() { - if (blockSubmit) { - blockSubmit = false; - return false; - } - }); - - // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all - $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) { - // track last key pressed - lastKeyPressCode = event.keyCode; - switch(event.keyCode) { - - case KEY.UP: - event.preventDefault(); - if ( select.visible() ) { - select.prev(); - } else { - onChange(0, true); - } - break; - - case KEY.DOWN: - event.preventDefault(); - if ( select.visible() ) { - select.next(); - } else { - onChange(0, true); - } - break; - - case KEY.PAGEUP: - event.preventDefault(); - if ( select.visible() ) { - select.pageUp(); - } else { - onChange(0, true); - } - break; - - case KEY.PAGEDOWN: - event.preventDefault(); - if ( select.visible() ) { - select.pageDown(); - } else { - onChange(0, true); - } - break; - - // matches also semicolon - case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA: - case KEY.TAB: - case KEY.RETURN: - if( selectCurrent() ) { - // stop default to prevent a form submit, Opera needs special handling - event.preventDefault(); - blockSubmit = true; - return false; - } - break; - - case KEY.ESC: - select.hide(); - break; - - default: - clearTimeout(timeout); - timeout = setTimeout(onChange, options.delay); - break; - } - }).focus(function(){ - // track whether the field has focus, we shouldn't process any - // results if the field no longer has focus - hasFocus++; - }).blur(function() { - hasFocus = 0; - if (!config.mouseDownOnSelect) { - hideResults(); - } - }).click(function() { - // show select when clicking in a focused field - if ( hasFocus++ > 1 && !select.visible() ) { - onChange(0, true); - } - }).bind("search", function() { - // TODO why not just specifying both arguments? - var fn = (arguments.length > 1) ? arguments[1] : null; - function findValueCallback(q, data) { - var result; - if( data && data.length ) { - for (var i=0; i < data.length; i++) { - if( data[i].result.toLowerCase() == q.toLowerCase() ) { - result = data[i]; - break; - } - } - } - if( typeof fn == "function" ) fn(result); - else $input.trigger("result", result && [result.data, result.value]); - } - $.each(trimWords($input.val()), function(i, value) { - request(value, findValueCallback, findValueCallback); - }); - }).bind("flushCache", function() { - cache.flush(); - }).bind("setOptions", function() { - $.extend(options, arguments[1]); - // if we've updated the data, repopulate - if ( "data" in arguments[1] ) - cache.populate(); - }).bind("unautocomplete", function() { - select.unbind(); - $input.unbind(); - $(input.form).unbind(".autocomplete"); - }); - - - function selectCurrent() { - var selected = select.selected(); - if( !selected ) - return false; - - var v = selected.result; - previousValue = v; - - if ( options.multiple ) { - var words = trimWords($input.val()); - if ( words.length > 1 ) { - v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v; - } - v += options.multipleSeparator; - } - - $input.val(v); - hideResultsNow(); - $input.trigger("result", [selected.data, selected.value]); - return true; - } - - function onChange(crap, skipPrevCheck) { - if( lastKeyPressCode == KEY.DEL ) { - select.hide(); - return; - } - - var currentValue = $input.val(); - - if ( !skipPrevCheck && currentValue == previousValue ) - return; - - previousValue = currentValue; - - currentValue = lastWord(currentValue); - if ( currentValue.length >= options.minChars) { - $input.addClass(options.loadingClass); - if (!options.matchCase) - currentValue = currentValue.toLowerCase(); - request(currentValue, receiveData, hideResultsNow); - } else { - stopLoading(); - select.hide(); - } - }; - - function trimWords(value) { - if ( !value ) { - return [""]; - } - var words = value.split( options.multipleSeparator ); - var result = []; - $.each(words, function(i, value) { - if ( $.trim(value) ) - result[i] = $.trim(value); - }); - return result; - } - - function lastWord(value) { - if ( !options.multiple ) - return value; - var words = trimWords(value); - return words[words.length - 1]; - } - - // fills in the input box w/the first match (assumed to be the best match) - // q: the term entered - // sValue: the first matching result - function autoFill(q, sValue){ - // autofill in the complete box w/the first match as long as the user hasn't entered in more data - // if the last user key pressed was backspace, don't autofill - if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) { - // fill in the value (keep the case the user has typed) - $input.val($input.val() + sValue.substring(lastWord(previousValue).length)); - // select the portion of the value not typed by the user (so the next character will erase) - $.Autocompleter.Selection(input, previousValue.length, previousValue.length + sValue.length); - } - }; - - function hideResults() { - clearTimeout(timeout); - timeout = setTimeout(hideResultsNow, 200); - }; - - function hideResultsNow() { - var wasVisible = select.visible(); - select.hide(); - clearTimeout(timeout); - stopLoading(); - if (options.mustMatch) { - // call search and run callback - $input.search( - function (result){ - // if no value found, clear the input box - if( !result ) { - if (options.multiple) { - var words = trimWords($input.val()).slice(0, -1); - $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") ); - } - else - $input.val( "" ); - } - } - ); - } - if (wasVisible) - // position cursor at end of input field - $.Autocompleter.Selection(input, input.value.length, input.value.length); - }; - - function receiveData(q, data) { - if ( data && data.length && hasFocus ) { - stopLoading(); - select.display(data, q); - autoFill(q, data[0].value); - select.show(); - } else { - hideResultsNow(); - } - }; - - function request(term, success, failure) { - if (!options.matchCase) - term = term.toLowerCase(); - var data = cache.load(term); - // recieve the cached data - if (data && data.length) { - success(term, data); - // if an AJAX url has been supplied, try loading the data now - } else if( (typeof options.url == "string") && (options.url.length > 0) ){ - - var extraParams = { - timestamp: +new Date() - }; - $.each(options.extraParams, function(key, param) { - extraParams[key] = typeof param == "function" ? param() : param; - }); - - $.ajax({ - // try to leverage ajaxQueue plugin to abort previous requests - mode: "abort", - // limit abortion to this input - port: "autocomplete" + input.name, - dataType: options.dataType, - url: options.url, - data: $.extend({ - q: lastWord(term), - limit: options.max - }, extraParams), - success: function(data) { - var parsed = options.parse && options.parse(data) || parse(data); - cache.add(term, parsed); - success(term, parsed); - } - }); - } else { - // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match - select.emptyList(); - failure(term); - } - }; - - function parse(data) { - var parsed = []; - var rows = data.split("\n"); - for (var i=0; i < rows.length; i++) { - var row = $.trim(rows[i]); - if (row) { - row = row.split("|"); - parsed[parsed.length] = { - data: row, - value: row[0], - result: options.formatResult && options.formatResult(row, row[0]) || row[0] - }; - } - } - return parsed; - }; - - function stopLoading() { - $input.removeClass(options.loadingClass); - }; - -}; - -$.Autocompleter.defaults = { - inputClass: "ac_input", - resultsClass: "ac_results", - loadingClass: "ac_loading", - minChars: 1, - delay: 400, - matchCase: false, - matchSubset: true, - matchContains: false, - cacheLength: 10, - max: 100, - mustMatch: false, - extraParams: {}, - selectFirst: true, - formatItem: function(row) { return row[0]; }, - formatMatch: null, - autoFill: false, - width: 0, - multiple: false, - multipleSeparator: ", ", - highlight: function(value, term) { - return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"); - }, - scroll: true, - scrollHeight: 180 -}; - -$.Autocompleter.Cache = function(options) { - - var data = {}; - var length = 0; - - function matchSubset(s, sub) { - if (!options.matchCase) - s = s.toLowerCase(); - var i = s.indexOf(sub); - if (i == -1) return false; - return i == 0 || options.matchContains; - }; - - function add(q, value) { - if (length > options.cacheLength){ - flush(); - } - if (!data[q]){ - length++; - } - data[q] = value; - } - - function populate(){ - if( !options.data ) return false; - // track the matches - var stMatchSets = {}, - nullData = 0; - - // no url was specified, we need to adjust the cache length to make sure it fits the local data store - if( !options.url ) options.cacheLength = 1; - - // track all options for minChars = 0 - stMatchSets[""] = []; - - // loop through the array and create a lookup structure - for ( var i = 0, ol = options.data.length; i < ol; i++ ) { - var rawValue = options.data[i]; - // if rawValue is a string, make an array otherwise just reference the array - rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue; - - var value = options.formatMatch(rawValue, i+1, options.data.length); - if ( value === false ) - continue; - - var firstChar = value.charAt(0).toLowerCase(); - // if no lookup array for this character exists, look it up now - if( !stMatchSets[firstChar] ) - stMatchSets[firstChar] = []; - - // if the match is a string - var row = { - value: value, - data: rawValue, - result: options.formatResult && options.formatResult(rawValue) || value - }; - - // push the current match into the set list - stMatchSets[firstChar].push(row); - - // keep track of minChars zero items - if ( nullData++ < options.max ) { - stMatchSets[""].push(row); - } - }; - - // add the data items to the cache - $.each(stMatchSets, function(i, value) { - // increase the cache size - options.cacheLength++; - // add to the cache - add(i, value); - }); - } - - // populate any existing data - setTimeout(populate, 25); - - function flush(){ - data = {}; - length = 0; - } - - return { - flush: flush, - add: add, - populate: populate, - load: function(q) { - if (!options.cacheLength || !length) - return null; - /* - * if dealing w/local data and matchContains than we must make sure - * to loop through all the data collections looking for matches - */ - if( !options.url && options.matchContains ){ - // track all matches - var csub = []; - // loop through all the data grids for matches - for( var k in data ){ - // don't search through the stMatchSets[""] (minChars: 0) cache - // this prevents duplicates - if( k.length > 0 ){ - var c = data[k]; - $.each(c, function(i, x) { - // if we've got a match, add it to the array - if (matchSubset(x.value, q)) { - csub.push(x); - } - }); - } - } - return csub; - } else - // if the exact item exists, use it - if (data[q]){ - return data[q]; - } else - if (options.matchSubset) { - for (var i = q.length - 1; i >= options.minChars; i--) { - var c = data[q.substr(0, i)]; - if (c) { - var csub = []; - $.each(c, function(i, x) { - if (matchSubset(x.value, q)) { - csub[csub.length] = x; - } - }); - return csub; - } - } - } - return null; - } - }; -}; - -$.Autocompleter.Select = function (options, input, select, config) { - var CLASSES = { - ACTIVE: "ac_over" - }; - - var listItems, - active = -1, - data, - term = "", - needsInit = true, - element, - list; - - // Create results - function init() { - if (!needsInit) - return; - element = $("<div/>") - .hide() - .addClass(options.resultsClass) - .css("position", "absolute") - .appendTo(document.body); - - list = $("<ul/>").appendTo(element).mouseover( function(event) { - if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') { - active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event)); - $(target(event)).addClass(CLASSES.ACTIVE); - } - }).click(function(event) { - $(target(event)).addClass(CLASSES.ACTIVE); - select(); - // TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus - input.focus(); - return false; - }).mousedown(function() { - config.mouseDownOnSelect = true; - }).mouseup(function() { - config.mouseDownOnSelect = false; - }); - - if( options.width > 0 ) - element.css("width", options.width); - - needsInit = false; - } - - function target(event) { - var element = event.target; - while(element && element.tagName != "LI") - element = element.parentNode; - // more fun with IE, sometimes event.target is empty, just ignore it then - if(!element) - return []; - return element; - } - - function moveSelect(step) { - listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE); - movePosition(step); - var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE); - if(options.scroll) { - var offset = 0; - listItems.slice(0, active).each(function() { - offset += this.offsetHeight; - }); - if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) { - list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight()); - } else if(offset < list.scrollTop()) { - list.scrollTop(offset); - } - } - }; - - function movePosition(step) { - active += step; - if (active < 0) { - active = listItems.size() - 1; - } else if (active >= listItems.size()) { - active = 0; - } - } - - function limitNumberOfItems(available) { - return options.max && options.max < available - ? options.max - : available; - } - - function fillList() { - list.empty(); - var max = limitNumberOfItems(data.length); - for (var i=0; i < max; i++) { - if (!data[i]) - continue; - var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term); - if ( formatted === false ) - continue; - var li = $("<li/>").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0]; - $.data(li, "ac_data", data[i]); - } - listItems = list.find("li"); - if ( options.selectFirst ) { - listItems.slice(0, 1).addClass(CLASSES.ACTIVE); - active = 0; - } - // apply bgiframe if available - if ( $.fn.bgiframe ) - list.bgiframe(); - } - - return { - display: function(d, q) { - init(); - data = d; - term = q; - fillList(); - }, - next: function() { - moveSelect(1); - }, - prev: function() { - moveSelect(-1); - }, - pageUp: function() { - if (active != 0 && active - 8 < 0) { - moveSelect( -active ); - } else { - moveSelect(-8); - } - }, - pageDown: function() { - if (active != listItems.size() - 1 && active + 8 > listItems.size()) { - moveSelect( listItems.size() - 1 - active ); - } else { - moveSelect(8); - } - }, - hide: function() { - element && element.hide(); - listItems && listItems.removeClass(CLASSES.ACTIVE); - active = -1; - }, - visible : function() { - return element && element.is(":visible"); - }, - current: function() { - return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]); - }, - show: function() { - var offset = $(input).offset(); - element.css({ - width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(), - top: offset.top + input.offsetHeight, - left: offset.left - }).show(); - if(options.scroll) { - list.scrollTop(0); - list.css({ - maxHeight: options.scrollHeight, - overflow: 'auto' - }); - - if($.browser.msie && typeof document.body.style.maxHeight === "undefined") { - var listHeight = 0; - listItems.each(function() { - listHeight += this.offsetHeight; - }); - var scrollbarsVisible = listHeight > options.scrollHeight; - list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight ); - if (!scrollbarsVisible) { - // IE doesn't recalculate width when scrollbar disappears - listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) ); - } - } - - } - }, - selected: function() { - var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE); - return selected && selected.length && $.data(selected[0], "ac_data"); - }, - emptyList: function (){ - list && list.empty(); - }, - unbind: function() { - element && element.remove(); - } - }; -}; - -$.Autocompleter.Selection = function(field, start, end) { - if( field.createTextRange ){ - var selRange = field.createTextRange(); - selRange.collapse(true); - selRange.moveStart("character", start); - selRange.moveEnd("character", end); - selRange.select(); - } else if( field.setSelectionRange ){ - field.setSelectionRange(start, end); - } else { - if( field.selectionStart ){ - field.selectionStart = start; - field.selectionEnd = end; - } - } - field.focus(); -}; - -})((typeof window.jQuery == 'undefined' && typeof window.django != 'undefined') - ? django.jQuery - : jQuery -); diff --git a/vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.bgiframe.min.js b/vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.bgiframe.min.js deleted file mode 100644 index 7165d7a3d86..00000000000 --- a/vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.bgiframe.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net) - * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) - * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. - * - * $LastChangedDate: 2007-07-22 01:45:56 +0200 (Son, 22 Jul 2007) $ - * $Rev: 2447 $ - * - * Version 2.1.1 - */ -(function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+'style="display:block;position:absolute;z-index:-1;'+(s.opacity!==false?'filter:Alpha(Opacity=\'0\');':'')+'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+'"/>';return this.each(function(){if($('> iframe.bgiframe',this).length==0)this.insertBefore(document.createElement(html),this.firstChild);});}return this;};})((typeof window.jQuery=='undefined' && typeof window.django!='undefined')? django.jQuery : jQuery); \ No newline at end of file diff --git a/vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.js b/vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.js deleted file mode 100644 index 400531a2db1..00000000000 --- a/vendor-local/lib/python/django_extensions/static/django_extensions/js/jquery.js +++ /dev/null @@ -1,3558 +0,0 @@ -(function(){ -/* - * jQuery 1.2.6 - New Wave Javascript - * - * Copyright (c) 2008 John Resig (jquery.com) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * $Date: 2008-05-27 21:17:26 +0200 (Di, 27 Mai 2008) $ - * $Rev: 5700 $ - */ - -// Map over jQuery in case of overwrite -var _jQuery = window.jQuery, -// Map over the $ in case of overwrite - _$ = window.$; - -var jQuery = window.jQuery = window.$ = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context ); -}; - -// A simple way to check for HTML strings or ID strings -// (both of which we optimize for) -var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/, - -// Is it a simple selector - isSimple = /^.[^:#\[\.]*$/, - -// Will speed up references to undefined, and allows munging its name. - undefined; - -jQuery.fn = jQuery.prototype = { - init: function( selector, context ) { - // Make sure that a selection was provided - selector = selector || document; - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this[0] = selector; - this.length = 1; - return this; - } - // Handle HTML strings - if ( typeof selector == "string" ) { - // Are we dealing with HTML string or an ID? - var match = quickExpr.exec( selector ); - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) - selector = jQuery.clean( [ match[1] ], context ); - - // HANDLE: $("#id") - else { - var elem = document.getElementById( match[3] ); - - // Make sure an element was located - if ( elem ){ - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id != match[3] ) - return jQuery().find( selector ); - - // Otherwise, we inject the element directly into the jQuery object - return jQuery( elem ); - } - selector = []; - } - - // HANDLE: $(expr, [context]) - // (which is just equivalent to: $(content).find(expr) - } else - return jQuery( context ).find( selector ); - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) - return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector ); - - return this.setArray(jQuery.makeArray(selector)); - }, - - // The current version of jQuery being used - jquery: "1.2.6", - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - // The number of elements contained in the matched element set - length: 0, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == undefined ? - - // Return a 'clean' array - jQuery.makeArray( this ) : - - // Return just the object - this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - // Build a new jQuery matched element set - var ret = jQuery( elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Force the current matched set of elements to become - // the specified array of elements (destroying the stack in the process) - // You should use pushStack() in order to do this, but maintain the stack - setArray: function( elems ) { - // Resetting the length to 0, then using the native Array push - // is a super-fast way to populate an object with array-like properties - this.length = 0; - Array.prototype.push.apply( this, elems ); - - return this; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - var ret = -1; - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem && elem.jquery ? elem[0] : elem - , this ); - }, - - attr: function( name, value, type ) { - var options = name; - - // Look for the case where we're accessing a style value - if ( name.constructor == String ) - if ( value === undefined ) - return this[0] && jQuery[ type || "attr" ]( this[0], name ); - - else { - options = {}; - options[ name ] = value; - } - - // Check to see if we're setting style values - return this.each(function(i){ - // Set all the styles - for ( name in options ) - jQuery.attr( - type ? - this.style : - this, - name, jQuery.prop( this, options[ name ], type, i, name ) - ); - }); - }, - - css: function( key, value ) { - // ignore negative width and height values - if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) - value = undefined; - return this.attr( key, value, "curCSS" ); - }, - - text: function( text ) { - if ( typeof text != "object" && text != null ) - return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); - - var ret = ""; - - jQuery.each( text || this, function(){ - jQuery.each( this.childNodes, function(){ - if ( this.nodeType != 8 ) - ret += this.nodeType != 1 ? - this.nodeValue : - jQuery.fn.text( [ this ] ); - }); - }); - - return ret; - }, - - wrapAll: function( html ) { - if ( this[0] ) - // The elements to wrap the target around - jQuery( html, this[0].ownerDocument ) - .clone() - .insertBefore( this[0] ) - .map(function(){ - var elem = this; - - while ( elem.firstChild ) - elem = elem.firstChild; - - return elem; - }) - .append(this); - - return this; - }, - - wrapInner: function( html ) { - return this.each(function(){ - jQuery( this ).contents().wrapAll( html ); - }); - }, - - wrap: function( html ) { - return this.each(function(){ - jQuery( this ).wrapAll( html ); - }); - }, - - append: function() { - return this.domManip(arguments, true, false, function(elem){ - if (this.nodeType == 1) - this.appendChild( elem ); - }); - }, - - prepend: function() { - return this.domManip(arguments, true, true, function(elem){ - if (this.nodeType == 1) - this.insertBefore( elem, this.firstChild ); - }); - }, - - before: function() { - return this.domManip(arguments, false, false, function(elem){ - this.parentNode.insertBefore( elem, this ); - }); - }, - - after: function() { - return this.domManip(arguments, false, true, function(elem){ - this.parentNode.insertBefore( elem, this.nextSibling ); - }); - }, - - end: function() { - return this.prevObject || jQuery( [] ); - }, - - find: function( selector ) { - var elems = jQuery.map(this, function(elem){ - return jQuery.find( selector, elem ); - }); - - return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ? - jQuery.unique( elems ) : - elems ); - }, - - clone: function( events ) { - // Do the clone - var ret = this.map(function(){ - if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) { - // IE copies events bound via attachEvent when - // using cloneNode. Calling detachEvent on the - // clone will also remove the events from the orignal - // In order to get around this, we use innerHTML. - // Unfortunately, this means some modifications to - // attributes in IE that are actually only stored - // as properties will not be copied (such as the - // the name attribute on an input). - var clone = this.cloneNode(true), - container = document.createElement("div"); - container.appendChild(clone); - return jQuery.clean([container.innerHTML])[0]; - } else - return this.cloneNode(true); - }); - - // Need to set the expando to null on the cloned set if it exists - // removeData doesn't work here, IE removes it from the original as well - // this is primarily for IE but the data expando shouldn't be copied over in any browser - var clone = ret.find("*").andSelf().each(function(){ - if ( this[ expando ] != undefined ) - this[ expando ] = null; - }); - - // Copy the events from the original to the clone - if ( events === true ) - this.find("*").andSelf().each(function(i){ - if (this.nodeType == 3) - return; - var events = jQuery.data( this, "events" ); - - for ( var type in events ) - for ( var handler in events[ type ] ) - jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); - }); - - // Return the cloned set - return ret; - }, - - filter: function( selector ) { - return this.pushStack( - jQuery.isFunction( selector ) && - jQuery.grep(this, function(elem, i){ - return selector.call( elem, i ); - }) || - - jQuery.multiFilter( selector, this ) ); - }, - - not: function( selector ) { - if ( selector.constructor == String ) - // test special case where just one selector is passed in - if ( isSimple.test( selector ) ) - return this.pushStack( jQuery.multiFilter( selector, this, true ) ); - else - selector = jQuery.multiFilter( selector, this ); - - var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; - return this.filter(function() { - return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; - }); - }, - - add: function( selector ) { - return this.pushStack( jQuery.unique( jQuery.merge( - this.get(), - typeof selector == 'string' ? - jQuery( selector ) : - jQuery.makeArray( selector ) - ))); - }, - - is: function( selector ) { - return !!selector && jQuery.multiFilter( selector, this ).length > 0; - }, - - hasClass: function( selector ) { - return this.is( "." + selector ); - }, - - val: function( value ) { - if ( value == undefined ) { - - if ( this.length ) { - var elem = this[0]; - - // We need to handle select boxes special - if ( jQuery.nodeName( elem, "select" ) ) { - var index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type == "select-one"; - - // Nothing was selected - if ( index < 0 ) - return null; - - // Loop through all the selected options - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var option = options[ i ]; - - if ( option.selected ) { - // Get the specifc value for the option - value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value; - - // We don't need an array for one selects - if ( one ) - return value; - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - - // Everything else, we just grab the value - } else - return (this[0].value || "").replace(/\r/g, ""); - - } - - return undefined; - } - - if( value.constructor == Number ) - value += ''; - - return this.each(function(){ - if ( this.nodeType != 1 ) - return; - - if ( value.constructor == Array && /radio|checkbox/.test( this.type ) ) - this.checked = (jQuery.inArray(this.value, value) >= 0 || - jQuery.inArray(this.name, value) >= 0); - - else if ( jQuery.nodeName( this, "select" ) ) { - var values = jQuery.makeArray(value); - - jQuery( "option", this ).each(function(){ - this.selected = (jQuery.inArray( this.value, values ) >= 0 || - jQuery.inArray( this.text, values ) >= 0); - }); - - if ( !values.length ) - this.selectedIndex = -1; - - } else - this.value = value; - }); - }, - - html: function( value ) { - return value == undefined ? - (this[0] ? - this[0].innerHTML : - null) : - this.empty().append( value ); - }, - - replaceWith: function( value ) { - return this.after( value ).remove(); - }, - - eq: function( i ) { - return this.slice( i, i + 1 ); - }, - - slice: function() { - return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function(elem, i){ - return callback.call( elem, i, elem ); - })); - }, - - andSelf: function() { - return this.add( this.prevObject ); - }, - - data: function( key, value ){ - var parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; - - if ( value === undefined ) { - var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - - if ( data === undefined && this.length ) - data = jQuery.data( this[0], key ); - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - } else - return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ - jQuery.data( this, key, value ); - }); - }, - - removeData: function( key ){ - return this.each(function(){ - jQuery.removeData( this, key ); - }); - }, - - domManip: function( args, table, reverse, callback ) { - var clone = this.length > 1, elems; - - return this.each(function(){ - if ( !elems ) { - elems = jQuery.clean( args, this.ownerDocument ); - - if ( reverse ) - elems.reverse(); - } - - var obj = this; - - if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) ) - obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") ); - - var scripts = jQuery( [] ); - - jQuery.each(elems, function(){ - var elem = clone ? - jQuery( this ).clone( true )[0] : - this; - - // execute all scripts after the elements have been injected - if ( jQuery.nodeName( elem, "script" ) ) - scripts = scripts.add( elem ); - else { - // Remove any inner scripts for later evaluation - if ( elem.nodeType == 1 ) - scripts = scripts.add( jQuery( "script", elem ).remove() ); - - // Inject the elements into the document - callback.call( obj, elem ); - } - }); - - scripts.each( evalScript ); - }); - } -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -function evalScript( i, elem ) { - if ( elem.src ) - jQuery.ajax({ - url: elem.src, - async: false, - dataType: "script" - }); - - else - jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); - - if ( elem.parentNode ) - elem.parentNode.removeChild( elem ); -} - -function now(){ - return +new Date; -} - -jQuery.extend = jQuery.fn.extend = function() { - // copy reference to target object - var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; - - // Handle a deep copy situation - if ( target.constructor == Boolean ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target != "object" && typeof target != "function" ) - target = {}; - - // extend jQuery itself if only one argument is passed - if ( length == i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) - // Extend the base object - for ( var name in options ) { - var src = target[ name ], copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) - continue; - - // Recurse if we're merging object values - if ( deep && copy && typeof copy == "object" && !copy.nodeType ) - target[ name ] = jQuery.extend( deep, - // Never move original objects, clone them - src || ( copy.length != null ? [ ] : { } ) - , copy ); - - // Don't bring in undefined values - else if ( copy !== undefined ) - target[ name ] = copy; - - } - - // Return the modified object - return target; -}; - -var expando = "jQuery" + now(), uuid = 0, windowData = {}, - // exclude the following css properties to add px - exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, - // cache defaultView - defaultView = document.defaultView || {}; - -jQuery.extend({ - noConflict: function( deep ) { - window.$ = _$; - - if ( deep ) - window.jQuery = _jQuery; - - return jQuery; - }, - - // See test/unit/core.js for details concerning this function. - isFunction: function( fn ) { - return !!fn && typeof fn != "string" && !fn.nodeName && - fn.constructor != Array && /^[\s[]?function/.test( fn + "" ); - }, - - // check if an element is in a (or is an) XML document - isXMLDoc: function( elem ) { - return elem.documentElement && !elem.body || - elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; - }, - - // Evalulates a script in a global context - globalEval: function( data ) { - data = jQuery.trim( data ); - - if ( data ) { - // Inspired by code by Andrea Giammarchi - // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html - var head = document.getElementsByTagName("head")[0] || document.documentElement, - script = document.createElement("script"); - - script.type = "text/javascript"; - if ( jQuery.browser.msie ) - script.text = data; - else - script.appendChild( document.createTextNode( data ) ); - - // Use insertBefore instead of appendChild to circumvent an IE6 bug. - // This arises when a base node is used (#2709). - head.insertBefore( script, head.firstChild ); - head.removeChild( script ); - } - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); - }, - - cache: {}, - - data: function( elem, name, data ) { - elem = elem == window ? - windowData : - elem; - - var id = elem[ expando ]; - - // Compute a unique ID for the element - if ( !id ) - id = elem[ expando ] = ++uuid; - - // Only generate the data cache if we're - // trying to access or manipulate it - if ( name && !jQuery.cache[ id ] ) - jQuery.cache[ id ] = {}; - - // Prevent overriding the named cache with undefined values - if ( data !== undefined ) - jQuery.cache[ id ][ name ] = data; - - // Return the named cache data, or the ID for the element - return name ? - jQuery.cache[ id ][ name ] : - id; - }, - - removeData: function( elem, name ) { - elem = elem == window ? - windowData : - elem; - - var id = elem[ expando ]; - - // If we want to remove a specific section of the element's data - if ( name ) { - if ( jQuery.cache[ id ] ) { - // Remove the section of cache data - delete jQuery.cache[ id ][ name ]; - - // If we've removed all the data, remove the element's cache - name = ""; - - for ( name in jQuery.cache[ id ] ) - break; - - if ( !name ) - jQuery.removeData( elem ); - } - - // Otherwise, we want to remove all of the element's data - } else { - // Clean up the element expando - try { - delete elem[ expando ]; - } catch(e){ - // IE has trouble directly removing the expando - // but it's ok with using removeAttribute - if ( elem.removeAttribute ) - elem.removeAttribute( expando ); - } - - // Completely remove the data cache - delete jQuery.cache[ id ]; - } - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, length = object.length; - - if ( args ) { - if ( length == undefined ) { - for ( name in object ) - if ( callback.apply( object[ name ], args ) === false ) - break; - } else - for ( ; i < length; ) - if ( callback.apply( object[ i++ ], args ) === false ) - break; - - // A special, fast, case for the most common use of each - } else { - if ( length == undefined ) { - for ( name in object ) - if ( callback.call( object[ name ], name, object[ name ] ) === false ) - break; - } else - for ( var value = object[0]; - i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} - } - - return object; - }, - - prop: function( elem, value, type, i, name ) { - // Handle executable functions - if ( jQuery.isFunction( value ) ) - value = value.call( elem, i ); - - // Handle passing in a number to a CSS property - return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ? - value + "px" : - value; - }, - - className: { - // internal only, use addClass("class") - add: function( elem, classNames ) { - jQuery.each((classNames || "").split(/\s+/), function(i, className){ - if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) - elem.className += (elem.className ? " " : "") + className; - }); - }, - - // internal only, use removeClass("class") - remove: function( elem, classNames ) { - if (elem.nodeType == 1) - elem.className = classNames != undefined ? - jQuery.grep(elem.className.split(/\s+/), function(className){ - return !jQuery.className.has( classNames, className ); - }).join(" ") : - ""; - }, - - // internal only, use hasClass("class") - has: function( elem, className ) { - return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; - } - }, - - // A method for quickly swapping in/out CSS properties to get correct calculations - swap: function( elem, options, callback ) { - var old = {}; - // Remember the old values, and insert the new ones - for ( var name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - callback.call( elem ); - - // Revert the old values - for ( var name in options ) - elem.style[ name ] = old[ name ]; - }, - - css: function( elem, name, force ) { - if ( name == "width" || name == "height" ) { - var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; - - function getWH() { - val = name == "width" ? elem.offsetWidth : elem.offsetHeight; - var padding = 0, border = 0; - jQuery.each( which, function() { - padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; - border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; - }); - val -= Math.round(padding + border); - } - - if ( jQuery(elem).is(":visible") ) - getWH(); - else - jQuery.swap( elem, props, getWH ); - - return Math.max(0, val); - } - - return jQuery.curCSS( elem, name, force ); - }, - - curCSS: function( elem, name, force ) { - var ret, style = elem.style; - - // A helper method for determining if an element's values are broken - function color( elem ) { - if ( !jQuery.browser.safari ) - return false; - - // defaultView is cached - var ret = defaultView.getComputedStyle( elem, null ); - return !ret || ret.getPropertyValue("color") == ""; - } - - // We need to handle opacity special in IE - if ( name == "opacity" && jQuery.browser.msie ) { - ret = jQuery.attr( style, "opacity" ); - - return ret == "" ? - "1" : - ret; - } - // Opera sometimes will give the wrong display answer, this fixes it, see #2037 - if ( jQuery.browser.opera && name == "display" ) { - var save = style.outline; - style.outline = "0 solid black"; - style.outline = save; - } - - // Make sure we're using the right name for getting the float value - if ( name.match( /float/i ) ) - name = styleFloat; - - if ( !force && style && style[ name ] ) - ret = style[ name ]; - - else if ( defaultView.getComputedStyle ) { - - // Only "float" is needed here - if ( name.match( /float/i ) ) - name = "float"; - - name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); - - var computedStyle = defaultView.getComputedStyle( elem, null ); - - if ( computedStyle && !color( elem ) ) - ret = computedStyle.getPropertyValue( name ); - - // If the element isn't reporting its values properly in Safari - // then some display: none elements are involved - else { - var swap = [], stack = [], a = elem, i = 0; - - // Locate all of the parent display: none elements - for ( ; a && color(a); a = a.parentNode ) - stack.unshift(a); - - // Go through and make them visible, but in reverse - // (It would be better if we knew the exact display type that they had) - for ( ; i < stack.length; i++ ) - if ( color( stack[ i ] ) ) { - swap[ i ] = stack[ i ].style.display; - stack[ i ].style.display = "block"; - } - - // Since we flip the display style, we have to handle that - // one special, otherwise get the value - ret = name == "display" && swap[ stack.length - 1 ] != null ? - "none" : - ( computedStyle && computedStyle.getPropertyValue( name ) ) || ""; - - // Finally, revert the display styles back - for ( i = 0; i < swap.length; i++ ) - if ( swap[ i ] != null ) - stack[ i ].style.display = swap[ i ]; - } - - // We should always get a number back from opacity - if ( name == "opacity" && ret == "" ) - ret = "1"; - - } else if ( elem.currentStyle ) { - var camelCase = name.replace(/\-(\w)/g, function(all, letter){ - return letter.toUpperCase(); - }); - - ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { - // Remember the original values - var left = style.left, rsLeft = elem.runtimeStyle.left; - - // Put in the new values to get a computed value out - elem.runtimeStyle.left = elem.currentStyle.left; - style.left = ret || 0; - ret = style.pixelLeft + "px"; - - // Revert the changed values - style.left = left; - elem.runtimeStyle.left = rsLeft; - } - } - - return ret; - }, - - clean: function( elems, context ) { - var ret = []; - context = context || document; - // !context.createElement fails in IE with an error but returns typeof 'object' - if (typeof context.createElement == 'undefined') - context = context.ownerDocument || context[0] && context[0].ownerDocument || document; - - jQuery.each(elems, function(i, elem){ - if ( !elem ) - return; - - if ( elem.constructor == Number ) - elem += ''; - - // Convert html string into DOM nodes - if ( typeof elem == "string" ) { - // Fix "XHTML"-style tags in all browsers - elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ - return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? - all : - front + "></" + tag + ">"; - }); - - // Trim whitespace, otherwise indexOf won't work as expected - var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div"); - - var wrap = - // option or optgroup - !tags.indexOf("<opt") && - [ 1, "<select multiple='multiple'>", "</select>" ] || - - !tags.indexOf("<leg") && - [ 1, "<fieldset>", "</fieldset>" ] || - - tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && - [ 1, "<table>", "</table>" ] || - - !tags.indexOf("<tr") && - [ 2, "<table><tbody>", "</tbody></table>" ] || - - // <thead> matched above - (!tags.indexOf("<td") || !tags.indexOf("<th")) && - [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] || - - !tags.indexOf("<col") && - [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] || - - // IE can't serialize <link> and <script> tags normally - jQuery.browser.msie && - [ 1, "div<div>", "</div>" ] || - - [ 0, "", "" ]; - - // Go to html and back, then peel off extra wrappers - div.innerHTML = wrap[1] + elem + wrap[2]; - - // Move to the right depth - while ( wrap[0]-- ) - div = div.lastChild; - - // Remove IE's autoinserted <tbody> from table fragments - if ( jQuery.browser.msie ) { - - // String was a <table>, *may* have spurious <tbody> - var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ? - div.firstChild && div.firstChild.childNodes : - - // String was a bare <thead> or <tfoot> - wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ? - div.childNodes : - []; - - for ( var j = tbody.length - 1; j >= 0 ; --j ) - if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) - tbody[ j ].parentNode.removeChild( tbody[ j ] ); - - // IE completely kills leading whitespace when innerHTML is used - if ( /^\s/.test( elem ) ) - div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild ); - - } - - elem = jQuery.makeArray( div.childNodes ); - } - - if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) ) - return; - - if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options ) - ret.push( elem ); - - else - ret = jQuery.merge( ret, elem ); - - }); - - return ret; - }, - - attr: function( elem, name, value ) { - // don't set attributes on text and comment nodes - if (!elem || elem.nodeType == 3 || elem.nodeType == 8) - return undefined; - - var notxml = !jQuery.isXMLDoc( elem ), - // Whether we are setting (or getting) - set = value !== undefined, - msie = jQuery.browser.msie; - - // Try to normalize/fix the name - name = notxml && jQuery.props[ name ] || name; - - // Only do all the following if this is a node (faster for style) - // IE elem.getAttribute passes even for style - if ( elem.tagName ) { - - // These attributes require special treatment - var special = /href|src|style/.test( name ); - - // Safari mis-reports the default selected property of a hidden option - // Accessing the parent's selectedIndex property fixes it - if ( name == "selected" && jQuery.browser.safari ) - elem.parentNode.selectedIndex; - - // If applicable, access the attribute via the DOM 0 way - if ( name in elem && notxml && !special ) { - if ( set ){ - // We can't allow the type property to be changed (since it causes problems in IE) - if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode ) - throw "type property can't be changed"; - - elem[ name ] = value; - } - - // browsers index elements by id/name on forms, give priority to attributes. - if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) - return elem.getAttributeNode( name ).nodeValue; - - return elem[ name ]; - } - - if ( msie && notxml && name == "style" ) - return jQuery.attr( elem.style, "cssText", value ); - - if ( set ) - // convert the value to a string (all browsers do this but IE) see #1070 - elem.setAttribute( name, "" + value ); - - var attr = msie && notxml && special - // Some attributes require a special call on IE - ? elem.getAttribute( name, 2 ) - : elem.getAttribute( name ); - - // Non-existent attributes return null, we normalize to undefined - return attr === null ? undefined : attr; - } - - // elem is actually elem.style ... set the style - - // IE uses filters for opacity - if ( msie && name == "opacity" ) { - if ( set ) { - // IE has trouble with opacity if it does not have layout - // Force it by setting the zoom level - elem.zoom = 1; - - // Set the alpha filter to set the opacity - elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) + - (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"); - } - - return elem.filter && elem.filter.indexOf("opacity=") >= 0 ? - (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '': - ""; - } - - name = name.replace(/-([a-z])/ig, function(all, letter){ - return letter.toUpperCase(); - }); - - if ( set ) - elem[ name ] = value; - - return elem[ name ]; - }, - - trim: function( text ) { - return (text || "").replace( /^\s+|\s+$/g, "" ); - }, - - makeArray: function( array ) { - var ret = []; - - if( array != null ){ - var i = array.length; - //the window, strings and functions also have 'length' - if( i == null || array.split || array.setInterval || array.call ) - ret[0] = array; - else - while( i ) - ret[--i] = array[i]; - } - - return ret; - }, - - inArray: function( elem, array ) { - for ( var i = 0, length = array.length; i < length; i++ ) - // Use === because on IE, window == document - if ( array[ i ] === elem ) - return i; - - return -1; - }, - - merge: function( first, second ) { - // We have to loop this way because IE & Opera overwrite the length - // expando of getElementsByTagName - var i = 0, elem, pos = first.length; - // Also, we need to make sure that the correct elements are being returned - // (IE returns comment nodes in a '*' query) - if ( jQuery.browser.msie ) { - while ( elem = second[ i++ ] ) - if ( elem.nodeType != 8 ) - first[ pos++ ] = elem; - - } else - while ( elem = second[ i++ ] ) - first[ pos++ ] = elem; - - return first; - }, - - unique: function( array ) { - var ret = [], done = {}; - - try { - - for ( var i = 0, length = array.length; i < length; i++ ) { - var id = jQuery.data( array[ i ] ); - - if ( !done[ id ] ) { - done[ id ] = true; - ret.push( array[ i ] ); - } - } - - } catch( e ) { - ret = array; - } - - return ret; - }, - - grep: function( elems, callback, inv ) { - var ret = []; - - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; i < length; i++ ) - if ( !inv != !callback( elems[ i ], i ) ) - ret.push( elems[ i ] ); - - return ret; - }, - - map: function( elems, callback ) { - var ret = []; - - // Go through the array, translating each of the items to their - // new value (or values). - for ( var i = 0, length = elems.length; i < length; i++ ) { - var value = callback( elems[ i ], i ); - - if ( value != null ) - ret[ ret.length ] = value; - } - - return ret.concat.apply( [], ret ); - } -}); - -var userAgent = navigator.userAgent.toLowerCase(); - -// Figure out what browser is being used -jQuery.browser = { - version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1], - safari: /webkit/.test( userAgent ), - opera: /opera/.test( userAgent ), - msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ), - mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ) -}; - -var styleFloat = jQuery.browser.msie ? - "styleFloat" : - "cssFloat"; - -jQuery.extend({ - // Check to see if the W3C box model is being used - boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat", - - props: { - "for": "htmlFor", - "class": "className", - "float": styleFloat, - cssFloat: styleFloat, - styleFloat: styleFloat, - readonly: "readOnly", - maxlength: "maxLength", - cellspacing: "cellSpacing", - rowspan: "rowSpan" - } -}); - -jQuery.each({ - parent: function(elem){return elem.parentNode;}, - parents: function(elem){return jQuery.dir(elem,"parentNode");}, - next: function(elem){return jQuery.nth(elem,2,"nextSibling");}, - prev: function(elem){return jQuery.nth(elem,2,"previousSibling");}, - nextAll: function(elem){return jQuery.dir(elem,"nextSibling");}, - prevAll: function(elem){return jQuery.dir(elem,"previousSibling");}, - siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);}, - children: function(elem){return jQuery.sibling(elem.firstChild);}, - contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);} -}, function(name, fn){ - jQuery.fn[ name ] = function( selector ) { - var ret = jQuery.map( this, fn ); - - if ( selector && typeof selector == "string" ) - ret = jQuery.multiFilter( selector, ret ); - - return this.pushStack( jQuery.unique( ret ) ); - }; -}); - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function(name, original){ - jQuery.fn[ name ] = function() { - var args = arguments; - - return this.each(function(){ - for ( var i = 0, length = args.length; i < length; i++ ) - jQuery( args[ i ] )[ original ]( this ); - }); - }; -}); - -jQuery.each({ - removeAttr: function( name ) { - jQuery.attr( this, name, "" ); - if (this.nodeType == 1) - this.removeAttribute( name ); - }, - - addClass: function( classNames ) { - jQuery.className.add( this, classNames ); - }, - - removeClass: function( classNames ) { - jQuery.className.remove( this, classNames ); - }, - - toggleClass: function( classNames ) { - jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames ); - }, - - remove: function( selector ) { - if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) { - // Prevent memory leaks - jQuery( "*", this ).add(this).each(function(){ - jQuery.event.remove(this); - jQuery.removeData(this); - }); - if (this.parentNode) - this.parentNode.removeChild( this ); - } - }, - - empty: function() { - // Remove element nodes and prevent memory leaks - jQuery( ">*", this ).remove(); - - // Remove any remaining nodes - while ( this.firstChild ) - this.removeChild( this.firstChild ); - } -}, function(name, fn){ - jQuery.fn[ name ] = function(){ - return this.each( fn, arguments ); - }; -}); - -jQuery.each([ "Height", "Width" ], function(i, name){ - var type = name.toLowerCase(); - - jQuery.fn[ type ] = function( size ) { - // Get window width or height - return this[0] == window ? - // Opera reports document.body.client[Width/Height] properly in both quirks and standards - jQuery.browser.opera && document.body[ "client" + name ] || - - // Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths) - jQuery.browser.safari && window[ "inner" + name ] || - - // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode - document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] : - - // Get document width or height - this[0] == document ? - // Either scroll[Width/Height] or offset[Width/Height], whichever is greater - Math.max( - Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]), - Math.max(document.body["offset" + name], document.documentElement["offset" + name]) - ) : - - // Get or set width or height on the element - size == undefined ? - // Get width or height on the element - (this.length ? jQuery.css( this[0], type ) : null) : - - // Set the width or height on the element (default to pixels if value is unitless) - this.css( type, size.constructor == String ? size : size + "px" ); - }; -}); - -// Helper function used by the dimensions and offset modules -function num(elem, prop) { - return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0; -}var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ? - "(?:[\\w*_-]|\\\\.)" : - "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)", - quickChild = new RegExp("^>\\s*(" + chars + "+)"), - quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"), - quickClass = new RegExp("^([#.]?)(" + chars + "*)"); - -jQuery.extend({ - expr: { - "": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);}, - "#": function(a,i,m){return a.getAttribute("id")==m[2];}, - ":": { - // Position Checks - lt: function(a,i,m){return i<m[3]-0;}, - gt: function(a,i,m){return i>m[3]-0;}, - nth: function(a,i,m){return m[3]-0==i;}, - eq: function(a,i,m){return m[3]-0==i;}, - first: function(a,i){return i==0;}, - last: function(a,i,m,r){return i==r.length-1;}, - even: function(a,i){return i%2==0;}, - odd: function(a,i){return i%2;}, - - // Child Checks - "first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;}, - "last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;}, - "only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");}, - - // Parent Checks - parent: function(a){return a.firstChild;}, - empty: function(a){return !a.firstChild;}, - - // Text Check - contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;}, - - // Visibility - visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";}, - hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";}, - - // Form attributes - enabled: function(a){return !a.disabled;}, - disabled: function(a){return a.disabled;}, - checked: function(a){return a.checked;}, - selected: function(a){return a.selected||jQuery.attr(a,"selected");}, - - // Form elements - text: function(a){return "text"==a.type;}, - radio: function(a){return "radio"==a.type;}, - checkbox: function(a){return "checkbox"==a.type;}, - file: function(a){return "file"==a.type;}, - password: function(a){return "password"==a.type;}, - submit: function(a){return "submit"==a.type;}, - image: function(a){return "image"==a.type;}, - reset: function(a){return "reset"==a.type;}, - button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");}, - input: function(a){return /input|select|textarea|button/i.test(a.nodeName);}, - - // :has() - has: function(a,i,m){return jQuery.find(m[3],a).length;}, - - // :header - header: function(a){return /h\d/i.test(a.nodeName);}, - - // :animated - animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;} - } - }, - - // The regular expressions that power the parsing engine - parse: [ - // Match: [@value='test'], [@foo] - /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/, - - // Match: :contains('foo') - /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/, - - // Match: :even, :last-child, #id, .class - new RegExp("^([:.#]*)(" + chars + "+)") - ], - - multiFilter: function( expr, elems, not ) { - var old, cur = []; - - while ( expr && expr != old ) { - old = expr; - var f = jQuery.filter( expr, elems, not ); - expr = f.t.replace(/^\s*,\s*/, "" ); - cur = not ? elems = f.r : jQuery.merge( cur, f.r ); - } - - return cur; - }, - - find: function( t, context ) { - // Quickly handle non-string expressions - if ( typeof t != "string" ) - return [ t ]; - - // check to make sure context is a DOM element or a document - if ( context && context.nodeType != 1 && context.nodeType != 9) - return [ ]; - - // Set the correct context (if none is provided) - context = context || document; - - // Initialize the search - var ret = [context], done = [], last, nodeName; - - // Continue while a selector expression exists, and while - // we're no longer looping upon ourselves - while ( t && last != t ) { - var r = []; - last = t; - - t = jQuery.trim(t); - - var foundToken = false, - - // An attempt at speeding up child selectors that - // point to a specific element tag - re = quickChild, - - m = re.exec(t); - - if ( m ) { - nodeName = m[1].toUpperCase(); - - // Perform our own iteration and filter - for ( var i = 0; ret[i]; i++ ) - for ( var c = ret[i].firstChild; c; c = c.nextSibling ) - if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) ) - r.push( c ); - - ret = r; - t = t.replace( re, "" ); - if ( t.indexOf(" ") == 0 ) continue; - foundToken = true; - } else { - re = /^([>+~])\s*(\w*)/i; - - if ( (m = re.exec(t)) != null ) { - r = []; - - var merge = {}; - nodeName = m[2].toUpperCase(); - m = m[1]; - - for ( var j = 0, rl = ret.length; j < rl; j++ ) { - var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild; - for ( ; n; n = n.nextSibling ) - if ( n.nodeType == 1 ) { - var id = jQuery.data(n); - - if ( m == "~" && merge[id] ) break; - - if (!nodeName || n.nodeName.toUpperCase() == nodeName ) { - if ( m == "~" ) merge[id] = true; - r.push( n ); - } - - if ( m == "+" ) break; - } - } - - ret = r; - - // And remove the token - t = jQuery.trim( t.replace( re, "" ) ); - foundToken = true; - } - } - - // See if there's still an expression, and that we haven't already - // matched a token - if ( t && !foundToken ) { - // Handle multiple expressions - if ( !t.indexOf(",") ) { - // Clean the result set - if ( context == ret[0] ) ret.shift(); - - // Merge the result sets - done = jQuery.merge( done, ret ); - - // Reset the context - r = ret = [context]; - - // Touch up the selector string - t = " " + t.substr(1,t.length); - - } else { - // Optimize for the case nodeName#idName - var re2 = quickID; - var m = re2.exec(t); - - // Re-organize the results, so that they're consistent - if ( m ) { - m = [ 0, m[2], m[3], m[1] ]; - - } else { - // Otherwise, do a traditional filter check for - // ID, class, and element selectors - re2 = quickClass; - m = re2.exec(t); - } - - m[2] = m[2].replace(/\\/g, ""); - - var elem = ret[ret.length-1]; - - // Try to do a global search by ID, where we can - if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) { - // Optimization for HTML document case - var oid = elem.getElementById(m[2]); - - // Do a quick check for the existence of the actual ID attribute - // to avoid selecting by the name attribute in IE - // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form - if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] ) - oid = jQuery('[@id="'+m[2]+'"]', elem)[0]; - - // Do a quick check for node name (where applicable) so - // that div#foo searches will be really fast - ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : []; - } else { - // We need to find all descendant elements - for ( var i = 0; ret[i]; i++ ) { - // Grab the tag name being searched for - var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2]; - - // Handle IE7 being really dumb about <object>s - if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" ) - tag = "param"; - - r = jQuery.merge( r, ret[i].getElementsByTagName( tag )); - } - - // It's faster to filter by class and be done with it - if ( m[1] == "." ) - r = jQuery.classFilter( r, m[2] ); - - // Same with ID filtering - if ( m[1] == "#" ) { - var tmp = []; - - // Try to find the element with the ID - for ( var i = 0; r[i]; i++ ) - if ( r[i].getAttribute("id") == m[2] ) { - tmp = [ r[i] ]; - break; - } - - r = tmp; - } - - ret = r; - } - - t = t.replace( re2, "" ); - } - - } - - // If a selector string still exists - if ( t ) { - // Attempt to filter it - var val = jQuery.filter(t,r); - ret = r = val.r; - t = jQuery.trim(val.t); - } - } - - // An error occurred with the selector; - // just return an empty set instead - if ( t ) - ret = []; - - // Remove the root context - if ( ret && context == ret[0] ) - ret.shift(); - - // And combine the results - done = jQuery.merge( done, ret ); - - return done; - }, - - classFilter: function(r,m,not){ - m = " " + m + " "; - var tmp = []; - for ( var i = 0; r[i]; i++ ) { - var pass = (" " + r[i].className + " ").indexOf( m ) >= 0; - if ( !not && pass || not && !pass ) - tmp.push( r[i] ); - } - return tmp; - }, - - filter: function(t,r,not) { - var last; - - // Look for common filter expressions - while ( t && t != last ) { - last = t; - - var p = jQuery.parse, m; - - for ( var i = 0; p[i]; i++ ) { - m = p[i].exec( t ); - - if ( m ) { - // Remove what we just matched - t = t.substring( m[0].length ); - - m[2] = m[2].replace(/\\/g, ""); - break; - } - } - - if ( !m ) - break; - - // :not() is a special case that can be optimized by - // keeping it out of the expression list - if ( m[1] == ":" && m[2] == "not" ) - // optimize if only one selector found (most common case) - r = isSimple.test( m[3] ) ? - jQuery.filter(m[3], r, true).r : - jQuery( r ).not( m[3] ); - - // We can get a big speed boost by filtering by class here - else if ( m[1] == "." ) - r = jQuery.classFilter(r, m[2], not); - - else if ( m[1] == "[" ) { - var tmp = [], type = m[3]; - - for ( var i = 0, rl = r.length; i < rl; i++ ) { - var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ]; - - if ( z == null || /href|src|selected/.test(m[2]) ) - z = jQuery.attr(a,m[2]) || ''; - - if ( (type == "" && !!z || - type == "=" && z == m[5] || - type == "!=" && z != m[5] || - type == "^=" && z && !z.indexOf(m[5]) || - type == "$=" && z.substr(z.length - m[5].length) == m[5] || - (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not ) - tmp.push( a ); - } - - r = tmp; - - // We can get a speed boost by handling nth-child here - } else if ( m[1] == ":" && m[2] == "nth-child" ) { - var merge = {}, tmp = [], - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( - m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" || - !/\D/.test(m[3]) && "0n+" + m[3] || m[3]), - // calculate the numbers (first)n+(last) including if they are negative - first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0; - - // loop through all the elements left in the jQuery object - for ( var i = 0, rl = r.length; i < rl; i++ ) { - var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode); - - if ( !merge[id] ) { - var c = 1; - - for ( var n = parentNode.firstChild; n; n = n.nextSibling ) - if ( n.nodeType == 1 ) - n.nodeIndex = c++; - - merge[id] = true; - } - - var add = false; - - if ( first == 0 ) { - if ( node.nodeIndex == last ) - add = true; - } else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 ) - add = true; - - if ( add ^ not ) - tmp.push( node ); - } - - r = tmp; - - // Otherwise, find the expression to execute - } else { - var fn = jQuery.expr[ m[1] ]; - if ( typeof fn == "object" ) - fn = fn[ m[2] ]; - - if ( typeof fn == "string" ) - fn = eval("false||function(a,i){return " + fn + ";}"); - - // Execute it against the current filter - r = jQuery.grep( r, function(elem, i){ - return fn(elem, i, m, r); - }, not ); - } - } - - // Return an array of filtered elements (r) - // and the modified expression string (t) - return { r: r, t: t }; - }, - - dir: function( elem, dir ){ - var matched = [], - cur = elem[dir]; - while ( cur && cur != document ) { - if ( cur.nodeType == 1 ) - matched.push( cur ); - cur = cur[dir]; - } - return matched; - }, - - nth: function(cur,result,dir,elem){ - result = result || 1; - var num = 0; - - for ( ; cur; cur = cur[dir] ) - if ( cur.nodeType == 1 && ++num == result ) - break; - - return cur; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType == 1 && n != elem ) - r.push( n ); - } - - return r; - } -}); -/* - * A number of helper functions used for managing events. - * Many of the ideas behind this code orignated from - * Dean Edwards' addEvent library. - */ -jQuery.event = { - - // Bind an event to an element - // Original by Dean Edwards - add: function(elem, types, handler, data) { - if ( elem.nodeType == 3 || elem.nodeType == 8 ) - return; - - // For whatever reason, IE has trouble passing the window object - // around, causing it to be cloned in the process - if ( jQuery.browser.msie && elem.setInterval ) - elem = window; - - // Make sure that the function being executed has a unique ID - if ( !handler.guid ) - handler.guid = this.guid++; - - // if data is passed, bind to handler - if( data != undefined ) { - // Create temporary function pointer to original handler - var fn = handler; - - // Create unique handler function, wrapped around original handler - handler = this.proxy( fn, function() { - // Pass arguments and context to original handler - return fn.apply(this, arguments); - }); - - // Store data in unique handler - handler.data = data; - } - - // Init the element's event structure - var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}), - handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){ - // Handle the second event of a trigger and when - // an event is called after a page has unloaded - if ( typeof jQuery != "undefined" && !jQuery.event.triggered ) - return jQuery.event.handle.apply(arguments.callee.elem, arguments); - }); - // Add elem as a property of the handle function - // This is to prevent a memory leak with non-native - // event in IE. - handle.elem = elem; - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - jQuery.each(types.split(/\s+/), function(index, type) { - // Namespaced event handlers - var parts = type.split("."); - type = parts[0]; - handler.type = parts[1]; - - // Get the current list of functions bound to this event - var handlers = events[type]; - - // Init the event handler queue - if (!handlers) { - handlers = events[type] = {}; - - // Check for a special event handler - // Only use addEventListener/attachEvent if the special - // events handler returns false - if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) { - // Bind the global event handler to the element - if (elem.addEventListener) - elem.addEventListener(type, handle, false); - else if (elem.attachEvent) - elem.attachEvent("on" + type, handle); - } - } - - // Add the function to the element's handler list - handlers[handler.guid] = handler; - - // Keep track of which events have been used, for global triggering - jQuery.event.global[type] = true; - }); - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - guid: 1, - global: {}, - - // Detach an event or set of events from an element - remove: function(elem, types, handler) { - // don't do events on text and comment nodes - if ( elem.nodeType == 3 || elem.nodeType == 8 ) - return; - - var events = jQuery.data(elem, "events"), ret, index; - - if ( events ) { - // Unbind all events for the element - if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") ) - for ( var type in events ) - this.remove( elem, type + (types || "") ); - else { - // types is actually an event object here - if ( types.type ) { - handler = types.handler; - types = types.type; - } - - // Handle multiple events seperated by a space - // jQuery(...).unbind("mouseover mouseout", fn); - jQuery.each(types.split(/\s+/), function(index, type){ - // Namespaced event handlers - var parts = type.split("."); - type = parts[0]; - - if ( events[type] ) { - // remove the given handler for the given type - if ( handler ) - delete events[type][handler.guid]; - - // remove all handlers for the given type - else - for ( handler in events[type] ) - // Handle the removal of namespaced events - if ( !parts[1] || events[type][handler].type == parts[1] ) - delete events[type][handler]; - - // remove generic event handler if no more handlers exist - for ( ret in events[type] ) break; - if ( !ret ) { - if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) { - if (elem.removeEventListener) - elem.removeEventListener(type, jQuery.data(elem, "handle"), false); - else if (elem.detachEvent) - elem.detachEvent("on" + type, jQuery.data(elem, "handle")); - } - ret = null; - delete events[type]; - } - } - }); - } - - // Remove the expando if it's no longer used - for ( ret in events ) break; - if ( !ret ) { - var handle = jQuery.data( elem, "handle" ); - if ( handle ) handle.elem = null; - jQuery.removeData( elem, "events" ); - jQuery.removeData( elem, "handle" ); - } - } - }, - - trigger: function(type, data, elem, donative, extra) { - // Clone the incoming data, if any - data = jQuery.makeArray(data); - - if ( type.indexOf("!") >= 0 ) { - type = type.slice(0, -1); - var exclusive = true; - } - - // Handle a global trigger - if ( !elem ) { - // Only trigger if we've ever bound an event for it - if ( this.global[type] ) - jQuery("*").add([window, document]).trigger(type, data); - - // Handle triggering a single element - } else { - // don't do events on text and comment nodes - if ( elem.nodeType == 3 || elem.nodeType == 8 ) - return undefined; - - var val, ret, fn = jQuery.isFunction( elem[ type ] || null ), - // Check to see if we need to provide a fake event, or not - event = !data[0] || !data[0].preventDefault; - - // Pass along a fake event - if ( event ) { - data.unshift({ - type: type, - target: elem, - preventDefault: function(){}, - stopPropagation: function(){}, - timeStamp: now() - }); - data[0][expando] = true; // no need to fix fake event - } - - // Enforce the right trigger type - data[0].type = type; - if ( exclusive ) - data[0].exclusive = true; - - // Trigger the event, it is assumed that "handle" is a function - var handle = jQuery.data(elem, "handle"); - if ( handle ) - val = handle.apply( elem, data ); - - // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) - if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) - val = false; - - // Extra functions don't get the custom event object - if ( event ) - data.shift(); - - // Handle triggering of extra function - if ( extra && jQuery.isFunction( extra ) ) { - // call the extra function and tack the current return value on the end for possible inspection - ret = extra.apply( elem, val == null ? data : data.concat( val ) ); - // if anything is returned, give it precedence and have it overwrite the previous value - if (ret !== undefined) - val = ret; - } - - // Trigger the native events (except for clicks on links) - if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) { - this.triggered = true; - try { - elem[ type ](); - // prevent IE from throwing an error for some hidden elements - } catch (e) {} - } - - this.triggered = false; - } - - return val; - }, - - handle: function(event) { - // returned undefined or false - var val, ret, namespace, all, handlers; - - event = arguments[0] = jQuery.event.fix( event || window.event ); - - // Namespaced event handlers - namespace = event.type.split("."); - event.type = namespace[0]; - namespace = namespace[1]; - // Cache this now, all = true means, any handler - all = !namespace && !event.exclusive; - - handlers = ( jQuery.data(this, "events") || {} )[event.type]; - - for ( var j in handlers ) { - var handler = handlers[j]; - - // Filter the functions by class - if ( all || handler.type == namespace ) { - // Pass in a reference to the handler function itself - // So that we can later remove it - event.handler = handler; - event.data = handler.data; - - ret = handler.apply( this, arguments ); - - if ( val !== false ) - val = ret; - - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - - return val; - }, - - props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" "), - - fix: function(event) { - if ( event[expando] == true ) - return event; - - // store a copy of the original event object - // and "clone" to set read-only properties - var originalEvent = event; - event = { originalEvent: originalEvent }; - - for ( var i = this.props.length, prop; i; ){ - prop = this.props[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Mark it as fixed - event[expando] = true; - - // add preventDefault and stopPropagation since - // they will not work on the clone - event.preventDefault = function() { - // if preventDefault exists run it on the original event - if (originalEvent.preventDefault) - originalEvent.preventDefault(); - // otherwise set the returnValue property of the original event to false (IE) - originalEvent.returnValue = false; - }; - event.stopPropagation = function() { - // if stopPropagation exists run it on the original event - if (originalEvent.stopPropagation) - originalEvent.stopPropagation(); - // otherwise set the cancelBubble property of the original event to true (IE) - originalEvent.cancelBubble = true; - }; - - // Fix timeStamp - event.timeStamp = event.timeStamp || now(); - - // Fix target property, if necessary - if ( !event.target ) - event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either - - // check if target is a textnode (safari) - if ( event.target.nodeType == 3 ) - event.target = event.target.parentNode; - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && event.fromElement ) - event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && event.clientX != null ) { - var doc = document.documentElement, body = document.body; - event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0); - event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0); - } - - // Add which for key events - if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) - event.which = event.charCode || event.keyCode; - - // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) - if ( !event.metaKey && event.ctrlKey ) - event.metaKey = event.ctrlKey; - - // Add which for click: 1 == left; 2 == middle; 3 == right - // Note: button is not normalized, so don't use it - if ( !event.which && event.button ) - event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); - - return event; - }, - - proxy: function( fn, proxy ){ - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++; - // So proxy can be declared as an argument - return proxy; - }, - - special: { - ready: { - setup: function() { - // Make sure the ready event is setup - bindReady(); - return; - }, - - teardown: function() { return; } - }, - - mouseenter: { - setup: function() { - if ( jQuery.browser.msie ) return false; - jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler); - return true; - }, - - teardown: function() { - if ( jQuery.browser.msie ) return false; - jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler); - return true; - }, - - handler: function(event) { - // If we actually just moused on to a sub-element, ignore it - if ( withinElement(event, this) ) return true; - // Execute the right handlers by setting the event type to mouseenter - event.type = "mouseenter"; - return jQuery.event.handle.apply(this, arguments); - } - }, - - mouseleave: { - setup: function() { - if ( jQuery.browser.msie ) return false; - jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler); - return true; - }, - - teardown: function() { - if ( jQuery.browser.msie ) return false; - jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler); - return true; - }, - - handler: function(event) { - // If we actually just moused on to a sub-element, ignore it - if ( withinElement(event, this) ) return true; - // Execute the right handlers by setting the event type to mouseleave - event.type = "mouseleave"; - return jQuery.event.handle.apply(this, arguments); - } - } - } -}; - -jQuery.fn.extend({ - bind: function( type, data, fn ) { - return type == "unload" ? this.one(type, data, fn) : this.each(function(){ - jQuery.event.add( this, type, fn || data, fn && data ); - }); - }, - - one: function( type, data, fn ) { - var one = jQuery.event.proxy( fn || data, function(event) { - jQuery(this).unbind(event, one); - return (fn || data).apply( this, arguments ); - }); - return this.each(function(){ - jQuery.event.add( this, type, one, fn && data); - }); - }, - - unbind: function( type, fn ) { - return this.each(function(){ - jQuery.event.remove( this, type, fn ); - }); - }, - - trigger: function( type, data, fn ) { - return this.each(function(){ - jQuery.event.trigger( type, data, this, true, fn ); - }); - }, - - triggerHandler: function( type, data, fn ) { - return this[0] && jQuery.event.trigger( type, data, this[0], false, fn ); - }, - - toggle: function( fn ) { - // Save reference to arguments for access in closure - var args = arguments, i = 1; - - // link all the functions, so any of them can unbind this click handler - while( i < args.length ) - jQuery.event.proxy( fn, args[i++] ); - - return this.click( jQuery.event.proxy( fn, function(event) { - // Figure out which function to execute - this.lastToggle = ( this.lastToggle || 0 ) % i; - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[ this.lastToggle++ ].apply( this, arguments ) || false; - })); - }, - - hover: function(fnOver, fnOut) { - return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut); - }, - - ready: function(fn) { - // Attach the listeners - bindReady(); - - // If the DOM is already ready - if ( jQuery.isReady ) - // Execute the function immediately - fn.call( document, jQuery ); - - // Otherwise, remember the function for later - else - // Add the function to the wait list - jQuery.readyList.push( function() { return fn.call(this, jQuery); } ); - - return this; - } -}); - -jQuery.extend({ - isReady: false, - readyList: [], - // Handle when the DOM is ready - ready: function() { - // Make sure that the DOM is not already loaded - if ( !jQuery.isReady ) { - // Remember that the DOM is ready - jQuery.isReady = true; - - // If there are functions bound, to execute - if ( jQuery.readyList ) { - // Execute all of them - jQuery.each( jQuery.readyList, function(){ - this.call( document ); - }); - - // Reset the list of functions - jQuery.readyList = null; - } - - // Trigger any bound ready events - jQuery(document).triggerHandler("ready"); - } - } -}); - -var readyBound = false; - -function bindReady(){ - if ( readyBound ) return; - readyBound = true; - - // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event - if ( document.addEventListener && !jQuery.browser.opera) - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", jQuery.ready, false ); - - // If IE is used and is not in a frame - // Continually check to see if the document is ready - if ( jQuery.browser.msie && window == top ) (function(){ - if (jQuery.isReady) return; - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch( error ) { - setTimeout( arguments.callee, 0 ); - return; - } - // and execute any waiting functions - jQuery.ready(); - })(); - - if ( jQuery.browser.opera ) - document.addEventListener( "DOMContentLoaded", function () { - if (jQuery.isReady) return; - for (var i = 0; i < document.styleSheets.length; i++) - if (document.styleSheets[i].disabled) { - setTimeout( arguments.callee, 0 ); - return; - } - // and execute any waiting functions - jQuery.ready(); - }, false); - - if ( jQuery.browser.safari ) { - var numStyles; - (function(){ - if (jQuery.isReady) return; - if ( document.readyState != "loaded" && document.readyState != "complete" ) { - setTimeout( arguments.callee, 0 ); - return; - } - if ( numStyles === undefined ) - numStyles = jQuery("style, link[rel=stylesheet]").length; - if ( document.styleSheets.length != numStyles ) { - setTimeout( arguments.callee, 0 ); - return; - } - // and execute any waiting functions - jQuery.ready(); - })(); - } - - // A fallback to window.onload, that will always work - jQuery.event.add( window, "load", jQuery.ready ); -} - -jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + - "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + - "submit,keydown,keypress,keyup,error").split(","), function(i, name){ - - // Handle event binding - jQuery.fn[name] = function(fn){ - return fn ? this.bind(name, fn) : this.trigger(name); - }; -}); - -// Checks if an event happened on an element within another element -// Used in jQuery.event.special.mouseenter and mouseleave handlers -var withinElement = function(event, elem) { - // Check if mouse(over|out) are still within the same parent element - var parent = event.relatedTarget; - // Traverse up the tree - while ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; } - // Return true if we actually just moused on to a sub-element - return parent == elem; -}; - -// Prevent memory leaks in IE -// And prevent errors on refresh with events like mouseover in other browsers -// Window isn't included so as not to unbind existing unload events -jQuery(window).bind("unload", function() { - jQuery("*").add(document).unbind(); -}); -jQuery.fn.extend({ - // Keep a copy of the old load - _load: jQuery.fn.load, - - load: function( url, params, callback ) { - if ( typeof url != 'string' ) - return this._load( url ); - - var off = url.indexOf(" "); - if ( off >= 0 ) { - var selector = url.slice(off, url.length); - url = url.slice(0, off); - } - - callback = callback || function(){}; - - // Default to a GET request - var type = "GET"; - - // If the second parameter was provided - if ( params ) - // If it's a function - if ( jQuery.isFunction( params ) ) { - // We assume that it's the callback - callback = params; - params = null; - - // Otherwise, build a param string - } else if( typeof params == 'object' ) { - params = jQuery.param( params ); - type = "POST"; - } - - var self = this; - - // Request the remote document - jQuery.ajax({ - url: url, - type: type, - dataType: "html", - data: params, - complete: function(res, status){ - // If successful, inject the HTML into all the matched elements - if ( status == "success" || status == "notmodified" ) - // See if a selector was specified - self.html( selector ? - // Create a dummy div to hold the results - jQuery("<div/>") - // inject the contents of the document in, removing the scripts - // to avoid any 'Permission Denied' errors in IE - .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, "")) - - // Locate the specified elements - .find(selector) : - - // If not, just inject the full result - res.responseText ); - - self.each( callback, [res.responseText, status, res] ); - } - }); - return this; - }, - - serialize: function() { - return jQuery.param(this.serializeArray()); - }, - serializeArray: function() { - return this.map(function(){ - return jQuery.nodeName(this, "form") ? - jQuery.makeArray(this.elements) : this; - }) - .filter(function(){ - return this.name && !this.disabled && - (this.checked || /select|textarea/i.test(this.nodeName) || - /text|hidden|password/i.test(this.type)); - }) - .map(function(i, elem){ - var val = jQuery(this).val(); - return val == null ? null : - val.constructor == Array ? - jQuery.map( val, function(val, i){ - return {name: elem.name, value: val}; - }) : - {name: elem.name, value: val}; - }).get(); - } -}); - -// Attach a bunch of functions for handling common AJAX events -jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){ - jQuery.fn[o] = function(f){ - return this.bind(o, f); - }; -}); - -var jsc = now(); - -jQuery.extend({ - get: function( url, data, callback, type ) { - // shift arguments if data argument was ommited - if ( jQuery.isFunction( data ) ) { - callback = data; - data = null; - } - - return jQuery.ajax({ - type: "GET", - url: url, - data: data, - success: callback, - dataType: type - }); - }, - - getScript: function( url, callback ) { - return jQuery.get(url, null, callback, "script"); - }, - - getJSON: function( url, data, callback ) { - return jQuery.get(url, data, callback, "json"); - }, - - post: function( url, data, callback, type ) { - if ( jQuery.isFunction( data ) ) { - callback = data; - data = {}; - } - - return jQuery.ajax({ - type: "POST", - url: url, - data: data, - success: callback, - dataType: type - }); - }, - - ajaxSetup: function( settings ) { - jQuery.extend( jQuery.ajaxSettings, settings ); - }, - - ajaxSettings: { - url: location.href, - global: true, - type: "GET", - timeout: 0, - contentType: "application/x-www-form-urlencoded", - processData: true, - async: true, - data: null, - username: null, - password: null, - accepts: { - xml: "application/xml, text/xml", - html: "text/html", - script: "text/javascript, application/javascript", - json: "application/json, text/javascript", - text: "text/plain", - _default: "*/*" - } - }, - - // Last-Modified header cache for next request - lastModified: {}, - - ajax: function( s ) { - // Extend the settings, but re-extend 's' so that it can be - // checked again later (in the test suite, specifically) - s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s)); - - var jsonp, jsre = /=\?(&|$)/g, status, data, - type = s.type.toUpperCase(); - - // convert data if not already a string - if ( s.data && s.processData && typeof s.data != "string" ) - s.data = jQuery.param(s.data); - - // Handle JSONP Parameter Callbacks - if ( s.dataType == "jsonp" ) { - if ( type == "GET" ) { - if ( !s.url.match(jsre) ) - s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?"; - } else if ( !s.data || !s.data.match(jsre) ) - s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?"; - s.dataType = "json"; - } - - // Build temporary JSONP function - if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) { - jsonp = "jsonp" + jsc++; - - // Replace the =? sequence both in the query string and the data - if ( s.data ) - s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); - s.url = s.url.replace(jsre, "=" + jsonp + "$1"); - - // We need to make sure - // that a JSONP style response is executed properly - s.dataType = "script"; - - // Handle JSONP-style loading - window[ jsonp ] = function(tmp){ - data = tmp; - success(); - complete(); - // Garbage collect - window[ jsonp ] = undefined; - try{ delete window[ jsonp ]; } catch(e){} - if ( head ) - head.removeChild( script ); - }; - } - - if ( s.dataType == "script" && s.cache == null ) - s.cache = false; - - if ( s.cache === false && type == "GET" ) { - var ts = now(); - // try replacing _= if it is there - var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2"); - // if nothing was replaced, add timestamp to the end - s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : ""); - } - - // If data is available, append data to url for get requests - if ( s.data && type == "GET" ) { - s.url += (s.url.match(/\?/) ? "&" : "?") + s.data; - - // IE likes to send both get and post data, prevent this - s.data = null; - } - - // Watch for a new set of requests - if ( s.global && ! jQuery.active++ ) - jQuery.event.trigger( "ajaxStart" ); - - // Matches an absolute URL, and saves the domain - var remote = /^(?:\w+:)?\/\/([^\/?#]+)/; - - // If we're requesting a remote document - // and trying to load JSON or Script with a GET - if ( s.dataType == "script" && type == "GET" - && remote.test(s.url) && remote.exec(s.url)[1] != location.host ){ - var head = document.getElementsByTagName("head")[0]; - var script = document.createElement("script"); - script.src = s.url; - if (s.scriptCharset) - script.charset = s.scriptCharset; - - // Handle Script loading - if ( !jsonp ) { - var done = false; - - // Attach handlers for all browsers - script.onload = script.onreadystatechange = function(){ - if ( !done && (!this.readyState || - this.readyState == "loaded" || this.readyState == "complete") ) { - done = true; - success(); - complete(); - head.removeChild( script ); - } - }; - } - - head.appendChild(script); - - // We handle everything using the script element injection - return undefined; - } - - var requestDone = false; - - // Create the request object; Microsoft failed to properly - // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available - var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); - - // Open the socket - // Passing null username, generates a login popup on Opera (#2865) - if( s.username ) - xhr.open(type, s.url, s.async, s.username, s.password); - else - xhr.open(type, s.url, s.async); - - // Need an extra try/catch for cross domain requests in Firefox 3 - try { - // Set the correct header, if data is being sent - if ( s.data ) - xhr.setRequestHeader("Content-Type", s.contentType); - - // Set the If-Modified-Since header, if ifModified mode. - if ( s.ifModified ) - xhr.setRequestHeader("If-Modified-Since", - jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" ); - - // Set header so the called script knows that it's an XMLHttpRequest - xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - - // Set the Accepts header for the server, depending on the dataType - xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? - s.accepts[ s.dataType ] + ", */*" : - s.accepts._default ); - } catch(e){} - - // Allow custom headers/mimetypes - if ( s.beforeSend && s.beforeSend(xhr, s) === false ) { - // cleanup active request counter - s.global && jQuery.active--; - // close opended socket - xhr.abort(); - return false; - } - - if ( s.global ) - jQuery.event.trigger("ajaxSend", [xhr, s]); - - // Wait for a response to come back - var onreadystatechange = function(isTimeout){ - // The transfer is complete and the data is available, or the request timed out - if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) { - requestDone = true; - - // clear poll interval - if (ival) { - clearInterval(ival); - ival = null; - } - - status = isTimeout == "timeout" ? "timeout" : - !jQuery.httpSuccess( xhr ) ? "error" : - s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" : - "success"; - - if ( status == "success" ) { - // Watch for, and catch, XML document parse errors - try { - // process the data (runs the xml through httpData regardless of callback) - data = jQuery.httpData( xhr, s.dataType, s.dataFilter ); - } catch(e) { - status = "parsererror"; - } - } - - // Make sure that the request was successful or notmodified - if ( status == "success" ) { - // Cache Last-Modified header, if ifModified mode. - var modRes; - try { - modRes = xhr.getResponseHeader("Last-Modified"); - } catch(e) {} // swallow exception thrown by FF if header is not available - - if ( s.ifModified && modRes ) - jQuery.lastModified[s.url] = modRes; - - // JSONP handles its own success callback - if ( !jsonp ) - success(); - } else - jQuery.handleError(s, xhr, status); - - // Fire the complete handlers - complete(); - - // Stop memory leaks - if ( s.async ) - xhr = null; - } - }; - - if ( s.async ) { - // don't attach the handler to the request, just poll it instead - var ival = setInterval(onreadystatechange, 13); - - // Timeout checker - if ( s.timeout > 0 ) - setTimeout(function(){ - // Check to see if the request is still happening - if ( xhr ) { - // Cancel the request - xhr.abort(); - - if( !requestDone ) - onreadystatechange( "timeout" ); - } - }, s.timeout); - } - - // Send the data - try { - xhr.send(s.data); - } catch(e) { - jQuery.handleError(s, xhr, null, e); - } - - // firefox 1.5 doesn't fire statechange for sync requests - if ( !s.async ) - onreadystatechange(); - - function success(){ - // If a local callback was specified, fire it and pass it the data - if ( s.success ) - s.success( data, status ); - - // Fire the global callback - if ( s.global ) - jQuery.event.trigger( "ajaxSuccess", [xhr, s] ); - } - - function complete(){ - // Process result - if ( s.complete ) - s.complete(xhr, status); - - // The request was completed - if ( s.global ) - jQuery.event.trigger( "ajaxComplete", [xhr, s] ); - - // Handle the global AJAX counter - if ( s.global && ! --jQuery.active ) - jQuery.event.trigger( "ajaxStop" ); - } - - // return XMLHttpRequest to allow aborting the request etc. - return xhr; - }, - - handleError: function( s, xhr, status, e ) { - // If a local callback was specified, fire it - if ( s.error ) s.error( xhr, status, e ); - - // Fire the global callback - if ( s.global ) - jQuery.event.trigger( "ajaxError", [xhr, s, e] ); - }, - - // Counter for holding the number of active queries - active: 0, - - // Determines if an XMLHttpRequest was successful or not - httpSuccess: function( xhr ) { - try { - // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 - return !xhr.status && location.protocol == "file:" || - ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 || - jQuery.browser.safari && xhr.status == undefined; - } catch(e){} - return false; - }, - - // Determines if an XMLHttpRequest returns NotModified - httpNotModified: function( xhr, url ) { - try { - var xhrRes = xhr.getResponseHeader("Last-Modified"); - - // Firefox always returns 200. check Last-Modified date - return xhr.status == 304 || xhrRes == jQuery.lastModified[url] || - jQuery.browser.safari && xhr.status == undefined; - } catch(e){} - return false; - }, - - httpData: function( xhr, type, filter ) { - var ct = xhr.getResponseHeader("content-type"), - xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0, - data = xml ? xhr.responseXML : xhr.responseText; - - if ( xml && data.documentElement.tagName == "parsererror" ) - throw "parsererror"; - - // Allow a pre-filtering function to sanitize the response - if( filter ) - data = filter( data, type ); - - // If the type is "script", eval it in global context - if ( type == "script" ) - jQuery.globalEval( data ); - - // Get the JavaScript object, if JSON is used. - if ( type == "json" ) - data = eval("(" + data + ")"); - - return data; - }, - - // Serialize an array of form elements or a set of - // key/values into a query string - param: function( a ) { - var s = [ ]; - - function add( key, value ){ - s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value); - }; - - // If an array was passed in, assume that it is an array - // of form elements - if ( a.constructor == Array || a.jquery ) - // Serialize the form elements - jQuery.each( a, function(){ - add( this.name, this.value ); - }); - - // Otherwise, assume that it's an object of key/value pairs - else - // Serialize the key/values - for ( var j in a ) - // If the value is an array then the key names need to be repeated - if ( a[j] && a[j].constructor == Array ) - jQuery.each( a[j], function(){ - add( j, this ); - }); - else - add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] ); - - // Return the resulting serialization - return s.join("&").replace(/%20/g, "+"); - } - -}); -jQuery.fn.extend({ - show: function(speed,callback){ - return speed ? - this.animate({ - height: "show", width: "show", opacity: "show" - }, speed, callback) : - - this.filter(":hidden").each(function(){ - this.style.display = this.oldblock || ""; - if ( jQuery.css(this,"display") == "none" ) { - var elem = jQuery("<" + this.tagName + " />").appendTo("body"); - this.style.display = elem.css("display"); - // handle an edge condition where css is - div { display:none; } or similar - if (this.style.display == "none") - this.style.display = "block"; - elem.remove(); - } - }).end(); - }, - - hide: function(speed,callback){ - return speed ? - this.animate({ - height: "hide", width: "hide", opacity: "hide" - }, speed, callback) : - - this.filter(":visible").each(function(){ - this.oldblock = this.oldblock || jQuery.css(this,"display"); - this.style.display = "none"; - }).end(); - }, - - // Save the old toggle function - _toggle: jQuery.fn.toggle, - - toggle: function( fn, fn2 ){ - return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ? - this._toggle.apply( this, arguments ) : - fn ? - this.animate({ - height: "toggle", width: "toggle", opacity: "toggle" - }, fn, fn2) : - this.each(function(){ - jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ](); - }); - }, - - slideDown: function(speed,callback){ - return this.animate({height: "show"}, speed, callback); - }, - - slideUp: function(speed,callback){ - return this.animate({height: "hide"}, speed, callback); - }, - - slideToggle: function(speed, callback){ - return this.animate({height: "toggle"}, speed, callback); - }, - - fadeIn: function(speed, callback){ - return this.animate({opacity: "show"}, speed, callback); - }, - - fadeOut: function(speed, callback){ - return this.animate({opacity: "hide"}, speed, callback); - }, - - fadeTo: function(speed,to,callback){ - return this.animate({opacity: to}, speed, callback); - }, - - animate: function( prop, speed, easing, callback ) { - var optall = jQuery.speed(speed, easing, callback); - - return this[ optall.queue === false ? "each" : "queue" ](function(){ - if ( this.nodeType != 1) - return false; - - var opt = jQuery.extend({}, optall), p, - hidden = jQuery(this).is(":hidden"), self = this; - - for ( p in prop ) { - if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden ) - return opt.complete.call(this); - - if ( p == "height" || p == "width" ) { - // Store display property - opt.display = jQuery.css(this, "display"); - - // Make sure that nothing sneaks out - opt.overflow = this.style.overflow; - } - } - - if ( opt.overflow != null ) - this.style.overflow = "hidden"; - - opt.curAnim = jQuery.extend({}, prop); - - jQuery.each( prop, function(name, val){ - var e = new jQuery.fx( self, opt, name ); - - if ( /toggle|show|hide/.test(val) ) - e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop ); - else { - var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/), - start = e.cur(true) || 0; - - if ( parts ) { - var end = parseFloat(parts[2]), - unit = parts[3] || "px"; - - // We need to compute starting value - if ( unit != "px" ) { - self.style[ name ] = (end || 1) + unit; - start = ((end || 1) / e.cur(true)) * start; - self.style[ name ] = start + unit; - } - - // If a +=/-= token was provided, we're doing a relative animation - if ( parts[1] ) - end = ((parts[1] == "-=" ? -1 : 1) * end) + start; - - e.custom( start, end, unit ); - } else - e.custom( start, val, "" ); - } - }); - - // For JS strict compliance - return true; - }); - }, - - queue: function(type, fn){ - if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) { - fn = type; - type = "fx"; - } - - if ( !type || (typeof type == "string" && !fn) ) - return queue( this[0], type ); - - return this.each(function(){ - if ( fn.constructor == Array ) - queue(this, type, fn); - else { - queue(this, type).push( fn ); - - if ( queue(this, type).length == 1 ) - fn.call(this); - } - }); - }, - - stop: function(clearQueue, gotoEnd){ - var timers = jQuery.timers; - - if (clearQueue) - this.queue([]); - - this.each(function(){ - // go in reverse order so anything added to the queue during the loop is ignored - for ( var i = timers.length - 1; i >= 0; i-- ) - if ( timers[i].elem == this ) { - if (gotoEnd) - // force the next step to be the last - timers[i](true); - timers.splice(i, 1); - } - }); - - // start the next in the queue if the last step wasn't forced - if (!gotoEnd) - this.dequeue(); - - return this; - } - -}); - -var queue = function( elem, type, array ) { - if ( elem ){ - - type = type || "fx"; - - var q = jQuery.data( elem, type + "queue" ); - - if ( !q || array ) - q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) ); - - } - return q; -}; - -jQuery.fn.dequeue = function(type){ - type = type || "fx"; - - return this.each(function(){ - var q = queue(this, type); - - q.shift(); - - if ( q.length ) - q[0].call( this ); - }); -}; - -jQuery.extend({ - - speed: function(speed, easing, fn) { - var opt = speed && speed.constructor == Object ? speed : { - complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && easing.constructor != Function && easing - }; - - opt.duration = (opt.duration && opt.duration.constructor == Number ? - opt.duration : - jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def; - - // Queueing - opt.old = opt.complete; - opt.complete = function(){ - if ( opt.queue !== false ) - jQuery(this).dequeue(); - if ( jQuery.isFunction( opt.old ) ) - opt.old.call( this ); - }; - - return opt; - }, - - easing: { - linear: function( p, n, firstNum, diff ) { - return firstNum + diff * p; - }, - swing: function( p, n, firstNum, diff ) { - return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; - } - }, - - timers: [], - timerId: null, - - fx: function( elem, options, prop ){ - this.options = options; - this.elem = elem; - this.prop = prop; - - if ( !options.orig ) - options.orig = {}; - } - -}); - -jQuery.fx.prototype = { - - // Simple function for setting a style value - update: function(){ - if ( this.options.step ) - this.options.step.call( this.elem, this.now, this ); - - (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); - - // Set display property to block for height/width animations - if ( this.prop == "height" || this.prop == "width" ) - this.elem.style.display = "block"; - }, - - // Get the current size - cur: function(force){ - if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null ) - return this.elem[ this.prop ]; - - var r = parseFloat(jQuery.css(this.elem, this.prop, force)); - return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0; - }, - - // Start an animation from one number to another - custom: function(from, to, unit){ - this.startTime = now(); - this.start = from; - this.end = to; - this.unit = unit || this.unit || "px"; - this.now = this.start; - this.pos = this.state = 0; - this.update(); - - var self = this; - function t(gotoEnd){ - return self.step(gotoEnd); - } - - t.elem = this.elem; - - jQuery.timers.push(t); - - if ( jQuery.timerId == null ) { - jQuery.timerId = setInterval(function(){ - var timers = jQuery.timers; - - for ( var i = 0; i < timers.length; i++ ) - if ( !timers[i]() ) - timers.splice(i--, 1); - - if ( !timers.length ) { - clearInterval( jQuery.timerId ); - jQuery.timerId = null; - } - }, 13); - } - }, - - // Simple 'show' function - show: function(){ - // Remember where we started, so that we can go back to it later - this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); - this.options.show = true; - - // Begin the animation - this.custom(0, this.cur()); - - // Make sure that we start at a small width/height to avoid any - // flash of content - if ( this.prop == "width" || this.prop == "height" ) - this.elem.style[this.prop] = "1px"; - - // Start by showing the element - jQuery(this.elem).show(); - }, - - // Simple 'hide' function - hide: function(){ - // Remember where we started, so that we can go back to it later - this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); - this.options.hide = true; - - // Begin the animation - this.custom(this.cur(), 0); - }, - - // Each step of an animation - step: function(gotoEnd){ - var t = now(); - - if ( gotoEnd || t > this.options.duration + this.startTime ) { - this.now = this.end; - this.pos = this.state = 1; - this.update(); - - this.options.curAnim[ this.prop ] = true; - - var done = true; - for ( var i in this.options.curAnim ) - if ( this.options.curAnim[i] !== true ) - done = false; - - if ( done ) { - if ( this.options.display != null ) { - // Reset the overflow - this.elem.style.overflow = this.options.overflow; - - // Reset the display - this.elem.style.display = this.options.display; - if ( jQuery.css(this.elem, "display") == "none" ) - this.elem.style.display = "block"; - } - - // Hide the element if the "hide" operation was done - if ( this.options.hide ) - this.elem.style.display = "none"; - - // Reset the properties, if the item has been hidden or shown - if ( this.options.hide || this.options.show ) - for ( var p in this.options.curAnim ) - jQuery.attr(this.elem.style, p, this.options.orig[p]); - } - - if ( done ) - // Execute the complete function - this.options.complete.call( this.elem ); - - return false; - } else { - var n = t - this.startTime; - this.state = n / this.options.duration; - - // Perform the easing function, defaults to swing - this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration); - this.now = this.start + ((this.end - this.start) * this.pos); - - // Perform the next step of the animation - this.update(); - } - - return true; - } - -}; - -jQuery.extend( jQuery.fx, { - speeds:{ - slow: 600, - fast: 200, - // Default speed - def: 400 - }, - step: { - scrollLeft: function(fx){ - fx.elem.scrollLeft = fx.now; - }, - - scrollTop: function(fx){ - fx.elem.scrollTop = fx.now; - }, - - opacity: function(fx){ - jQuery.attr(fx.elem.style, "opacity", fx.now); - }, - - _default: function(fx){ - fx.elem.style[ fx.prop ] = fx.now + fx.unit; - } - } -}); -// The Offset Method -// Originally By Brandon Aaron, part of the Dimension Plugin -// http://jquery.com/plugins/project/dimensions -jQuery.fn.offset = function() { - var left = 0, top = 0, elem = this[0], results; - - if ( elem ) with ( jQuery.browser ) { - var parent = elem.parentNode, - offsetChild = elem, - offsetParent = elem.offsetParent, - doc = elem.ownerDocument, - safari2 = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent), - css = jQuery.curCSS, - fixed = css(elem, "position") == "fixed"; - - // Use getBoundingClientRect if available - if ( !(mozilla && elem == document.body) && elem.getBoundingClientRect ) { - var box = elem.getBoundingClientRect(); - - // Add the document scroll offsets - add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft), - box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop)); - - // IE adds the HTML element's border, by default it is medium which is 2px - // IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; } - // IE 7 standards mode, the border is always 2px - // This border/offset is typically represented by the clientLeft and clientTop properties - // However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS - // Therefore this method will be off by 2px in IE while in quirksmode - add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop ); - - // Otherwise loop through the offsetParents and parentNodes - } else { - - // Initial element offsets - add( elem.offsetLeft, elem.offsetTop ); - - // Get parent offsets - while ( offsetParent ) { - // Add offsetParent offsets - add( offsetParent.offsetLeft, offsetParent.offsetTop ); - - // Mozilla and Safari > 2 does not include the border on offset parents - // However Mozilla adds the border for table or table cells - if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 ) - border( offsetParent ); - - // Add the document scroll offsets if position is fixed on any offsetParent - if ( !fixed && css(offsetParent, "position") == "fixed" ) - fixed = true; - - // Set offsetChild to previous offsetParent unless it is the body element - offsetChild = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent; - // Get next offsetParent - offsetParent = offsetParent.offsetParent; - } - - // Get parent scroll offsets - while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) { - // Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug - if ( !/^inline|table.*$/i.test(css(parent, "display")) ) - // Subtract parent scroll offsets - add( -parent.scrollLeft, -parent.scrollTop ); - - // Mozilla does not add the border for a parent that has overflow != visible - if ( mozilla && css(parent, "overflow") != "visible" ) - border( parent ); - - // Get next parent - parent = parent.parentNode; - } - - // Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild - // Mozilla doubles body offsets with a non-absolutely positioned offsetChild - if ( (safari2 && (fixed || css(offsetChild, "position") == "absolute")) || - (mozilla && css(offsetChild, "position") != "absolute") ) - add( -doc.body.offsetLeft, -doc.body.offsetTop ); - - // Add the document scroll offsets if position is fixed - if ( fixed ) - add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft), - Math.max(doc.documentElement.scrollTop, doc.body.scrollTop)); - } - - // Return an object with top and left properties - results = { top: top, left: left }; - } - - function border(elem) { - add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) ); - } - - function add(l, t) { - left += parseInt(l, 10) || 0; - top += parseInt(t, 10) || 0; - } - - return results; -}; - - -jQuery.fn.extend({ - position: function() { - var left = 0, top = 0, results; - - if ( this[0] ) { - // Get *real* offsetParent - var offsetParent = this.offsetParent(), - - // Get correct offsets - offset = this.offset(), - parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset(); - - // Subtract element margins - // note: when an element has margin: auto the offsetLeft and marginLeft - // are the same in Safari causing offset.left to incorrectly be 0 - offset.top -= num( this, 'marginTop' ); - offset.left -= num( this, 'marginLeft' ); - - // Add offsetParent borders - parentOffset.top += num( offsetParent, 'borderTopWidth' ); - parentOffset.left += num( offsetParent, 'borderLeftWidth' ); - - // Subtract the two offsets - results = { - top: offset.top - parentOffset.top, - left: offset.left - parentOffset.left - }; - } - - return results; - }, - - offsetParent: function() { - var offsetParent = this[0].offsetParent; - while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') ) - offsetParent = offsetParent.offsetParent; - return jQuery(offsetParent); - } -}); - - -// Create scrollLeft and scrollTop methods -jQuery.each( ['Left', 'Top'], function(i, name) { - var method = 'scroll' + name; - - jQuery.fn[ method ] = function(val) { - if (!this[0]) return; - - return val != undefined ? - - // Set the scroll offset - this.each(function() { - this == window || this == document ? - window.scrollTo( - !i ? val : jQuery(window).scrollLeft(), - i ? val : jQuery(window).scrollTop() - ) : - this[ method ] = val; - }) : - - // Return the scroll offset - this[0] == window || this[0] == document ? - self[ i ? 'pageYOffset' : 'pageXOffset' ] || - jQuery.boxModel && document.documentElement[ method ] || - document.body[ method ] : - this[0][ method ]; - }; -}); -// Create innerHeight, innerWidth, outerHeight and outerWidth methods -jQuery.each([ "Height", "Width" ], function(i, name){ - - var tl = i ? "Left" : "Top", // top or left - br = i ? "Right" : "Bottom"; // bottom or right - - // innerHeight and innerWidth - jQuery.fn["inner" + name] = function(){ - return this[ name.toLowerCase() ]() + - num(this, "padding" + tl) + - num(this, "padding" + br); - }; - - // outerHeight and outerWidth - jQuery.fn["outer" + name] = function(margin) { - return this["inner" + name]() + - num(this, "border" + tl + "Width") + - num(this, "border" + br + "Width") + - (margin ? - num(this, "margin" + tl) + num(this, "margin" + br) : 0); - }; - -});})(); diff --git a/vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/body.html b/vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/body.html deleted file mode 100644 index e777d5f040a..00000000000 --- a/vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/body.html +++ /dev/null @@ -1,34 +0,0 @@ -{% if use_subgraph %} -subgraph {{ cluster_app_name }} { - label=< - <TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0"> - <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" - ><FONT FACE="Helvetica Bold" COLOR="Black" POINT-SIZE="12" - >{{ app_name }}</FONT></TD></TR> - </TABLE> - > - color=olivedrab4 - style="rounded" -{% endif %} -{% for model in models %} - {{ model.app_name }}_{{ model.name }} [label=< - <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0"> - <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4" - ><FONT FACE="Helvetica Bold" COLOR="white" - >{{ model.label }}{% if model.abstracts %}<BR/><<FONT FACE="Helvetica Italic">{{ model.abstracts|join:"," }}</FONT>>{% endif %}</FONT></TD></TR> - {% if not disable_fields %} - {% for field in model.fields %} - <TR><TD ALIGN="LEFT" BORDER="0" - ><FONT {% if field.blank %}COLOR="#7B7B7B" {% endif %}FACE="Helvetica {% if field.abstract %}Italic{% else %}Bold{% endif %}">{{ field.label }}</FONT - ></TD> - <TD ALIGN="LEFT" - ><FONT {% if field.blank %}COLOR="#7B7B7B" {% endif %}FACE="Helvetica {% if field.abstract %}Italic{% else %}Bold{% endif %}">{{ field.type }}</FONT - ></TD></TR> - {% endfor %} - {% endif %} - </TABLE> - >] -{% endfor %} -{% if use_subgraph %} -} -{% endif %} \ No newline at end of file diff --git a/vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/head.html b/vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/head.html deleted file mode 100644 index aa7e63b2126..00000000000 --- a/vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/head.html +++ /dev/null @@ -1,15 +0,0 @@ - -digraph name { - fontname = "Helvetica" - fontsize = 8 - - node [ - fontname = "Helvetica" - fontsize = 8 - shape = "plaintext" - ] - edge [ - fontname = "Helvetica" - fontsize = 8 - ] - diff --git a/vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/rel.html b/vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/rel.html deleted file mode 100644 index 308c9faeb6a..00000000000 --- a/vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/rel.html +++ /dev/null @@ -1,15 +0,0 @@ -{% for model in models %} - {% for relation in model.relations %} - {% if relation.needs_node %} - {{ relation.target_app }}_{{ relation.target }} [label=< - <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0"> - <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4" - ><FONT FACE="Helvetica Bold" COLOR="white" - >{{ relation.target }}</FONT></TD></TR> - </TABLE> - >] - {% endif %} - {{ model.app_name }}_{{ model.name }} -> {{ relation.target_app }}_{{ relation.target }} - [label="{{ relation.label }}"] {{ relation.arrows }}; - {% endfor %} -{% endfor %} \ No newline at end of file diff --git a/vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/tail.html b/vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/tail.html deleted file mode 100644 index ff30235f076..00000000000 --- a/vendor-local/lib/python/django_extensions/templates/django_extensions/graph_models/tail.html +++ /dev/null @@ -1 +0,0 @@ -} \ No newline at end of file diff --git a/vendor-local/lib/python/django_extensions/templates/django_extensions/widgets/foreignkey_searchinput.html b/vendor-local/lib/python/django_extensions/templates/django_extensions/widgets/foreignkey_searchinput.html deleted file mode 100644 index 6c9d6b1c841..00000000000 --- a/vendor-local/lib/python/django_extensions/templates/django_extensions/widgets/foreignkey_searchinput.html +++ /dev/null @@ -1,60 +0,0 @@ -{% load i18n %} -<input type="text" id="lookup_{{ name }}" value="{{ label }}" style="display:none;" /> -<a href="{{ related_url }}{{ url }}" class="related-lookup" id="lookup_id_{{ name }}" onclick="return showRelatedObjectLookupPopup(this);"> - <img src="{{ admin_media_prefix }}img/{% if pre_django_14 %}admin/{% endif %}selector-search.gif" width="16" height="16" alt="{% trans "Lookup" %}" /> -</a> -<script type="text/javascript"> -(function($){ - // Show lookup input - $("#lookup_{{ name }}").show(); - function reset() { - $('#id_{{ name }}').val(''); - $('#lookup_{{ name }}').val(''); - }; - function lookup(query) { - $.get('{{ search_path }}', { - 'search_fields': '{{ search_fields }}', - 'app_label': '{{ app_label }}', - 'model_name': '{{ model_name }}', - 'object_pk': query - }, function(data){ - $('#lookup_{{ name }}').val(data); - {{ name }}_value = query; - }); - }; - $('#id_{{ name }}').bind(($.browser.opera ? "keypress" : "keyup"), function(event) { - if ($(this).val()) { - if (event.keyCode == 27) { - reset(); - } else { - lookup($(this).val()); - }; - }; - }); - $('#lookup_{{ name }}').autocomplete('{{ search_path }}', { - extraParams: { - 'search_fields': '{{ search_fields }}', - 'app_label': '{{ app_label }}', - 'model_name': '{{ model_name }}' - } - }).result(function(event, data, formatted) { - if (data) { - $('#id_{{ name }}').val(data[1]); - } - }).keyup(function(event){ - if (event.keyCode == 27) { - reset(); - }; - }); - var {{ name }}_value = $('#id_{{ name }}').val(); - function check() { - {{ name }}_check = $('#id_{{ name }}').val(); - if ({{ name }}_check) { - if ({{ name }}_check != {{ name }}_value) { - lookup({{ name }}_check); - } - } - } - timeout = window.setInterval(check, 300); -})((typeof window.jQuery == 'undefined' && typeof window.django != 'undefined')? django.jQuery : jQuery); -</script> diff --git a/vendor-local/lib/python/django_extensions/templatetags/__init__.py b/vendor-local/lib/python/django_extensions/templatetags/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/templatetags/highlighting.py b/vendor-local/lib/python/django_extensions/templatetags/highlighting.py deleted file mode 100644 index 78f6dbcfab4..00000000000 --- a/vendor-local/lib/python/django_extensions/templatetags/highlighting.py +++ /dev/null @@ -1,91 +0,0 @@ -""" -Similar to syntax_color.py but this is intended more for being able to -copy+paste actual code into your Django templates without needing to -escape or anything crazy. - -http://lobstertech.com/2008/aug/30/django_syntax_highlight_template_tag/ - -Example: - - {% load highlighting %} - - <style> - @import url("http://lobstertech.com/media/css/highlight.css"); - .highlight { background: #f8f8f8; } - .highlight { font-size: 11px; margin: 1em; border: 1px solid #ccc; - border-left: 3px solid #F90; padding: 0; } - .highlight pre { padding: 1em; overflow: auto; line-height: 120%; margin: 0; } - .predesc { margin: 1.5em 1.5em -2.5em 1em; text-align: right; - font: bold 12px Tahoma, Arial, sans-serif; - letter-spacing: 1px; color: #333; } - </style> - - <h2>check out this code</h2> - - {% highlight 'python' 'Excerpt: blah.py' %} - def need_food(self): - print("Love is <colder> than &death&") - {% endhighlight %} - -""" - -from pygments import highlight as pyghighlight -from pygments.lexers import get_lexer_by_name -from pygments.formatters import HtmlFormatter -from django import template -from django.template import Template, Context, Node, Variable, TemplateSyntaxError -from django.template.defaultfilters import stringfilter -from django.utils.safestring import mark_safe - -register = template.Library() - - -@register.filter -@stringfilter -def parse_template(value): - return mark_safe(Template(value).render(Context())) -parse_template.is_safe = True - - -class CodeNode(Node): - def __init__(self, language, nodelist, name=''): - self.language = Variable(language) - self.nodelist = nodelist - if name: - self.name = Variable(name) - else: - self.name = None - - def render(self, context): - code = self.nodelist.render(context).strip() - lexer = get_lexer_by_name(self.language.resolve(context)) - formatter = HtmlFormatter(linenos=False) - html = "" - if self.name: - name = self.name.resolve(context) - html = '<div class="predesc"><span>%s</span></div>' % (name) - return html + pyghighlight(code, lexer, formatter) - - -@register.tag -def highlight(parser, token): - """ - Allows you to put a highlighted source code <pre> block in your code. - This takes two arguments, the language and a little explaination message - that will be generated before the code. The second argument is optional. - - Your code will be fed through pygments so you can use any language it - supports. - - {% load highlighting %} - {% highlight 'python' 'Excerpt: blah.py' %} - def need_food(self): - print("Love is colder than death") - {% endhighlight %} - """ - nodelist = parser.parse(('endhighlight',)) - parser.delete_first_token() - bits = token.split_contents()[1:] - if len(bits) < 1: - raise TemplateSyntaxError("'highlight' statement requires an argument") - return CodeNode(bits[0], nodelist, *bits[1:]) diff --git a/vendor-local/lib/python/django_extensions/templatetags/syntax_color.py b/vendor-local/lib/python/django_extensions/templatetags/syntax_color.py deleted file mode 100644 index 4c4c23dca33..00000000000 --- a/vendor-local/lib/python/django_extensions/templatetags/syntax_color.py +++ /dev/null @@ -1,97 +0,0 @@ -r""" -Template filter for rendering a string with syntax highlighting. -It relies on Pygments to accomplish this. - -Some standard usage examples (from within Django templates). -Coloring a string with the Python lexer: - - {% load syntax_color %} - {{ code_string|colorize:"python" }} - -You may use any lexer in Pygments. The complete list of which -can be found [on the Pygments website][1]. - -[1]: http://pygments.org/docs/lexers/ - -You may also have Pygments attempt to guess the correct lexer for -a particular string. However, if may not be able to choose a lexer, -in which case it will simply return the string unmodified. This is -less efficient compared to specifying the lexer to use. - - {{ code_string|colorize }} - -You may also render the syntax highlighed text with line numbers. - - {% load syntax_color %} - {{ some_code|colorize_table:"html+django" }} - {{ let_pygments_pick_for_this_code|colorize_table }} - -Please note that before you can load the ``syntax_color`` template filters -you will need to add the ``django_extensions.utils`` application to the -``INSTALLED_APPS``setting in your project's ``settings.py`` file. -""" - -__author__ = 'Will Larson <lethain@gmail.com>' - - -from django import template -from django.template.defaultfilters import stringfilter -from django.utils.safestring import mark_safe -from django.core.exceptions import ImproperlyConfigured - -try: - from pygments import highlight - from pygments.formatters import HtmlFormatter - from pygments.lexers import get_lexer_by_name, guess_lexer, ClassNotFound -except ImportError: - raise ImproperlyConfigured( - "Please install 'pygments' library to use syntax_color.") - -register = template.Library() - - -@register.simple_tag -def pygments_css(): - return HtmlFormatter().get_style_defs('.highlight') - - -def generate_pygments_css(path=None): - if path is None: - import os - path = os.path.join(os.getcwd(), 'pygments.css') - f = open(path, 'w') - f.write(pygments_css()) - f.close() - - -def get_lexer(value, arg): - if arg is None: - return guess_lexer(value) - return get_lexer_by_name(arg) - - -@register.filter(name='colorize') -@stringfilter -def colorize(value, arg=None): - try: - return mark_safe(highlight(value, get_lexer(value, arg), HtmlFormatter())) - except ClassNotFound: - return value - - -@register.filter(name='colorize_table') -@stringfilter -def colorize_table(value, arg=None): - try: - return mark_safe(highlight(value, get_lexer(value, arg), HtmlFormatter(linenos='table'))) - except ClassNotFound: - return value - - -@register.filter(name='colorize_noclasses') -@stringfilter -def colorize_noclasses(value, arg=None): - try: - return mark_safe(highlight(value, get_lexer(value, arg), HtmlFormatter(noclasses=True))) - except ClassNotFound: - return value diff --git a/vendor-local/lib/python/django_extensions/templatetags/truncate_letters.py b/vendor-local/lib/python/django_extensions/templatetags/truncate_letters.py deleted file mode 100644 index b77a6b1fc87..00000000000 --- a/vendor-local/lib/python/django_extensions/templatetags/truncate_letters.py +++ /dev/null @@ -1,28 +0,0 @@ -import django -from django import template -from django.template.defaultfilters import stringfilter - -register = template.Library() - - -def truncateletters(value, arg): - """ - Truncates a string after a certain number of letters - - Argument: Number of letters to truncate after - """ - from django_extensions.utils.text import truncate_letters - try: - length = int(arg) - except ValueError: # invalid literal for int() - return value # Fail silently - return truncate_letters(value, length) - -if django.get_version() >= "1.4": - truncateletters = stringfilter(truncateletters) - register.filter(truncateletters, is_safe=True) -else: - truncateletters.is_safe = True - truncateletters = stringfilter(truncateletters) - register.filter(truncateletters) - diff --git a/vendor-local/lib/python/django_extensions/templatetags/widont.py b/vendor-local/lib/python/django_extensions/templatetags/widont.py deleted file mode 100644 index d42833f941c..00000000000 --- a/vendor-local/lib/python/django_extensions/templatetags/widont.py +++ /dev/null @@ -1,62 +0,0 @@ -from django.template import Library -from django.utils.encoding import force_unicode -import re -import six - -register = Library() -re_widont = re.compile(r'\s+(\S+\s*)$') -re_widont_html = re.compile(r'([^<>\s])\s+([^<>\s]+\s*)(</?(?:address|blockquote|br|dd|div|dt|fieldset|form|h[1-6]|li|noscript|p|td|th)[^>]*>|$)', re.IGNORECASE) - - -def widont(value, count=1): - """ - Adds an HTML non-breaking space between the final two words of the string to - avoid "widowed" words. - - Examples: - - >>> print(widont('Test me out')) - Test me out - - >>> widont('It works with trailing spaces too ') - u'It works with trailing spaces too ' - - >>> print(widont('NoEffect')) - NoEffect - """ - def replace(matchobj): - return six.u(' %s' % matchobj.group(1)) - for i in range(count): - value = re_widont.sub(replace, force_unicode(value)) - return value - - -def widont_html(value): - """ - Adds an HTML non-breaking space between the final two words at the end of - (and in sentences just outside of) block level tags to avoid "widowed" - words. - - Examples: - - >>> print(widont_html('<h2>Here is a simple example </h2> <p>Single</p>')) - <h2>Here is a simple example </h2> <p>Single</p> - - >>> print(widont_html('<p>test me<br /> out</p><h2>Ok?</h2>Not in a p<p title="test me">and this</p>')) - <p>test me<br /> out</p><h2>Ok?</h2>Not in a p<p title="test me">and this</p> - - >>> print(widont_html('leading text <p>test me out</p> trailing text')) - leading text <p>test me out</p> trailing text - """ - def replace(matchobj): - return six.u('%s %s%s' % matchobj.groups()) - return re_widont_html.sub(replace, force_unicode(value)) - -register.filter(widont) -register.filter(widont_html) - -if __name__ == "__main__": - def _test(): - import doctest - doctest.testmod() - _test() diff --git a/vendor-local/lib/python/django_extensions/tests/__init__.py b/vendor-local/lib/python/django_extensions/tests/__init__.py deleted file mode 100644 index c251bab6b7a..00000000000 --- a/vendor-local/lib/python/django_extensions/tests/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.db import models # NOQA -from django_extensions.tests.test_dumpscript import DumpScriptTests -from django_extensions.tests.utils import TruncateLetterTests -from django_extensions.tests.json_field import JsonFieldTest -from django_extensions.tests.uuid_field import UUIDFieldTest -from django_extensions.tests.fields import AutoSlugFieldTest -from django_extensions.tests.management_command import CommandTest, ShowTemplateTagsTests - - -__test_classes__ = [ - DumpScriptTests, JsonFieldTest, UUIDFieldTest, AutoSlugFieldTest, CommandTest, ShowTemplateTagsTests, TruncateLetterTests -] - -try: - from django_extensions.tests.encrypted_fields import EncryptedFieldsTestCase - from django_extensions.tests.models import Secret # NOQA - __test_classes__.append(EncryptedFieldsTestCase) -except ImportError: - pass diff --git a/vendor-local/lib/python/django_extensions/tests/encrypted_fields.py b/vendor-local/lib/python/django_extensions/tests/encrypted_fields.py deleted file mode 100644 index 1451c34e3fc..00000000000 --- a/vendor-local/lib/python/django_extensions/tests/encrypted_fields.py +++ /dev/null @@ -1,74 +0,0 @@ -from django.db import connection -from django.conf import settings -from django.core.management import call_command -from django.db.models import loading -from django.utils import unittest - -# Only perform encrypted fields tests if keyczar is present -# Resolves http://github.com/django-extensions/django-extensions/issues/#issue/17 -try: - from keyczar import keyczar, keyczart, keyinfo # NOQA - from django_extensions.tests.models import Secret - from django_extensions.db.fields.encrypted import EncryptedTextField, EncryptedCharField # NOQA - keyczar_active = hasattr(settings, "ENCRYPTED_FIELD_KEYS_DIR") -except ImportError: - keyczar_active = False - - -class EncryptedFieldsTestCase(unittest.TestCase): - - def __init__(self, *args, **kwargs): - if keyczar_active: - self.crypt = keyczar.Crypter.Read(settings.ENCRYPTED_FIELD_KEYS_DIR) - super(EncryptedFieldsTestCase, self).__init__(*args, **kwargs) - - def setUp(self): - self.old_installed_apps = settings.INSTALLED_APPS - settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) - settings.INSTALLED_APPS.append('django_extensions.tests') - loading.cache.loaded = False - call_command('syncdb', verbosity=0) - - def tearDown(self): - settings.INSTALLED_APPS = self.old_installed_apps - - def testCharFieldCreate(self): - if not keyczar_active: - return - test_val = "Test Secret" - secret = Secret.objects.create(name=test_val) - cursor = connection.cursor() - query = "SELECT name FROM %s WHERE id = %d" % (Secret._meta.db_table, secret.id) - cursor.execute(query) - db_val, = cursor.fetchone() - decrypted_val = self.crypt.Decrypt(db_val[len(EncryptedCharField.prefix):]) - self.assertEqual(test_val, decrypted_val) - - def testCharFieldRead(self): - if not keyczar_active: - return - test_val = "Test Secret" - secret = Secret.objects.create(name=test_val) - retrieved_secret = Secret.objects.get(id=secret.id) - self.assertEqual(test_val, retrieved_secret.name) - - def testTextFieldCreate(self): - if not keyczar_active: - return - test_val = "Test Secret" - secret = Secret.objects.create(text=test_val) - cursor = connection.cursor() - query = "SELECT text FROM %s WHERE id = %d" % (Secret._meta.db_table, secret.id) - cursor.execute(query) - db_val, = cursor.fetchone() - decrypted_val = self.crypt.Decrypt(db_val[len(EncryptedCharField.prefix):]) - self.assertEqual(test_val, decrypted_val) - - def testTextFieldRead(self): - if not keyczar_active: - return - test_val = "Test Secret" - secret = Secret.objects.create(text=test_val) - retrieved_secret = Secret.objects.get(id=secret.id) - self.assertEqual(test_val, retrieved_secret.text) - diff --git a/vendor-local/lib/python/django_extensions/tests/fields.py b/vendor-local/lib/python/django_extensions/tests/fields.py deleted file mode 100644 index 3edd360e796..00000000000 --- a/vendor-local/lib/python/django_extensions/tests/fields.py +++ /dev/null @@ -1,105 +0,0 @@ -from django.conf import settings -from django.core.management import call_command -from django.db.models import loading -from django.db import models -from django.utils import unittest - -from django_extensions.db.fields import AutoSlugField - - -class SluggedTestModel(models.Model): - title = models.CharField(max_length=42) - slug = AutoSlugField(populate_from='title') - - -class ChildSluggedTestModel(SluggedTestModel): - pass - - -class AutoSlugFieldTest(unittest.TestCase): - def setUp(self): - self.old_installed_apps = settings.INSTALLED_APPS - settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) - settings.INSTALLED_APPS.append('django_extensions.tests') - loading.cache.loaded = False - call_command('syncdb', verbosity=0) - - def tearDown(self): - SluggedTestModel.objects.all().delete() - settings.INSTALLED_APPS = self.old_installed_apps - - def testAutoCreateSlug(self): - m = SluggedTestModel(title='foo') - m.save() - self.assertEqual(m.slug, 'foo') - - def testAutoCreateNextSlug(self): - m = SluggedTestModel(title='foo') - m.save() - - m = SluggedTestModel(title='foo') - m.save() - self.assertEqual(m.slug, 'foo-2') - - def testAutoCreateSlugWithNumber(self): - m = SluggedTestModel(title='foo 2012') - m.save() - self.assertEqual(m.slug, 'foo-2012') - - def testAutoUpdateSlugWithNumber(self): - m = SluggedTestModel(title='foo 2012') - m.save() - m.save() - self.assertEqual(m.slug, 'foo-2012') - - def testUpdateSlug(self): - m = SluggedTestModel(title='foo') - m.save() - - # update m instance without using `save' - SluggedTestModel.objects.filter(pk=m.pk).update(slug='foo-2012') - # update m instance with new data from the db - m = SluggedTestModel.objects.get(pk=m.pk) - - self.assertEqual(m.slug, 'foo-2012') - - m.save() - self.assertEqual(m.slug, 'foo-2012') - - def testSimpleSlugSource(self): - m = SluggedTestModel(title='-foo') - m.save() - self.assertEqual(m.slug, 'foo') - - n = SluggedTestModel(title='-foo') - n.save() - self.assertEqual(n.slug, 'foo-2') - - n.save() - self.assertEqual(n.slug, 'foo-2') - - def testEmptySlugSource(self): - # regression test - - m = SluggedTestModel(title='') - m.save() - self.assertEqual(m.slug, '-2') - - n = SluggedTestModel(title='') - n.save() - self.assertEqual(n.slug, '-3') - - n.save() - self.assertEqual(n.slug, '-3') - - def testInheritanceCreatesNextSlug(self): - m = SluggedTestModel(title='foo') - m.save() - - n = ChildSluggedTestModel(title='foo') - n.save() - self.assertEqual(n.slug, 'foo-2') - - o = SluggedTestModel(title='foo') - o.save() - self.assertEqual(o.slug, 'foo-3') diff --git a/vendor-local/lib/python/django_extensions/tests/json_field.py b/vendor-local/lib/python/django_extensions/tests/json_field.py deleted file mode 100644 index e9aed0ffc05..00000000000 --- a/vendor-local/lib/python/django_extensions/tests/json_field.py +++ /dev/null @@ -1,37 +0,0 @@ -from django.conf import settings -from django.core.management import call_command -from django.db.models import loading -from django.db import models -from django.utils import unittest - -from django_extensions.db.fields.json import JSONField - - -class TestModel(models.Model): - a = models.IntegerField() - j_field = JSONField() - - -class JsonFieldTest(unittest.TestCase): - def setUp(self): - self.old_installed_apps = settings.INSTALLED_APPS - settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) - settings.INSTALLED_APPS.append('django_extensions.tests') - loading.cache.loaded = False - call_command('syncdb', verbosity=0) - - def tearDown(self): - settings.INSTALLED_APPS = self.old_installed_apps - - def testCharFieldCreate(self): - j = TestModel.objects.create(a=6, j_field=dict(foo='bar')) - self.assertEqual(j.a, 6) - - def testDefault(self): - j = TestModel.objects.create(a=1) - self.assertEqual(j.j_field, {}) - - def testEmptyList(self): - j = TestModel.objects.create(a=6, j_field=[]) - self.assertTrue(isinstance(j.j_field, list)) - self.assertEqual(j.j_field, []) diff --git a/vendor-local/lib/python/django_extensions/tests/management/__init__.py b/vendor-local/lib/python/django_extensions/tests/management/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/tests/management/commands/__init__.py b/vendor-local/lib/python/django_extensions/tests/management/commands/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/tests/management/commands/error_raising_command.py b/vendor-local/lib/python/django_extensions/tests/management/commands/error_raising_command.py deleted file mode 100644 index 3bc646cf538..00000000000 --- a/vendor-local/lib/python/django_extensions/tests/management/commands/error_raising_command.py +++ /dev/null @@ -1,10 +0,0 @@ - -from django_extensions.management.base import LoggingBaseCommand - - -class Command(LoggingBaseCommand): - help = 'Test error' - - def handle(self, *args, **options): - raise Exception("Test Error") - diff --git a/vendor-local/lib/python/django_extensions/tests/management_command.py b/vendor-local/lib/python/django_extensions/tests/management_command.py deleted file mode 100644 index 86c6d38197e..00000000000 --- a/vendor-local/lib/python/django_extensions/tests/management_command.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -import logging - -try: - from cStringIO import StringIO # NOQA -except ImportError: - from io import StringIO # NOQA - -try: - import importlib # NOQA -except ImportError: - from django.utils import importlib # NOQA - -from django.core.management import call_command -from django.test import TestCase - - -class MockLoggingHandler(logging.Handler): - """ Mock logging handler to check for expected logs. """ - - def __init__(self, *args, **kwargs): - self.reset() - logging.Handler.__init__(self, *args, **kwargs) - - def emit(self, record): - self.messages[record.levelname.lower()].append(record.getMessage()) - - def reset(self): - self.messages = { - 'debug': [], - 'info': [], - 'warning': [], - 'error': [], - 'critical': [], - } - - -class CommandTest(TestCase): - def test_error_logging(self): - # Ensure command errors are properly logged and reraised - from django_extensions.management.base import logger - logger.addHandler(MockLoggingHandler()) - module_path = "django_extensions.tests.management.commands.error_raising_command" - module = importlib.import_module(module_path) - error_raising_command = module.Command() - self.assertRaises(Exception, error_raising_command.execute) - handler = logger.handlers[0] - self.assertEqual(len(handler.messages['error']), 1) - - -class ShowTemplateTagsTests(TestCase): - def test_some_output(self): - out = StringIO() - call_command('show_templatetags', stdout=out) - output = out.getvalue() - # Once django_extension is installed during tests it should appear with - # its templatetags - self.assertIn('django_extensions', output) - # let's check at least one - self.assertIn('truncate_letters', output) diff --git a/vendor-local/lib/python/django_extensions/tests/models.py b/vendor-local/lib/python/django_extensions/tests/models.py deleted file mode 100644 index f8deab6a10e..00000000000 --- a/vendor-local/lib/python/django_extensions/tests/models.py +++ /dev/null @@ -1,36 +0,0 @@ -from django.db import models -from django.conf import settings - -try: - from django_extensions.db.fields.encrypted import EncryptedTextField, EncryptedCharField - if not hasattr(settings, 'ENCRYPTED_FIELD_KEYS_DIR'): - raise ImportError -except ImportError: - class EncryptedCharField(object): - def __init__(self, *args, **kwargs): - pass - - class EncryptedTextField(object): - def __init__(self, *args, **kwargs): - pass - - -class Secret(models.Model): - name = EncryptedCharField("Name", blank=True, max_length=255) - text = EncryptedTextField("Text", blank=True) - - -class Name(models.Model): - name = models.CharField(max_length=50) - - -class Note(models.Model): - note = models.TextField() - - -class Person(models.Model): - name = models.ForeignKey(Name) - age = models.PositiveIntegerField() - children = models.ManyToManyField('self') - notes = models.ManyToManyField(Note) - diff --git a/vendor-local/lib/python/django_extensions/tests/test_dumpscript.py b/vendor-local/lib/python/django_extensions/tests/test_dumpscript.py deleted file mode 100644 index dd4b2190b28..00000000000 --- a/vendor-local/lib/python/django_extensions/tests/test_dumpscript.py +++ /dev/null @@ -1,95 +0,0 @@ -import sys - -# conditional imports for python 3 -try: - import compiler # NOQA - from StringIO import StringIO # NOQA -except ImportError: - import ast as compiler # NOQA - from io import StringIO # NOQA -from django.test import TestCase - -from django.core.management import call_command -from django_extensions.tests.models import Name, Note, Person - -from django.conf import settings -from django.db.models import loading - - -class DumpScriptTests(TestCase): - def setUp(self): - self.real_stdout = sys.stdout - self.real_stderr = sys.stderr - sys.stdout = StringIO() - sys.stderr = StringIO() - - self.original_installed_apps = settings.INSTALLED_APPS - settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) - settings.INSTALLED_APPS.append('django_extensions.tests') - loading.cache.loaded = False - call_command('syncdb', verbosity=0) - - def tearDown(self): - sys.stdout = self.real_stdout - sys.stderr = self.real_stderr - settings.INSTALLED_APPS.remove('django_extensions.tests') - settings.INSTALLED_APPS = self.original_installed_apps - loading.cache.loaded = False - - def test_runs(self): - # lame test...does it run? - n = Name(name='Gabriel') - n.save() - call_command('dumpscript', 'tests') - self.assertTrue('Gabriel' in sys.stdout.getvalue()) - - #---------------------------------------------------------------------- - def test_replaced_stdout(self): - # check if stdout can be replaced - sys.stdout = StringIO() - n = Name(name='Mike') - n.save() - tmp_out = StringIO() - call_command('dumpscript', 'tests', stdout=tmp_out) - self.assertTrue('Mike' in tmp_out.getvalue()) # script should go to tmp_out - self.assertEqual(0, len(sys.stdout.getvalue())) # there should not be any output to sys.stdout - tmp_out.close() - - #---------------------------------------------------------------------- - def test_replaced_stderr(self): - # check if stderr can be replaced, without changing stdout - n = Name(name='Fred') - n.save() - tmp_err = StringIO() - sys.stderr = StringIO() - call_command('dumpscript', 'tests', stderr=tmp_err) - self.assertTrue('Fred' in sys.stdout.getvalue()) # script should still go to stdout - self.assertTrue('Name' in tmp_err.getvalue()) # error output should go to tmp_err - self.assertEqual(0, len(sys.stderr.getvalue())) # there should not be any output to sys.stderr - tmp_err.close() - - #---------------------------------------------------------------------- - def test_valid_syntax(self): - n1 = Name(name='John') - n1.save() - p1 = Person(name=n1, age=40) - p1.save() - n2 = Name(name='Jane') - n2.save() - p2 = Person(name=n2, age=18) - p2.save() - p2.children.add(p1) - note1 = Note(note="This is the first note.") - note1.save() - note2 = Note(note="This is the second note.") - note2.save() - p2.notes.add(note1, note2) - tmp_out = StringIO() - call_command('dumpscript', 'tests', stdout=tmp_out) - ast_syntax_tree = compiler.parse(tmp_out.getvalue()) - if hasattr(ast_syntax_tree, 'body'): - self.assertTrue(len(ast_syntax_tree.body) > 1) - else: - self.assertTrue(len(ast_syntax_tree.asList()) > 1) - tmp_out.close() - diff --git a/vendor-local/lib/python/django_extensions/tests/urls.py b/vendor-local/lib/python/django_extensions/tests/urls.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/tests/utils.py b/vendor-local/lib/python/django_extensions/tests/utils.py deleted file mode 100644 index 23935b66e07..00000000000 --- a/vendor-local/lib/python/django_extensions/tests/utils.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- -import sys -import six - -from django.test import TestCase -from django.utils.unittest import skipIf - -from django_extensions.utils.text import truncate_letters -try: - import uuid - assert uuid -except ImportError: - from django_extensions.utils import uuid - - -class TruncateLetterTests(TestCase): - def test_truncate_more_than_text_length(self): - self.assertEqual(six.u("hello tests"), truncate_letters("hello tests", 100)) - - def test_truncate_text(self): - self.assertEqual(six.u("hello..."), truncate_letters("hello tests", 5)) - - def test_truncate_with_range(self): - for i in range(10, -1, -1): - self.assertEqual( - six.u('hello tests'[:i]) + '...', - truncate_letters("hello tests", i) - ) - - def test_with_non_ascii_characters(self): - self.assertEqual( - six.u('\u5ce0 (\u3068\u3046\u3052 t\u014dg...'), - truncate_letters("峠 (とうげ tōge - mountain pass)", 10) - ) - - -class UUIDTests(TestCase): - @skipIf(sys.version_info >= (2, 5, 0), 'uuid already in stdlib') - def test_uuid3(self): - # make a UUID using an MD5 hash of a namespace UUID and a name - self.assertEqual( - uuid.UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e'), - uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org') - ) - - @skipIf(sys.version_info >= (2, 5, 0), 'uuid already in stdlib') - def test_uuid5(self): - # make a UUID using a SHA-1 hash of a namespace UUID and a name - self.assertEqual( - uuid.UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d'), - uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org') - ) - - @skipIf(sys.version_info >= (2, 5, 0), 'uuid already in stdlib') - def test_uuid_str(self): - # make a UUID from a string of hex digits (braces and hyphens ignored) - x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}') - # convert a UUID to a string of hex digits in standard form - self.assertEqual('00010203-0405-0607-0809-0a0b0c0d0e0f', str(x)) - - @skipIf(sys.version_info >= (2, 5, 0), 'uuid already in stdlib') - def test_uuid_bytes(self): - # make a UUID from a string of hex digits (braces and hyphens ignored) - x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}') - # get the raw 16 bytes of the UUID - self.assertEqual( - '\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f', - x.bytes - ) - - @skipIf(sys.version_info >= (2, 5, 0), 'uuid already in stdlib') - def test_make_uuid_from_byte_string(self): - self.assertEqual( - uuid.UUID(bytes='\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f'), - uuid.UUID('00010203-0405-0607-0809-0a0b0c0d0e0f') - ) diff --git a/vendor-local/lib/python/django_extensions/tests/uuid_field.py b/vendor-local/lib/python/django_extensions/tests/uuid_field.py deleted file mode 100644 index 823ff2e2ba4..00000000000 --- a/vendor-local/lib/python/django_extensions/tests/uuid_field.py +++ /dev/null @@ -1,58 +0,0 @@ -import six -from django.conf import settings -from django.core.management import call_command -from django.db.models import loading -from django.db import models -from django.utils import unittest - -from django_extensions.db.fields import UUIDField - - -class TestModel_field(models.Model): - a = models.IntegerField() - uuid_field = UUIDField() - - -class TestModel_pk(models.Model): - uuid_field = UUIDField(primary_key=True) - - -class TestAgregateModel(TestModel_pk): - a = models.IntegerField() - - -class TestManyToManyModel(TestModel_pk): - many = models.ManyToManyField(TestModel_field) - - -class UUIDFieldTest(unittest.TestCase): - def setUp(self): - self.old_installed_apps = settings.INSTALLED_APPS - settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) - settings.INSTALLED_APPS.append('django_extensions.tests') - loading.cache.loaded = False - call_command('syncdb', verbosity=0) - - def tearDown(self): - settings.INSTALLED_APPS = self.old_installed_apps - - def testUUIDFieldCreate(self): - j = TestModel_field.objects.create(a=6, uuid_field=six.u('550e8400-e29b-41d4-a716-446655440000')) - self.assertEqual(j.uuid_field, six.u('550e8400-e29b-41d4-a716-446655440000')) - - def testUUIDField_pkCreate(self): - j = TestModel_pk.objects.create(uuid_field=six.u('550e8400-e29b-41d4-a716-446655440000')) - self.assertEqual(j.uuid_field, six.u('550e8400-e29b-41d4-a716-446655440000')) - self.assertEqual(j.pk, six.u('550e8400-e29b-41d4-a716-446655440000')) - - def testUUIDField_pkAgregateCreate(self): - j = TestAgregateModel.objects.create(a=6, uuid_field=six.u('550e8400-e29b-41d4-a716-446655440001')) - self.assertEqual(j.a, 6) - self.assertIsInstance(j.pk, six.string_types) - self.assertEqual(len(j.pk), 36) - - def testUUIDFieldManyToManyCreate(self): - j = TestManyToManyModel.objects.create(uuid_field=six.u('550e8400-e29b-41d4-a716-446655440010')) - self.assertEqual(j.uuid_field, six.u('550e8400-e29b-41d4-a716-446655440010')) - self.assertEqual(j.pk, six.u('550e8400-e29b-41d4-a716-446655440010')) - diff --git a/vendor-local/lib/python/django_extensions/utils/__init__.py b/vendor-local/lib/python/django_extensions/utils/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/django_extensions/utils/dia2django.py b/vendor-local/lib/python/django_extensions/utils/dia2django.py deleted file mode 100644 index 91a48631df8..00000000000 --- a/vendor-local/lib/python/django_extensions/utils/dia2django.py +++ /dev/null @@ -1,215 +0,0 @@ -#!/usr/bin/python -# -*- coding: UTF-8 -*- -##Author Igor Támara igor@tamarapatino.org -##Use this little program as you wish, if you -#include it in your work, let others know you -#are using it preserving this note, you have -#the right to make derivative works, Use it -#at your own risk. -#Tested to work on(etch testing 13-08-2007): -# Python 2.4.4 (#2, Jul 17 2007, 11:56:54) -# [GCC 4.1.3 20070629 (prerelease) (Debian 4.1.2-13)] on linux2 - -dependclasses = ["User", "Group", "Permission", "Message"] - -import codecs -import sys -import gzip -from xml.dom.minidom import * # NOQA -import re -import six - -#Type dictionary translation types SQL -> Django -tsd = { - "text": "TextField", - "date": "DateField", - "varchar": "CharField", - "int": "IntegerField", - "float": "FloatField", - "serial": "AutoField", - "boolean": "BooleanField", - "numeric": "FloatField", - "timestamp": "DateTimeField", - "bigint": "IntegerField", - "datetime": "DateTimeField", - "date": "DateField", - "time": "TimeField", - "bool": "BooleanField", - "int": "IntegerField", -} - -#convert varchar -> CharField -v2c = re.compile('varchar\((\d+)\)') - - -def index(fks, id): - """Looks for the id on fks, fks is an array of arrays, each array has on [1] - the id of the class in a dia diagram. When not present returns None, else - it returns the position of the class with id on fks""" - for i, j in fks.items(): - if fks[i][1] == id: - return i - return None - - -def addparentstofks(rels, fks): - """Gets a list of relations, between parents and sons and a dict of - clases named in dia, and modifies the fks to add the parent as fk to get - order on the output of classes and replaces the base class of the son, to - put the class parent name. - """ - for j in rels: - son = index(fks, j[1]) - parent = index(fks, j[0]) - fks[son][2] = fks[son][2].replace("models.Model", parent) - if parent not in fks[son][0]: - fks[son][0].append(parent) - - -def dia2django(archivo): - models_txt = '' - f = codecs.open(archivo, "rb") - #dia files are gzipped - data = gzip.GzipFile(fileobj=f).read() - ppal = parseString(data) - #diagram -> layer -> object -> UML - Class -> name, (attribs : composite -> name,type) - datos = ppal.getElementsByTagName("dia:diagram")[0].getElementsByTagName("dia:layer")[0].getElementsByTagName("dia:object") - clases = {} - herit = [] - imports = six.u("") - for i in datos: - #Look for the classes - if i.getAttribute("type") == "UML - Class": - myid = i.getAttribute("id") - for j in i.childNodes: - if j.nodeType == Node.ELEMENT_NODE and j.hasAttributes(): - if j.getAttribute("name") == "name": - actclas = j.getElementsByTagName("dia:string")[0].childNodes[0].data[1:-1] - myname = "\nclass %s(models.Model) :\n" % actclas - clases[actclas] = [[], myid, myname, 0] - if j.getAttribute("name") == "attributes": - for l in j.getElementsByTagName("dia:composite"): - if l.getAttribute("type") == "umlattribute": - #Look for the attribute name and type - for k in l.getElementsByTagName("dia:attribute"): - if k.getAttribute("name") == "name": - nc = k.getElementsByTagName("dia:string")[0].childNodes[0].data[1:-1] - elif k.getAttribute("name") == "type": - tc = k.getElementsByTagName("dia:string")[0].childNodes[0].data[1:-1] - elif k.getAttribute("name") == "value": - val = k.getElementsByTagName("dia:string")[0].childNodes[0].data[1:-1] - if val == '##': - val = '' - elif k.getAttribute("name") == "visibility" and k.getElementsByTagName("dia:enum")[0].getAttribute("val") == "2": - if tc.replace(" ", "").lower().startswith("manytomanyfield("): - #If we find a class not in our model that is marked as being to another model - newc = tc.replace(" ", "")[16:-1] - if dependclasses.count(newc) == 0: - dependclasses.append(newc) - if tc.replace(" ", "").lower().startswith("foreignkey("): - #If we find a class not in our model that is marked as being to another model - newc = tc.replace(" ", "")[11:-1] - if dependclasses.count(newc) == 0: - dependclasses.append(newc) - - #Mapping SQL types to Django - varch = v2c.search(tc) - if tc.replace(" ", "").startswith("ManyToManyField("): - myfor = tc.replace(" ", "")[16:-1] - if actclas == myfor: - #In case of a recursive type, we use 'self' - tc = tc.replace(myfor, "'self'") - elif clases[actclas][0].count(myfor) == 0: - #Adding related class - if myfor not in dependclasses: - #In case we are using Auth classes or external via protected dia visibility - clases[actclas][0].append(myfor) - tc = "models." + tc - if len(val) > 0: - tc = tc.replace(")", "," + val + ")") - elif tc.find("Field") != -1: - if tc.count("()") > 0 and len(val) > 0: - tc = "models.%s" % tc.replace(")", "," + val + ")") - else: - tc = "models.%s(%s)" % (tc, val) - elif tc.replace(" ", "").startswith("ForeignKey("): - myfor = tc.replace(" ", "")[11:-1] - if actclas == myfor: - #In case of a recursive type, we use 'self' - tc = tc.replace(myfor, "'self'") - elif clases[actclas][0].count(myfor) == 0: - #Adding foreign classes - if myfor not in dependclasses: - #In case we are using Auth classes - clases[actclas][0].append(myfor) - tc = "models." + tc - if len(val) > 0: - tc = tc.replace(")", "," + val + ")") - elif varch is None: - tc = "models." + tsd[tc.strip().lower()] + "(" + val + ")" - else: - tc = "models.CharField(max_length=" + varch.group(1) + ")" - if len(val) > 0: - tc = tc.replace(")", ", " + val + " )") - if not (nc == "id" and tc == "AutoField()"): - clases[actclas][2] = clases[actclas][2] + (" %s = %s\n" % (nc, tc)) - elif i.getAttribute("type") == "UML - Generalization": - mycons = ['A', 'A'] - a = i.getElementsByTagName("dia:connection") - for j in a: - if len(j.getAttribute("to")): - mycons[int(j.getAttribute("handle"))] = j.getAttribute("to") - print(mycons) - if not 'A' in mycons: - herit.append(mycons) - elif i.getAttribute("type") == "UML - SmallPackage": - a = i.getElementsByTagName("dia:string") - for j in a: - if len(j.childNodes[0].data[1:-1]): - imports += six.u("from %s.models import *" % j.childNodes[0].data[1:-1]) - - addparentstofks(herit, clases) - #Ordering the appearance of classes - #First we make a list of the classes each classs is related to. - ordered = [] - for j, k in clases.iteritems(): - k[2] = k[2] + "\n def __unicode__(self):\n return u\"\"\n" - for fk in k[0]: - if fk not in dependclasses: - clases[fk][3] += 1 - ordered.append([j] + k) - - i = 0 - while i < len(ordered): - mark = i - j = i + 1 - while j < len(ordered): - if ordered[i][0] in ordered[j][1]: - mark = j - j += 1 - if mark == i: - i += 1 - else: - # swap %s in %s" % ( ordered[i] , ordered[mark]) to make ordered[i] to be at the end - if ordered[i][0] in ordered[mark][1] and ordered[mark][0] in ordered[i][1]: - #Resolving simplistic circular ForeignKeys - print("Not able to resolve circular ForeignKeys between %s and %s" % (ordered[i][1], ordered[mark][0])) - break - a = ordered[i] - ordered[i] = ordered[mark] - ordered[mark] = a - if i == len(ordered) - 1: - break - ordered.reverse() - if imports: - models_txt = str(imports) - for i in ordered: - models_txt += '%s\n' % str(i[3]) - - return models_txt - -if __name__ == '__main__': - if len(sys.argv) == 2: - dia2django(sys.argv[1]) - else: - print(" Use:\n \n " + sys.argv[0] + " diagram.dia\n\n") diff --git a/vendor-local/lib/python/django_extensions/utils/text.py b/vendor-local/lib/python/django_extensions/utils/text.py deleted file mode 100644 index fd650cf4e54..00000000000 --- a/vendor-local/lib/python/django_extensions/utils/text.py +++ /dev/null @@ -1,23 +0,0 @@ -import six - -from django.utils.functional import allow_lazy - -# conditional import, force_unicode was renamed in Django 1.5 -try: - from django.utils.encoding import force_unicode # NOQA -except ImportError: - from django.utils.encoding import force_text as force_unicode # NOQA - - -def truncate_letters(s, num): - """ - truncates a string to a number of letters, similar to truncate_words - """ - s = force_unicode(s) - length = int(num) - if len(s) > length: - s = s[:length] - if not s.endswith('...'): - s += '...' - return s -truncate_letters = allow_lazy(truncate_letters, six.text_type) diff --git a/vendor-local/lib/python/django_extensions/utils/validatingtemplatetags.py b/vendor-local/lib/python/django_extensions/utils/validatingtemplatetags.py deleted file mode 100644 index b36ca7e1725..00000000000 --- a/vendor-local/lib/python/django_extensions/utils/validatingtemplatetags.py +++ /dev/null @@ -1,91 +0,0 @@ -from django.template.base import Library, Node -from django.template import defaulttags -from django.templatetags import future -register = Library() - -error_on_old_style_url_tag = False -new_style_url_tag = False -errors = [] - - -def before_new_template(force_new_urls): - """Reset state ready for new template""" - global new_style_url_tag, error_on_old_style_url_tag, errors - new_style_url_tag = False - error_on_old_style_url_tag = force_new_urls - errors = [] - - -def get_template_errors(): - return errors - - -# Disable extends and include as they are not needed, slow parsing down, and cause duplicate errors -class NoOpNode(Node): - def render(self, context): - return '' - - -@register.tag -def extends(parser, token): - return NoOpNode() - - -@register.tag -def include(parser, token): - return NoOpNode() - - -# We replace load to determine whether new style urls are in use and re-patch url after -# a future version is loaded -@register.tag -def load(parser, token): - global new_style_url_tag - bits = token.contents.split() - - reloaded_url_tag = False - if len(bits) >= 4 and bits[-2] == "from" and bits[-1] == "future": - for name in bits[1:-2]: - if name == "url": - new_style_url_tag = True - reloaded_url_tag = True - - try: - return defaulttags.load(parser, token) - finally: - if reloaded_url_tag: - parser.tags['url'] = new_style_url - - -@register.tag(name='url') -def old_style_url(parser, token): - global error_on_old_style_url_tag - - bits = token.split_contents() - view = bits[1] - - if error_on_old_style_url_tag: - _error("Old style url tag used (only reported once per file): {%% %s %%}" % (" ".join(bits)), token) - error_on_old_style_url_tag = False - - if view[0] in "\"'" and view[0] == view[-1]: - _error("Old style url tag with quotes around view name: {%% %s %%}" % (" ".join(bits)), token) - - return defaulttags.url(parser, token) - - -def new_style_url(parser, token): - bits = token.split_contents() - view = bits[1] - - if view[0] not in "\"'" or view[0] != view[-1]: - _error("New style url tag without quotes around view name: {%% %s %%}" % (" ".join(bits)), token) - - return future.url(parser, token) - - -def _error(message, token): - origin, (start, upto) = token.source - source = origin.reload() - line = source.count("\n", 0, start) + 1 # 1 based line numbering - errors.append((origin, line, message)) diff --git a/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/PKG-INFO b/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/PKG-INFO deleted file mode 100644 index 82eac0cdff0..00000000000 --- a/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/PKG-INFO +++ /dev/null @@ -1,19 +0,0 @@ -Metadata-Version: 1.1 -Name: djangorestframework -Version: 2.3.7 -Summary: Web APIs for Django, made easy. -Home-page: http://django-rest-framework.org -Author: Tom Christie -Author-email: tom@tomchristie.com -License: BSD -Description: UNKNOWN -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Django -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Topic :: Internet :: WWW/HTTP diff --git a/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/SOURCES.txt b/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/SOURCES.txt deleted file mode 100644 index d9431fbc1b7..00000000000 --- a/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/SOURCES.txt +++ /dev/null @@ -1,113 +0,0 @@ -MANIFEST.in -setup.cfg -setup.py -djangorestframework.egg-info/PKG-INFO -djangorestframework.egg-info/SOURCES.txt -djangorestframework.egg-info/dependency_links.txt -djangorestframework.egg-info/top_level.txt -rest_framework/__init__.py -rest_framework/authentication.py -rest_framework/compat.py -rest_framework/decorators.py -rest_framework/exceptions.py -rest_framework/fields.py -rest_framework/filters.py -rest_framework/generics.py -rest_framework/mixins.py -rest_framework/models.py -rest_framework/negotiation.py -rest_framework/pagination.py -rest_framework/parsers.py -rest_framework/permissions.py -rest_framework/relations.py -rest_framework/renderers.py -rest_framework/request.py -rest_framework/response.py -rest_framework/reverse.py -rest_framework/routers.py -rest_framework/serializers.py -rest_framework/settings.py -rest_framework/six.py -rest_framework/status.py -rest_framework/test.py -rest_framework/throttling.py -rest_framework/urlpatterns.py -rest_framework/urls.py -rest_framework/views.py -rest_framework/viewsets.py -rest_framework/authtoken/__init__.py -rest_framework/authtoken/admin.py -rest_framework/authtoken/models.py -rest_framework/authtoken/serializers.py -rest_framework/authtoken/views.py -rest_framework/authtoken/migrations/0001_initial.py -rest_framework/authtoken/migrations/__init__.py -rest_framework/runtests/__init__.py -rest_framework/runtests/runcoverage.py -rest_framework/runtests/runtests.py -rest_framework/runtests/settings.py -rest_framework/runtests/urls.py -rest_framework/static/rest_framework/css/bootstrap-tweaks.css -rest_framework/static/rest_framework/css/bootstrap.min.css -rest_framework/static/rest_framework/css/default.css -rest_framework/static/rest_framework/css/prettify.css -rest_framework/static/rest_framework/img/glyphicons-halflings-white.png -rest_framework/static/rest_framework/img/glyphicons-halflings.png -rest_framework/static/rest_framework/img/grid.png -rest_framework/static/rest_framework/js/bootstrap.min.js -rest_framework/static/rest_framework/js/default.js -rest_framework/static/rest_framework/js/jquery-1.8.1-min.js -rest_framework/static/rest_framework/js/prettify-min.js -rest_framework/templates/rest_framework/api.html -rest_framework/templates/rest_framework/base.html -rest_framework/templates/rest_framework/form.html -rest_framework/templates/rest_framework/login.html -rest_framework/templates/rest_framework/login_base.html -rest_framework/templatetags/__init__.py -rest_framework/templatetags/rest_framework.py -rest_framework/tests/__init__.py -rest_framework/tests/description.py -rest_framework/tests/models.py -rest_framework/tests/test_authentication.py -rest_framework/tests/test_breadcrumbs.py -rest_framework/tests/test_decorators.py -rest_framework/tests/test_description.py -rest_framework/tests/test_fields.py -rest_framework/tests/test_files.py -rest_framework/tests/test_filters.py -rest_framework/tests/test_genericrelations.py -rest_framework/tests/test_generics.py -rest_framework/tests/test_htmlrenderer.py -rest_framework/tests/test_hyperlinkedserializers.py -rest_framework/tests/test_multitable_inheritance.py -rest_framework/tests/test_negotiation.py -rest_framework/tests/test_pagination.py -rest_framework/tests/test_parsers.py -rest_framework/tests/test_permissions.py -rest_framework/tests/test_relations.py -rest_framework/tests/test_relations_hyperlink.py -rest_framework/tests/test_relations_nested.py -rest_framework/tests/test_relations_pk.py -rest_framework/tests/test_relations_slug.py -rest_framework/tests/test_renderers.py -rest_framework/tests/test_request.py -rest_framework/tests/test_response.py -rest_framework/tests/test_reverse.py -rest_framework/tests/test_routers.py -rest_framework/tests/test_serializer.py -rest_framework/tests/test_serializer_bulk_update.py -rest_framework/tests/test_serializer_nested.py -rest_framework/tests/test_settings.py -rest_framework/tests/test_testing.py -rest_framework/tests/test_throttling.py -rest_framework/tests/test_urlpatterns.py -rest_framework/tests/test_validation.py -rest_framework/tests/test_views.py -rest_framework/tests/tests.py -rest_framework/tests/extras/__init__.py -rest_framework/tests/extras/bad_import.py -rest_framework/utils/__init__.py -rest_framework/utils/breadcrumbs.py -rest_framework/utils/encoders.py -rest_framework/utils/formatting.py -rest_framework/utils/mediatypes.py \ No newline at end of file diff --git a/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/dependency_links.txt b/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/dependency_links.txt deleted file mode 100644 index 8b137891791..00000000000 --- a/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/installed-files.txt b/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/installed-files.txt deleted file mode 100644 index 7a0585d79b2..00000000000 --- a/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/installed-files.txt +++ /dev/null @@ -1,201 +0,0 @@ -../rest_framework/__init__.py -../rest_framework/authentication.py -../rest_framework/compat.py -../rest_framework/decorators.py -../rest_framework/exceptions.py -../rest_framework/fields.py -../rest_framework/filters.py -../rest_framework/generics.py -../rest_framework/mixins.py -../rest_framework/models.py -../rest_framework/negotiation.py -../rest_framework/pagination.py -../rest_framework/parsers.py -../rest_framework/permissions.py -../rest_framework/relations.py -../rest_framework/renderers.py -../rest_framework/request.py -../rest_framework/response.py -../rest_framework/reverse.py -../rest_framework/routers.py -../rest_framework/serializers.py -../rest_framework/settings.py -../rest_framework/six.py -../rest_framework/status.py -../rest_framework/test.py -../rest_framework/throttling.py -../rest_framework/urlpatterns.py -../rest_framework/urls.py -../rest_framework/views.py -../rest_framework/viewsets.py -../rest_framework/authtoken/__init__.py -../rest_framework/authtoken/admin.py -../rest_framework/authtoken/models.py -../rest_framework/authtoken/serializers.py -../rest_framework/authtoken/views.py -../rest_framework/authtoken/migrations/0001_initial.py -../rest_framework/authtoken/migrations/__init__.py -../rest_framework/runtests/__init__.py -../rest_framework/runtests/runcoverage.py -../rest_framework/runtests/runtests.py -../rest_framework/runtests/settings.py -../rest_framework/runtests/urls.py -../rest_framework/templatetags/__init__.py -../rest_framework/templatetags/rest_framework.py -../rest_framework/tests/__init__.py -../rest_framework/tests/description.py -../rest_framework/tests/models.py -../rest_framework/tests/test_authentication.py -../rest_framework/tests/test_breadcrumbs.py -../rest_framework/tests/test_decorators.py -../rest_framework/tests/test_description.py -../rest_framework/tests/test_fields.py -../rest_framework/tests/test_files.py -../rest_framework/tests/test_filters.py -../rest_framework/tests/test_genericrelations.py -../rest_framework/tests/test_generics.py -../rest_framework/tests/test_htmlrenderer.py -../rest_framework/tests/test_hyperlinkedserializers.py -../rest_framework/tests/test_multitable_inheritance.py -../rest_framework/tests/test_negotiation.py -../rest_framework/tests/test_pagination.py -../rest_framework/tests/test_parsers.py -../rest_framework/tests/test_permissions.py -../rest_framework/tests/test_relations.py -../rest_framework/tests/test_relations_hyperlink.py -../rest_framework/tests/test_relations_nested.py -../rest_framework/tests/test_relations_pk.py -../rest_framework/tests/test_relations_slug.py -../rest_framework/tests/test_renderers.py -../rest_framework/tests/test_request.py -../rest_framework/tests/test_response.py -../rest_framework/tests/test_reverse.py -../rest_framework/tests/test_routers.py -../rest_framework/tests/test_serializer.py -../rest_framework/tests/test_serializer_bulk_update.py -../rest_framework/tests/test_serializer_nested.py -../rest_framework/tests/test_settings.py -../rest_framework/tests/test_testing.py -../rest_framework/tests/test_throttling.py -../rest_framework/tests/test_urlpatterns.py -../rest_framework/tests/test_validation.py -../rest_framework/tests/test_views.py -../rest_framework/tests/tests.py -../rest_framework/tests/extras/__init__.py -../rest_framework/tests/extras/bad_import.py -../rest_framework/utils/__init__.py -../rest_framework/utils/breadcrumbs.py -../rest_framework/utils/encoders.py -../rest_framework/utils/formatting.py -../rest_framework/utils/mediatypes.py -../rest_framework/static/rest_framework/css/bootstrap-tweaks.css -../rest_framework/static/rest_framework/css/bootstrap.min.css -../rest_framework/static/rest_framework/css/default.css -../rest_framework/static/rest_framework/css/prettify.css -../rest_framework/static/rest_framework/img/glyphicons-halflings-white.png -../rest_framework/static/rest_framework/img/glyphicons-halflings.png -../rest_framework/static/rest_framework/img/grid.png -../rest_framework/static/rest_framework/js/bootstrap.min.js -../rest_framework/static/rest_framework/js/default.js -../rest_framework/static/rest_framework/js/jquery-1.8.1-min.js -../rest_framework/static/rest_framework/js/prettify-min.js -../rest_framework/templates/rest_framework/api.html -../rest_framework/templates/rest_framework/base.html -../rest_framework/templates/rest_framework/form.html -../rest_framework/templates/rest_framework/login.html -../rest_framework/templates/rest_framework/login_base.html -../rest_framework/__init__.pyc -../rest_framework/authentication.pyc -../rest_framework/compat.pyc -../rest_framework/decorators.pyc -../rest_framework/exceptions.pyc -../rest_framework/fields.pyc -../rest_framework/filters.pyc -../rest_framework/generics.pyc -../rest_framework/mixins.pyc -../rest_framework/models.pyc -../rest_framework/negotiation.pyc -../rest_framework/pagination.pyc -../rest_framework/parsers.pyc -../rest_framework/permissions.pyc -../rest_framework/relations.pyc -../rest_framework/renderers.pyc -../rest_framework/request.pyc -../rest_framework/response.pyc -../rest_framework/reverse.pyc -../rest_framework/routers.pyc -../rest_framework/serializers.pyc -../rest_framework/settings.pyc -../rest_framework/six.pyc -../rest_framework/status.pyc -../rest_framework/test.pyc -../rest_framework/throttling.pyc -../rest_framework/urlpatterns.pyc -../rest_framework/urls.pyc -../rest_framework/views.pyc -../rest_framework/viewsets.pyc -../rest_framework/authtoken/__init__.pyc -../rest_framework/authtoken/admin.pyc -../rest_framework/authtoken/models.pyc -../rest_framework/authtoken/serializers.pyc -../rest_framework/authtoken/views.pyc -../rest_framework/authtoken/migrations/0001_initial.pyc -../rest_framework/authtoken/migrations/__init__.pyc -../rest_framework/runtests/__init__.pyc -../rest_framework/runtests/runcoverage.pyc -../rest_framework/runtests/runtests.pyc -../rest_framework/runtests/settings.pyc -../rest_framework/runtests/urls.pyc -../rest_framework/templatetags/__init__.pyc -../rest_framework/templatetags/rest_framework.pyc -../rest_framework/tests/__init__.pyc -../rest_framework/tests/description.pyc -../rest_framework/tests/models.pyc -../rest_framework/tests/test_authentication.pyc -../rest_framework/tests/test_breadcrumbs.pyc -../rest_framework/tests/test_decorators.pyc -../rest_framework/tests/test_description.pyc -../rest_framework/tests/test_fields.pyc -../rest_framework/tests/test_files.pyc -../rest_framework/tests/test_filters.pyc -../rest_framework/tests/test_genericrelations.pyc -../rest_framework/tests/test_generics.pyc -../rest_framework/tests/test_htmlrenderer.pyc -../rest_framework/tests/test_hyperlinkedserializers.pyc -../rest_framework/tests/test_multitable_inheritance.pyc -../rest_framework/tests/test_negotiation.pyc -../rest_framework/tests/test_pagination.pyc -../rest_framework/tests/test_parsers.pyc -../rest_framework/tests/test_permissions.pyc -../rest_framework/tests/test_relations.pyc -../rest_framework/tests/test_relations_hyperlink.pyc -../rest_framework/tests/test_relations_nested.pyc -../rest_framework/tests/test_relations_pk.pyc -../rest_framework/tests/test_relations_slug.pyc -../rest_framework/tests/test_renderers.pyc -../rest_framework/tests/test_request.pyc -../rest_framework/tests/test_response.pyc -../rest_framework/tests/test_reverse.pyc -../rest_framework/tests/test_routers.pyc -../rest_framework/tests/test_serializer.pyc -../rest_framework/tests/test_serializer_bulk_update.pyc -../rest_framework/tests/test_serializer_nested.pyc -../rest_framework/tests/test_settings.pyc -../rest_framework/tests/test_testing.pyc -../rest_framework/tests/test_throttling.pyc -../rest_framework/tests/test_urlpatterns.pyc -../rest_framework/tests/test_validation.pyc -../rest_framework/tests/test_views.pyc -../rest_framework/tests/tests.pyc -../rest_framework/tests/extras/__init__.pyc -../rest_framework/tests/extras/bad_import.pyc -../rest_framework/utils/__init__.pyc -../rest_framework/utils/breadcrumbs.pyc -../rest_framework/utils/encoders.pyc -../rest_framework/utils/formatting.pyc -../rest_framework/utils/mediatypes.pyc -./ -dependency_links.txt -PKG-INFO -SOURCES.txt -top_level.txt diff --git a/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/top_level.txt b/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/top_level.txt deleted file mode 100644 index d8c2daf12e4..00000000000 --- a/vendor-local/lib/python/djangorestframework-2.3.7-py2.7.egg-info/top_level.txt +++ /dev/null @@ -1,8 +0,0 @@ -rest_framework/authtoken -rest_framework/utils -rest_framework/tests/extras -rest_framework/tests -rest_framework/runtests -rest_framework/templatetags -rest_framework -rest_framework/authtoken/migrations diff --git a/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/PKG-INFO b/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/PKG-INFO deleted file mode 100644 index 7154c4a8200..00000000000 --- a/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/PKG-INFO +++ /dev/null @@ -1,851 +0,0 @@ -Metadata-Version: 1.1 -Name: requests -Version: 2.0.1 -Summary: Python HTTP for Humans. -Home-page: http://python-requests.org -Author: Kenneth Reitz -Author-email: me@kennethreitz.com -License: Copyright 2013 Kenneth Reitz - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -Description: Requests: HTTP for Humans - ========================= - - .. image:: https://badge.fury.io/py/requests.png - :target: http://badge.fury.io/py/requests - - .. image:: https://pypip.in/d/requests/badge.png - :target: https://crate.io/packages/requests/ - - .. image:: http://ci.kennethreitz.org/buildStatus/icon?job=requests-trunk - :target: http://ci.kennethreitz.org/job/requests-trunk/ - - - Requests is an Apache2 Licensed HTTP library, written in Python, for human - beings. - - Most existing Python modules for sending HTTP requests are extremely - verbose and cumbersome. Python's builtin urllib2 module provides most of - the HTTP capabilities you should need, but the api is thoroughly broken. - It requires an enormous amount of work (even method overrides) to - perform the simplest of tasks. - - Things shouldn't be this way. Not in Python. - - .. code-block:: pycon - - >>> r = requests.get('https://api.github.com', auth=('user', 'pass')) - >>> r.status_code - 204 - >>> r.headers['content-type'] - 'application/json' - >>> r.text - ... - - See `the same code, without Requests <https://gist.github.com/973705>`_. - - Requests allow you to send HTTP/1.1 requests. You can add headers, form data, - multipart files, and parameters with simple Python dictionaries, and access the - response data in the same way. It's powered by httplib and `urllib3 - <https://github.com/shazow/urllib3>`_, but it does all the hard work and crazy - hacks for you. - - - Features - -------- - - - International Domains and URLs - - Keep-Alive & Connection Pooling - - Sessions with Cookie Persistence - - Browser-style SSL Verification - - Basic/Digest Authentication - - Elegant Key/Value Cookies - - Automatic Decompression - - Unicode Response Bodies - - Multipart File Uploads - - Connection Timeouts - - Thread-safety - - HTTP(S) proxy support - - - Installation - ------------ - - To install Requests, simply: - - .. code-block:: bash - - $ pip install requests - - Or, if you absolutely must: - - .. code-block:: bash - - $ easy_install requests - - But, you really shouldn't do that. - - - Documentation - ------------- - - Documentation is available at http://docs.python-requests.org/. - - - Contribute - ---------- - - #. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a `Contributor Friendly`_ tag for issues that should be ideal for people who are not very familiar with the codebase yet. - #. If you feel uncomfortable or uncertain about an issue or your changes, feel free to email @sigmavirus24 and he will happily help you via email, Skype, remote pairing or whatever you are comfortable with. - #. Fork `the repository`_ on GitHub to start making your changes to the **master** branch (or branch off of it). - #. Write a test which shows that the bug was fixed or that the feature works as expected. - #. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_. - - .. _`the repository`: http://github.com/kennethreitz/requests - .. _AUTHORS: https://github.com/kennethreitz/requests/blob/master/AUTHORS.rst - .. _Contributor Friendly: https://github.com/kennethreitz/requests/issues?direction=desc&labels=Contributor+Friendly&page=1&sort=updated&state=open - - - .. :changelog: - - Release History - --------------- - - - 2.0.1 (2013-10-24) - ++++++++++++++++++ - - - Updated included CA Bundle with new mistrusts and automated process for the future - - Added MD5-sess to Digest Auth - - Accept per-file headers in multipart file POST messages. - - Fixed: Don't send the full URL on CONNECT messages. - - Fixed: Correctly lowercase a redirect scheme. - - Fixed: Cookies not persisted when set via functional API. - - Fixed: Translate urllib3 ProxyError into a requests ProxyError derived from ConnectionError. - - Updated internal urllib3 and chardet. - - 2.0.0 (2013-09-24) - ++++++++++++++++++ - - **API Changes:** - - - Keys in the Headers dictionary are now native strings on all Python versions, - i.e. bytestrings on Python 2, unicode on Python 3. - - Proxy URLs now *must* have an explicit scheme. A ``MissingSchema`` exception - will be raised if they don't. - - Timeouts now apply to read time if ``Stream=False``. - - ``RequestException`` is now a subclass of ``IOError``, not ``RuntimeError``. - - Added new method to ``PreparedRequest`` objects: ``PreparedRequest.copy()``. - - Added new method to ``Session`` objects: ``Session.update_request()``. This - method updates a ``Request`` object with the data (e.g. cookies) stored on - the ``Session``. - - Added new method to ``Session`` objects: ``Session.prepare_request()``. This - method updates and prepares a ``Request`` object, and returns the - corresponding ``PreparedRequest`` object. - - Added new method to ``HTTPAdapter`` objects: ``HTTPAdapter.proxy_headers()``. - This should not be called directly, but improves the subclass interface. - - ``httplib.IncompleteRead`` exceptions caused by incorrect chunked encoding - will now raise a Requests ``ChunkedEncodingError`` instead. - - Invalid percent-escape sequences now cause a Requests ``InvalidURL`` - exception to be raised. - - HTTP 208 no longer uses reason phrase ``"im_used"``. Correctly uses - ``"already_reported"``. - - HTTP 226 reason added (``"im_used"``). - - **Bugfixes:** - - - Vastly improved proxy support, including the CONNECT verb. Special thanks to - the many contributors who worked towards this improvement. - - Cookies are now properly managed when 401 authentication responses are - received. - - Chunked encoding fixes. - - Support for mixed case schemes. - - Better handling of streaming downloads. - - Retrieve environment proxies from more locations. - - Minor cookies fixes. - - Improved redirect behaviour. - - Improved streaming behaviour, particularly for compressed data. - - Miscellaneous small Python 3 text encoding bugs. - - ``.netrc`` no longer overrides explicit auth. - - Cookies set by hooks are now correctly persisted on Sessions. - - Fix problem with cookies that specify port numbers in their host field. - - ``BytesIO`` can be used to perform streaming uploads. - - More generous parsing of the ``no_proxy`` environment variable. - - Non-string objects can be passed in data values alongside files. - - 1.2.3 (2013-05-25) - ++++++++++++++++++ - - - Simple packaging fix - - - 1.2.2 (2013-05-23) - ++++++++++++++++++ - - - Simple packaging fix - - - 1.2.1 (2013-05-20) - ++++++++++++++++++ - - - Python 3.3.2 compatibility - - Always percent-encode location headers - - Fix connection adapter matching to be most-specific first - - new argument to the default connection adapter for passing a block argument - - prevent a KeyError when there's no link headers - - 1.2.0 (2013-03-31) - ++++++++++++++++++ - - - Fixed cookies on sessions and on requests - - Significantly change how hooks are dispatched - hooks now receive all the - arguments specified by the user when making a request so hooks can make a - secondary request with the same parameters. This is especially necessary for - authentication handler authors - - certifi support was removed - - Fixed bug where using OAuth 1 with body ``signature_type`` sent no data - - Major proxy work thanks to @Lukasa including parsing of proxy authentication - from the proxy url - - Fix DigestAuth handling too many 401s - - Update vendored urllib3 to include SSL bug fixes - - Allow keyword arguments to be passed to ``json.loads()`` via the - ``Response.json()`` method - - Don't send ``Content-Length`` header by default on ``GET`` or ``HEAD`` - requests - - Add ``elapsed`` attribute to ``Response`` objects to time how long a request - took. - - Fix ``RequestsCookieJar`` - - Sessions and Adapters are now picklable, i.e., can be used with the - multiprocessing library - - Update charade to version 1.0.3 - - The change in how hooks are dispatched will likely cause a great deal of - issues. - - 1.1.0 (2013-01-10) - ++++++++++++++++++ - - - CHUNKED REQUESTS - - Support for iterable response bodies - - Assume servers persist redirect params - - Allow explicit content types to be specified for file data - - Make merge_kwargs case-insensitive when looking up keys - - 1.0.3 (2012-12-18) - ++++++++++++++++++ - - - Fix file upload encoding bug - - Fix cookie behavior - - 1.0.2 (2012-12-17) - ++++++++++++++++++ - - - Proxy fix for HTTPAdapter. - - 1.0.1 (2012-12-17) - ++++++++++++++++++ - - - Cert verification exception bug. - - Proxy fix for HTTPAdapter. - - 1.0.0 (2012-12-17) - ++++++++++++++++++ - - - Massive Refactor and Simplification - - Switch to Apache 2.0 license - - Swappable Connection Adapters - - Mountable Connection Adapters - - Mutable ProcessedRequest chain - - /s/prefetch/stream - - Removal of all configuration - - Standard library logging - - Make Response.json() callable, not property. - - Usage of new charade project, which provides python 2 and 3 simultaneous chardet. - - Removal of all hooks except 'response' - - Removal of all authentication helpers (OAuth, Kerberos) - - This is not a backwards compatible change. - - 0.14.2 (2012-10-27) - +++++++++++++++++++ - - - Improved mime-compatible JSON handling - - Proxy fixes - - Path hack fixes - - Case-Insensistive Content-Encoding headers - - Support for CJK parameters in form posts - - - 0.14.1 (2012-10-01) - +++++++++++++++++++ - - - Python 3.3 Compatibility - - Simply default accept-encoding - - Bugfixes - - - 0.14.0 (2012-09-02) - ++++++++++++++++++++ - - - No more iter_content errors if already downloaded. - - 0.13.9 (2012-08-25) - +++++++++++++++++++ - - - Fix for OAuth + POSTs - - Remove exception eating from dispatch_hook - - General bugfixes - - 0.13.8 (2012-08-21) - +++++++++++++++++++ - - - Incredible Link header support :) - - 0.13.7 (2012-08-19) - +++++++++++++++++++ - - - Support for (key, value) lists everywhere. - - Digest Authentication improvements. - - Ensure proxy exclusions work properly. - - Clearer UnicodeError exceptions. - - Automatic casting of URLs to tsrings (fURL and such) - - Bugfixes. - - 0.13.6 (2012-08-06) - +++++++++++++++++++ - - - Long awaited fix for hanging connections! - - 0.13.5 (2012-07-27) - +++++++++++++++++++ - - - Packaging fix - - 0.13.4 (2012-07-27) - +++++++++++++++++++ - - - GSSAPI/Kerberos authentication! - - App Engine 2.7 Fixes! - - Fix leaking connections (from urllib3 update) - - OAuthlib path hack fix - - OAuthlib URL parameters fix. - - 0.13.3 (2012-07-12) - +++++++++++++++++++ - - - Use simplejson if available. - - Do not hide SSLErrors behind Timeouts. - - Fixed param handling with urls containing fragments. - - Significantly improved information in User Agent. - - client certificates are ignored when verify=False - - 0.13.2 (2012-06-28) - +++++++++++++++++++ - - - Zero dependencies (once again)! - - New: Response.reason - - Sign querystring parameters in OAuth 1.0 - - Client certificates no longer ignored when verify=False - - Add openSUSE certificate support - - 0.13.1 (2012-06-07) - +++++++++++++++++++ - - - Allow passing a file or file-like object as data. - - Allow hooks to return responses that indicate errors. - - Fix Response.text and Response.json for body-less responses. - - 0.13.0 (2012-05-29) - +++++++++++++++++++ - - - Removal of Requests.async in favor of `grequests <https://github.com/kennethreitz/grequests>`_ - - Allow disabling of cookie persistiance. - - New implimentation of safe_mode - - cookies.get now supports default argument - - Session cookies not saved when Session.request is called with return_response=False - - Env: no_proxy support. - - RequestsCookieJar improvements. - - Various bug fixes. - - 0.12.1 (2012-05-08) - +++++++++++++++++++ - - - New ``Response.json`` property. - - Ability to add string file uploads. - - Fix out-of-range issue with iter_lines. - - Fix iter_content default size. - - Fix POST redirects containing files. - - 0.12.0 (2012-05-02) - +++++++++++++++++++ - - - EXPERIMENTAL OAUTH SUPPORT! - - Proper CookieJar-backed cookies interface with awesome dict-like interface. - - Speed fix for non-iterated content chunks. - - Move ``pre_request`` to a more usable place. - - New ``pre_send`` hook. - - Lazily encode data, params, files. - - Load system Certificate Bundle if ``certify`` isn't available. - - Cleanups, fixes. - - 0.11.2 (2012-04-22) - +++++++++++++++++++ - - - Attempt to use the OS's certificate bundle if ``certifi`` isn't available. - - Infinite digest auth redirect fix. - - Multi-part file upload improvements. - - Fix decoding of invalid %encodings in URLs. - - If there is no content in a response don't throw an error the second time that content is attempted to be read. - - Upload data on redirects. - - 0.11.1 (2012-03-30) - +++++++++++++++++++ - - * POST redirects now break RFC to do what browsers do: Follow up with a GET. - * New ``strict_mode`` configuration to disable new redirect behavior. - - - 0.11.0 (2012-03-14) - +++++++++++++++++++ - - * Private SSL Certificate support - * Remove select.poll from Gevent monkeypatching - * Remove redundant generator for chunked transfer encoding - * Fix: Response.ok raises Timeout Exception in safe_mode - - 0.10.8 (2012-03-09) - +++++++++++++++++++ - - * Generate chunked ValueError fix - * Proxy configuration by environment variables - * Simplification of iter_lines. - * New `trust_env` configuration for disabling system/environment hints. - * Suppress cookie errors. - - 0.10.7 (2012-03-07) - +++++++++++++++++++ - - * `encode_uri` = False - - 0.10.6 (2012-02-25) - +++++++++++++++++++ - - * Allow '=' in cookies. - - 0.10.5 (2012-02-25) - +++++++++++++++++++ - - * Response body with 0 content-length fix. - * New async.imap. - * Don't fail on netrc. - - - 0.10.4 (2012-02-20) - +++++++++++++++++++ - - * Honor netrc. - - 0.10.3 (2012-02-20) - +++++++++++++++++++ - - * HEAD requests don't follow redirects anymore. - * raise_for_status() doesn't raise for 3xx anymore. - * Make Session objects picklable. - * ValueError for invalid schema URLs. - - 0.10.2 (2012-01-15) - +++++++++++++++++++ - - * Vastly improved URL quoting. - * Additional allowed cookie key values. - * Attempted fix for "Too many open files" Error - * Replace unicode errors on first pass, no need for second pass. - * Append '/' to bare-domain urls before query insertion. - * Exceptions now inherit from RuntimeError. - * Binary uploads + auth fix. - * Bugfixes. - - - 0.10.1 (2012-01-23) - +++++++++++++++++++ - - * PYTHON 3 SUPPORT! - * Dropped 2.5 Support. (*Backwards Incompatible*) - - 0.10.0 (2012-01-21) - +++++++++++++++++++ - - * ``Response.content`` is now bytes-only. (*Backwards Incompatible*) - * New ``Response.text`` is unicode-only. - * If no ``Response.encoding`` is specified and ``chardet`` is available, ``Respoonse.text`` will guess an encoding. - * Default to ISO-8859-1 (Western) encoding for "text" subtypes. - * Removal of `decode_unicode`. (*Backwards Incompatible*) - * New multiple-hooks system. - * New ``Response.register_hook`` for registering hooks within the pipeline. - * ``Response.url`` is now Unicode. - - 0.9.3 (2012-01-18) - ++++++++++++++++++ - - * SSL verify=False bugfix (apparent on windows machines). - - 0.9.2 (2012-01-18) - ++++++++++++++++++ - - * Asynchronous async.send method. - * Support for proper chunk streams with boundaries. - * session argument for Session classes. - * Print entire hook tracebacks, not just exception instance. - * Fix response.iter_lines from pending next line. - * Fix but in HTTP-digest auth w/ URI having query strings. - * Fix in Event Hooks section. - * Urllib3 update. - - - 0.9.1 (2012-01-06) - ++++++++++++++++++ - - * danger_mode for automatic Response.raise_for_status() - * Response.iter_lines refactor - - 0.9.0 (2011-12-28) - ++++++++++++++++++ - - * verify ssl is default. - - - 0.8.9 (2011-12-28) - ++++++++++++++++++ - - * Packaging fix. - - - 0.8.8 (2011-12-28) - ++++++++++++++++++ - - * SSL CERT VERIFICATION! - * Release of Cerifi: Mozilla's cert list. - * New 'verify' argument for SSL requests. - * Urllib3 update. - - 0.8.7 (2011-12-24) - ++++++++++++++++++ - - * iter_lines last-line truncation fix - * Force safe_mode for async requests - * Handle safe_mode exceptions more consistently - * Fix iteration on null responses in safe_mode - - 0.8.6 (2011-12-18) - ++++++++++++++++++ - - * Socket timeout fixes. - * Proxy Authorization support. - - 0.8.5 (2011-12-14) - ++++++++++++++++++ - - * Response.iter_lines! - - 0.8.4 (2011-12-11) - ++++++++++++++++++ - - * Prefetch bugfix. - * Added license to installed version. - - 0.8.3 (2011-11-27) - ++++++++++++++++++ - - * Converted auth system to use simpler callable objects. - * New session parameter to API methods. - * Display full URL while logging. - - 0.8.2 (2011-11-19) - ++++++++++++++++++ - - * New Unicode decoding system, based on over-ridable `Response.encoding`. - * Proper URL slash-quote handling. - * Cookies with ``[``, ``]``, and ``_`` allowed. - - 0.8.1 (2011-11-15) - ++++++++++++++++++ - - * URL Request path fix - * Proxy fix. - * Timeouts fix. - - 0.8.0 (2011-11-13) - ++++++++++++++++++ - - * Keep-alive support! - * Complete removal of Urllib2 - * Complete removal of Poster - * Complete removal of CookieJars - * New ConnectionError raising - * Safe_mode for error catching - * prefetch parameter for request methods - * OPTION method - * Async pool size throttling - * File uploads send real names - * Vendored in urllib3 - - 0.7.6 (2011-11-07) - ++++++++++++++++++ - - * Digest authentication bugfix (attach query data to path) - - 0.7.5 (2011-11-04) - ++++++++++++++++++ - - * Response.content = None if there was an invalid repsonse. - * Redirection auth handling. - - 0.7.4 (2011-10-26) - ++++++++++++++++++ - - * Session Hooks fix. - - 0.7.3 (2011-10-23) - ++++++++++++++++++ - - * Digest Auth fix. - - - 0.7.2 (2011-10-23) - ++++++++++++++++++ - - * PATCH Fix. - - - 0.7.1 (2011-10-23) - ++++++++++++++++++ - - * Move away from urllib2 authentication handling. - * Fully Remove AuthManager, AuthObject, &c. - * New tuple-based auth system with handler callbacks. - - - 0.7.0 (2011-10-22) - ++++++++++++++++++ - - * Sessions are now the primary interface. - * Deprecated InvalidMethodException. - * PATCH fix. - * New config system (no more global settings). - - - 0.6.6 (2011-10-19) - ++++++++++++++++++ - - * Session parameter bugfix (params merging). - - - 0.6.5 (2011-10-18) - ++++++++++++++++++ - - * Offline (fast) test suite. - * Session dictionary argument merging. - - - 0.6.4 (2011-10-13) - ++++++++++++++++++ - - * Automatic decoding of unicode, based on HTTP Headers. - * New ``decode_unicode`` setting. - * Removal of ``r.read/close`` methods. - * New ``r.faw`` interface for advanced response usage.* - * Automatic expansion of parameterized headers. - - - 0.6.3 (2011-10-13) - ++++++++++++++++++ - - * Beautiful ``requests.async`` module, for making async requests w/ gevent. - - - 0.6.2 (2011-10-09) - ++++++++++++++++++ - - * GET/HEAD obeys allow_redirects=False. - - - 0.6.1 (2011-08-20) - ++++++++++++++++++ - - * Enhanced status codes experience ``\o/`` - * Set a maximum number of redirects (``settings.max_redirects``) - * Full Unicode URL support - * Support for protocol-less redirects. - * Allow for arbitrary request types. - * Bugfixes - - - 0.6.0 (2011-08-17) - ++++++++++++++++++ - - * New callback hook system - * New persistient sessions object and context manager - * Transparent Dict-cookie handling - * Status code reference object - * Removed Response.cached - * Added Response.request - * All args are kwargs - * Relative redirect support - * HTTPError handling improvements - * Improved https testing - * Bugfixes - - - 0.5.1 (2011-07-23) - ++++++++++++++++++ - - * International Domain Name Support! - * Access headers without fetching entire body (``read()``) - * Use lists as dicts for parameters - * Add Forced Basic Authentication - * Forced Basic is default authentication type - * ``python-requests.org`` default User-Agent header - * CaseInsensitiveDict lower-case caching - * Response.history bugfix - - - 0.5.0 (2011-06-21) - ++++++++++++++++++ - - * PATCH Support - * Support for Proxies - * HTTPBin Test Suite - * Redirect Fixes - * settings.verbose stream writing - * Querystrings for all methods - * URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicity raised - ``r.requests.get('hwe://blah'); r.raise_for_status()`` - - - 0.4.1 (2011-05-22) - ++++++++++++++++++ - - * Improved Redirection Handling - * New 'allow_redirects' param for following non-GET/HEAD Redirects - * Settings module refactoring - - - 0.4.0 (2011-05-15) - ++++++++++++++++++ - - * Response.history: list of redirected responses - * Case-Insensitive Header Dictionaries! - * Unicode URLs - - - 0.3.4 (2011-05-14) - ++++++++++++++++++ - - * Urllib2 HTTPAuthentication Recursion fix (Basic/Digest) - * Internal Refactor - * Bytes data upload Bugfix - - - - 0.3.3 (2011-05-12) - ++++++++++++++++++ - - * Request timeouts - * Unicode url-encoded data - * Settings context manager and module - - - 0.3.2 (2011-04-15) - ++++++++++++++++++ - - * Automatic Decompression of GZip Encoded Content - * AutoAuth Support for Tupled HTTP Auth - - - 0.3.1 (2011-04-01) - ++++++++++++++++++ - - * Cookie Changes - * Response.read() - * Poster fix - - - 0.3.0 (2011-02-25) - ++++++++++++++++++ - - * Automatic Authentication API Change - * Smarter Query URL Parameterization - * Allow file uploads and POST data together - * New Authentication Manager System - - Simpler Basic HTTP System - - Supports all build-in urllib2 Auths - - Allows for custom Auth Handlers - - - 0.2.4 (2011-02-19) - ++++++++++++++++++ - - * Python 2.5 Support - * PyPy-c v1.4 Support - * Auto-Authentication tests - * Improved Request object constructor - - 0.2.3 (2011-02-15) - ++++++++++++++++++ - - * New HTTPHandling Methods - - Response.__nonzero__ (false if bad HTTP Status) - - Response.ok (True if expected HTTP Status) - - Response.error (Logged HTTPError if bad HTTP Status) - - Response.raise_for_status() (Raises stored HTTPError) - - - 0.2.2 (2011-02-14) - ++++++++++++++++++ - - * Still handles request in the event of an HTTPError. (Issue #2) - * Eventlet and Gevent Monkeypatch support. - * Cookie Support (Issue #1) - - - 0.2.1 (2011-02-14) - ++++++++++++++++++ - - * Added file attribute to POST and PUT requests for multipart-encode file uploads. - * Added Request.url attribute for context and redirects - - - 0.2.0 (2011-02-14) - ++++++++++++++++++ - - * Birth! - - - 0.0.1 (2011-02-13) - ++++++++++++++++++ - - * Frustration - * Conception - - -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Natural Language :: English -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 diff --git a/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/SOURCES.txt b/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/SOURCES.txt deleted file mode 100644 index 0e746a2e1bc..00000000000 --- a/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/SOURCES.txt +++ /dev/null @@ -1,86 +0,0 @@ -HISTORY.rst -LICENSE -MANIFEST.in -NOTICE -README.rst -requirements.txt -setup.cfg -setup.py -test_requests.py -requests/__init__.py -requests/adapters.py -requests/api.py -requests/auth.py -requests/cacert.pem -requests/certs.py -requests/compat.py -requests/cookies.py -requests/exceptions.py -requests/hooks.py -requests/models.py -requests/sessions.py -requests/status_codes.py -requests/structures.py -requests/utils.py -requests.egg-info/PKG-INFO -requests.egg-info/SOURCES.txt -requests.egg-info/dependency_links.txt -requests.egg-info/not-zip-safe -requests.egg-info/top_level.txt -requests/packages/__init__.py -requests/packages/charade/__init__.py -requests/packages/charade/__main__.py -requests/packages/charade/big5freq.py -requests/packages/charade/big5prober.py -requests/packages/charade/chardistribution.py -requests/packages/charade/charsetgroupprober.py -requests/packages/charade/charsetprober.py -requests/packages/charade/codingstatemachine.py -requests/packages/charade/compat.py -requests/packages/charade/constants.py -requests/packages/charade/cp949prober.py -requests/packages/charade/escprober.py -requests/packages/charade/escsm.py -requests/packages/charade/eucjpprober.py -requests/packages/charade/euckrfreq.py -requests/packages/charade/euckrprober.py -requests/packages/charade/euctwfreq.py -requests/packages/charade/euctwprober.py -requests/packages/charade/gb2312freq.py -requests/packages/charade/gb2312prober.py -requests/packages/charade/hebrewprober.py -requests/packages/charade/jisfreq.py -requests/packages/charade/jpcntx.py -requests/packages/charade/langbulgarianmodel.py -requests/packages/charade/langcyrillicmodel.py -requests/packages/charade/langgreekmodel.py -requests/packages/charade/langhebrewmodel.py -requests/packages/charade/langhungarianmodel.py -requests/packages/charade/langthaimodel.py -requests/packages/charade/latin1prober.py -requests/packages/charade/mbcharsetprober.py -requests/packages/charade/mbcsgroupprober.py -requests/packages/charade/mbcssm.py -requests/packages/charade/sbcharsetprober.py -requests/packages/charade/sbcsgroupprober.py -requests/packages/charade/sjisprober.py -requests/packages/charade/universaldetector.py -requests/packages/charade/utf8prober.py -requests/packages/urllib3/__init__.py -requests/packages/urllib3/_collections.py -requests/packages/urllib3/connection.py -requests/packages/urllib3/connectionpool.py -requests/packages/urllib3/exceptions.py -requests/packages/urllib3/fields.py -requests/packages/urllib3/filepost.py -requests/packages/urllib3/poolmanager.py -requests/packages/urllib3/request.py -requests/packages/urllib3/response.py -requests/packages/urllib3/util.py -requests/packages/urllib3/contrib/__init__.py -requests/packages/urllib3/contrib/ntlmpool.py -requests/packages/urllib3/contrib/pyopenssl.py -requests/packages/urllib3/packages/__init__.py -requests/packages/urllib3/packages/ordered_dict.py -requests/packages/urllib3/packages/six.py -requests/packages/urllib3/packages/ssl_match_hostname/__init__.py \ No newline at end of file diff --git a/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/dependency_links.txt b/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/dependency_links.txt deleted file mode 100644 index 8b137891791..00000000000 --- a/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/installed-files.txt b/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/installed-files.txt deleted file mode 100644 index 68458c534f9..00000000000 --- a/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/installed-files.txt +++ /dev/null @@ -1,149 +0,0 @@ -../requests/__init__.py -../requests/adapters.py -../requests/api.py -../requests/auth.py -../requests/certs.py -../requests/compat.py -../requests/cookies.py -../requests/exceptions.py -../requests/hooks.py -../requests/models.py -../requests/sessions.py -../requests/status_codes.py -../requests/structures.py -../requests/utils.py -../requests/packages/__init__.py -../requests/packages/charade/__init__.py -../requests/packages/charade/__main__.py -../requests/packages/charade/big5freq.py -../requests/packages/charade/big5prober.py -../requests/packages/charade/chardistribution.py -../requests/packages/charade/charsetgroupprober.py -../requests/packages/charade/charsetprober.py -../requests/packages/charade/codingstatemachine.py -../requests/packages/charade/compat.py -../requests/packages/charade/constants.py -../requests/packages/charade/cp949prober.py -../requests/packages/charade/escprober.py -../requests/packages/charade/escsm.py -../requests/packages/charade/eucjpprober.py -../requests/packages/charade/euckrfreq.py -../requests/packages/charade/euckrprober.py -../requests/packages/charade/euctwfreq.py -../requests/packages/charade/euctwprober.py -../requests/packages/charade/gb2312freq.py -../requests/packages/charade/gb2312prober.py -../requests/packages/charade/hebrewprober.py -../requests/packages/charade/jisfreq.py -../requests/packages/charade/jpcntx.py -../requests/packages/charade/langbulgarianmodel.py -../requests/packages/charade/langcyrillicmodel.py -../requests/packages/charade/langgreekmodel.py -../requests/packages/charade/langhebrewmodel.py -../requests/packages/charade/langhungarianmodel.py -../requests/packages/charade/langthaimodel.py -../requests/packages/charade/latin1prober.py -../requests/packages/charade/mbcharsetprober.py -../requests/packages/charade/mbcsgroupprober.py -../requests/packages/charade/mbcssm.py -../requests/packages/charade/sbcharsetprober.py -../requests/packages/charade/sbcsgroupprober.py -../requests/packages/charade/sjisprober.py -../requests/packages/charade/universaldetector.py -../requests/packages/charade/utf8prober.py -../requests/packages/urllib3/__init__.py -../requests/packages/urllib3/_collections.py -../requests/packages/urllib3/connection.py -../requests/packages/urllib3/connectionpool.py -../requests/packages/urllib3/exceptions.py -../requests/packages/urllib3/fields.py -../requests/packages/urllib3/filepost.py -../requests/packages/urllib3/poolmanager.py -../requests/packages/urllib3/request.py -../requests/packages/urllib3/response.py -../requests/packages/urllib3/util.py -../requests/packages/urllib3/packages/__init__.py -../requests/packages/urllib3/packages/ordered_dict.py -../requests/packages/urllib3/packages/six.py -../requests/packages/urllib3/contrib/__init__.py -../requests/packages/urllib3/contrib/ntlmpool.py -../requests/packages/urllib3/contrib/pyopenssl.py -../requests/packages/urllib3/packages/ssl_match_hostname/__init__.py -../requests/cacert.pem -../requests/__init__.pyc -../requests/adapters.pyc -../requests/api.pyc -../requests/auth.pyc -../requests/certs.pyc -../requests/compat.pyc -../requests/cookies.pyc -../requests/exceptions.pyc -../requests/hooks.pyc -../requests/models.pyc -../requests/sessions.pyc -../requests/status_codes.pyc -../requests/structures.pyc -../requests/utils.pyc -../requests/packages/__init__.pyc -../requests/packages/charade/__init__.pyc -../requests/packages/charade/__main__.pyc -../requests/packages/charade/big5freq.pyc -../requests/packages/charade/big5prober.pyc -../requests/packages/charade/chardistribution.pyc -../requests/packages/charade/charsetgroupprober.pyc -../requests/packages/charade/charsetprober.pyc -../requests/packages/charade/codingstatemachine.pyc -../requests/packages/charade/compat.pyc -../requests/packages/charade/constants.pyc -../requests/packages/charade/cp949prober.pyc -../requests/packages/charade/escprober.pyc -../requests/packages/charade/escsm.pyc -../requests/packages/charade/eucjpprober.pyc -../requests/packages/charade/euckrfreq.pyc -../requests/packages/charade/euckrprober.pyc -../requests/packages/charade/euctwfreq.pyc -../requests/packages/charade/euctwprober.pyc -../requests/packages/charade/gb2312freq.pyc -../requests/packages/charade/gb2312prober.pyc -../requests/packages/charade/hebrewprober.pyc -../requests/packages/charade/jisfreq.pyc -../requests/packages/charade/jpcntx.pyc -../requests/packages/charade/langbulgarianmodel.pyc -../requests/packages/charade/langcyrillicmodel.pyc -../requests/packages/charade/langgreekmodel.pyc -../requests/packages/charade/langhebrewmodel.pyc -../requests/packages/charade/langhungarianmodel.pyc -../requests/packages/charade/langthaimodel.pyc -../requests/packages/charade/latin1prober.pyc -../requests/packages/charade/mbcharsetprober.pyc -../requests/packages/charade/mbcsgroupprober.pyc -../requests/packages/charade/mbcssm.pyc -../requests/packages/charade/sbcharsetprober.pyc -../requests/packages/charade/sbcsgroupprober.pyc -../requests/packages/charade/sjisprober.pyc -../requests/packages/charade/universaldetector.pyc -../requests/packages/charade/utf8prober.pyc -../requests/packages/urllib3/__init__.pyc -../requests/packages/urllib3/_collections.pyc -../requests/packages/urllib3/connection.pyc -../requests/packages/urllib3/connectionpool.pyc -../requests/packages/urllib3/exceptions.pyc -../requests/packages/urllib3/fields.pyc -../requests/packages/urllib3/filepost.pyc -../requests/packages/urllib3/poolmanager.pyc -../requests/packages/urllib3/request.pyc -../requests/packages/urllib3/response.pyc -../requests/packages/urllib3/util.pyc -../requests/packages/urllib3/packages/__init__.pyc -../requests/packages/urllib3/packages/ordered_dict.pyc -../requests/packages/urllib3/packages/six.pyc -../requests/packages/urllib3/contrib/__init__.pyc -../requests/packages/urllib3/contrib/ntlmpool.pyc -../requests/packages/urllib3/contrib/pyopenssl.pyc -../requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc -./ -dependency_links.txt -not-zip-safe -PKG-INFO -SOURCES.txt -top_level.txt diff --git a/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/not-zip-safe b/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/not-zip-safe deleted file mode 100644 index 8b137891791..00000000000 --- a/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/not-zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/top_level.txt b/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/top_level.txt deleted file mode 100644 index f2293605cf1..00000000000 --- a/vendor-local/lib/python/requests-2.0.1-py2.7.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -requests diff --git a/vendor-local/lib/python/requests/__init__.py b/vendor-local/lib/python/requests/__init__.py deleted file mode 100644 index 793ac22aab8..00000000000 --- a/vendor-local/lib/python/requests/__init__.py +++ /dev/null @@ -1,77 +0,0 @@ -# -*- coding: utf-8 -*- - -# __ -# /__) _ _ _ _ _/ _ -# / ( (- (/ (/ (- _) / _) -# / - -""" -requests HTTP library -~~~~~~~~~~~~~~~~~~~~~ - -Requests is an HTTP library, written in Python, for human beings. Basic GET -usage: - - >>> import requests - >>> r = requests.get('http://python.org') - >>> r.status_code - 200 - >>> 'Python is a programming language' in r.content - True - -... or POST: - - >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post("http://httpbin.org/post", data=payload) - >>> print(r.text) - { - ... - "form": { - "key2": "value2", - "key1": "value1" - }, - ... - } - -The other HTTP methods are supported - see `requests.api`. Full documentation -is at <http://python-requests.org>. - -:copyright: (c) 2013 by Kenneth Reitz. -:license: Apache 2.0, see LICENSE for more details. - -""" - -__title__ = 'requests' -__version__ = '2.0.1' -__build__ = 0x020001 -__author__ = 'Kenneth Reitz' -__license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2013 Kenneth Reitz' - -# Attempt to enable urllib3's SNI support, if possible -try: - from .packages.urllib3.contrib import pyopenssl - pyopenssl.inject_into_urllib3() -except ImportError: - pass - -from . import utils -from .models import Request, Response, PreparedRequest -from .api import request, get, head, post, patch, put, delete, options -from .sessions import session, Session -from .status_codes import codes -from .exceptions import ( - RequestException, Timeout, URLRequired, - TooManyRedirects, HTTPError, ConnectionError -) - -# Set default logging handler to avoid "No handler found" warnings. -import logging -try: # Python 2.7+ - from logging import NullHandler -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass - -logging.getLogger(__name__).addHandler(NullHandler()) diff --git a/vendor-local/lib/python/requests/adapters.py b/vendor-local/lib/python/requests/adapters.py deleted file mode 100644 index 0adca690cde..00000000000 --- a/vendor-local/lib/python/requests/adapters.py +++ /dev/null @@ -1,374 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.adapters -~~~~~~~~~~~~~~~~~ - -This module contains the transport adapters that Requests uses to define -and maintain connections. -""" - -import socket - -from .models import Response -from .packages.urllib3.poolmanager import PoolManager, proxy_from_url -from .packages.urllib3.response import HTTPResponse -from .packages.urllib3.util import Timeout as TimeoutSauce -from .compat import urlparse, basestring, urldefrag, unquote -from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, - except_on_missing_scheme, get_auth_from_url) -from .structures import CaseInsensitiveDict -from .packages.urllib3.exceptions import MaxRetryError -from .packages.urllib3.exceptions import TimeoutError -from .packages.urllib3.exceptions import SSLError as _SSLError -from .packages.urllib3.exceptions import HTTPError as _HTTPError -from .packages.urllib3.exceptions import ProxyError as _ProxyError -from .cookies import extract_cookies_to_jar -from .exceptions import ConnectionError, Timeout, SSLError, ProxyError -from .auth import _basic_auth_str - -DEFAULT_POOLBLOCK = False -DEFAULT_POOLSIZE = 10 -DEFAULT_RETRIES = 0 - - -class BaseAdapter(object): - """The Base Transport Adapter""" - - def __init__(self): - super(BaseAdapter, self).__init__() - - def send(self): - raise NotImplementedError - - def close(self): - raise NotImplementedError - - -class HTTPAdapter(BaseAdapter): - """The built-in HTTP Adapter for urllib3. - - Provides a general-case interface for Requests sessions to contact HTTP and - HTTPS urls by implementing the Transport Adapter interface. This class will - usually be created by the :class:`Session <Session>` class under the - covers. - - :param pool_connections: The number of urllib3 connection pools to cache. - :param pool_maxsize: The maximum number of connections to save in the pool. - :param max_retries: The maximum number of retries each connection should attempt. - :param pool_block: Whether the connection pool should block for connections. - - Usage:: - - >>> import requests - >>> s = requests.Session() - >>> a = requests.adapters.HTTPAdapter() - >>> s.mount('http://', a) - """ - __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', - '_pool_block'] - - def __init__(self, pool_connections=DEFAULT_POOLSIZE, - pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, - pool_block=DEFAULT_POOLBLOCK): - self.max_retries = max_retries - self.config = {} - self.proxy_manager = {} - - super(HTTPAdapter, self).__init__() - - self._pool_connections = pool_connections - self._pool_maxsize = pool_maxsize - self._pool_block = pool_block - - self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) - - def __getstate__(self): - return dict((attr, getattr(self, attr, None)) for attr in - self.__attrs__) - - def __setstate__(self, state): - for attr, value in state.items(): - setattr(self, attr, value) - - self.init_poolmanager(self._pool_connections, self._pool_maxsize, - block=self._pool_block) - - def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK): - """Initializes a urllib3 PoolManager. This method should not be called - from user code, and is only exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param connections: The number of urllib3 connection pools to cache. - :param maxsize: The maximum number of connections to save in the pool. - :param block: Block when no free connections are available. - """ - # save these values for pickling - self._pool_connections = connections - self._pool_maxsize = maxsize - self._pool_block = block - - self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, - block=block) - - def cert_verify(self, conn, url, verify, cert): - """Verify a SSL certificate. This method should not be called from user - code, and is only exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param conn: The urllib3 connection object associated with the cert. - :param url: The requested URL. - :param verify: Whether we should actually verify the certificate. - :param cert: The SSL certificate to verify. - """ - if url.lower().startswith('https') and verify: - - cert_loc = None - - # Allow self-specified cert location. - if verify is not True: - cert_loc = verify - - if not cert_loc: - cert_loc = DEFAULT_CA_BUNDLE_PATH - - if not cert_loc: - raise Exception("Could not find a suitable SSL CA certificate bundle.") - - conn.cert_reqs = 'CERT_REQUIRED' - conn.ca_certs = cert_loc - else: - conn.cert_reqs = 'CERT_NONE' - conn.ca_certs = None - - if cert: - if not isinstance(cert, basestring): - conn.cert_file = cert[0] - conn.key_file = cert[1] - else: - conn.cert_file = cert - - def build_response(self, req, resp): - """Builds a :class:`Response <requests.Response>` object from a urllib3 - response. This should not be called from user code, and is only exposed - for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>` - - :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response. - :param resp: The urllib3 response object. - """ - response = Response() - - # Fallback to None if there's no status_code, for whatever reason. - response.status_code = getattr(resp, 'status', None) - - # Make headers case-insensitive. - response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) - - # Set encoding. - response.encoding = get_encoding_from_headers(response.headers) - response.raw = resp - response.reason = response.raw.reason - - if isinstance(req.url, bytes): - response.url = req.url.decode('utf-8') - else: - response.url = req.url - - # Add new cookies from the server. - extract_cookies_to_jar(response.cookies, req, resp) - - # Give the Response some context. - response.request = req - response.connection = self - - return response - - def get_connection(self, url, proxies=None): - """Returns a urllib3 connection for the given URL. This should not be - called from user code, and is only exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param url: The URL to connect to. - :param proxies: (optional) A Requests-style dictionary of proxies used on this request. - """ - proxies = proxies or {} - proxy = proxies.get(urlparse(url.lower()).scheme) - - if proxy: - except_on_missing_scheme(proxy) - proxy_headers = self.proxy_headers(proxy) - - if not proxy in self.proxy_manager: - self.proxy_manager[proxy] = proxy_from_url( - proxy, - proxy_headers=proxy_headers) - - conn = self.proxy_manager[proxy].connection_from_url(url) - else: - conn = self.poolmanager.connection_from_url(url.lower()) - - return conn - - def close(self): - """Disposes of any internal state. - - Currently, this just closes the PoolManager, which closes pooled - connections. - """ - self.poolmanager.clear() - - def request_url(self, request, proxies): - """Obtain the url to use when making the final request. - - If the message is being sent through a HTTP proxy, the full URL has to - be used. Otherwise, we should only use the path portion of the URL. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param proxies: A dictionary of schemes to proxy URLs. - """ - proxies = proxies or {} - scheme = urlparse(request.url).scheme.lower() - proxy = proxies.get(scheme) - - if proxy and scheme != 'https': - url, _ = urldefrag(request.url) - else: - url = request.path_url - - return url - - def add_headers(self, request, **kwargs): - """Add any headers needed by the connection. As of v2.0 this does - nothing by default, but is left for overriding by users that subclass - the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to. - :param kwargs: The keyword arguments from the call to send(). - """ - pass - - def proxy_headers(self, proxy): - """Returns a dictionary of the headers to add to any request sent - through a proxy. This works with urllib3 magic to ensure that they are - correctly sent to the proxy, rather than in a tunnelled request if - CONNECT is being used. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param proxies: The url of the proxy being used for this request. - :param kwargs: Optional additional keyword arguments. - """ - headers = {} - username, password = get_auth_from_url(proxy) - - if username and password: - # Proxy auth usernames and passwords will be urlencoded, we need - # to decode them. - username = unquote(username) - password = unquote(password) - headers['Proxy-Authorization'] = _basic_auth_str(username, - password) - - return headers - - def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) The timeout on the request. - :param verify: (optional) Whether to verify SSL certificates. - :param vert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - """ - - conn = self.get_connection(request.url, proxies) - - self.cert_verify(conn, request.url, verify, cert) - url = self.request_url(request, proxies) - self.add_headers(request) - - chunked = not (request.body is None or 'Content-Length' in request.headers) - - if stream: - timeout = TimeoutSauce(connect=timeout) - else: - timeout = TimeoutSauce(connect=timeout, read=timeout) - - try: - if not chunked: - resp = conn.urlopen( - method=request.method, - url=url, - body=request.body, - headers=request.headers, - redirect=False, - assert_same_host=False, - preload_content=False, - decode_content=False, - retries=self.max_retries, - timeout=timeout - ) - - # Send the request. - else: - if hasattr(conn, 'proxy_pool'): - conn = conn.proxy_pool - - low_conn = conn._get_conn(timeout=timeout) - low_conn.putrequest(request.method, url, skip_accept_encoding=True) - - for header, value in request.headers.items(): - low_conn.putheader(header, value) - - low_conn.endheaders() - - for i in request.body: - low_conn.send(hex(len(i))[2:].encode('utf-8')) - low_conn.send(b'\r\n') - low_conn.send(i) - low_conn.send(b'\r\n') - low_conn.send(b'0\r\n\r\n') - - r = low_conn.getresponse() - resp = HTTPResponse.from_httplib(r, - pool=conn, - connection=low_conn, - preload_content=False, - decode_content=False - ) - - except socket.error as sockerr: - raise ConnectionError(sockerr) - - except MaxRetryError as e: - raise ConnectionError(e) - - except _ProxyError as e: - raise ProxyError(e) - - except (_SSLError, _HTTPError) as e: - if isinstance(e, _SSLError): - raise SSLError(e) - elif isinstance(e, TimeoutError): - raise Timeout(e) - else: - raise - - r = self.build_response(request, resp) - - if not stream: - r.content - - return r diff --git a/vendor-local/lib/python/requests/api.py b/vendor-local/lib/python/requests/api.py deleted file mode 100644 index baf43dd6130..00000000000 --- a/vendor-local/lib/python/requests/api.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.api -~~~~~~~~~~~~ - -This module implements the Requests API. - -:copyright: (c) 2012 by Kenneth Reitz. -:license: Apache2, see LICENSE for more details. - -""" - -from . import sessions - - -def request(method, url, **kwargs): - """Constructs and sends a :class:`Request <Request>`. - Returns :class:`Response <Response>` object. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of 'name': file-like-objects (or {'name': ('filename', fileobj)}) for multipart encoding upload. - :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) Float describing the timeout of the request. - :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed. - :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. - :param stream: (optional) if ``False``, the response content will be immediately downloaded. - :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. - - Usage:: - - >>> import requests - >>> req = requests.request('GET', 'http://httpbin.org/get') - <Response [200]> - """ - - session = sessions.Session() - return session.request(method=method, url=url, **kwargs) - - -def get(url, **kwargs): - """Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', True) - return request('get', url, **kwargs) - - -def options(url, **kwargs): - """Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', True) - return request('options', url, **kwargs) - - -def head(url, **kwargs): - """Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', False) - return request('head', url, **kwargs) - - -def post(url, data=None, **kwargs): - """Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return request('post', url, data=data, **kwargs) - - -def put(url, data=None, **kwargs): - """Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return request('put', url, data=data, **kwargs) - - -def patch(url, data=None, **kwargs): - """Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return request('patch', url, data=data, **kwargs) - - -def delete(url, **kwargs): - """Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return request('delete', url, **kwargs) diff --git a/vendor-local/lib/python/requests/auth.py b/vendor-local/lib/python/requests/auth.py deleted file mode 100644 index 30529e296e6..00000000000 --- a/vendor-local/lib/python/requests/auth.py +++ /dev/null @@ -1,180 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.auth -~~~~~~~~~~~~~ - -This module contains the authentication handlers for Requests. -""" - -import os -import re -import time -import hashlib -import logging - -from base64 import b64encode - -from .compat import urlparse, str -from .utils import parse_dict_header - -log = logging.getLogger(__name__) - -CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' -CONTENT_TYPE_MULTI_PART = 'multipart/form-data' - - -def _basic_auth_str(username, password): - """Returns a Basic Auth string.""" - - return 'Basic ' + b64encode(('%s:%s' % (username, password)).encode('latin1')).strip().decode('latin1') - - -class AuthBase(object): - """Base class that all auth implementations derive from""" - - def __call__(self, r): - raise NotImplementedError('Auth hooks must be callable.') - - -class HTTPBasicAuth(AuthBase): - """Attaches HTTP Basic Authentication to the given Request object.""" - def __init__(self, username, password): - self.username = username - self.password = password - - def __call__(self, r): - r.headers['Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPProxyAuth(HTTPBasicAuth): - """Attaches HTTP Proxy Authentication to a given Request object.""" - def __call__(self, r): - r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPDigestAuth(AuthBase): - """Attaches HTTP Digest Authentication to the given Request object.""" - def __init__(self, username, password): - self.username = username - self.password = password - self.last_nonce = '' - self.nonce_count = 0 - self.chal = {} - - def build_digest_header(self, method, url): - - realm = self.chal['realm'] - nonce = self.chal['nonce'] - qop = self.chal.get('qop') - algorithm = self.chal.get('algorithm') - opaque = self.chal.get('opaque') - - if algorithm is None: - _algorithm = 'MD5' - else: - _algorithm = algorithm.upper() - # lambdas assume digest modules are imported at the top level - if _algorithm == 'MD5': - def md5_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.md5(x).hexdigest() - hash_utf8 = md5_utf8 - elif _algorithm == 'SHA': - def sha_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha1(x).hexdigest() - hash_utf8 = sha_utf8 - # XXX MD5-sess - KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) - - if hash_utf8 is None: - return None - - # XXX not implemented yet - entdig = None - p_parsed = urlparse(url) - path = p_parsed.path - if p_parsed.query: - path += '?' + p_parsed.query - - A1 = '%s:%s:%s' % (self.username, realm, self.password) - A2 = '%s:%s' % (method, path) - - if qop is None: - respdig = KD(hash_utf8(A1), "%s:%s" % (nonce, hash_utf8(A2))) - elif qop == 'auth' or 'auth' in qop.split(','): - if nonce == self.last_nonce: - self.nonce_count += 1 - else: - self.nonce_count = 1 - - ncvalue = '%08x' % self.nonce_count - s = str(self.nonce_count).encode('utf-8') - s += nonce.encode('utf-8') - s += time.ctime().encode('utf-8') - s += os.urandom(8) - - cnonce = (hashlib.sha1(s).hexdigest()[:16]) - noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, hash_utf8(A2)) - respdig = KD(hash_utf8(A1), noncebit) - else: - # XXX handle auth-int. - return None - - self.last_nonce = nonce - - # XXX should the partial digests be encoded too? - base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ - 'response="%s"' % (self.username, realm, nonce, path, respdig) - if opaque: - base += ', opaque="%s"' % opaque - if algorithm: - base += ', algorithm="%s"' % algorithm - if entdig: - base += ', digest="%s"' % entdig - if qop: - base += ', qop=auth, nc=%s, cnonce="%s"' % (ncvalue, cnonce) - - return 'Digest %s' % (base) - - def handle_401(self, r, **kwargs): - """Takes the given response and tries digest-auth, if needed.""" - - num_401_calls = getattr(self, 'num_401_calls', 1) - s_auth = r.headers.get('www-authenticate', '') - - if 'digest' in s_auth.lower() and num_401_calls < 2: - - setattr(self, 'num_401_calls', num_401_calls + 1) - pat = re.compile(r'digest ', flags=re.IGNORECASE) - self.chal = parse_dict_header(pat.sub('', s_auth, count=1)) - - # Consume content and release the original connection - # to allow our new request to reuse the same one. - r.content - r.raw.release_conn() - prep = r.request.copy() - prep.prepare_cookies(r.cookies) - - prep.headers['Authorization'] = self.build_digest_header( - prep.method, prep.url) - _r = r.connection.send(prep, **kwargs) - _r.history.append(r) - _r.request = prep - - return _r - - setattr(self, 'num_401_calls', 1) - return r - - def __call__(self, r): - # If we have a saved nonce, skip the 401 - if self.last_nonce: - r.headers['Authorization'] = self.build_digest_header(r.method, r.url) - r.register_hook('response', self.handle_401) - return r diff --git a/vendor-local/lib/python/requests/cacert.pem b/vendor-local/lib/python/requests/cacert.pem deleted file mode 100644 index e908bb6a117..00000000000 --- a/vendor-local/lib/python/requests/cacert.pem +++ /dev/null @@ -1,4966 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Label: "GTE CyberTrust Global Root" -# Serial: 421 -# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db -# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 -# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Server CA" -# Serial: 1 -# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d -# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c -# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Premium Server CA" -# Serial: 1 -# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a -# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a -# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -# Issuer: O=Equifax OU=Equifax Secure Certificate Authority -# Subject: O=Equifax OU=Equifax Secure Certificate Authority -# Label: "Equifax Secure CA" -# Serial: 903804111 -# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 -# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a -# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 149843929435818692848040365716851702463 -# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 -# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 -# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Label: "Verisign Class 3 Public Primary Certification Authority - G2" -# Serial: 167285380242319648451154478808036881606 -# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 -# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f -# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Label: "ValiCert Class 1 VA" -# Serial: 1 -# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb -# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e -# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Label: "ValiCert Class 2 VA" -# Serial: 1 -# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 -# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 -# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Label: "RSA Root Certificate 1" -# Serial: 1 -# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 -# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb -# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 4 Public Primary Certification Authority - G3" -# Serial: 314531972711909413743075096039378935511 -# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df -# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d -# SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 -GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ -+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd -U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm -NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ -ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 -CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq -g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c -2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ -bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Secure Server CA" -# Serial: 927650371 -# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee -# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 -# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure Global eBusiness CA" -# Serial: 1 -# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc -# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 -# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure eBusiness CA 1" -# Serial: 4 -# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d -# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 -# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network -# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network -# Label: "AddTrust Low-Value Services Root" -# Serial: 1 -# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc -# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d -# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7 ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw -MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD -VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul -CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n -tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl -dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch -PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC -+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O -BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl -MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X -7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz -43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl -pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA -WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network -# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network -# Label: "AddTrust Public Services Root" -# Serial: 1 -# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f -# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5 -# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx -MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB -ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV -BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV -6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX -GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP -dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH -1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF -62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW -BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv -b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 -IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ -iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh -4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm -XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network -# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network -# Label: "AddTrust Qualified Certificates Root" -# Serial: 1 -# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb -# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf -# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16 ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 -MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK -EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh -BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq -xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G -87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i -2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U -WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 -0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G -A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr -pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm -aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv -hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm -hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 -P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y -iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no -xqE= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: O=RSA Security Inc OU=RSA Security 2048 V3 -# Subject: O=RSA Security Inc OU=RSA Security 2048 V3 -# Label: "RSA Security 2048 v3" -# Serial: 13297492616345471454730593562152402946 -# MD5 Fingerprint: 77:0d:19:b1:21:fd:00:42:9c:3e:0c:a5:dd:0b:02:8e -# SHA1 Fingerprint: 25:01:90:19:cf:fb:d9:99:1c:b7:68:25:74:8d:94:5f:30:93:95:42 -# SHA256 Fingerprint: af:8b:67:62:a1:e5:28:22:81:61:a9:5d:5c:55:9e:e2:66:27:8f:75:d7:9e:83:01:89:a5:03:50:6a:bd:6b:4c ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp -dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy -MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp -eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg -/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl -wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh -AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 -PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu -AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR -MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc -HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ -Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO -rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch -6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 -7CAFYd4= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Global CA 2" -# Serial: 1 -# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9 -# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d -# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85 ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs -IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg -R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A -PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 -Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL -TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL -5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 -S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe -2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap -EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td -EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv -/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN -A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 -abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF -I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz -4iIprn2DQKi6bA== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc. -# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc. -# Label: "America Online Root Certification Authority 1" -# Serial: 1 -# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e -# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a -# SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3 ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk -hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym -1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW -OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb -2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko -O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU -AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb -LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir -oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C -MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc. -# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc. -# Label: "America Online Root Certification Authority 2" -# Serial: 1 -# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf -# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84 -# SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC -206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci -KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 -JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 -BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e -Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B -PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 -Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq -Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 -+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj -FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn -xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 -LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc -obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 -CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe -IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA -DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F -AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX -Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb -AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl -Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw -RY8mkaKO/qk= ------END CERTIFICATE----- - -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -# Issuer: CN=Certum CA O=Unizeto Sp. z o.o. -# Subject: CN=Certum CA O=Unizeto Sp. z o.o. -# Label: "Certum Root CA" -# Serial: 65568 -# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9 -# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18 -# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24 ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E -jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo -ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI -ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu -Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg -AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 -HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA -uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa -TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg -xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q -CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs -6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=Secure Certificate Services O=Comodo CA Limited -# Subject: CN=Secure Certificate Services O=Comodo CA Limited -# Label: "Comodo Secure Services root" -# Serial: 1 -# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd -# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1 -# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8 ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp -ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow -fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV -BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM -cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S -HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 -CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk -3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz -6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV -HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw -Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww -DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 -5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI -gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ -aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl -izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= ------END CERTIFICATE----- - -# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited -# Subject: CN=Trusted Certificate Services O=Comodo CA Limited -# Label: "Comodo Trusted Services root" -# Serial: 1 -# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27 -# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd -# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 -aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla -MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO -BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD -VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW -fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt -TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL -fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW -1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 -kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G -A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo -dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu -Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ -HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS -jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ -xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn -dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA" -# Serial: 10000010 -# MD5 Fingerprint: 60:84:7c:5a:ce:db:0c:d4:cb:a7:e9:fe:02:c6:a9:c0 -# SHA1 Fingerprint: 10:1d:fa:3f:d5:0b:cb:bb:9b:b5:60:0c:19:55:a4:1a:f4:73:3a:04 -# SHA256 Fingerprint: d4:1d:82:9e:8c:16:59:82:2a:f9:3f:ce:62:bf:fc:de:26:4f:c8:4e:8b:95:0c:5f:f2:75:d0:52:35:46:95:a3 ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO -TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy -MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk -ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn -ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 -9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO -hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U -tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o -BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh -SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww -OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv -cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA -7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k -/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm -eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 -u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy -7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -# Issuer: O=TDC Internet OU=TDC Internet Root CA -# Subject: O=TDC Internet OU=TDC Internet Root CA -# Label: "TDC Internet Root CA" -# Serial: 986490188 -# MD5 Fingerprint: 91:f4:03:55:20:a1:f8:63:2c:62:de:ac:fb:61:1c:8e -# SHA1 Fingerprint: 21:fc:bd:8e:7f:6c:af:05:1b:d1:b3:43:ec:a8:e7:61:47:f2:0f:8a -# SHA256 Fingerprint: 48:98:c6:88:8c:0c:ff:b0:d3:e3:1a:ca:8a:37:d4:e3:51:5f:f7:46:d0:26:35:d8:66:46:cf:a0:a3:18:5a:e7 ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE -SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg -Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV -BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl -cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA -vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu -Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a -0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 -4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN -eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD -R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG -A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu -dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME -Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 -WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ -KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO -Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX -wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 -9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 -jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 -aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - -# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com -# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com -# Label: "UTN DATACorp SGC Root CA" -# Serial: 91374294542884689855167577680241077609 -# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06 -# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4 -# SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48 ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB -kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw -IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG -EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu -dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 -E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ -D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK -4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq -lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW -bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB -o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js -LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr -BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB -AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj -j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH -KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv -2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 -mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com -# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com -# Label: "UTN USERFirst Hardware Root CA" -# Serial: 91374294542884704022267039221184531197 -# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39 -# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7 -# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37 ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Chambers of Commerce Root" -# Serial: 0 -# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 -# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 -# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Global Chambersign Root" -# Serial: 0 -# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 -# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 -# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Notary (Class A) Root" -# Serial: 259 -# MD5 Fingerprint: 86:38:6d:5e:49:63:6c:85:5c:db:6d:dc:94:b7:d0:f7 -# SHA1 Fingerprint: ac:ed:5f:65:53:fd:25:ce:01:5f:1f:7a:48:3b:6a:74:9f:61:78:c6 -# SHA256 Fingerprint: 7f:12:cd:5f:7e:5e:29:0e:c7:d8:51:79:d5:b7:2c:20:a5:be:75:08:ff:db:5b:f8:1a:b9:68:4a:7f:c9:f6:67 ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV -MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe -TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 -dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 -N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC -dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu -MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL -b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD -zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi -3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 -WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY -Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi -NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC -ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 -QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 -YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz -aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm -ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg -ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs -amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv -IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 -Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 -ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 -YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg -dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs -b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G -CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO -xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP -0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ -QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk -f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK -8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI ------END CERTIFICATE----- - -# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Business (Class B) Root" -# Serial: 105 -# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 -# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af -# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Express (Class C) Root" -# Serial: 104 -# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 -# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b -# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Label: "StartCom Certification Authority" -# Serial: 1 -# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 -# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f -# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js -LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM -BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy -dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh -cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh -YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg -dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp -bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ -YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ -9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 -jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW -FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz -ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 -ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L -EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu -L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC -O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V -um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh -NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Firmaprofesional Root CA" -# Serial: 1 -# MD5 Fingerprint: 11:92:79:40:3c:b1:83:40:e5:ab:66:4a:67:92:80:df -# SHA1 Fingerprint: a9:62:8f:4b:98:a9:1b:48:35:ba:d2:c1:46:32:86:bb:66:64:6a:8c -# SHA256 Fingerprint: c1:cf:0b:52:09:64:35:e3:f1:b7:1d:aa:ec:45:5a:23:11:c8:40:4f:55:83:a9:e2:13:c6:9d:85:7d:94:33:05 ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx -IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w -HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx -IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u -Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY -rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z -hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay -BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL -iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb -AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv -bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 -MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E -FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n -VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m -hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl -ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp -QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 -quGnM/b9Sh/22WA= ------END CERTIFICATE----- - -# Issuer: CN=Wells Fargo Root Certificate Authority O=Wells Fargo OU=Wells Fargo Certification Authority -# Subject: CN=Wells Fargo Root Certificate Authority O=Wells Fargo OU=Wells Fargo Certification Authority -# Label: "Wells Fargo Root CA" -# Serial: 971282334 -# MD5 Fingerprint: 20:0b:4a:7a:88:a7:a9:42:86:8a:5f:74:56:7b:88:05 -# SHA1 Fingerprint: 93:e6:ab:22:03:03:b5:23:28:dc:da:56:9e:ba:e4:d1:d1:cc:fb:65 -# SHA256 Fingerprint: 03:45:8b:6a:be:ec:c2:14:95:3d:97:14:9a:f4:53:91:69:1d:e9:f9:cd:cc:26:47:86:3a:3d:67:c9:5c:24:3b ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 -MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww -KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G -A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 -5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE -SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O -JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu -ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE -AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB -AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB -CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw -b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo -7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ -0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 -nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ -33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- - -# Issuer: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services -# Subject: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services -# Label: "Swisscom Root CA 1" -# Serial: 122348795730808398873664200247279986742 -# MD5 Fingerprint: f8:38:7c:77:88:df:2c:16:68:2e:c2:e2:52:4b:b8:f9 -# SHA1 Fingerprint: 5f:3a:fc:0a:8b:64:f6:86:67:34:74:df:7e:a9:a2:fe:f9:fa:7a:51 -# SHA256 Fingerprint: 21:db:20:12:36:60:bb:2e:d4:18:20:5d:a1:1e:e7:a8:5a:65:e2:bc:6e:55:b5:af:7e:78:99:c8:a2:66:d9:2e ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk -MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 -YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg -Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT -AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp -Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 -m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih -FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ -TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F -EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco -kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu -HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF -vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo -19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC -L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW -bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX -JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw -FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc -K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf -ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik -Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB -sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e -3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR -ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip -mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH -b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf -rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms -hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y -zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 -MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Label: "DST ACES CA X6" -# Serial: 17771143917277623872238992636097467865 -# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 -# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d -# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- - -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Label: "TURKTRUST Certificate Services Provider Root 1" -# Serial: 1 -# MD5 Fingerprint: f1:6a:22:18:c9:cd:df:ce:82:1d:1d:b7:78:5c:a9:a5 -# SHA1 Fingerprint: 79:98:a3:08:e1:4d:65:85:e6:c2:1e:15:3a:71:9f:ba:5a:d3:4a:d9 -# SHA256 Fingerprint: 44:04:e3:3b:5e:14:0d:cf:99:80:51:fd:fc:80:28:c7:c8:16:15:c5:ee:73:7b:11:1b:58:82:33:a9:b5:35:a0 ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg -MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz -MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy -dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD -VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg -xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu -xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 -XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k -heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J -YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C -urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 -JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 -b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV -9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 -kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh -fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA -aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS -RGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005 -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005 -# Label: "TURKTRUST Certificate Services Provider Root 2" -# Serial: 1 -# MD5 Fingerprint: 37:a5:6e:d4:b1:25:84:97:b7:fd:56:15:7a:f9:a2:00 -# SHA1 Fingerprint: b4:35:d4:e1:11:9d:1c:66:90:a7:49:eb:b3:94:bd:63:7b:a7:82:b7 -# SHA256 Fingerprint: c4:70:cf:54:7e:23:02:b9:77:fb:29:dd:71:a8:9a:7b:6c:1f:60:77:7b:03:29:f5:60:17:f3:28:bf:4f:6b:e6 ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 -WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv -bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU -UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw -bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe -LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef -J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh -R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ -Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX -JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p -zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S -Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ -KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq -ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz -gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH -uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS -y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA -# Subject: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA -# Label: "WellsSecure Public Root Certificate Authority" -# Serial: 1 -# MD5 Fingerprint: 15:ac:a5:c2:92:2d:79:bc:e8:7f:cb:67:ed:02:cf:36 -# SHA1 Fingerprint: e7:b4:f6:9d:61:ec:90:69:db:7e:90:a7:40:1a:3c:f4:7d:4f:e8:ee -# SHA256 Fingerprint: a7:12:72:ae:aa:a3:cf:e8:72:7f:7f:b3:9f:0f:b3:d1:e5:42:6e:90:60:b0:6e:e6:f1:3e:9a:3c:58:33:cd:43 ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx -IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs -cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 -MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl -bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD -DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r -WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU -Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs -HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj -z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf -SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl -AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG -KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P -AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j -BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC -VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX -ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB -ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd -/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB -A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn -k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 -iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv -2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=IGC/A O=PM/SGDN OU=DCSSI -# Subject: CN=IGC/A O=PM/SGDN OU=DCSSI -# Label: "IGC/A" -# Serial: 245102874772 -# MD5 Fingerprint: 0c:7f:dd:6a:f4:2a:b9:c8:9b:bd:20:7e:a9:db:5c:37 -# SHA1 Fingerprint: 60:d6:89:74:b5:c2:65:9e:8a:0f:c1:88:7c:88:d2:46:69:1b:18:2c -# SHA256 Fingerprint: b9:be:a7:86:0a:96:2e:a3:61:1d:ab:97:ab:6d:a3:e2:1c:10:68:b9:7d:55:57:5e:d0:e1:12:79:c1:1c:89:32 ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT -AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ -TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG -9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw -MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM -BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO -MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 -LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI -s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 -xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 -u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b -F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx -Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd -PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV -HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx -NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF -AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ -L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY -YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a -NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R -0982gaEbeC9xs/FZTEYYKKuF0mBWWg== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Label: "Security Communication EV RootCA1" -# Serial: 0 -# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 -# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d -# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz -MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N -IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 -bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE -RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO -zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 -bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF -MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 -VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC -OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW -tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ -q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb -EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ -Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O -VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA -# Subject: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA -# Label: "Microsec e-Szigno Root CA" -# Serial: 272122594155480254301341951808045322001 -# MD5 Fingerprint: f0:96:b6:2f:c5:10:d5:67:8e:83:25:32:e8:5e:2e:e5 -# SHA1 Fingerprint: 23:88:c9:d3:71:cc:9e:96:3d:ff:7d:3c:a7:ce:fc:d6:25:ec:19:0d -# SHA256 Fingerprint: 32:7a:3d:76:1a:ba:de:a0:34:eb:99:84:06:27:5c:b1:a4:77:6e:fd:ae:2f:df:6d:01:68:ea:1c:4f:55:67:d0 ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw -cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy -b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z -ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 -NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN -TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p -Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u -uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ -LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA -vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 -Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx -62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB -AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw -LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP -BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB -AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov -MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 -ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT -AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh -ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo -AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa -AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln -bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p -Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP -PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv -Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB -EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu -w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj -cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV -HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI -VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS -BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS -b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS -8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds -ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl -7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR -hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ -MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A. -# Subject: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A. -# Label: "AC Ra\xC3\xADz Certic\xC3\xA1mara S.A." -# Serial: 38908203973182606954752843738508300 -# MD5 Fingerprint: 93:2a:3e:f6:fd:23:69:0d:71:20:d4:2b:47:99:2b:a6 -# SHA1 Fingerprint: cb:a1:c5:f8:b0:e3:5e:b8:b9:45:12:d3:f9:34:a2:e9:06:10:d3:36 -# SHA256 Fingerprint: a6:c5:1e:0d:a5:ca:0a:93:09:d2:e4:c0:e4:0c:2a:f9:10:7a:ae:82:03:85:7f:e1:98:e3:e7:69:e3:43:08:5c ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx -CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp -ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa -QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw -NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft -ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu -QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG -qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL -fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ -Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 -Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ -54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b -MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j -ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej -YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt -A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF -rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ -pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB -lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy -YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 -7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs -YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 -xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc -unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ -Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp -ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 -gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 -jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ -XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD -W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ -RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r -MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk -BYn8eNZcLCZDqQ== ------END CERTIFICATE----- - -# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA -# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA -# Label: "TC TrustCenter Class 2 CA II" -# Serial: 941389028203453866782103406992443 -# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23 -# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e -# SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4 ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV -BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 -Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 -OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i -SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc -VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf -tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg -uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J -XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK -8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 -5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 -kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 -Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz -JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 -Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS -GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt -ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 -au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV -hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI -dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== ------END CERTIFICATE----- - -# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA -# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA -# Label: "TC TrustCenter Class 3 CA II" -# Serial: 1506523511417715638772220530020799 -# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e -# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5 -# SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV -BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 -Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 -OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i -SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc -VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW -Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q -Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 -1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq -ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 -Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX -XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 -Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz -JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 -Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN -irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 -TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 -g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB -95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj -S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== ------END CERTIFICATE----- - -# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA -# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA -# Label: "TC TrustCenter Universal CA I" -# Serial: 601024842042189035295619584734726 -# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c -# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3 -# SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV -BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 -c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx -MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg -R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD -VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR -JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T -fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu -jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z -wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ -fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD -VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G -CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 -7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn -8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs -ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ -2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=ComSign Secured CA O=ComSign -# Subject: CN=ComSign Secured CA O=ComSign -# Label: "ComSign Secured CA" -# Serial: 264725503855295744117309814499492384489 -# MD5 Fingerprint: 40:01:25:06:8d:21:43:6a:0e:43:00:9c:e7:43:f3:d5 -# SHA1 Fingerprint: f9:cd:0e:2c:da:76:24:c1:8f:bd:f0:f0:ab:b6:45:b8:f7:fe:d5:7a -# SHA256 Fingerprint: 50:79:41:c7:44:60:a0:b4:70:86:22:0d:4e:99:32:57:2a:b5:d1:b5:bb:cb:89:80:ab:1c:b1:76:51:a8:44:d2 ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw -PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu -MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx -GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL -MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf -HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh -gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW -v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue -Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr -9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt -6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 -MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl -Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 -ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq -hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p -iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC -dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL -kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL -hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi -# Subject: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi -# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3" -# Serial: 17 -# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26 -# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96 -# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS -MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp -bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw -VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy -YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy -dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe -Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx -GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls -aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU -QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh -xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 -aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr -IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h -gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK -O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO -fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw -lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID -AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP -NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t -wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM -7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh -gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n -oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs -yZyQ2uypQjyttgI= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327 -# Label: "Buypass Class 2 CA 1" -# Serial: 1 -# MD5 Fingerprint: b8:08:9a:f0:03:cc:1b:0d:c8:6c:0b:76:a1:75:64:23 -# SHA1 Fingerprint: a0:a1:ab:90:c9:fc:84:7b:3b:12:61:e8:97:7d:5f:d3:22:61:d3:cc -# SHA256 Fingerprint: 0f:4e:9c:dd:26:4b:02:55:50:d1:70:80:63:40:21:4f:e9:44:34:c9:b0:2f:69:7e:c7:10:fc:5f:ea:fb:5e:38 ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg -Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL -MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD -VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 -ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX -l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB -HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B -5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 -WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD -AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP -gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ -DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu -BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs -h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk -LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327 -# Label: "Buypass Class 3 CA 1" -# Serial: 2 -# MD5 Fingerprint: df:3c:73:59:81:e7:39:50:81:04:4c:34:a2:cb:b3:7b -# SHA1 Fingerprint: 61:57:3a:11:df:0e:d8:7e:d5:92:65:22:ea:d0:56:d7:44:b3:23:71 -# SHA256 Fingerprint: b7:b1:2b:17:1f:82:1d:aa:99:0c:d0:fe:50:87:b1:28:44:8b:a8:e5:18:4f:84:c5:1e:02:b5:c8:fb:96:2b:24 ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg -Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL -MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD -VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg -isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z -NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI -+MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R -hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ -mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD -AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP -Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s -EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 -mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC -e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow -dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -# Issuer: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. -# Subject: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. -# Label: "EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1" -# Serial: 5525761995591021570 -# MD5 Fingerprint: 2c:20:26:9d:cb:1a:4a:00:85:b5:b7:5a:ae:c2:01:37 -# SHA1 Fingerprint: 8c:96:ba:eb:dd:2b:07:07:48:ee:30:32:66:a0:f3:98:6e:7c:ae:58 -# SHA256 Fingerprint: 35:ae:5b:dd:d8:f7:ae:63:5c:ff:ba:56:82:a8:f0:0b:95:f4:84:62:c7:10:8e:e9:a0:e5:29:2b:07:4a:af:b2 ------BEGIN CERTIFICATE----- -MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV -BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt -ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 -MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg -SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl -a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h -4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk -tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s -tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL -dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 -c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um -TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z -+kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O -Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW -OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW -fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 -l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw -FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ -8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI -6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO -TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME -wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY -Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn -xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q -DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q -Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t -hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 -7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 -QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=CNNIC ROOT O=CNNIC -# Subject: CN=CNNIC ROOT O=CNNIC -# Label: "CNNIC ROOT" -# Serial: 1228079105 -# MD5 Fingerprint: 21:bc:82:ab:49:c4:13:3b:4b:b2:2b:5c:6b:90:9c:19 -# SHA1 Fingerprint: 8b:af:4c:9b:1d:f0:2a:92:f7:da:12:8e:b9:1b:ac:f4:98:60:4b:6f -# SHA256 Fingerprint: e2:83:93:77:3d:a8:45:a6:79:f2:08:0c:c7:fb:44:a3:b7:a1:c3:79:2c:b7:eb:77:29:fd:cb:6a:8d:99:ae:a7 ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD -TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 -MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF -Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh -IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 -dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO -V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC -GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN -v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB -AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB -Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO -76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK -OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH -ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi -yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL -buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj -2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= ------END CERTIFICATE----- - -# Issuer: O=Japanese Government OU=ApplicationCA -# Subject: O=Japanese Government OU=ApplicationCA -# Label: "ApplicationCA - Japanese Government" -# Serial: 49 -# MD5 Fingerprint: 7e:23:4e:5b:a7:a5:b4:25:e9:00:07:74:11:62:ae:d6 -# SHA1 Fingerprint: 7f:8a:b0:cf:d0:51:87:6a:66:f3:36:0f:47:c8:8d:8c:d3:35:fc:74 -# SHA256 Fingerprint: 2d:47:43:7d:e1:79:51:21:5a:12:f3:c5:8e:51:c7:29:a5:80:26:ef:1f:cc:0a:5f:b3:d9:dc:01:2f:60:0d:19 ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc -MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp -b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT -AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs -aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H -j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K -f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 -IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw -FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht -QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm -/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ -k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ -MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC -seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ -hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ -eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U -DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj -B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) -# Label: "NetLock Arany (Class Gold) Főtanúsítvány" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=CA Disig O=Disig a.s. -# Subject: CN=CA Disig O=Disig a.s. -# Label: "CA Disig" -# Serial: 1 -# MD5 Fingerprint: 3f:45:96:39:e2:50:87:f7:bb:fe:98:0c:3c:20:98:e6 -# SHA1 Fingerprint: 2a:c8:d5:8b:57:ce:bf:2f:49:af:f2:fc:76:8f:51:14:62:90:7a:41 -# SHA256 Fingerprint: 92:bf:51:19:ab:ec:ca:d0:b1:33:2d:c4:e1:d0:5f:ba:75:b5:67:90:44:ee:0c:a2:6e:93:1f:74:4f:2f:33:cf ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET -MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE -AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw -CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg -YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE -Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX -mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD -XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW -S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp -FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD -AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu -ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z -ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv -Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw -DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 -yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq -EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB -EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN -PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -# Issuer: CN=Juur-SK O=AS Sertifitseerimiskeskus -# Subject: CN=Juur-SK O=AS Sertifitseerimiskeskus -# Label: "Juur-SK" -# Serial: 999181308 -# MD5 Fingerprint: aa:8e:5d:d9:f8:db:0a:58:b7:8d:26:87:6c:82:35:55 -# SHA1 Fingerprint: 40:9d:4b:d9:17:b5:5c:27:b6:9b:64:cb:98:22:44:0d:cd:09:b8:89 -# SHA256 Fingerprint: ec:c3:e9:c3:40:75:03:be:e0:91:aa:95:2f:41:34:8f:f8:8b:aa:86:3b:22:64:be:fa:c8:07:90:15:74:e9:39 ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN -AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp -dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw -MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw -CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ -MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB -SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz -ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH -LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP -PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL -2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w -ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC -MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk -AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 -AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz -AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz -AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f -BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY -P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi -CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g -kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 -HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS -na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q -qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z -TbvGRNs2yyqcjg== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI -# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI -# Label: "ACEDICOM Root" -# Serial: 7029493972724711941 -# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6 -# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84 -# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a ------BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE -AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x -CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW -MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF -RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC -AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 -09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 -XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P -Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK -t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb -X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 -MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU -fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI -2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH -K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae -ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP -BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ -MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw -RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm -fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 -gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe -I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i -5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi -ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn -MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ -o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 -zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN -GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt -r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK -Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 80507572722862485515306429940691309246 -# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 -# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b -# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S. -# Subject: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S. -# Label: "E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi" -# Serial: 91184789765598910059173000485363494069 -# MD5 Fingerprint: 3d:41:29:cb:1e:aa:11:74:cd:5d:b0:62:af:b0:43:5b -# SHA1 Fingerprint: dd:e1:d2:a9:01:80:2e:1d:87:5e:84:b3:80:7e:4b:b1:fd:99:41:34 -# SHA256 Fingerprint: e6:09:07:84:65:a4:19:78:0c:b6:ac:4c:1c:0b:fb:46:53:d9:d9:cc:6e:b3:94:6e:b7:f3:d6:99:97:ba:d5:98 ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp -Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp -a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx -MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg -R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU -MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT -L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H -5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC -90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 -c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE -VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP -qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S -/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj -/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X -KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Autorité Racine" -# Serial: 1 -# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a -# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3 -# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17 ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk -BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 -Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl -cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 -aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY -F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N -8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe -rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K -/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu -7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC -28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 -lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E -nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB -0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 -5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj -WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN -jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s -ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM -OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q -619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn -2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj -o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v -nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG -5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq -pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb -dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 -BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -# Issuer: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA -# Subject: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA -# Label: "Root CA Generalitat Valenciana" -# Serial: 994436456 -# MD5 Fingerprint: 2c:8c:17:5e:b1:54:ab:93:17:b5:36:5a:db:d1:c6:f2 -# SHA1 Fingerprint: a0:73:e5:c5:bd:43:61:0d:86:4c:21:13:0a:85:58:57:cc:9c:ea:46 -# SHA256 Fingerprint: 8c:4e:df:d0:43:48:f3:22:96:9e:7e:29:a4:cd:4d:ca:00:46:55:06:1c:16:e1:b0:76:42:2e:f3:42:ad:63:0e ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF -UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ -R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN -MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw -JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+ -WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj -SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl -u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy -A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk -Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7 -MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr -aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC -IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A -cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA -YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA -bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA -bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA -aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA -ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA -YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA -ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA -LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6 -Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y -eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw -CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G -A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu -Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn -lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt -b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg -9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF -ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC -IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -# Issuer: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03 -# Subject: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03 -# Label: "A-Trust-nQual-03" -# Serial: 93214 -# MD5 Fingerprint: 49:63:ae:27:f4:d5:95:3d:d8:db:24:86:b8:9c:07:53 -# SHA1 Fingerprint: d3:c0:63:f2:19:ed:07:3e:34:ad:5d:75:0b:32:76:29:ff:d5:9a:f2 -# SHA256 Fingerprint: 79:3c:bf:45:59:b9:fd:e3:8a:b2:2d:f1:68:69:f6:98:81:ae:14:c4:b0:13:9a:c7:88:a7:8a:1a:fc:ca:02:fb ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB -VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp -bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R -dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw -MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy -dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52 -ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM -EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj -lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ -znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH -2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1 -k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs -2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD -VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG -KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+ -8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R -FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE -DNuxUCAKGkq6ahq97BvIxYSazQ== ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Label: "StartCom Certification Authority" -# Serial: 45 -# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 -# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 -# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul -F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC -ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w -ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk -aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 -YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg -c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 -d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG -CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF -wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS -Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst -0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc -pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl -CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF -P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK -1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm -KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ -8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm -fyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. -# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. -# Label: "StartCom Certification Authority G2" -# Serial: 59 -# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 -# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 -# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 -OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG -A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ -JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD -vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo -D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ -Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW -RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK -HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN -nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM -0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i -UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 -Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg -TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL -BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX -UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl -6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK -9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ -HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI -wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY -XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l -IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo -hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr -so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 -# Label: "TURKTRUST Certificate Services Provider Root 2007" -# Serial: 1 -# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72 -# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33 -# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50 ------BEGIN CERTIFICATE----- -MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx -OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry -b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC -VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE -sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F -ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY -KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG -+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG -HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P -IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M -733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk -Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW -AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I -aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 -mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa -XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ -qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica -# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT -# Label: "PSCProcert" -# Serial: 11 -# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec -# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74 -# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0 ------BEGIN CERTIFICATE----- -MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s -YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz -dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 -aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh -IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ -KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw -MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy -b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx -KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG -A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u -aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 -7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 -BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G -ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 -JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 -PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 -0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH -0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ -6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m -v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 -K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev -bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw -MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w -MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD -gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 -b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh -bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 -cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp -ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg -ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq -hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD -AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w -MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag -RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t -UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl -cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v -Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG -AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN -AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS -1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB -3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv -Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh -HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm -pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz -sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE -qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb -mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 -opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H -YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km ------END CERTIFICATE----- - -# Issuer: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center -# Subject: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center -# Label: "China Internet Network Information Center EV Certificates Root" -# Serial: 1218379777 -# MD5 Fingerprint: 55:5d:63:00:97:bd:6a:97:f5:67:ab:4b:fb:6e:63:15 -# SHA1 Fingerprint: 4f:99:aa:93:fb:2b:d1:37:26:a1:99:4a:ce:7f:f0:05:f2:93:5d:1e -# SHA256 Fingerprint: 1c:01:c6:f4:db:b2:fe:fc:22:55:8b:2b:ca:32:56:3f:49:84:4a:cf:c3:2b:7b:e4:b0:ff:59:9f:9e:8c:7a:f7 ------BEGIN CERTIFICATE----- -MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC -Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g -Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 -aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa -Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg -SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo -aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp -ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z -7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// -DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx -zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 -hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs -4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u -gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY -NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E -FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 -j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG -52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB -echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws -ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI -zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy -wy39FCqQmbkHzJ8= ------END CERTIFICATE----- - -# Issuer: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services -# Subject: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services -# Label: "Swisscom Root CA 2" -# Serial: 40698052477090394928831521023204026294 -# MD5 Fingerprint: 5b:04:69:ec:a5:83:94:63:18:a7:86:d0:e4:f2:6e:19 -# SHA1 Fingerprint: 77:47:4f:c6:30:e4:0f:4c:47:64:3f:84:ba:b8:c6:95:4a:8a:41:ec -# SHA256 Fingerprint: f0:9b:12:2c:71:14:f4:a0:9b:d4:ea:4f:4a:99:d5:58:b4:6e:4c:25:cd:81:14:0d:29:c0:56:13:91:4c:38:41 ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk -MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 -YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg -Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT -AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp -Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr -jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r -0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f -2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP -ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF -y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA -tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL -6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0 -uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL -acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh -k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q -VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw -FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O -BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh -b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R -fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv -/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI -REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx -srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv -aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT -woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n -Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W -t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N -8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2 -9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5 -wSsSnqaeG8XmDtkx2Q== ------END CERTIFICATE----- - -# Issuer: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services -# Subject: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services -# Label: "Swisscom Root EV CA 2" -# Serial: 322973295377129385374608406479535262296 -# MD5 Fingerprint: 7b:30:34:9f:dd:0a:4b:6b:35:ca:31:51:28:5d:ae:ec -# SHA1 Fingerprint: e7:a1:90:29:d3:d5:52:dc:0d:0f:c6:92:d3:ea:88:0d:15:2e:1a:6b -# SHA256 Fingerprint: d9:5f:ea:3c:a4:ee:dc:e7:4c:d7:6e:75:fc:6d:1f:f6:2c:44:1f:0f:a8:bc:77:f0:34:b1:9e:5d:b2:58:01:5d ------BEGIN CERTIFICATE----- -MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw -ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp -dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290 -IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD -VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy -dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg -MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx -UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD -1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH -oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR -HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/ -5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv -idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL -OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC -NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f -46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB -UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth -7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G -A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED -MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB -bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x -XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T -PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0 -Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70 -WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL -Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm -7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S -nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN -vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB -WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI -fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb -I+2ksx0WckNLIOFZfsLorSa/ovc= ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R1 O=Disig a.s. -# Subject: CN=CA Disig Root R1 O=Disig a.s. -# Label: "CA Disig Root R1" -# Serial: 14052245610670616104 -# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a -# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 -# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy -MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk -D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o -OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A -fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe -IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n -oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK -/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj -rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD -3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE -7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC -yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd -qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI -hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR -xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA -SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo -HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB -emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC -AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb -7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x -DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk -F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF -a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT -Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- diff --git a/vendor-local/lib/python/requests/certs.py b/vendor-local/lib/python/requests/certs.py deleted file mode 100644 index bc00826191d..00000000000 --- a/vendor-local/lib/python/requests/certs.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -certs.py -~~~~~~~~ - -This module returns the preferred default CA certificate bundle. - -If you are packaging Requests, e.g., for a Linux distribution or a managed -environment, you can change the definition of where() to return a separately -packaged CA bundle. -""" - -import os.path - - -def where(): - """Return the preferred certificate bundle.""" - # vendored bundle inside Requests - return os.path.join(os.path.dirname(__file__), 'cacert.pem') - -if __name__ == '__main__': - print(where()) diff --git a/vendor-local/lib/python/requests/compat.py b/vendor-local/lib/python/requests/compat.py deleted file mode 100644 index 0d61a572df6..00000000000 --- a/vendor-local/lib/python/requests/compat.py +++ /dev/null @@ -1,115 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -pythoncompat -""" - -from .packages import charade as chardet - -import sys - -# ------- -# Pythons -# ------- - -# Syntax sugar. -_ver = sys.version_info - -#: Python 2.x? -is_py2 = (_ver[0] == 2) - -#: Python 3.x? -is_py3 = (_ver[0] == 3) - -#: Python 3.0.x -is_py30 = (is_py3 and _ver[1] == 0) - -#: Python 3.1.x -is_py31 = (is_py3 and _ver[1] == 1) - -#: Python 3.2.x -is_py32 = (is_py3 and _ver[1] == 2) - -#: Python 3.3.x -is_py33 = (is_py3 and _ver[1] == 3) - -#: Python 3.4.x -is_py34 = (is_py3 and _ver[1] == 4) - -#: Python 2.7.x -is_py27 = (is_py2 and _ver[1] == 7) - -#: Python 2.6.x -is_py26 = (is_py2 and _ver[1] == 6) - -#: Python 2.5.x -is_py25 = (is_py2 and _ver[1] == 5) - -#: Python 2.4.x -is_py24 = (is_py2 and _ver[1] == 4) # I'm assuming this is not by choice. - - -# --------- -# Platforms -# --------- - - -# Syntax sugar. -_ver = sys.version.lower() - -is_pypy = ('pypy' in _ver) -is_jython = ('jython' in _ver) -is_ironpython = ('iron' in _ver) - -# Assume CPython, if nothing else. -is_cpython = not any((is_pypy, is_jython, is_ironpython)) - -# Windows-based system. -is_windows = 'win32' in str(sys.platform).lower() - -# Standard Linux 2+ system. -is_linux = ('linux' in str(sys.platform).lower()) -is_osx = ('darwin' in str(sys.platform).lower()) -is_hpux = ('hpux' in str(sys.platform).lower()) # Complete guess. -is_solaris = ('solar==' in str(sys.platform).lower()) # Complete guess. - -try: - import simplejson as json -except ImportError: - import json - -# --------- -# Specifics -# --------- - -if is_py2: - from urllib import quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, proxy_bypass - from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag - from urllib2 import parse_http_list - import cookielib - from Cookie import Morsel - from StringIO import StringIO - from .packages.urllib3.packages.ordered_dict import OrderedDict - from httplib import IncompleteRead - - builtin_str = str - bytes = str - str = unicode - basestring = basestring - numeric_types = (int, long, float) - - -elif is_py3: - from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag - from urllib.request import parse_http_list, getproxies, proxy_bypass - from http import cookiejar as cookielib - from http.cookies import Morsel - from io import StringIO - from collections import OrderedDict - from http.client import IncompleteRead - - builtin_str = str - str = str - bytes = bytes - basestring = (str, bytes) - numeric_types = (int, float) diff --git a/vendor-local/lib/python/requests/cookies.py b/vendor-local/lib/python/requests/cookies.py deleted file mode 100644 index ea56c065a51..00000000000 --- a/vendor-local/lib/python/requests/cookies.py +++ /dev/null @@ -1,412 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -Compatibility code to be able to use `cookielib.CookieJar` with requests. - -requests.utils imports from here, so be careful with imports. -""" - -import time -import collections -from .compat import cookielib, urlparse, Morsel - -try: - import threading - # grr, pyflakes: this fixes "redefinition of unused 'threading'" - threading -except ImportError: - import dummy_threading as threading - - -class MockRequest(object): - """Wraps a `requests.Request` to mimic a `urllib2.Request`. - - The code in `cookielib.CookieJar` expects this interface in order to correctly - manage cookie policies, i.e., determine whether a cookie can be set, given the - domains of the request and the cookie. - - The original request object is read-only. The client is responsible for collecting - the new headers via `get_new_headers()` and interpreting them appropriately. You - probably want `get_cookie_header`, defined below. - """ - - def __init__(self, request): - self._r = request - self._new_headers = {} - self.type = urlparse(self._r.url).scheme - - def get_type(self): - return self.type - - def get_host(self): - return urlparse(self._r.url).netloc - - def get_origin_req_host(self): - return self.get_host() - - def get_full_url(self): - return self._r.url - - def is_unverifiable(self): - return True - - def has_header(self, name): - return name in self._r.headers or name in self._new_headers - - def get_header(self, name, default=None): - return self._r.headers.get(name, self._new_headers.get(name, default)) - - def add_header(self, key, val): - """cookielib has no legitimate use for this method; add it back if you find one.""" - raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") - - def add_unredirected_header(self, name, value): - self._new_headers[name] = value - - def get_new_headers(self): - return self._new_headers - - @property - def unverifiable(self): - return self.is_unverifiable() - - @property - def origin_req_host(self): - return self.get_origin_req_host() - - @property - def host(self): - return self.get_host() - - -class MockResponse(object): - """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. - - ...what? Basically, expose the parsed HTTP headers from the server response - the way `cookielib` expects to see them. - """ - - def __init__(self, headers): - """Make a MockResponse for `cookielib` to read. - - :param headers: a httplib.HTTPMessage or analogous carrying the headers - """ - self._headers = headers - - def info(self): - return self._headers - - def getheaders(self, name): - self._headers.getheaders(name) - - -def extract_cookies_to_jar(jar, request, response): - """Extract the cookies from the response into a CookieJar. - - :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) - :param request: our own requests.Request object - :param response: urllib3.HTTPResponse object - """ - if not (hasattr(response, '_original_response') and - response._original_response): - return - # the _original_response field is the wrapped httplib.HTTPResponse object, - req = MockRequest(request) - # pull out the HTTPMessage with the headers and put it in the mock: - res = MockResponse(response._original_response.msg) - jar.extract_cookies(res, req) - - -def get_cookie_header(jar, request): - """Produce an appropriate Cookie header string to be sent with `request`, or None.""" - r = MockRequest(request) - jar.add_cookie_header(r) - return r.get_new_headers().get('Cookie') - - -def remove_cookie_by_name(cookiejar, name, domain=None, path=None): - """Unsets a cookie by name, by default over all domains and paths. - - Wraps CookieJar.clear(), is O(n). - """ - clearables = [] - for cookie in cookiejar: - if cookie.name == name: - if domain is None or domain == cookie.domain: - if path is None or path == cookie.path: - clearables.append((cookie.domain, cookie.path, cookie.name)) - - for domain, path, name in clearables: - cookiejar.clear(domain, path, name) - - -class CookieConflictError(RuntimeError): - """There are two cookies that meet the criteria specified in the cookie jar. - Use .get and .set and include domain and path args in order to be more specific.""" - - -class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): - """Compatibility class; is a cookielib.CookieJar, but exposes a dict interface. - - This is the CookieJar we create by default for requests and sessions that - don't specify one, since some clients may expect response.cookies and - session.cookies to support dict operations. - - Don't use the dict interface internally; it's just for compatibility with - with external client code. All `requests` code should work out of the box - with externally provided instances of CookieJar, e.g., LWPCookieJar and - FileCookieJar. - - Caution: dictionary operations that are normally O(1) may be O(n). - - Unlike a regular CookieJar, this class is pickleable. - """ - - def get(self, name, default=None, domain=None, path=None): - """Dict-like get() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. Caution: operation is O(n), not O(1).""" - try: - return self._find_no_duplicates(name, domain, path) - except KeyError: - return default - - def set(self, name, value, **kwargs): - """Dict-like set() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains.""" - # support client code that unsets cookies by assignment of a None value: - if value is None: - remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) - return - - if isinstance(value, Morsel): - c = morsel_to_cookie(value) - else: - c = create_cookie(name, value, **kwargs) - self.set_cookie(c) - return c - - def keys(self): - """Dict-like keys() that returns a list of names of cookies from the jar. - See values() and items().""" - keys = [] - for cookie in iter(self): - keys.append(cookie.name) - return keys - - def values(self): - """Dict-like values() that returns a list of values of cookies from the jar. - See keys() and items().""" - values = [] - for cookie in iter(self): - values.append(cookie.value) - return values - - def items(self): - """Dict-like items() that returns a list of name-value tuples from the jar. - See keys() and values(). Allows client-code to call "dict(RequestsCookieJar) - and get a vanilla python dict of key value pairs.""" - items = [] - for cookie in iter(self): - items.append((cookie.name, cookie.value)) - return items - - def list_domains(self): - """Utility method to list all the domains in the jar.""" - domains = [] - for cookie in iter(self): - if cookie.domain not in domains: - domains.append(cookie.domain) - return domains - - def list_paths(self): - """Utility method to list all the paths in the jar.""" - paths = [] - for cookie in iter(self): - if cookie.path not in paths: - paths.append(cookie.path) - return paths - - def multiple_domains(self): - """Returns True if there are multiple domains in the jar. - Returns False otherwise.""" - domains = [] - for cookie in iter(self): - if cookie.domain is not None and cookie.domain in domains: - return True - domains.append(cookie.domain) - return False # there is only one domain in jar - - def get_dict(self, domain=None, path=None): - """Takes as an argument an optional domain and path and returns a plain old - Python dict of name-value pairs of cookies that meet the requirements.""" - dictionary = {} - for cookie in iter(self): - if (domain is None or cookie.domain == domain) and (path is None - or cookie.path == path): - dictionary[cookie.name] = cookie.value - return dictionary - - def __getitem__(self, name): - """Dict-like __getitem__() for compatibility with client code. Throws exception - if there are more than one cookie with name. In that case, use the more - explicit get() method instead. Caution: operation is O(n), not O(1).""" - - return self._find_no_duplicates(name) - - def __setitem__(self, name, value): - """Dict-like __setitem__ for compatibility with client code. Throws exception - if there is already a cookie of that name in the jar. In that case, use the more - explicit set() method instead.""" - - self.set(name, value) - - def __delitem__(self, name): - """Deletes a cookie given a name. Wraps cookielib.CookieJar's remove_cookie_by_name().""" - remove_cookie_by_name(self, name) - - def set_cookie(self, cookie, *args, **kwargs): - if cookie.value.startswith('"') and cookie.value.endswith('"'): - cookie.value = cookie.value.replace('\\"', '') - return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) - - def update(self, other): - """Updates this jar with cookies from another CookieJar or dict-like""" - if isinstance(other, cookielib.CookieJar): - for cookie in other: - self.set_cookie(cookie) - else: - super(RequestsCookieJar, self).update(other) - - def _find(self, name, domain=None, path=None): - """Requests uses this method internally to get cookie values. Takes as args name - and optional domain and path. Returns a cookie.value. If there are conflicting cookies, - _find arbitrarily chooses one. See _find_no_duplicates if you want an exception thrown - if there are conflicting cookies.""" - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - return cookie.value - - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def _find_no_duplicates(self, name, domain=None, path=None): - """__get_item__ and get call _find_no_duplicates -- never used in Requests internally. - Takes as args name and optional domain and path. Returns a cookie.value. - Throws KeyError if cookie is not found and CookieConflictError if there are - multiple cookies that match name and optionally domain and path.""" - toReturn = None - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - if toReturn is not None: # if there are multiple cookies that meet passed in criteria - raise CookieConflictError('There are multiple cookies with name, %r' % (name)) - toReturn = cookie.value # we will eventually return this as long as no cookie conflict - - if toReturn: - return toReturn - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def __getstate__(self): - """Unlike a normal CookieJar, this class is pickleable.""" - state = self.__dict__.copy() - # remove the unpickleable RLock object - state.pop('_cookies_lock') - return state - - def __setstate__(self, state): - """Unlike a normal CookieJar, this class is pickleable.""" - self.__dict__.update(state) - if '_cookies_lock' not in self.__dict__: - self._cookies_lock = threading.RLock() - - def copy(self): - """Return a copy of this RequestsCookieJar.""" - new_cj = RequestsCookieJar() - new_cj.update(self) - return new_cj - - -def create_cookie(name, value, **kwargs): - """Make a cookie from underspecified parameters. - - By default, the pair of `name` and `value` will be set for the domain '' - and sent on every request (this is sometimes called a "supercookie"). - """ - result = dict( - version=0, - name=name, - value=value, - port=None, - domain='', - path='/', - secure=False, - expires=None, - discard=True, - comment=None, - comment_url=None, - rest={'HttpOnly': None}, - rfc2109=False,) - - badargs = set(kwargs) - set(result) - if badargs: - err = 'create_cookie() got unexpected keyword arguments: %s' - raise TypeError(err % list(badargs)) - - result.update(kwargs) - result['port_specified'] = bool(result['port']) - result['domain_specified'] = bool(result['domain']) - result['domain_initial_dot'] = result['domain'].startswith('.') - result['path_specified'] = bool(result['path']) - - return cookielib.Cookie(**result) - - -def morsel_to_cookie(morsel): - """Convert a Morsel object into a Cookie containing the one k/v pair.""" - expires = None - if morsel["max-age"]: - expires = time.time() + morsel["max-age"] - elif morsel['expires']: - expires = morsel['expires'] - if type(expires) == type(""): - time_template = "%a, %d-%b-%Y %H:%M:%S GMT" - expires = time.mktime(time.strptime(expires, time_template)) - c = create_cookie( - name=morsel.key, - value=morsel.value, - version=morsel['version'] or 0, - port=None, - domain=morsel['domain'], - path=morsel['path'], - secure=bool(morsel['secure']), - expires=expires, - discard=False, - comment=morsel['comment'], - comment_url=bool(morsel['comment']), - rest={'HttpOnly': morsel['httponly']}, - rfc2109=False,) - return c - - -def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): - """Returns a CookieJar from a key/value dictionary. - - :param cookie_dict: Dict of key/values to insert into CookieJar. - :param cookiejar: (optional) A cookiejar to add the cookies to. - :param overwrite: (optional) If False, will not replace cookies - already in the jar with new ones. - """ - if cookiejar is None: - cookiejar = RequestsCookieJar() - - if cookie_dict is not None: - names_from_jar = [cookie.name for cookie in cookiejar] - for name in cookie_dict: - if overwrite or (name not in names_from_jar): - cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) - - return cookiejar diff --git a/vendor-local/lib/python/requests/exceptions.py b/vendor-local/lib/python/requests/exceptions.py deleted file mode 100644 index bc42b5fff08..00000000000 --- a/vendor-local/lib/python/requests/exceptions.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.exceptions -~~~~~~~~~~~~~~~~~~~ - -This module contains the set of Requests' exceptions. - -""" - - -class RequestException(IOError): - """There was an ambiguous exception that occurred while handling your - request.""" - - -class HTTPError(RequestException): - """An HTTP error occurred.""" - - def __init__(self, *args, **kwargs): - """ Initializes HTTPError with optional `response` object. """ - self.response = kwargs.pop('response', None) - super(HTTPError, self).__init__(*args, **kwargs) - - -class ConnectionError(RequestException): - """A Connection error occurred.""" - - -class ProxyError(ConnectionError): - """A proxy error occurred.""" - - -class SSLError(ConnectionError): - """An SSL error occurred.""" - - -class Timeout(RequestException): - """The request timed out.""" - - -class URLRequired(RequestException): - """A valid URL is required to make a request.""" - - -class TooManyRedirects(RequestException): - """Too many redirects.""" - - -class MissingSchema(RequestException, ValueError): - """The URL schema (e.g. http or https) is missing.""" - - -class InvalidSchema(RequestException, ValueError): - """See defaults.py for valid schemas.""" - - -class InvalidURL(RequestException, ValueError): - """ The URL provided was somehow invalid. """ - - -class ChunkedEncodingError(RequestException): - """The server declared chunked encoding but sent an invalid chunk.""" diff --git a/vendor-local/lib/python/requests/hooks.py b/vendor-local/lib/python/requests/hooks.py deleted file mode 100644 index 5dfaf6b6801..00000000000 --- a/vendor-local/lib/python/requests/hooks.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.hooks -~~~~~~~~~~~~~~ - -This module provides the capabilities for the Requests hooks system. - -Available hooks: - -``response``: - The response generated from a Request. - -""" - - -HOOKS = ['response'] - - -def default_hooks(): - hooks = {} - for event in HOOKS: - hooks[event] = [] - return hooks - -# TODO: response is the only one - - -def dispatch_hook(key, hooks, hook_data, **kwargs): - """Dispatches a hook dictionary on a given piece of data.""" - - hooks = hooks or dict() - - if key in hooks: - hooks = hooks.get(key) - - if hasattr(hooks, '__call__'): - hooks = [hooks] - - for hook in hooks: - _hook_data = hook(hook_data, **kwargs) - if _hook_data is not None: - hook_data = _hook_data - - return hook_data diff --git a/vendor-local/lib/python/requests/models.py b/vendor-local/lib/python/requests/models.py deleted file mode 100644 index 5647bf3d406..00000000000 --- a/vendor-local/lib/python/requests/models.py +++ /dev/null @@ -1,733 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -import collections -import logging -import datetime - -from io import BytesIO, UnsupportedOperation -from .hooks import default_hooks -from .structures import CaseInsensitiveDict - -from .auth import HTTPBasicAuth -from .cookies import cookiejar_from_dict, get_cookie_header -from .packages.urllib3.fields import RequestField -from .packages.urllib3.filepost import encode_multipart_formdata -from .packages.urllib3.util import parse_url -from .exceptions import ( - HTTPError, RequestException, MissingSchema, InvalidURL, - ChunkedEncodingError) -from .utils import ( - guess_filename, get_auth_from_url, requote_uri, - stream_decode_response_unicode, to_key_val_list, parse_header_links, - iter_slices, guess_json_utf, super_len, to_native_string) -from .compat import ( - cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO, - is_py2, chardet, json, builtin_str, basestring, IncompleteRead) - -CONTENT_CHUNK_SIZE = 10 * 1024 -ITER_CHUNK_SIZE = 512 - -log = logging.getLogger(__name__) - - -class RequestEncodingMixin(object): - @property - def path_url(self): - """Build the path URL to use.""" - - url = [] - - p = urlsplit(self.url) - - path = p.path - if not path: - path = '/' - - url.append(path) - - query = p.query - if query: - url.append('?') - url.append(query) - - return ''.join(url) - - @staticmethod - def _encode_params(data): - """Encode parameters in a piece of data. - - Will successfully encode parameters when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary - if parameters are supplied as a dict. - """ - - if isinstance(data, (str, bytes)): - return data - elif hasattr(data, 'read'): - return data - elif hasattr(data, '__iter__'): - result = [] - for k, vs in to_key_val_list(data): - if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): - vs = [vs] - for v in vs: - if v is not None: - result.append( - (k.encode('utf-8') if isinstance(k, str) else k, - v.encode('utf-8') if isinstance(v, str) else v)) - return urlencode(result, doseq=True) - else: - return data - - @staticmethod - def _encode_files(files, data): - """Build the body for a multipart/form-data request. - - Will successfully encode files when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary - if parameters are supplied as a dict. - - """ - if (not files): - raise ValueError("Files must be provided.") - elif isinstance(data, basestring): - raise ValueError("Data must not be a string.") - - new_fields = [] - fields = to_key_val_list(data or {}) - files = to_key_val_list(files or {}) - - for field, val in fields: - if isinstance(val, basestring) or not hasattr(val, '__iter__'): - val = [val] - for v in val: - if v is not None: - # Don't call str() on bytestrings: in Py3 it all goes wrong. - if not isinstance(v, bytes): - v = str(v) - - new_fields.append( - (field.decode('utf-8') if isinstance(field, bytes) else field, - v.encode('utf-8') if isinstance(v, str) else v)) - - for (k, v) in files: - # support for explicit filename - ft = None - fh = None - if isinstance(v, (tuple, list)): - if len(v) == 2: - fn, fp = v - elif len(v) == 3: - fn, fp, ft = v - else: - fn, fp, ft, fh = v - else: - fn = guess_filename(v) or k - fp = v - if isinstance(fp, str): - fp = StringIO(fp) - if isinstance(fp, bytes): - fp = BytesIO(fp) - - rf = RequestField(name=k, data=fp.read(), - filename=fn, headers=fh) - rf.make_multipart(content_type=ft) - new_fields.append(rf) - - body, content_type = encode_multipart_formdata(new_fields) - - return body, content_type - - -class RequestHooksMixin(object): - def register_hook(self, event, hook): - """Properly register a hook.""" - - if event not in self.hooks: - raise ValueError('Unsupported event specified, with event name "%s"' % (event)) - - if isinstance(hook, collections.Callable): - self.hooks[event].append(hook) - elif hasattr(hook, '__iter__'): - self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable)) - - def deregister_hook(self, event, hook): - """Deregister a previously registered hook. - Returns True if the hook existed, False if not. - """ - - try: - self.hooks[event].remove(hook) - return True - except ValueError: - return False - - -class Request(RequestHooksMixin): - """A user-created :class:`Request <Request>` object. - - Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server. - - :param method: HTTP method to use. - :param url: URL to send. - :param headers: dictionary of headers to send. - :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach the request. If a dictionary is provided, form-encoding will take place. - :param params: dictionary of URL parameters to append to the URL. - :param auth: Auth handler or (user, pass) tuple. - :param cookies: dictionary or CookieJar of cookies to attach to this request. - :param hooks: dictionary of callback hooks, for internal usage. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'http://httpbin.org/get') - >>> req.prepare() - <PreparedRequest [GET]> - - """ - def __init__(self, - method=None, - url=None, - headers=None, - files=None, - data=None, - params=None, - auth=None, - cookies=None, - hooks=None): - - # Default empty dicts for dict params. - data = [] if data is None else data - files = [] if files is None else files - headers = {} if headers is None else headers - params = {} if params is None else params - hooks = {} if hooks is None else hooks - - self.hooks = default_hooks() - for (k, v) in list(hooks.items()): - self.register_hook(event=k, hook=v) - - self.method = method - self.url = url - self.headers = headers - self.files = files - self.data = data - self.params = params - self.auth = auth - self.cookies = cookies - - def __repr__(self): - return '<Request [%s]>' % (self.method) - - def prepare(self): - """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.""" - p = PreparedRequest() - p.prepare( - method=self.method, - url=self.url, - headers=self.headers, - files=self.files, - data=self.data, - params=self.params, - auth=self.auth, - cookies=self.cookies, - hooks=self.hooks, - ) - return p - - -class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): - """The fully mutable :class:`PreparedRequest <PreparedRequest>` object, - containing the exact bytes that will be sent to the server. - - Generated from either a :class:`Request <Request>` object or manually. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'http://httpbin.org/get') - >>> r = req.prepare() - <PreparedRequest [GET]> - - >>> s = requests.Session() - >>> s.send(r) - <Response [200]> - - """ - - def __init__(self): - #: HTTP verb to send to the server. - self.method = None - #: HTTP URL to send the request to. - self.url = None - #: dictionary of HTTP headers. - self.headers = None - #: request body to send to the server. - self.body = None - #: dictionary of callback hooks, for internal usage. - self.hooks = default_hooks() - - def prepare(self, method=None, url=None, headers=None, files=None, - data=None, params=None, auth=None, cookies=None, hooks=None): - """Prepares the entire request with the given parameters.""" - - self.prepare_method(method) - self.prepare_url(url, params) - self.prepare_headers(headers) - self.prepare_cookies(cookies) - self.prepare_body(data, files) - self.prepare_auth(auth, url) - # Note that prepare_auth must be last to enable authentication schemes - # such as OAuth to work on a fully prepared request. - - # This MUST go after prepare_auth. Authenticators could add a hook - self.prepare_hooks(hooks) - - def __repr__(self): - return '<PreparedRequest [%s]>' % (self.method) - - def copy(self): - p = PreparedRequest() - p.method = self.method - p.url = self.url - p.headers = self.headers.copy() - p.body = self.body - p.hooks = self.hooks - return p - - def prepare_method(self, method): - """Prepares the given HTTP method.""" - self.method = method - if self.method is not None: - self.method = self.method.upper() - - def prepare_url(self, url, params): - """Prepares the given HTTP URL.""" - #: Accept objects that have string representations. - try: - url = unicode(url) - except NameError: - # We're on Python 3. - url = str(url) - except UnicodeDecodeError: - pass - - # Support for unicode domain names and paths. - scheme, auth, host, port, path, query, fragment = parse_url(url) - - if not scheme: - raise MissingSchema("Invalid URL %r: No schema supplied" % url) - - if not host: - raise InvalidURL("Invalid URL %r: No host supplied" % url) - - # Only want to apply IDNA to the hostname - try: - host = host.encode('idna').decode('utf-8') - except UnicodeError: - raise InvalidURL('URL has an invalid label.') - - # Carefully reconstruct the network location - netloc = auth or '' - if netloc: - netloc += '@' - netloc += host - if port: - netloc += ':' + str(port) - - # Bare domains aren't valid URLs. - if not path: - path = '/' - - if is_py2: - if isinstance(scheme, str): - scheme = scheme.encode('utf-8') - if isinstance(netloc, str): - netloc = netloc.encode('utf-8') - if isinstance(path, str): - path = path.encode('utf-8') - if isinstance(query, str): - query = query.encode('utf-8') - if isinstance(fragment, str): - fragment = fragment.encode('utf-8') - - enc_params = self._encode_params(params) - if enc_params: - if query: - query = '%s&%s' % (query, enc_params) - else: - query = enc_params - - url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) - self.url = url - - def prepare_headers(self, headers): - """Prepares the given HTTP headers.""" - - if headers: - self.headers = CaseInsensitiveDict((to_native_string(name), value) for name, value in headers.items()) - else: - self.headers = CaseInsensitiveDict() - - def prepare_body(self, data, files): - """Prepares the given HTTP body data.""" - - # Check if file, fo, generator, iterator. - # If not, run through normal process. - - # Nottin' on you. - body = None - content_type = None - length = None - - is_stream = all([ - hasattr(data, '__iter__'), - not isinstance(data, basestring), - not isinstance(data, list), - not isinstance(data, dict) - ]) - - try: - length = super_len(data) - except (TypeError, AttributeError, UnsupportedOperation): - length = None - - if is_stream: - body = data - - if files: - raise NotImplementedError('Streamed bodies and files are mutually exclusive.') - - if length is not None: - self.headers['Content-Length'] = str(length) - else: - self.headers['Transfer-Encoding'] = 'chunked' - else: - # Multi-part file uploads. - if files: - (body, content_type) = self._encode_files(files, data) - else: - if data: - body = self._encode_params(data) - if isinstance(data, str) or isinstance(data, builtin_str) or hasattr(data, 'read'): - content_type = None - else: - content_type = 'application/x-www-form-urlencoded' - - self.prepare_content_length(body) - - # Add content-type if it wasn't explicitly provided. - if (content_type) and (not 'content-type' in self.headers): - self.headers['Content-Type'] = content_type - - self.body = body - - def prepare_content_length(self, body): - if hasattr(body, 'seek') and hasattr(body, 'tell'): - body.seek(0, 2) - self.headers['Content-Length'] = str(body.tell()) - body.seek(0, 0) - elif body is not None: - l = super_len(body) - if l: - self.headers['Content-Length'] = str(l) - elif self.method not in ('GET', 'HEAD'): - self.headers['Content-Length'] = '0' - - def prepare_auth(self, auth, url=''): - """Prepares the given HTTP auth data.""" - - # If no Auth is explicitly provided, extract it from the URL first. - if auth is None: - url_auth = get_auth_from_url(self.url) - auth = url_auth if any(url_auth) else None - - if auth: - if isinstance(auth, tuple) and len(auth) == 2: - # special-case basic HTTP auth - auth = HTTPBasicAuth(*auth) - - # Allow auth to make its changes. - r = auth(self) - - # Update self to reflect the auth changes. - self.__dict__.update(r.__dict__) - - # Recompute Content-Length - self.prepare_content_length(self.body) - - def prepare_cookies(self, cookies): - """Prepares the given HTTP cookie data.""" - - if isinstance(cookies, cookielib.CookieJar): - cookies = cookies - else: - cookies = cookiejar_from_dict(cookies) - - if 'cookie' not in self.headers: - cookie_header = get_cookie_header(cookies, self) - if cookie_header is not None: - self.headers['Cookie'] = cookie_header - - def prepare_hooks(self, hooks): - """Prepares the given hooks.""" - for event in hooks: - self.register_hook(event, hooks[event]) - - -class Response(object): - """The :class:`Response <Response>` object, which contains a - server's response to an HTTP request. - """ - - def __init__(self): - super(Response, self).__init__() - - self._content = False - self._content_consumed = False - - #: Integer Code of responded HTTP Status. - self.status_code = None - - #: Case-insensitive Dictionary of Response Headers. - #: For example, ``headers['content-encoding']`` will return the - #: value of a ``'Content-Encoding'`` response header. - self.headers = CaseInsensitiveDict() - - #: File-like object representation of response (for advanced usage). - #: Requires that ``stream=True` on the request. - # This requirement does not apply for use internally to Requests. - self.raw = None - - #: Final URL location of Response. - self.url = None - - #: Encoding to decode with when accessing r.text. - self.encoding = None - - #: A list of :class:`Response <Response>` objects from - #: the history of the Request. Any redirect responses will end - #: up here. The list is sorted from the oldest to the most recent request. - self.history = [] - - self.reason = None - - #: A CookieJar of Cookies the server sent back. - self.cookies = cookiejar_from_dict({}) - - #: The amount of time elapsed between sending the request - #: and the arrival of the response (as a timedelta) - self.elapsed = datetime.timedelta(0) - - def __repr__(self): - return '<Response [%s]>' % (self.status_code) - - def __bool__(self): - """Returns true if :attr:`status_code` is 'OK'.""" - return self.ok - - def __nonzero__(self): - """Returns true if :attr:`status_code` is 'OK'.""" - return self.ok - - def __iter__(self): - """Allows you to use a response as an iterator.""" - return self.iter_content(128) - - @property - def ok(self): - try: - self.raise_for_status() - except RequestException: - return False - return True - - @property - def apparent_encoding(self): - """The apparent encoding, provided by the lovely Charade library - (Thanks, Ian!).""" - return chardet.detect(self.content)['encoding'] - - def iter_content(self, chunk_size=1, decode_unicode=False): - """Iterates over the response data. When stream=True is set on the - request, this avoids reading the content at once into memory for - large responses. The chunk size is the number of bytes it should - read into memory. This is not necessarily the length of each item - returned as decoding can take place. - """ - if self._content_consumed: - # simulate reading small chunks of the content - return iter_slices(self._content, chunk_size) - - def generate(): - try: - # Special case for urllib3. - try: - for chunk in self.raw.stream(chunk_size, - decode_content=True): - yield chunk - except IncompleteRead as e: - raise ChunkedEncodingError(e) - except AttributeError: - # Standard file-like object. - while True: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk - - self._content_consumed = True - - gen = generate() - - if decode_unicode: - gen = stream_decode_response_unicode(gen, self) - - return gen - - def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None): - """Iterates over the response data, one line at a time. When - stream=True is set on the request, this avoids reading the - content at once into memory for large responses. - """ - - pending = None - - for chunk in self.iter_content(chunk_size=chunk_size, - decode_unicode=decode_unicode): - - if pending is not None: - chunk = pending + chunk - lines = chunk.splitlines() - - if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: - pending = lines.pop() - else: - pending = None - - for line in lines: - yield line - - if pending is not None: - yield pending - - @property - def content(self): - """Content of the response, in bytes.""" - - if self._content is False: - # Read the contents. - try: - if self._content_consumed: - raise RuntimeError( - 'The content for this response was already consumed') - - if self.status_code == 0: - self._content = None - else: - self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() - - except AttributeError: - self._content = None - - self._content_consumed = True - # don't need to release the connection; that's been handled by urllib3 - # since we exhausted the data. - return self._content - - @property - def text(self): - """Content of the response, in unicode. - - if Response.encoding is None and chardet module is available, encoding - will be guessed. - """ - - # Try charset from content-type - content = None - encoding = self.encoding - - if not self.content: - return str('') - - # Fallback to auto-detected encoding. - if self.encoding is None: - encoding = self.apparent_encoding - - # Decode unicode from given encoding. - try: - content = str(self.content, encoding, errors='replace') - except (LookupError, TypeError): - # A LookupError is raised if the encoding was not found which could - # indicate a misspelling or similar mistake. - # - # A TypeError can be raised if encoding is None - # - # So we try blindly encoding. - content = str(self.content, errors='replace') - - return content - - def json(self, **kwargs): - """Returns the json-encoded content of a response, if any. - - :param \*\*kwargs: Optional arguments that ``json.loads`` takes. - """ - - if not self.encoding and len(self.content) > 3: - # No encoding set. JSON RFC 4627 section 3 states we should expect - # UTF-8, -16 or -32. Detect which one to use; If the detection or - # decoding fails, fall back to `self.text` (using chardet to make - # a best guess). - encoding = guess_json_utf(self.content) - if encoding is not None: - return json.loads(self.content.decode(encoding), **kwargs) - return json.loads(self.text, **kwargs) - - @property - def links(self): - """Returns the parsed header links of the response, if any.""" - - header = self.headers.get('link') - - # l = MultiDict() - l = {} - - if header: - links = parse_header_links(header) - - for link in links: - key = link.get('rel') or link.get('url') - l[key] = link - - return l - - def raise_for_status(self): - """Raises stored :class:`HTTPError`, if one occurred.""" - - http_error_msg = '' - - if 400 <= self.status_code < 500: - http_error_msg = '%s Client Error: %s' % (self.status_code, self.reason) - - elif 500 <= self.status_code < 600: - http_error_msg = '%s Server Error: %s' % (self.status_code, self.reason) - - if http_error_msg: - raise HTTPError(http_error_msg, response=self) - - def close(self): - """Closes the underlying file descriptor and releases the connection - back to the pool. - - *Note: Should not normally need to be called explicitly.* - """ - return self.raw.release_conn() diff --git a/vendor-local/lib/python/requests/packages/__init__.py b/vendor-local/lib/python/requests/packages/__init__.py deleted file mode 100644 index d62c4b7111b..00000000000 --- a/vendor-local/lib/python/requests/packages/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from __future__ import absolute_import - -from . import urllib3 diff --git a/vendor-local/lib/python/requests/packages/charade/__init__.py b/vendor-local/lib/python/requests/packages/charade/__init__.py deleted file mode 100644 index 26362e9739a..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/__init__.py +++ /dev/null @@ -1,66 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -__version__ = "1.0.3" -from sys import version_info - - -def detect(aBuf): - if ((version_info < (3, 0) and isinstance(aBuf, unicode)) or - (version_info >= (3, 0) and not isinstance(aBuf, bytes))): - raise ValueError('Expected a bytes object, not a unicode object') - - from . import universaldetector - u = universaldetector.UniversalDetector() - u.reset() - u.feed(aBuf) - u.close() - return u.result - -def _description_of(path): - """Return a string describing the probable encoding of a file.""" - from charade.universaldetector import UniversalDetector - - u = UniversalDetector() - for line in open(path, 'rb'): - u.feed(line) - u.close() - result = u.result - if result['encoding']: - return '%s: %s with confidence %s' % (path, - result['encoding'], - result['confidence']) - else: - return '%s: no result' % path - - -def charade_cli(): - """ - Script which takes one or more file paths and reports on their detected - encodings - - Example:: - - % chardetect.py somefile someotherfile - somefile: windows-1252 with confidence 0.5 - someotherfile: ascii with confidence 1.0 - - """ - from sys import argv - for path in argv[1:]: - print(_description_of(path)) - \ No newline at end of file diff --git a/vendor-local/lib/python/requests/packages/charade/__main__.py b/vendor-local/lib/python/requests/packages/charade/__main__.py deleted file mode 100644 index c0d587fa9ed..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/__main__.py +++ /dev/null @@ -1,7 +0,0 @@ -''' -support ';python -m charade <file1> [file2] ...' package execution syntax (2.7+) -''' - -from charade import charade_cli - -charade_cli() diff --git a/vendor-local/lib/python/requests/packages/charade/big5freq.py b/vendor-local/lib/python/requests/packages/charade/big5freq.py deleted file mode 100644 index 65bffc04b0d..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/big5freq.py +++ /dev/null @@ -1,925 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Big5 frequency table -# by Taiwan's Mandarin Promotion Council -# <http://www.edu.tw:81/mandr/> -# -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -#Char to FreqOrder table -BIG5_TABLE_SIZE = 5376 - -Big5CharToFreqOrder = ( - 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 -3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 -1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 - 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 -3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 -4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 -5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 - 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 - 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 - 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 -2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 -1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 -3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 - 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 -3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 -2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 - 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 -3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 -1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 -5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 - 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 -5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 -1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 - 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 - 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 -3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 -3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 - 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 -2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 -2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 - 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 - 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 -3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 -1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 -1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 -1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 -2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 - 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 -4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 -1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 -5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 -2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 - 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 - 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 - 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 - 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 -5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 - 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 -1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 - 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 - 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 -5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 -1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 - 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 -3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 -4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 -3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 - 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 - 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 -1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 -4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 -3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 -3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 -2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 -5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 -3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 -5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 -1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 -2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 -1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 - 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 -1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 -4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 -3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 - 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 - 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 - 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 -2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 -5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 -1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 -2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 -1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 -1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 -5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 -5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 -5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 -3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 -4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 -4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 -2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 -5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 -3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 - 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 -5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 -5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 -1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 -2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 -3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 -4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 -5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 -3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 -4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 -1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 -1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 -4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 -1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 - 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 -1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 -1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 -3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 - 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 -5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 -2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 -1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 -1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 -5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 - 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 -4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 - 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 -2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 - 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 -1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 -1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 - 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 -4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 -4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 -1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 -3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 -5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 -5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 -1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 -2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 -1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 -3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 -2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 -3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 -2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 -4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 -4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 -3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 - 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 -3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 - 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 -3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 -4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 -3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 -1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 -5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 - 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 -5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 -1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 - 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 -4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 -4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 - 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 -2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 -2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 -3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 -1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 -4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 -2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 -1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 -1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 -2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 -3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 -1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 -5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 -1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 -4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 -1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 - 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 -1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 -4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 -4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 -2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 -1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 -4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 - 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 -5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 -2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 -3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 -4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 - 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 -5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 -5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 -1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 -4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 -4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 -2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 -3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 -3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 -2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 -1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 -4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 -3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 -3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 -2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 -4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 -5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 -3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 -2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 -3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 -1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 -2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 -3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 -4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 -2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 -2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 -5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 -1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 -2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 -1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 -3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 -4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 -2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 -3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 -3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 -2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 -4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 -2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 -3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 -4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 -5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 -3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 - 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 -1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 -4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 -1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 -4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 -5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 - 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 -5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 -5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 -2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 -3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 -2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 -2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 - 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 -1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 -4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 -3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 -3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 - 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 -2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 - 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 -2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 -4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 -1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 -4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 -1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 -3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 - 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 -3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 -5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 -5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 -3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 -3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 -1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 -2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 -5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 -1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 -1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 -3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 - 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 -1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 -4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 -5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 -2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 -3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 - 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 -1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 -2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 -2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 -5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 -5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 -5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 -2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 -2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 -1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 -4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 -3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 -3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 -4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 -4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 -2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 -2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 -5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 -4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 -5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 -4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 - 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 - 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 -1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 -3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 -4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 -1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 -5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 -2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 -2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 -3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 -5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 -1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 -3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 -5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 -1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 -5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 -2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 -3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 -2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 -3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 -3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 -3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 -4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 - 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 -2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 -4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 -3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 -5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 -1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 -5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 - 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 -1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 - 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 -4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 -1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 -4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 -1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 - 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 -3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 -4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 -5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 - 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 -3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 - 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 #last 512 -#Everything below is of no interest for detection purpose -2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392 -2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408 -5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424 -5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440 -5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456 -5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472 -5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488 -5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504 -5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520 -5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536 -5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552 -5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568 -5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584 -5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600 -6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616 -6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632 -6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648 -6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664 -6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680 -6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696 -6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712 -6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728 -6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744 -6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760 -6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776 -6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792 -6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808 -6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824 -6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840 -6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856 -6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872 -6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888 -6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904 -6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920 -6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936 -6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952 -6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968 -6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984 -6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000 -6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016 -6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032 -6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048 -6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064 -6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080 -6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096 -6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112 -6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128 -6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144 -6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160 -6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176 -6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192 -6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208 -6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224 -6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240 -6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256 -3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272 -6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288 -6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304 -3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320 -6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336 -6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352 -6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368 -6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384 -6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400 -6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416 -6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432 -4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448 -6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464 -6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480 -3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496 -6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512 -6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528 -6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544 -6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560 -6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576 -6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592 -6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608 -6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624 -6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640 -6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656 -6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672 -7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688 -7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704 -7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720 -7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736 -7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752 -7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768 -7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784 -7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800 -7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816 -7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832 -7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848 -7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864 -7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880 -7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896 -7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912 -7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928 -7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944 -7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960 -7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976 -7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992 -7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008 -7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024 -7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040 -7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056 -7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072 -7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088 -7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104 -7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120 -7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136 -7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152 -7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168 -7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184 -7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200 -7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216 -7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232 -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248 -7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264 -7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280 -7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296 -7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312 -7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328 -7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344 -7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360 -7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376 -7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392 -7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408 -7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424 -7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440 -3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456 -7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472 -7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488 -7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504 -7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520 -4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536 -7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552 -7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568 -7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584 -7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600 -7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616 -7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632 -7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648 -7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664 -7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680 -7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696 -7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712 -8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728 -8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744 -8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760 -8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776 -8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792 -8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808 -8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824 -8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840 -8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856 -8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872 -8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888 -8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904 -8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920 -8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936 -8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952 -8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968 -8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984 -8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016 -8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032 -8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048 -8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064 -8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080 -8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096 -8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112 -8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128 -8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144 -8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160 -8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176 -8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192 -8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208 -8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224 -8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240 -8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256 -8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272 -8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288 -8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304 -8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320 -8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336 -8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352 -8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368 -8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384 -8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400 -8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416 -8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432 -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448 -8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464 -8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480 -8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496 -8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512 -8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528 -8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544 -8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560 -8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576 -8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592 -8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608 -8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624 -8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640 -8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656 -8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672 -8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688 -4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704 -8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720 -8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736 -8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752 -8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768 -9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784 -9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800 -9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816 -9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832 -9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848 -9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864 -9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880 -9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896 -9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912 -9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928 -9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944 -9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960 -9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976 -9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992 -9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008 -9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024 -9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040 -9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056 -9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072 -9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088 -9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104 -9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120 -9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136 -9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152 -9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168 -9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184 -9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200 -9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216 -9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232 -9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248 -9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264 -9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280 -9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296 -9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312 -9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328 -9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344 -9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360 -9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376 -3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392 -9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408 -9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424 -9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440 -4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456 -9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472 -9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488 -9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504 -9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520 -9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536 -9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552 -9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568 -9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584 -9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600 -9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616 -9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632 -9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648 -9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664 -9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680 -9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696 -9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712 -9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728 -9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744 -9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760 -9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776 -9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792 -9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808 -9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824 -10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840 -10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856 -10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872 -10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888 -10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904 -10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920 -10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936 -10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952 -10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968 -4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984 -10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000 -10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016 -10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032 -10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048 -10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064 -10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080 -10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096 -10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112 -4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128 -10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144 -10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160 -10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176 -10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192 -10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208 -10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224 -10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240 -10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256 -10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272 -10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288 -10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304 -10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320 -10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336 -10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352 -10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368 -10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384 -10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400 -4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416 -10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432 -10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448 -10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464 -10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480 -10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496 -10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512 -10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528 -10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544 -10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560 -10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576 -10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592 -10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608 -10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624 -10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640 -10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656 -10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672 -10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688 -10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704 -10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720 -10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736 -10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752 -10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768 -10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784 -10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800 -10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816 -10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832 -10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848 -10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864 -10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880 -10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896 -11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912 -11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928 -11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944 -4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960 -11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976 -11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992 -11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008 -11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024 -11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040 -11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056 -11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072 -11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088 -11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104 -11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120 -11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136 -11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152 -11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168 -11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184 -11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200 -11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216 -11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232 -11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248 -11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264 -11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280 -11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296 -11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312 -11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328 -11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344 -11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360 -11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376 -11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392 -11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408 -11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424 -11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440 -11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456 -11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472 -4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488 -11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504 -11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520 -11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536 -11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552 -11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568 -11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584 -11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600 -11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616 -11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632 -11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648 -11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664 -11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680 -11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696 -11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712 -11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728 -11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744 -11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760 -11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776 -11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792 -11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808 -11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824 -11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840 -11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856 -11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872 -11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888 -11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904 -11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920 -11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936 -12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952 -12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968 -12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984 -12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000 -12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016 -12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032 -12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048 -12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064 -12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080 -12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096 -12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112 -12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128 -12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144 -12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160 -12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176 -4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192 -4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208 -4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224 -12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240 -12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256 -12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272 -12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288 -12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304 -12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320 -12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336 -12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352 -12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368 -12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384 -12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400 -12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416 -12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432 -12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448 -12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464 -12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480 -12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496 -12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512 -12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528 -12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544 -12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560 -12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576 -12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592 -12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608 -12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624 -12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640 -12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656 -12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672 -12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688 -12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704 -12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720 -12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736 -12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752 -12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768 -12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784 -12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800 -12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816 -12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832 -12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848 -12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864 -12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880 -12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896 -12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912 -12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928 -12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944 -12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960 -12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976 -4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992 -13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008 -13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024 -13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040 -13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056 -13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072 -13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088 -13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104 -4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120 -13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136 -13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152 -13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168 -13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184 -13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200 -13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216 -13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232 -13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248 -13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264 -13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280 -13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296 -13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312 -13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328 -13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344 -13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360 -5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376 -13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392 -13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408 -13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424 -13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440 -13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456 -13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472 -13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488 -13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504 -13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520 -13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536 -13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552 -13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568 -13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584 -13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600 -13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616 -13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632 -13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648 -13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664 -13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680 -13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696 -13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712 -13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728 -13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744 -13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760 -13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776 -13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792 -13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808 -13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824 -13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840 -13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856 -13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872 -13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888 -13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904 -13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920 -13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936 -13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952 -13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968 -13968,13969,13970,13971,13972) #13973 - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/big5prober.py b/vendor-local/lib/python/requests/packages/charade/big5prober.py deleted file mode 100644 index 7382f7c5d49..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/big5prober.py +++ /dev/null @@ -1,42 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import Big5DistributionAnalysis -from .mbcssm import Big5SMModel - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(Big5SMModel) - self._mDistributionAnalyzer = Big5DistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "Big5" diff --git a/vendor-local/lib/python/requests/packages/charade/chardistribution.py b/vendor-local/lib/python/requests/packages/charade/chardistribution.py deleted file mode 100644 index dfd3355e916..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/chardistribution.py +++ /dev/null @@ -1,231 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO) -from .compat import wrap_ord - -ENOUGH_DATA_THRESHOLD = 1024 -SURE_YES = 0.99 -SURE_NO = 0.01 -MINIMUM_DATA_THRESHOLD = 3 - - -class CharDistributionAnalysis: - def __init__(self): - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._mCharToFreqOrder = None - self._mTableSize = None # Size of above table - # This is a constant value which varies from language to language, - # used in calculating confidence. See - # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html - # for further detail. - self._mTypicalDistributionRatio = None - self.reset() - - def reset(self): - """reset analyser, clear any state""" - # If this flag is set to True, detection is done and conclusion has - # been made - self._mDone = False - self._mTotalChars = 0 # Total characters encountered - # The number of characters whose frequency order is less than 512 - self._mFreqChars = 0 - - def feed(self, aBuf, aCharLen): - """feed a character with known length""" - if aCharLen == 2: - # we only care about 2-bytes character in our distribution analysis - order = self.get_order(aBuf) - else: - order = -1 - if order >= 0: - self._mTotalChars += 1 - # order is valid - if order < self._mTableSize: - if 512 > self._mCharToFreqOrder[order]: - self._mFreqChars += 1 - - def get_confidence(self): - """return confidence based on existing data""" - # if we didn't receive any character in our consideration range, - # return negative answer - if self._mTotalChars <= 0 or self._mFreqChars <= MINIMUM_DATA_THRESHOLD: - return SURE_NO - - if self._mTotalChars != self._mFreqChars: - r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars) - * self._mTypicalDistributionRatio)) - if r < SURE_YES: - return r - - # normalize confidence (we don't want to be 100% sure) - return SURE_YES - - def got_enough_data(self): - # It is not necessary to receive all data to draw conclusion. - # For charset detection, certain amount of data is enough - return self._mTotalChars > ENOUGH_DATA_THRESHOLD - - def get_order(self, aBuf): - # We do not handle characters based on the original encoding string, - # but convert this encoding string to a number, here called order. - # This allows multiple encodings of a language to share one frequency - # table. - return -1 - - -class EUCTWDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCTWCharToFreqOrder - self._mTableSize = EUCTW_TABLE_SIZE - self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-TW encoding, we are interested - # first byte range: 0xc4 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = wrap_ord(aBuf[0]) - if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1 - else: - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCKRCharToFreqOrder - self._mTableSize = EUCKR_TABLE_SIZE - self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-KR encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = wrap_ord(aBuf[0]) - if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1 - else: - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = GB2312CharToFreqOrder - self._mTableSize = GB2312_TABLE_SIZE - self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for GB2312 encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if (first_char >= 0xB0) and (second_char >= 0xA1): - return 94 * (first_char - 0xB0) + second_char - 0xA1 - else: - return -1 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = Big5CharToFreqOrder - self._mTableSize = BIG5_TABLE_SIZE - self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for big5 encoding, we are interested - # first byte range: 0xa4 -- 0xfe - # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if first_char >= 0xA4: - if second_char >= 0xA1: - return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 - else: - return 157 * (first_char - 0xA4) + second_char - 0x40 - else: - return -1 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for sjis encoding, we are interested - # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe - # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if (first_char >= 0x81) and (first_char <= 0x9F): - order = 188 * (first_char - 0x81) - elif (first_char >= 0xE0) and (first_char <= 0xEF): - order = 188 * (first_char - 0xE0 + 31) - else: - return -1 - order = order + second_char - 0x40 - if second_char > 0x7F: - order = -1 - return order - - -class EUCJPDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-JP encoding, we are interested - # first byte range: 0xa0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - char = wrap_ord(aBuf[0]) - if char >= 0xA0: - return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1 - else: - return -1 diff --git a/vendor-local/lib/python/requests/packages/charade/charsetgroupprober.py b/vendor-local/lib/python/requests/packages/charade/charsetgroupprober.py deleted file mode 100644 index 29596547489..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/charsetgroupprober.py +++ /dev/null @@ -1,106 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import sys -from .charsetprober import CharSetProber - - -class CharSetGroupProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mActiveNum = 0 - self._mProbers = [] - self._mBestGuessProber = None - - def reset(self): - CharSetProber.reset(self) - self._mActiveNum = 0 - for prober in self._mProbers: - if prober: - prober.reset() - prober.active = True - self._mActiveNum += 1 - self._mBestGuessProber = None - - def get_charset_name(self): - if not self._mBestGuessProber: - self.get_confidence() - if not self._mBestGuessProber: - return None -# self._mBestGuessProber = self._mProbers[0] - return self._mBestGuessProber.get_charset_name() - - def feed(self, aBuf): - for prober in self._mProbers: - if not prober: - continue - if not prober.active: - continue - st = prober.feed(aBuf) - if not st: - continue - if st == constants.eFoundIt: - self._mBestGuessProber = prober - return self.get_state() - elif st == constants.eNotMe: - prober.active = False - self._mActiveNum -= 1 - if self._mActiveNum <= 0: - self._mState = constants.eNotMe - return self.get_state() - return self.get_state() - - def get_confidence(self): - st = self.get_state() - if st == constants.eFoundIt: - return 0.99 - elif st == constants.eNotMe: - return 0.01 - bestConf = 0.0 - self._mBestGuessProber = None - for prober in self._mProbers: - if not prober: - continue - if not prober.active: - if constants._debug: - sys.stderr.write(prober.get_charset_name() - + ' not active\n') - continue - cf = prober.get_confidence() - if constants._debug: - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), cf)) - if bestConf < cf: - bestConf = cf - self._mBestGuessProber = prober - if not self._mBestGuessProber: - return 0.0 - return bestConf -# else: -# self._mBestGuessProber = self._mProbers[0] -# return self._mBestGuessProber.get_confidence() diff --git a/vendor-local/lib/python/requests/packages/charade/charsetprober.py b/vendor-local/lib/python/requests/packages/charade/charsetprober.py deleted file mode 100644 index 97581712c1c..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/charsetprober.py +++ /dev/null @@ -1,62 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import re - - -class CharSetProber: - def __init__(self): - pass - - def reset(self): - self._mState = constants.eDetecting - - def get_charset_name(self): - return None - - def feed(self, aBuf): - pass - - def get_state(self): - return self._mState - - def get_confidence(self): - return 0.0 - - def filter_high_bit_only(self, aBuf): - aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf) - return aBuf - - def filter_without_english_letters(self, aBuf): - aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf) - return aBuf - - def filter_with_english_letters(self, aBuf): - # TODO - return aBuf diff --git a/vendor-local/lib/python/requests/packages/charade/codingstatemachine.py b/vendor-local/lib/python/requests/packages/charade/codingstatemachine.py deleted file mode 100644 index 1bda9ff1620..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/codingstatemachine.py +++ /dev/null @@ -1,61 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart -from .compat import wrap_ord - - -class CodingStateMachine: - def __init__(self, sm): - self._mModel = sm - self._mCurrentBytePos = 0 - self._mCurrentCharLen = 0 - self.reset() - - def reset(self): - self._mCurrentState = eStart - - def next_state(self, c): - # for each byte we get its class - # if it is first byte, we also get byte length - # PY3K: aBuf is a byte stream, so c is an int, not a byte - byteCls = self._mModel['classTable'][wrap_ord(c)] - if self._mCurrentState == eStart: - self._mCurrentBytePos = 0 - self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] - # from byte's class and stateTable, we get its next state - curr_state = (self._mCurrentState * self._mModel['classFactor'] - + byteCls) - self._mCurrentState = self._mModel['stateTable'][curr_state] - self._mCurrentBytePos += 1 - return self._mCurrentState - - def get_current_charlen(self): - return self._mCurrentCharLen - - def get_coding_state_machine(self): - return self._mModel['name'] diff --git a/vendor-local/lib/python/requests/packages/charade/compat.py b/vendor-local/lib/python/requests/packages/charade/compat.py deleted file mode 100644 index d9e30addf9b..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/compat.py +++ /dev/null @@ -1,34 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# Contributor(s): -# Ian Cordasco - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys - - -if sys.version_info < (3, 0): - base_str = (str, unicode) -else: - base_str = (bytes, str) - - -def wrap_ord(a): - if sys.version_info < (3, 0) and isinstance(a, base_str): - return ord(a) - else: - return a diff --git a/vendor-local/lib/python/requests/packages/charade/constants.py b/vendor-local/lib/python/requests/packages/charade/constants.py deleted file mode 100644 index a3d27de250b..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/constants.py +++ /dev/null @@ -1,39 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -_debug = 0 - -eDetecting = 0 -eFoundIt = 1 -eNotMe = 2 - -eStart = 0 -eError = 1 -eItsMe = 2 - -SHORTCUT_THRESHOLD = 0.95 diff --git a/vendor-local/lib/python/requests/packages/charade/cp949prober.py b/vendor-local/lib/python/requests/packages/charade/cp949prober.py deleted file mode 100644 index 543501fe092..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/cp949prober.py +++ /dev/null @@ -1,44 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import CP949SMModel - - -class CP949Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(CP949SMModel) - # NOTE: CP949 is a superset of EUC-KR, so the distribution should be - # not different. - self._mDistributionAnalyzer = EUCKRDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "CP949" diff --git a/vendor-local/lib/python/requests/packages/charade/escprober.py b/vendor-local/lib/python/requests/packages/charade/escprober.py deleted file mode 100644 index 0063935ce65..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/escprober.py +++ /dev/null @@ -1,86 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -from .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, - ISO2022KRSMModel) -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .compat import wrap_ord - - -class EscCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = [ - CodingStateMachine(HZSMModel), - CodingStateMachine(ISO2022CNSMModel), - CodingStateMachine(ISO2022JPSMModel), - CodingStateMachine(ISO2022KRSMModel) - ] - self.reset() - - def reset(self): - CharSetProber.reset(self) - for codingSM in self._mCodingSM: - if not codingSM: - continue - codingSM.active = True - codingSM.reset() - self._mActiveSM = len(self._mCodingSM) - self._mDetectedCharset = None - - def get_charset_name(self): - return self._mDetectedCharset - - def get_confidence(self): - if self._mDetectedCharset: - return 0.99 - else: - return 0.00 - - def feed(self, aBuf): - for c in aBuf: - # PY3K: aBuf is a byte array, so c is an int, not a byte - for codingSM in self._mCodingSM: - if not codingSM: - continue - if not codingSM.active: - continue - codingState = codingSM.next_state(wrap_ord(c)) - if codingState == constants.eError: - codingSM.active = False - self._mActiveSM -= 1 - if self._mActiveSM <= 0: - self._mState = constants.eNotMe - return self.get_state() - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - self._mDetectedCharset = codingSM.get_coding_state_machine() # nopep8 - return self.get_state() - - return self.get_state() diff --git a/vendor-local/lib/python/requests/packages/charade/escsm.py b/vendor-local/lib/python/requests/packages/charade/escsm.py deleted file mode 100644 index 1cf3aa6db6d..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/escsm.py +++ /dev/null @@ -1,242 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart, eError, eItsMe - -HZ_cls = ( -1,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,0,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,4,0,5,2,0, # 78 - 7f -1,1,1,1,1,1,1,1, # 80 - 87 -1,1,1,1,1,1,1,1, # 88 - 8f -1,1,1,1,1,1,1,1, # 90 - 97 -1,1,1,1,1,1,1,1, # 98 - 9f -1,1,1,1,1,1,1,1, # a0 - a7 -1,1,1,1,1,1,1,1, # a8 - af -1,1,1,1,1,1,1,1, # b0 - b7 -1,1,1,1,1,1,1,1, # b8 - bf -1,1,1,1,1,1,1,1, # c0 - c7 -1,1,1,1,1,1,1,1, # c8 - cf -1,1,1,1,1,1,1,1, # d0 - d7 -1,1,1,1,1,1,1,1, # d8 - df -1,1,1,1,1,1,1,1, # e0 - e7 -1,1,1,1,1,1,1,1, # e8 - ef -1,1,1,1,1,1,1,1, # f0 - f7 -1,1,1,1,1,1,1,1, # f8 - ff -) - -HZ_st = ( -eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f -eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 - 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f - 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 - 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f -) - -HZCharLenTable = (0, 0, 0, 0, 0, 0) - -HZSMModel = {'classTable': HZ_cls, - 'classFactor': 6, - 'stateTable': HZ_st, - 'charLenTable': HZCharLenTable, - 'name': "HZ-GB-2312"} - -ISO2022CN_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,3,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,4,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022CN_st = ( -eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 -eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f -eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 -eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 - 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 -eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f -) - -ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022CNSMModel = {'classTable': ISO2022CN_cls, - 'classFactor': 9, - 'stateTable': ISO2022CN_st, - 'charLenTable': ISO2022CNCharLenTable, - 'name': "ISO-2022-CN"} - -ISO2022JP_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,2,2, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,7,0,0,0, # 20 - 27 -3,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -6,0,4,0,8,0,0,0, # 40 - 47 -0,9,5,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022JP_st = ( -eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 -eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 -eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f -eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 -eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f -eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f -eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 -) - -ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022JPSMModel = {'classTable': ISO2022JP_cls, - 'classFactor': 10, - 'stateTable': ISO2022JP_st, - 'charLenTable': ISO2022JPCharLenTable, - 'name': "ISO-2022-JP"} - -ISO2022KR_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,3,0,0,0, # 20 - 27 -0,4,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,5,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022KR_st = ( -eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f -eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 -eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f -eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 -) - -ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) - -ISO2022KRSMModel = {'classTable': ISO2022KR_cls, - 'classFactor': 6, - 'stateTable': ISO2022KR_st, - 'charLenTable': ISO2022KRCharLenTable, - 'name': "ISO-2022-KR"} - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/eucjpprober.py b/vendor-local/lib/python/requests/packages/charade/eucjpprober.py deleted file mode 100644 index d70cfbbb017..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/eucjpprober.py +++ /dev/null @@ -1,90 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCJPDistributionAnalysis -from .jpcntx import EUCJPContextAnalysis -from .mbcssm import EUCJPSMModel - - -class EUCJPProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCJPSMModel) - self._mDistributionAnalyzer = EUCJPDistributionAnalysis() - self._mContextAnalyzer = EUCJPContextAnalysis() - self.reset() - - def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() - - def get_charset_name(self): - return "EUC-JP" - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar, charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) diff --git a/vendor-local/lib/python/requests/packages/charade/euckrfreq.py b/vendor-local/lib/python/requests/packages/charade/euckrfreq.py deleted file mode 100644 index a179e4c21c0..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/euckrfreq.py +++ /dev/null @@ -1,596 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology - -# 128 --> 0.79 -# 256 --> 0.92 -# 512 --> 0.986 -# 1024 --> 0.99944 -# 2048 --> 0.99999 -# -# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 -# Random Distribution Ration = 512 / (2350-512) = 0.279. -# -# Typical Distribution Ratio - -EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 - -EUCKR_TABLE_SIZE = 2352 - -# Char to FreqOrder table , -EUCKRCharToFreqOrder = ( \ - 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, -1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, -1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, - 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, - 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, - 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, -1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, - 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, - 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, -1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, -1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, -1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, -1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, -1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, - 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, -1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, -1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, -1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, -1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, - 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, -1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, - 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, - 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, -1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, - 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, -1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, - 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, - 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, -1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, -1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, -1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, -1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, - 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, -1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, - 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, - 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, -1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, -1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, -1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, -1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, -1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, -1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, - 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, - 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, - 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, -1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, - 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, -1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, - 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, - 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, -2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, - 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, - 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, -2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, -2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, - 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, - 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, -2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, - 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, -1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, -2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, -1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, -2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, -2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, -1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, - 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, -2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, -2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, - 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, - 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, -2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, -1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, -2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, -2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, -2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, -2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, -2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, -2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, -1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, -2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, -2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, -2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, -2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, -2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, -1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, -1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, -2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, -1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, -2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, -1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, - 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, -2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, - 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, -2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, - 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, -2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, -2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, - 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, -2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, -1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, - 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, -1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, -2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, -1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, -2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, - 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, -2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, -1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, -2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, -1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, -2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, -1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, - 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, -2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, -2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, - 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, - 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, -1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, -1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, - 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, -2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, -2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, - 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, - 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, - 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, -2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, - 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, - 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, -2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, -2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, - 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, -2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, -1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, - 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, -2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, -2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, -2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, - 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, - 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, - 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, -2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, -2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, -2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, -1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, -2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, - 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 -#Everything below is of no interest for detection purpose -2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, -2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, -2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, -2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, -2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, -2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, -2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, -2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, -2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, -2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, -2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, -2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, -2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, -2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, -1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, -2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, -2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, -2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, -2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, -2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, -2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, -2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, -2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, -2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, -3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, -3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, -3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, -3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, -3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, -3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, -3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, -3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, -3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, -3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, -3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, -3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, -3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, -3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, -3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, -3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, -3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, -3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, -3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, -3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, -3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, -3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, -3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, -3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, -3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, -3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, -3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, -3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, -3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, -3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, -3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, -3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, -1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, -1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, -3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, -3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, -3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, -3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, -3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, -3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, -3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, -3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, -3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, -3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, -3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, -3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, -3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, -1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, -3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, -3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, -3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, -3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, -3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, -3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, -3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, -1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, -3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, -3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, -3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, -3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, -1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, -3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, -3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, -3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, -3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, -3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, -3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, -3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, -4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, -4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, -1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, -4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, -4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, -4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, -4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, -4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, -4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, -4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, -4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, -4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, -4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, -4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, -4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, -4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, -4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, -4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, -4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, -4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, -4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, -4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, -4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, -4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, -4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, -4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, -4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, -4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, -4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, -4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, -4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, -4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, -4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, -4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, -4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, -4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, -4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, -4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, -4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, -4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, -4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, -4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, -4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, -4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, -4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, -1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, -4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, -4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, -4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, -4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, -4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, -4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, -4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, -4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, -4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, -4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, -4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, -4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, -4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, -4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, -4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, -4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, -4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, -4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, -4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, -4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, -5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, -5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, -1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, -5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, -5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, -5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, -5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, -5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, -1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, -5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, -5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, -5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, -5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, -5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, -1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, -5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, -5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, -5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, -5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, -5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, -5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, -5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, -5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, -5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, -5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, -5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, -5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, -5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, -5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, -5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, -5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, -5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, -5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, -5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, -5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, -5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, -5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, -5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, -1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, -5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, -5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, -5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, -5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, -1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, -5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, -5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, -5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, -5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, -5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, -1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, -5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, -1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, -5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, -5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, -5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, -5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, -5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, -5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, -5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, -5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, -5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, -5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, -5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, -5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, -5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, -5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, -6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, -6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, -6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, -6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, -6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, -6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, -6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, -6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, -6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, -6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, -6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, -6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, -6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, -6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, -6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, -6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, -6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, #1024 -6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, -6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, -6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, -6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, -6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, -6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, -6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, -6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, -6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, -6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, -6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, -6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, -6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, -6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, -6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, -6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, -6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, -6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, -1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, -6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, -6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, -6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, -6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, -6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, -1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, -6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, -1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, -6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, -6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, -6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, -1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, -6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, -6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, -6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, -6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, -6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, -6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, -6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, -6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, -6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, -6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, -6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, -6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, -6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, -6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, -6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, -6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, -6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, -7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, -7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, -7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, -7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, -7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, -7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, -7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, -7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, -7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, -7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, -7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, -7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, -7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, -7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, -7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, -7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, -7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, -7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, -7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, -7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, -7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, -7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, -7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, -7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, -7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, -7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, -7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, -7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, -7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, -7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, -7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, -7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, -7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, -7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, -7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, -7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, -7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, -7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, -7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, -7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, -7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, -7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, -7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, -7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, -7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, -7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, -7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, -7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, -7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, -7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, -7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, -7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, -7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, -7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, -7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, -7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, -7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, -8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, -8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, -8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, -8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, -8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, -8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, -8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, -8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, -8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, -8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, -8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, -8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, -8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, -8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, -8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, -8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, -8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, -8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, -8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, -8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, -8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, -8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, -8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, -8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, -8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, -8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, -8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, -8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, -8736,8737,8738,8739,8740,8741) - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/euckrprober.py b/vendor-local/lib/python/requests/packages/charade/euckrprober.py deleted file mode 100644 index def3e429028..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/euckrprober.py +++ /dev/null @@ -1,42 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKRSMModel - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCKRSMModel) - self._mDistributionAnalyzer = EUCKRDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "EUC-KR" diff --git a/vendor-local/lib/python/requests/packages/charade/euctwfreq.py b/vendor-local/lib/python/requests/packages/charade/euctwfreq.py deleted file mode 100644 index 576e7504dca..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/euctwfreq.py +++ /dev/null @@ -1,428 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# EUCTW frequency table -# Converted from big5 work -# by Taiwan's Mandarin Promotion Council -# <http:#www.edu.tw:81/mandr/> - -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -# Char to FreqOrder table , -EUCTW_TABLE_SIZE = 8102 - -EUCTWCharToFreqOrder = ( - 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 -3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 -1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 - 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 -3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 -4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 -7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 - 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 - 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 - 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 -2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 -1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 -3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 - 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 -3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 -2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 - 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 -3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 -1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 -7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 - 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 -7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 -1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 - 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 - 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 -3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 -3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 - 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 -2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 -2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 - 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 - 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 -3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 -1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 -1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 -1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 -2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 - 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 -4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 -1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 -7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 -2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 - 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 - 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 - 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 - 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 -7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 - 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 -1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 - 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 - 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 -7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 -1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 - 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 -3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 -4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 -3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 - 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 - 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 -1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 -4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 -3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 -3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 -2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 -7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 -3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 -7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 -1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 -2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 -1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 - 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 -1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 -4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 -3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 - 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 - 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 - 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 -2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 -7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 -1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 -2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 -1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 -1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 -7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 -7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 -7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 -3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 -4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 -1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 -7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 -2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 -7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 -3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 -3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 -7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 -2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 -7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 - 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 -4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 -2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 -7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 -3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 -2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 -2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 - 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 -2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 -1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 -1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 -2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 -1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 -7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 -7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 -2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 -4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 -1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 -7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 - 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 -4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 - 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 -2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 - 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 -1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 -1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 - 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 -3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 -3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 -1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 -3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 -7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 -7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 -1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 -2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 -1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 -3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 -2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 -3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 -2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 -4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 -4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 -3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 - 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 -3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 - 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 -3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 -3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 -3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 -1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 -7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 - 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 -7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 -1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 - 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 -4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 -3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 - 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 -2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 -2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 -3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 -1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 -4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 -2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 -1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 -1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 -2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 -3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 -1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 -7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 -1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 -4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 -1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 - 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 -1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 -3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 -3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 -2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 -1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 -4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 - 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 -7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 -2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 -3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 -4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 - 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 -7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 -7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 -1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 -4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 -3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 -2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 -3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 -3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 -2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 -1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 -4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 -3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 -3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 -2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 -4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 -7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 -3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 -2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 -3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 -1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 -2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 -3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 -4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 -2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 -2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 -7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 -1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 -2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 -1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 -3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 -4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 -2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 -3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 -3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 -2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 -4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 -2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 -3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 -4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 -7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 -3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 - 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 -1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 -4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 -1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 -4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 -7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 - 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 -7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 -2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 -1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 -1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 -3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 - 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 - 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 - 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 -3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 -2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 - 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 -7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 -1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 -3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 -7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 -1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 -7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 -4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 -1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 -2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 -2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 -4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 - 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 - 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 -3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 -3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 -1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 -2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 -7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 -1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 -1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 -3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 - 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 -1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 -4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 -7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 -2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 -3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 - 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 -1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 -2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 -2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 -7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 -7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 -7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 -2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 -2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 -1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 -4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 -3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 -3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 -4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 -4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 -2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 -2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 -7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 -4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 -7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 -2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 -1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 -3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 -4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 -2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 - 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 -2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 -1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 -2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 -2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 -4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 -7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 -1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 -3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 -7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 -1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 -8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 -2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 -8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 -2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 -2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 -8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 -8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 -8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 - 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 -8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 -4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 -3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 -8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 -1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 -8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 - 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 -1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 - 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 -4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 -1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 -4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 -1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 - 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 -3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 -4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 -8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 - 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 -3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 - 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 -2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 -#Everything below is of no interest for detection purpose -2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118 -2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134 -8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150 -8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166 -8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182 -8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198 -8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214 -8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230 -8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246 -8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262 -8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294 -8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310 -8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326 -8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342 -8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358 -8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374 -8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390 -8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406 -8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422 -8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438 -8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454 -8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470 -8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486 -8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502 -8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518 -8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534 -8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550 -8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566 -8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582 -8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598 -8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614 -8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630 -8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646 -8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662 -8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678 -8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694 -8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710 -8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726 -8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742 - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/euctwprober.py b/vendor-local/lib/python/requests/packages/charade/euctwprober.py deleted file mode 100644 index e601adfdc60..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/euctwprober.py +++ /dev/null @@ -1,41 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTWSMModel - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCTWSMModel) - self._mDistributionAnalyzer = EUCTWDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "EUC-TW" diff --git a/vendor-local/lib/python/requests/packages/charade/gb2312freq.py b/vendor-local/lib/python/requests/packages/charade/gb2312freq.py deleted file mode 100644 index 1238f510fc6..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/gb2312freq.py +++ /dev/null @@ -1,472 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# GB2312 most frequently used character table -# -# Char to FreqOrder table , from hz6763 - -# 512 --> 0.79 -- 0.79 -# 1024 --> 0.92 -- 0.13 -# 2048 --> 0.98 -- 0.06 -# 6768 --> 1.00 -- 0.02 -# -# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 -# Random Distribution Ration = 512 / (3755 - 512) = 0.157 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR - -GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 - -GB2312_TABLE_SIZE = 3760 - -GB2312CharToFreqOrder = ( -1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, -2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, -2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, - 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, -1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, -1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, - 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, -1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, -2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, -3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, - 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, -1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, - 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, -2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, - 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, -2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, -1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, -3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, - 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, -1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, - 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, -2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, -1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, -3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, -1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, -2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, -1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, - 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, -3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, -3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, - 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, -3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, - 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, -1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, -3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, -2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, -1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, - 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, -1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, -4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, - 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, -3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, -3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, - 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, -1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, -2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, -1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, -1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, - 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, -3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, -3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, -4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, - 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, -3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, -1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, -1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, -4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, - 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, - 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, -3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, -1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, - 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, -1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, -2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, - 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, - 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, - 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, -3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, -4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, -3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, - 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, -2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, -2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, -2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, - 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, -2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, - 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, - 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, - 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, -3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, -2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, -2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, -1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, - 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, -2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, - 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, - 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, -1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, -1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, - 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, - 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, -1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, -2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, -3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, -2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, -2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, -2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, -3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, -1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, -1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, -2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, -1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, -3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, -1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, -1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, -3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, - 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, -2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, -1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, -4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, -1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, -1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, -3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, -1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, - 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, - 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, -1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, - 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, -1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, -1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, - 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, -3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, -4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, -3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, -2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, -2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, -1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, -3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, -2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, -1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, -1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, - 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, -2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, -2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, -3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, -4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, -3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, - 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, -3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, -2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, -1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, - 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, - 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, -3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, -4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, -2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, -1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, -1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, - 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, -1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, -3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, - 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, - 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, -1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, - 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, -1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, - 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, -2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, - 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, -2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, -2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, -1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, -1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, -2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, - 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, -1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, -1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, -2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, -2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, -3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, -1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, -4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, - 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, - 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, -3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, -1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, - 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, -3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, -1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, -4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, -1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, -2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, -1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, - 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, -1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, -3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, - 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, -2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, - 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, -1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, -1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, -1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, -3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, -2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, -3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, -3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, -3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, - 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, -2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, - 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, -2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, - 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, -1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, - 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, - 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, -1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, -3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, -3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, -1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, -1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, -3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, -2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, -2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, -1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, -3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, - 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, -4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, -1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, -2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, -3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, -3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, -1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, - 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, - 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, -2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, - 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, -1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, - 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, -1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, -1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, -1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, -1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, -1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, - 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, - 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, # last 512 -#Everything below is of no interest for detection purpose -5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, -5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, -5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, -3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, -4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, -5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, -5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, -4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, -4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, -4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, -4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, -3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, -6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, -4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, -6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, -4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, -4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, -4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, -5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, -3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, -4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, -3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, -4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, -4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, -6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, -6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, -5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, -4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, -6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, -4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, -5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, -5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, -5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, -6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, -3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, -6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, -4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, -5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, -6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, -6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, -4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, -5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, -4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, -5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, -5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, -4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, -4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, -5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, -4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, -4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, -5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, -4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, -4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, -4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, -5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, -5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, -4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, -3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, -4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, -6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, -5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, -5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, -4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, -6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, -5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, -6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, -4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, -5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, -5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, -3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, -5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, -6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, -4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, -6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, -4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, -4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, -6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, -3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, -6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, -4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, -3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, -3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, -3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, -4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, -2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, -5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, -4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, -5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, -5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, -5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, -4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, -5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, -4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, -5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, -1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, -3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, -4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, -4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, -6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, -4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, -5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, -3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, -5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, -5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, -5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, -3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, -5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, -5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, -3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, -5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, -5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, -5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, -6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, -4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, -6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, -4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, -3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, -4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, -5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, -5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, -5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, -3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, -3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, -6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, -6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, -5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, -6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, -6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, -6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, -6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, -6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, -5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, -6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, -6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, -3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, -3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, -4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, -4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, -3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, -5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, -5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, -5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, -5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, -5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, -4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, -5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, -6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, -5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, -4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, -4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, -6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, -3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, -4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, -4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, -5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, -6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, -6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, -4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, -6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, -5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, -5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, -5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, -5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, -5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, -4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, -5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, -5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, -5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, -5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, -6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, -4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, -5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, -4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, -4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, -6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, -4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, -6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, -3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, -5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, -6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, -6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, -6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, -5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, -6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, -6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, -3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, -5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, -4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767) - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/gb2312prober.py b/vendor-local/lib/python/requests/packages/charade/gb2312prober.py deleted file mode 100644 index 643fe2519e7..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/gb2312prober.py +++ /dev/null @@ -1,41 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312SMModel - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(GB2312SMModel) - self._mDistributionAnalyzer = GB2312DistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "GB2312" diff --git a/vendor-local/lib/python/requests/packages/charade/hebrewprober.py b/vendor-local/lib/python/requests/packages/charade/hebrewprober.py deleted file mode 100644 index 90d171f302d..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/hebrewprober.py +++ /dev/null @@ -1,283 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Shy Shalom -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .constants import eNotMe, eDetecting -from .compat import wrap_ord - -# This prober doesn't actually recognize a language or a charset. -# It is a helper prober for the use of the Hebrew model probers - -### General ideas of the Hebrew charset recognition ### -# -# Four main charsets exist in Hebrew: -# "ISO-8859-8" - Visual Hebrew -# "windows-1255" - Logical Hebrew -# "ISO-8859-8-I" - Logical Hebrew -# "x-mac-hebrew" - ?? Logical Hebrew ?? -# -# Both "ISO" charsets use a completely identical set of code points, whereas -# "windows-1255" and "x-mac-hebrew" are two different proper supersets of -# these code points. windows-1255 defines additional characters in the range -# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific -# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. -# x-mac-hebrew defines similar additional code points but with a different -# mapping. -# -# As far as an average Hebrew text with no diacritics is concerned, all four -# charsets are identical with respect to code points. Meaning that for the -# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters -# (including final letters). -# -# The dominant difference between these charsets is their directionality. -# "Visual" directionality means that the text is ordered as if the renderer is -# not aware of a BIDI rendering algorithm. The renderer sees the text and -# draws it from left to right. The text itself when ordered naturally is read -# backwards. A buffer of Visual Hebrew generally looks like so: -# "[last word of first line spelled backwards] [whole line ordered backwards -# and spelled backwards] [first word of first line spelled backwards] -# [end of line] [last word of second line] ... etc' " -# adding punctuation marks, numbers and English text to visual text is -# naturally also "visual" and from left to right. -# -# "Logical" directionality means the text is ordered "naturally" according to -# the order it is read. It is the responsibility of the renderer to display -# the text from right to left. A BIDI algorithm is used to place general -# punctuation marks, numbers and English text in the text. -# -# Texts in x-mac-hebrew are almost impossible to find on the Internet. From -# what little evidence I could find, it seems that its general directionality -# is Logical. -# -# To sum up all of the above, the Hebrew probing mechanism knows about two -# charsets: -# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are -# backwards while line order is natural. For charset recognition purposes -# the line order is unimportant (In fact, for this implementation, even -# word order is unimportant). -# Logical Hebrew - "windows-1255" - normal, naturally ordered text. -# -# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be -# specifically identified. -# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew -# that contain special punctuation marks or diacritics is displayed with -# some unconverted characters showing as question marks. This problem might -# be corrected using another model prober for x-mac-hebrew. Due to the fact -# that x-mac-hebrew texts are so rare, writing another model prober isn't -# worth the effort and performance hit. -# -#### The Prober #### -# -# The prober is divided between two SBCharSetProbers and a HebrewProber, -# all of which are managed, created, fed data, inquired and deleted by the -# SBCSGroupProber. The two SBCharSetProbers identify that the text is in -# fact some kind of Hebrew, Logical or Visual. The final decision about which -# one is it is made by the HebrewProber by combining final-letter scores -# with the scores of the two SBCharSetProbers to produce a final answer. -# -# The SBCSGroupProber is responsible for stripping the original text of HTML -# tags, English characters, numbers, low-ASCII punctuation characters, spaces -# and new lines. It reduces any sequence of such characters to a single space. -# The buffer fed to each prober in the SBCS group prober is pure text in -# high-ASCII. -# The two SBCharSetProbers (model probers) share the same language model: -# Win1255Model. -# The first SBCharSetProber uses the model normally as any other -# SBCharSetProber does, to recognize windows-1255, upon which this model was -# built. The second SBCharSetProber is told to make the pair-of-letter -# lookup in the language model backwards. This in practice exactly simulates -# a visual Hebrew model using the windows-1255 logical Hebrew model. -# -# The HebrewProber is not using any language model. All it does is look for -# final-letter evidence suggesting the text is either logical Hebrew or visual -# Hebrew. Disjointed from the model probers, the results of the HebrewProber -# alone are meaningless. HebrewProber always returns 0.00 as confidence -# since it never identifies a charset by itself. Instead, the pointer to the -# HebrewProber is passed to the model probers as a helper "Name Prober". -# When the Group prober receives a positive identification from any prober, -# it asks for the name of the charset identified. If the prober queried is a -# Hebrew model prober, the model prober forwards the call to the -# HebrewProber to make the final decision. In the HebrewProber, the -# decision is made according to the final-letters scores maintained and Both -# model probers scores. The answer is returned in the form of the name of the -# charset identified, either "windows-1255" or "ISO-8859-8". - -# windows-1255 / ISO-8859-8 code points of interest -FINAL_KAF = 0xea -NORMAL_KAF = 0xeb -FINAL_MEM = 0xed -NORMAL_MEM = 0xee -FINAL_NUN = 0xef -NORMAL_NUN = 0xf0 -FINAL_PE = 0xf3 -NORMAL_PE = 0xf4 -FINAL_TSADI = 0xf5 -NORMAL_TSADI = 0xf6 - -# Minimum Visual vs Logical final letter score difference. -# If the difference is below this, don't rely solely on the final letter score -# distance. -MIN_FINAL_CHAR_DISTANCE = 5 - -# Minimum Visual vs Logical model score difference. -# If the difference is below this, don't rely at all on the model score -# distance. -MIN_MODEL_DISTANCE = 0.01 - -VISUAL_HEBREW_NAME = "ISO-8859-8" -LOGICAL_HEBREW_NAME = "windows-1255" - - -class HebrewProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mLogicalProber = None - self._mVisualProber = None - self.reset() - - def reset(self): - self._mFinalCharLogicalScore = 0 - self._mFinalCharVisualScore = 0 - # The two last characters seen in the previous buffer, - # mPrev and mBeforePrev are initialized to space in order to simulate - # a word delimiter at the beginning of the data - self._mPrev = ' ' - self._mBeforePrev = ' ' - # These probers are owned by the group prober. - - def set_model_probers(self, logicalProber, visualProber): - self._mLogicalProber = logicalProber - self._mVisualProber = visualProber - - def is_final(self, c): - return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, - FINAL_TSADI] - - def is_non_final(self, c): - # The normal Tsadi is not a good Non-Final letter due to words like - # 'lechotet' (to chat) containing an apostrophe after the tsadi. This - # apostrophe is converted to a space in FilterWithoutEnglishLetters - # causing the Non-Final tsadi to appear at an end of a word even - # though this is not the case in the original text. - # The letters Pe and Kaf rarely display a related behavior of not being - # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' - # for example legally end with a Non-Final Pe or Kaf. However, the - # benefit of these letters as Non-Final letters outweighs the damage - # since these words are quite rare. - return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] - - def feed(self, aBuf): - # Final letter analysis for logical-visual decision. - # Look for evidence that the received buffer is either logical Hebrew - # or visual Hebrew. - # The following cases are checked: - # 1) A word longer than 1 letter, ending with a final letter. This is - # an indication that the text is laid out "naturally" since the - # final letter really appears at the end. +1 for logical score. - # 2) A word longer than 1 letter, ending with a Non-Final letter. In - # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, - # should not end with the Non-Final form of that letter. Exceptions - # to this rule are mentioned above in isNonFinal(). This is an - # indication that the text is laid out backwards. +1 for visual - # score - # 3) A word longer than 1 letter, starting with a final letter. Final - # letters should not appear at the beginning of a word. This is an - # indication that the text is laid out backwards. +1 for visual - # score. - # - # The visual score and logical score are accumulated throughout the - # text and are finally checked against each other in GetCharSetName(). - # No checking for final letters in the middle of words is done since - # that case is not an indication for either Logical or Visual text. - # - # We automatically filter out all 7-bit characters (replace them with - # spaces) so the word boundary detection works properly. [MAP] - - if self.get_state() == eNotMe: - # Both model probers say it's not them. No reason to continue. - return eNotMe - - aBuf = self.filter_high_bit_only(aBuf) - - for cur in aBuf: - if cur == ' ': - # We stand on a space - a word just ended - if self._mBeforePrev != ' ': - # next-to-last char was not a space so self._mPrev is not a - # 1 letter word - if self.is_final(self._mPrev): - # case (1) [-2:not space][-1:final letter][cur:space] - self._mFinalCharLogicalScore += 1 - elif self.is_non_final(self._mPrev): - # case (2) [-2:not space][-1:Non-Final letter][ - # cur:space] - self._mFinalCharVisualScore += 1 - else: - # Not standing on a space - if ((self._mBeforePrev == ' ') and - (self.is_final(self._mPrev)) and (cur != ' ')): - # case (3) [-2:space][-1:final letter][cur:not space] - self._mFinalCharVisualScore += 1 - self._mBeforePrev = self._mPrev - self._mPrev = cur - - # Forever detecting, till the end or until both model probers return - # eNotMe (handled above) - return eDetecting - - def get_charset_name(self): - # Make the decision: is it Logical or Visual? - # If the final letter score distance is dominant enough, rely on it. - finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore - if finalsub >= MIN_FINAL_CHAR_DISTANCE: - return LOGICAL_HEBREW_NAME - if finalsub <= -MIN_FINAL_CHAR_DISTANCE: - return VISUAL_HEBREW_NAME - - # It's not dominant enough, try to rely on the model scores instead. - modelsub = (self._mLogicalProber.get_confidence() - - self._mVisualProber.get_confidence()) - if modelsub > MIN_MODEL_DISTANCE: - return LOGICAL_HEBREW_NAME - if modelsub < -MIN_MODEL_DISTANCE: - return VISUAL_HEBREW_NAME - - # Still no good, back to final letter distance, maybe it'll save the - # day. - if finalsub < 0.0: - return VISUAL_HEBREW_NAME - - # (finalsub > 0 - Logical) or (don't know what to do) default to - # Logical. - return LOGICAL_HEBREW_NAME - - def get_state(self): - # Remain active as long as any of the model probers are active. - if (self._mLogicalProber.get_state() == eNotMe) and \ - (self._mVisualProber.get_state() == eNotMe): - return eNotMe - return eDetecting diff --git a/vendor-local/lib/python/requests/packages/charade/jisfreq.py b/vendor-local/lib/python/requests/packages/charade/jisfreq.py deleted file mode 100644 index 064345b0867..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/jisfreq.py +++ /dev/null @@ -1,569 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology -# -# Japanese frequency table, applied to both S-JIS and EUC-JP -# They are sorted in order. - -# 128 --> 0.77094 -# 256 --> 0.85710 -# 512 --> 0.92635 -# 1024 --> 0.97130 -# 2048 --> 0.99431 -# -# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 -# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 -# -# Typical Distribution Ratio, 25% of IDR - -JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 - -# Char to FreqOrder table , -JIS_TABLE_SIZE = 4368 - -JISCharToFreqOrder = ( - 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 -3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 -1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 -2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 -2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 -5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 -1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 -5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 -5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 -5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 -5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 -5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 -5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 -1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 -1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 -1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 -2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 -3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 -3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 - 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 - 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 -1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 - 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 -5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 - 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 - 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 - 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 - 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 - 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 -5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 -5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 -5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 -4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 -5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 -5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 -5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 -5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 -5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 -5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 -5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 -5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 -5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 -3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 -5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 -5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 -5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 -5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 -5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 -5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 -5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 -5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 -5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 -5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 -5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 -5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 -5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 -5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 -5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 -5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 -5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 -5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 -5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 -5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 -5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 -5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 -5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 -5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 -5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 -5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 -5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 -5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 -5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 -5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 -5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 -5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 -5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 -5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 -5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 -5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 -6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 -6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 -6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 -6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 -6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 -6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 -6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 -6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 -4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 - 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 - 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 -1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 -1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 - 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 -3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 -3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 - 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 -3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 -3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 - 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 -2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 - 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 -3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 -1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 - 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 -1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 - 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 -2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 -2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 -2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 -2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 -1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 -1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 -1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 -1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 -2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 -1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 -2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 -1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 -1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 -1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 -1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 -1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 -1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 - 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 - 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 -1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 -2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 -2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 -2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 -3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 -3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 - 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 -3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 -1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 - 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 -2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 -1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 - 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 -3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 -4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 -2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 -1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 -2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 -1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 - 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 - 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 -1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 -2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 -2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 -2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 -3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 -1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 -2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 - 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 - 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 - 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 -1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 -2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 - 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 -1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 -1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 - 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 -1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 -1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 -1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 - 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 -2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 - 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 -2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 -3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 -2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 -1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 -6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 -1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 -2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 -1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 - 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 - 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 -3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 -3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 -1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 -1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 -1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 -1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 - 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 - 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 -2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 - 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 -3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 -2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 - 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 -1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 -2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 - 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 -1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 - 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 -4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 -2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 -1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 - 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 -1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 -2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 - 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 -6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 -1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 -1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 -2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 -3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 - 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 -3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 -1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 - 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 -1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 - 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 -3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 - 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 -2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 - 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 -4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 -2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 -1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 -1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 -1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 - 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 -1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 -3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 -1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 -3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 - 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 - 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 - 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 -2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 -1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 - 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 -1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 - 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 -1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 - 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 - 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 - 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 -1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 -1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 -2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 -4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 - 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 -1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 - 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 -1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 -3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 -1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 -2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 -2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 -1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 -1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 -2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 - 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 -2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 -1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 -1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 -1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 -1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 -3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 -2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 -2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 - 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 -3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 -3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 -1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 -2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 -1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 -2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 -#Everything below is of no interest for detection purpose -2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384 -6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400 -6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416 -6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432 -6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448 -4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464 -4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480 -3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496 -3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512 -4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528 -3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544 -6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560 -4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576 -6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592 -6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608 -6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624 -6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640 -6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656 -6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672 -3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688 -3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704 -6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720 -2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736 -4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752 -4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768 -4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784 -6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800 -3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816 -4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832 -4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848 -6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864 -4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880 -6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896 -3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912 -2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928 -4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944 -2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960 -6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976 -4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992 -6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008 -6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024 -6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040 -4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056 -6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072 -2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088 -6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104 -4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120 -6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136 -4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152 -4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168 -6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184 -6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200 -6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216 -3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232 -1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248 -3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264 -3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280 -4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296 -6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312 -3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328 -6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344 -3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360 -3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376 -2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392 -6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408 -6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424 -3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440 -6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456 -3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472 -6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488 -6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504 -6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520 -4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536 -6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552 -4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568 -3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584 -3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600 -6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616 -6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632 -4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648 -6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664 -6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680 -6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696 -6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712 -6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728 -6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744 -4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760 -4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776 -3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792 -6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808 -4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824 -2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840 -6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856 -6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872 -4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888 -2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904 -4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920 -2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936 -4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952 -4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968 -4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984 -6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000 -3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016 -6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032 -3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048 -6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064 -2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080 -3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096 -7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112 -2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128 -3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144 -3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160 -3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176 -3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192 -7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208 -7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224 -7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240 -7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256 -7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272 -4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288 -3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304 -3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320 -4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336 -3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352 -3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368 -7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384 -4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400 -7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416 -7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432 -7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448 -7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464 -7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480 -4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496 -4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512 -7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528 -3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544 -4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560 -7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576 -7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592 -4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608 -3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624 -3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640 -7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656 -4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672 -4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688 -4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704 -4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720 -4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736 -4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752 -7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768 -7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784 -7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800 -7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816 -7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832 -2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848 -3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864 -7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880 -7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896 -3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912 -4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928 -3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944 -3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960 -2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976 -7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992 -7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008 -4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024 -3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040 -3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056 -7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072 -7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088 -7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104 -4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120 -7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136 -2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152 -3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168 -4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184 -7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200 -4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216 -4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232 -7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248 -7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264 -5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280 -7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296 -7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312 -7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328 -7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344 -7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360 -5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376 -5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392 -7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408 -3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424 -7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440 -7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456 -3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472 -7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488 -7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504 -1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520 -3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536 -4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552 -2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568 -3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584 -2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600 -5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616 -4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632 -4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648 -5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664 -7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680 -7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696 -7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712 -7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728 -3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744 -7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760 -3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776 -7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792 -4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808 -7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824 -7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840 -7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856 -7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872 -7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888 -7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904 -7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920 -7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936 -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952 -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968 -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984 -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000 -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016 -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032 -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048 -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064 -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080 -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096 -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112 -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128 -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144 -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160 -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176 -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192 -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208 -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224 -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240 -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256 -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272 - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/jpcntx.py b/vendor-local/lib/python/requests/packages/charade/jpcntx.py deleted file mode 100644 index e4e9e4da512..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/jpcntx.py +++ /dev/null @@ -1,219 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .compat import wrap_ord - -NUM_OF_CATEGORY = 6 -DONT_KNOW = -1 -ENOUGH_REL_THRESHOLD = 100 -MAX_REL_THRESHOLD = 1000 -MINIMUM_DATA_THRESHOLD = 4 - -# This is hiragana 2-char sequence table, the number in each cell represents its frequency category -jp2CharContext = ( -(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), -(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), -(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), -(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), -(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), -(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), -(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), -(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), -(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), -(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), -(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), -(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), -(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), -(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), -(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), -(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), -(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), -(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), -(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), -(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), -(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), -(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), -(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), -(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), -(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), -(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), -(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), -(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), -(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), -(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), -(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), -(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), -(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), -(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), -(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), -(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), -(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), -(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), -(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), -(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), -(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), -(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), -(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), -(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), -(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), -(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), -(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), -(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), -(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), -(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), -(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), -(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), -(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), -(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), -(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), -(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), -(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), -(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), -(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), -(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), -(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), -(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), -(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), -(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), -(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), -(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), -(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), -(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), -(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), -(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), -(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), -(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), -(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), -(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), -) - -class JapaneseContextAnalysis: - def __init__(self): - self.reset() - - def reset(self): - self._mTotalRel = 0 # total sequence received - # category counters, each interger counts sequence in its category - self._mRelSample = [0] * NUM_OF_CATEGORY - # if last byte in current buffer is not the last byte of a character, - # we need to know how many bytes to skip in next buffer - self._mNeedToSkipCharNum = 0 - self._mLastCharOrder = -1 # The order of previous char - # If this flag is set to True, detection is done and conclusion has - # been made - self._mDone = False - - def feed(self, aBuf, aLen): - if self._mDone: - return - - # The buffer we got is byte oriented, and a character may span in more than one - # buffers. In case the last one or two byte in last buffer is not - # complete, we record how many byte needed to complete that character - # and skip these bytes here. We can choose to record those bytes as - # well and analyse the character once it is complete, but since a - # character will not make much difference, by simply skipping - # this character will simply our logic and improve performance. - i = self._mNeedToSkipCharNum - while i < aLen: - order, charLen = self.get_order(aBuf[i:i + 2]) - i += charLen - if i > aLen: - self._mNeedToSkipCharNum = i - aLen - self._mLastCharOrder = -1 - else: - if (order != -1) and (self._mLastCharOrder != -1): - self._mTotalRel += 1 - if self._mTotalRel > MAX_REL_THRESHOLD: - self._mDone = True - break - self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 - self._mLastCharOrder = order - - def got_enough_data(self): - return self._mTotalRel > ENOUGH_REL_THRESHOLD - - def get_confidence(self): - # This is just one way to calculate confidence. It works well for me. - if self._mTotalRel > MINIMUM_DATA_THRESHOLD: - return float(self._mTotalRel - self._mRelSample[0]) / self._mTotalRel - else: - return DONT_KNOW - - def get_order(self, aBuf): - return -1, 1 - -class SJISContextAnalysis(JapaneseContextAnalysis): - def get_order(self, aBuf): - if not aBuf: - return -1, 1 - # find out current char's byte length - first_char = wrap_ord(aBuf[0]) - if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)): - charLen = 2 - else: - charLen = 1 - - # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) - if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, charLen - - return -1, charLen - -class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, aBuf): - if not aBuf: - return -1, 1 - # find out current char's byte length - first_char = wrap_ord(aBuf[0]) - if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - charLen = 2 - elif first_char == 0x8F: - charLen = 3 - else: - charLen = 1 - - # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) - if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, charLen - - return -1, charLen - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/langbulgarianmodel.py b/vendor-local/lib/python/requests/packages/charade/langbulgarianmodel.py deleted file mode 100644 index ea5a60ba043..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/langbulgarianmodel.py +++ /dev/null @@ -1,229 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -# this table is modified base on win1251BulgarianCharToOrderMap, so -# only number <64 is sure valid - -Latin5_BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 -210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 - 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 - 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 -) - -win1251BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 -221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 - 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 - 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 96.9392% -# first 1024 sequences:3.0618% -# rest sequences: 0.2992% -# negative sequences: 0.0020% -BulgarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, -3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, -0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, -0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, -0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, -0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, -0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, -2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, -3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, -1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, -3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, -1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, -2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, -2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, -3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, -1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, -2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, -2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, -1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, -2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, -2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, -2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, -1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, -2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, -1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, -3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, -1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, -3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, -1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, -2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, -1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, -2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, -1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, -2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, -1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, -2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, -1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, -1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, -1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, -1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, -0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, -1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, -1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -) - -Latin5BulgarianModel = { - 'charToOrderMap': Latin5_BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" -} - -Win1251BulgarianModel = { - 'charToOrderMap': win1251BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" -} - - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/langcyrillicmodel.py b/vendor-local/lib/python/requests/packages/charade/langcyrillicmodel.py deleted file mode 100644 index 15e338fc111..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/langcyrillicmodel.py +++ /dev/null @@ -1,329 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# KOI8-R language model -# Character Mapping Table: -KOI8R_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 -223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 -238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 - 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 - 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 - 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 - 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 -) - -win1251_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -) - -latin5_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -macCyrillic_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, -) - -IBM855_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, -206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, - 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, -220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, -230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, - 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, - 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, -250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, -) - -IBM866_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 97.6601% -# first 1024 sequences: 2.3389% -# rest sequences: 0.1237% -# negative sequences: 0.0009% -RussianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, -1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, -1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, -2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, -1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, -3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, -1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, -2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, -1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, -1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, -1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, -1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, -3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, -1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, -2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, -1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, -2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, -1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, -1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, -1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, -3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, -3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, -1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, -1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, -0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, -1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, -1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, -0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, -1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, -1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, -1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, -2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, -1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, -1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, -1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, -0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, -0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, -0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -) - -Koi8rModel = { - 'charToOrderMap': KOI8R_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "KOI8-R" -} - -Win1251CyrillicModel = { - 'charToOrderMap': win1251_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" -} - -Latin5CyrillicModel = { - 'charToOrderMap': latin5_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" -} - -MacCyrillicModel = { - 'charToOrderMap': macCyrillic_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "MacCyrillic" -}; - -Ibm866Model = { - 'charToOrderMap': IBM866_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM866" -} - -Ibm855Model = { - 'charToOrderMap': IBM855_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM855" -} - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/langgreekmodel.py b/vendor-local/lib/python/requests/packages/charade/langgreekmodel.py deleted file mode 100644 index 93241ce26bb..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/langgreekmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin7_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -win1253_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.2851% -# first 1024 sequences:1.7001% -# rest sequences: 0.0359% -# negative sequences: 0.0148% -GreekLangModel = ( -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, -2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, -2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, -2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, -0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, -3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, -2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, -0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, -0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, -0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, -0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, -0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, -0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, -0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, -0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, -0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, -0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, -0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, -0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, -0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, -0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, -0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, -0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, -0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin7GreekModel = { - 'charToOrderMap': Latin7_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-7" -} - -Win1253GreekModel = { - 'charToOrderMap': win1253_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "windows-1253" -} - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/langhebrewmodel.py b/vendor-local/lib/python/requests/packages/charade/langhebrewmodel.py deleted file mode 100644 index d87132446d8..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/langhebrewmodel.py +++ /dev/null @@ -1,201 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Simon Montagu -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Shoshannah Forbes - original C code (?) -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Windows-1255 language model -# Character Mapping Table: -win1255_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 - 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 -253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 - 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 -124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, -215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, - 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, -106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, - 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, -238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, - 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, - 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.4004% -# first 1024 sequences: 1.5981% -# rest sequences: 0.087% -# negative sequences: 0.0015% -HebrewLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, -3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, -1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, -1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, -1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, -1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, -0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, -0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, -0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, -0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, -0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, -0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, -0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, -0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, -0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, -0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, -0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, -0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, -0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, -1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, -1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, -2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, -0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, -0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, -) - -Win1255HebrewModel = { - 'charToOrderMap': win1255_CharToOrderMap, - 'precedenceMatrix': HebrewLangModel, - 'mTypicalPositiveRatio': 0.984004, - 'keepEnglishLetter': False, - 'charsetName': "windows-1255" -} - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/langhungarianmodel.py b/vendor-local/lib/python/requests/packages/charade/langhungarianmodel.py deleted file mode 100644 index 6f59c612602..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/langhungarianmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin2_HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, -175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, - 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, - 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, -245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -win1250HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, -177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, - 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, - 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, -245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 94.7368% -# first 1024 sequences:5.2623% -# rest sequences: 0.8894% -# negative sequences: 0.0009% -HungarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, -3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, -0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, -1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, -1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, -3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, -2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, -2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, -2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, -2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, -1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, -1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, -3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, -1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, -1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, -2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, -2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, -2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, -3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, -1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, -1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, -1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, -2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, -1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, -2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, -2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, -1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, -1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, -0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, -2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, -2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, -1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, -1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, -2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, -2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, -2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, -1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, -0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -) - -Latin2HungarianModel = { - 'charToOrderMap': Latin2_HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "ISO-8859-2" -} - -Win1250HungarianModel = { - 'charToOrderMap': win1250HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "windows-1250" -} - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/langthaimodel.py b/vendor-local/lib/python/requests/packages/charade/langthaimodel.py deleted file mode 100644 index df343a74732..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/langthaimodel.py +++ /dev/null @@ -1,200 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# The following result for thai was collected from a limited sample (1M). - -# Character Mapping Table: -TIS620CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 -188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 -253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 - 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 -209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, -223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, -236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, - 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, - 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, - 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, - 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, - 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 92.6386% -# first 1024 sequences:7.3177% -# rest sequences: 1.0230% -# negative sequences: 0.0436% -ThaiLangModel = ( -0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, -0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, -3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, -0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, -3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, -3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, -3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, -3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, -2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, -3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, -1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, -3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, -1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, -0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, -0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, -2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, -0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, -3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, -2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, -2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, -3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, -3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, -3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, -3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, -1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, -0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, -0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, -3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, -3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, -1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, -3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, -3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, -0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, -0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, -1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, -1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, -3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, -0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, -3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, -0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, -0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, -0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, -0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, -0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, -0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, -0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, -3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, -2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, -0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, -3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, -1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -TIS620ThaiModel = { - 'charToOrderMap': TIS620CharToOrderMap, - 'precedenceMatrix': ThaiLangModel, - 'mTypicalPositiveRatio': 0.926386, - 'keepEnglishLetter': False, - 'charsetName': "TIS-620" -} - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/latin1prober.py b/vendor-local/lib/python/requests/packages/charade/latin1prober.py deleted file mode 100644 index 18eefd46a54..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/latin1prober.py +++ /dev/null @@ -1,139 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .constants import eNotMe -from .compat import wrap_ord - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -CLASS_NUM = 8 # total classes - -Latin1_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 - OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F - UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 - OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF - ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF - ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 - ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF - ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 - ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -Latin1ClassModel = ( - # UDF OTH ASC ASS ACV ACO ASV ASO - 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, # ASO -) - - -class Latin1Prober(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self.reset() - - def reset(self): - self._mLastCharClass = OTH - self._mFreqCounter = [0] * FREQ_CAT_NUM - CharSetProber.reset(self) - - def get_charset_name(self): - return "windows-1252" - - def feed(self, aBuf): - aBuf = self.filter_with_english_letters(aBuf) - for c in aBuf: - charClass = Latin1_CharToClass[wrap_ord(c)] - freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) - + charClass] - if freq == 0: - self._mState = eNotMe - break - self._mFreqCounter[freq] += 1 - self._mLastCharClass = charClass - - return self.get_state() - - def get_confidence(self): - if self.get_state() == eNotMe: - return 0.01 - - total = sum(self._mFreqCounter) - if total < 0.01: - confidence = 0.0 - else: - confidence = ((float(self._mFreqCounter[3]) / total) - - (self._mFreqCounter[1] * 20.0 / total)) - if confidence < 0.0: - confidence = 0.0 - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence = confidence * 0.5 - return confidence diff --git a/vendor-local/lib/python/requests/packages/charade/mbcharsetprober.py b/vendor-local/lib/python/requests/packages/charade/mbcharsetprober.py deleted file mode 100644 index 1eee253c047..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/mbcharsetprober.py +++ /dev/null @@ -1,86 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .charsetprober import CharSetProber - - -class MultiByteCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mDistributionAnalyzer = None - self._mCodingSM = None - self._mLastChar = [0, 0] - - def reset(self): - CharSetProber.reset(self) - if self._mCodingSM: - self._mCodingSM.reset() - if self._mDistributionAnalyzer: - self._mDistributionAnalyzer.reset() - self._mLastChar = [0, 0] - - def get_charset_name(self): - pass - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mDistributionAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - return self._mDistributionAnalyzer.get_confidence() diff --git a/vendor-local/lib/python/requests/packages/charade/mbcsgroupprober.py b/vendor-local/lib/python/requests/packages/charade/mbcsgroupprober.py deleted file mode 100644 index 2f6f5e897f6..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/mbcsgroupprober.py +++ /dev/null @@ -1,54 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .utf8prober import UTF8Prober -from .sjisprober import SJISProber -from .eucjpprober import EUCJPProber -from .gb2312prober import GB2312Prober -from .euckrprober import EUCKRProber -from .cp949prober import CP949Prober -from .big5prober import Big5Prober -from .euctwprober import EUCTWProber - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - CP949Prober(), - Big5Prober(), - EUCTWProber() - ] - self.reset() diff --git a/vendor-local/lib/python/requests/packages/charade/mbcssm.py b/vendor-local/lib/python/requests/packages/charade/mbcssm.py deleted file mode 100644 index 55c02f0a063..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/mbcssm.py +++ /dev/null @@ -1,575 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart, eError, eItsMe - -# BIG5 - -BIG5_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 4,4,4,4,4,4,4,4, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 4,3,3,3,3,3,3,3, # a0 - a7 - 3,3,3,3,3,3,3,3, # a8 - af - 3,3,3,3,3,3,3,3, # b0 - b7 - 3,3,3,3,3,3,3,3, # b8 - bf - 3,3,3,3,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -BIG5_st = ( - eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 - eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f - eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17 -) - -Big5CharLenTable = (0, 1, 1, 2, 0) - -Big5SMModel = {'classTable': BIG5_cls, - 'classFactor': 5, - 'stateTable': BIG5_st, - 'charLenTable': Big5CharLenTable, - 'name': 'Big5'} - -# CP949 - -CP949_cls = ( - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f - 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f - 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f - 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f - 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f - 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f - 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f - 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f - 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af - 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf - 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff -) - -CP949_st = ( -#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = - eError,eStart, 3,eError,eStart,eStart, 4, 5,eError, 6, # eStart - eError,eError,eError,eError,eError,eError,eError,eError,eError,eError, # eError - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe, # eItsMe - eError,eError,eStart,eStart,eError,eError,eError,eStart,eStart,eStart, # 3 - eError,eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 4 - eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 5 - eError,eStart,eStart,eStart,eStart,eError,eError,eStart,eStart,eStart, # 6 -) - -CP949CharLenTable = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) - -CP949SMModel = {'classTable': CP949_cls, - 'classFactor': 10, - 'stateTable': CP949_st, - 'charLenTable': CP949CharLenTable, - 'name': 'CP949'} - -# EUC-JP - -EUCJP_cls = ( - 4,4,4,4,4,4,4,4, # 00 - 07 - 4,4,4,4,4,4,5,5, # 08 - 0f - 4,4,4,4,4,4,4,4, # 10 - 17 - 4,4,4,5,4,4,4,4, # 18 - 1f - 4,4,4,4,4,4,4,4, # 20 - 27 - 4,4,4,4,4,4,4,4, # 28 - 2f - 4,4,4,4,4,4,4,4, # 30 - 37 - 4,4,4,4,4,4,4,4, # 38 - 3f - 4,4,4,4,4,4,4,4, # 40 - 47 - 4,4,4,4,4,4,4,4, # 48 - 4f - 4,4,4,4,4,4,4,4, # 50 - 57 - 4,4,4,4,4,4,4,4, # 58 - 5f - 4,4,4,4,4,4,4,4, # 60 - 67 - 4,4,4,4,4,4,4,4, # 68 - 6f - 4,4,4,4,4,4,4,4, # 70 - 77 - 4,4,4,4,4,4,4,4, # 78 - 7f - 5,5,5,5,5,5,5,5, # 80 - 87 - 5,5,5,5,5,5,1,3, # 88 - 8f - 5,5,5,5,5,5,5,5, # 90 - 97 - 5,5,5,5,5,5,5,5, # 98 - 9f - 5,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,0,5 # f8 - ff -) - -EUCJP_st = ( - 3, 4, 3, 5,eStart,eError,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 - eError,eError,eStart,eError,eError,eError, 3,eError,#18-1f - 3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27 -) - -EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) - -EUCJPSMModel = {'classTable': EUCJP_cls, - 'classFactor': 6, - 'stateTable': EUCJP_st, - 'charLenTable': EUCJPCharLenTable, - 'name': 'EUC-JP'} - -# EUC-KR - -EUCKR_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,3,3,3, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,3,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 2,2,2,2,2,2,2,2, # e0 - e7 - 2,2,2,2,2,2,2,2, # e8 - ef - 2,2,2,2,2,2,2,2, # f0 - f7 - 2,2,2,2,2,2,2,0 # f8 - ff -) - -EUCKR_st = ( - eError,eStart, 3,eError,eError,eError,eError,eError,#00-07 - eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f -) - -EUCKRCharLenTable = (0, 1, 2, 0) - -EUCKRSMModel = {'classTable': EUCKR_cls, - 'classFactor': 4, - 'stateTable': EUCKR_st, - 'charLenTable': EUCKRCharLenTable, - 'name': 'EUC-KR'} - -# EUC-TW - -EUCTW_cls = ( - 2,2,2,2,2,2,2,2, # 00 - 07 - 2,2,2,2,2,2,0,0, # 08 - 0f - 2,2,2,2,2,2,2,2, # 10 - 17 - 2,2,2,0,2,2,2,2, # 18 - 1f - 2,2,2,2,2,2,2,2, # 20 - 27 - 2,2,2,2,2,2,2,2, # 28 - 2f - 2,2,2,2,2,2,2,2, # 30 - 37 - 2,2,2,2,2,2,2,2, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,2, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,6,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,3,4,4,4,4,4,4, # a0 - a7 - 5,5,1,1,1,1,1,1, # a8 - af - 1,1,1,1,1,1,1,1, # b0 - b7 - 1,1,1,1,1,1,1,1, # b8 - bf - 1,1,3,1,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -EUCTW_st = ( - eError,eError,eStart, 3, 3, 3, 4,eError,#00-07 - eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 - eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f - 5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 - eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f -) - -EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) - -EUCTWSMModel = {'classTable': EUCTW_cls, - 'classFactor': 7, - 'stateTable': EUCTW_st, - 'charLenTable': EUCTWCharLenTable, - 'name': 'x-euc-tw'} - -# GB2312 - -GB2312_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 3,3,3,3,3,3,3,3, # 30 - 37 - 3,3,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,4, # 78 - 7f - 5,6,6,6,6,6,6,6, # 80 - 87 - 6,6,6,6,6,6,6,6, # 88 - 8f - 6,6,6,6,6,6,6,6, # 90 - 97 - 6,6,6,6,6,6,6,6, # 98 - 9f - 6,6,6,6,6,6,6,6, # a0 - a7 - 6,6,6,6,6,6,6,6, # a8 - af - 6,6,6,6,6,6,6,6, # b0 - b7 - 6,6,6,6,6,6,6,6, # b8 - bf - 6,6,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 6,6,6,6,6,6,6,6, # e0 - e7 - 6,6,6,6,6,6,6,6, # e8 - ef - 6,6,6,6,6,6,6,6, # f0 - f7 - 6,6,6,6,6,6,6,0 # f8 - ff -) - -GB2312_st = ( - eError,eStart,eStart,eStart,eStart,eStart, 3,eError,#00-07 - eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 - 4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f - eError,eError, 5,eError,eError,eError,eItsMe,eError,#20-27 - eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f -) - -# To be accurate, the length of class 6 can be either 2 or 4. -# But it is not necessary to discriminate between the two since -# it is used for frequency analysis only, and we are validing -# each code range there as well. So it is safe to set it to be -# 2 here. -GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2) - -GB2312SMModel = {'classTable': GB2312_cls, - 'classFactor': 7, - 'stateTable': GB2312_st, - 'charLenTable': GB2312CharLenTable, - 'name': 'GB2312'} - -# Shift_JIS - -SJIS_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 3,3,3,3,3,3,3,3, # 80 - 87 - 3,3,3,3,3,3,3,3, # 88 - 8f - 3,3,3,3,3,3,3,3, # 90 - 97 - 3,3,3,3,3,3,3,3, # 98 - 9f - #0xa0 is illegal in sjis encoding, but some pages does - #contain such byte. We need to be more error forgiven. - 2,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,4,4,4, # e8 - ef - 4,4,4,4,4,4,4,4, # f0 - f7 - 4,4,4,4,4,0,0,0 # f8 - ff -) - - -SJIS_st = ( - eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17 -) - -SJISCharLenTable = (0, 1, 1, 2, 0, 0) - -SJISSMModel = {'classTable': SJIS_cls, - 'classFactor': 6, - 'stateTable': SJIS_st, - 'charLenTable': SJISCharLenTable, - 'name': 'Shift_JIS'} - -# UCS2-BE - -UCS2BE_cls = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2BE_st = ( - 5, 7, 7,eError, 4, 3,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe, 6, 6, 6, 6,eError,eError,#10-17 - 6, 6, 6, 6, 6,eItsMe, 6, 6,#18-1f - 6, 6, 6, 6, 5, 7, 7,eError,#20-27 - 5, 8, 6, 6,eError, 6, 6, 6,#28-2f - 6, 6, 6, 6,eError,eError,eStart,eStart #30-37 -) - -UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) - -UCS2BESMModel = {'classTable': UCS2BE_cls, - 'classFactor': 6, - 'stateTable': UCS2BE_st, - 'charLenTable': UCS2BECharLenTable, - 'name': 'UTF-16BE'} - -# UCS2-LE - -UCS2LE_cls = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2LE_st = ( - 6, 6, 7, 6, 4, 3,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError,#10-17 - 5, 5, 5,eError, 5,eError, 6, 6,#18-1f - 7, 6, 8, 8, 5, 5, 5,eError,#20-27 - 5, 5, 5,eError,eError,eError, 5, 5,#28-2f - 5, 5, 5,eError, 5,eError,eStart,eStart #30-37 -) - -UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) - -UCS2LESMModel = {'classTable': UCS2LE_cls, - 'classFactor': 6, - 'stateTable': UCS2LE_st, - 'charLenTable': UCS2LECharLenTable, - 'name': 'UTF-16LE'} - -# UTF-8 - -UTF8_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 2,2,2,2,3,3,3,3, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 5,5,5,5,5,5,5,5, # a0 - a7 - 5,5,5,5,5,5,5,5, # a8 - af - 5,5,5,5,5,5,5,5, # b0 - b7 - 5,5,5,5,5,5,5,5, # b8 - bf - 0,0,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 7,8,8,8,8,8,8,8, # e0 - e7 - 8,8,8,8,8,9,8,8, # e8 - ef - 10,11,11,11,11,11,11,11, # f0 - f7 - 12,13,13,13,14,15,0,0 # f8 - ff -) - -UTF8_st = ( - eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 - 9, 11, 8, 7, 6, 5, 4, 3,#08-0f - eError,eError,eError,eError,eError,eError,eError,eError,#10-17 - eError,eError,eError,eError,eError,eError,eError,eError,#18-1f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f - eError,eError, 5, 5, 5, 5,eError,eError,#30-37 - eError,eError,eError,eError,eError,eError,eError,eError,#38-3f - eError,eError,eError, 5, 5, 5,eError,eError,#40-47 - eError,eError,eError,eError,eError,eError,eError,eError,#48-4f - eError,eError, 7, 7, 7, 7,eError,eError,#50-57 - eError,eError,eError,eError,eError,eError,eError,eError,#58-5f - eError,eError,eError,eError, 7, 7,eError,eError,#60-67 - eError,eError,eError,eError,eError,eError,eError,eError,#68-6f - eError,eError, 9, 9, 9, 9,eError,eError,#70-77 - eError,eError,eError,eError,eError,eError,eError,eError,#78-7f - eError,eError,eError,eError,eError, 9,eError,eError,#80-87 - eError,eError,eError,eError,eError,eError,eError,eError,#88-8f - eError,eError, 12, 12, 12, 12,eError,eError,#90-97 - eError,eError,eError,eError,eError,eError,eError,eError,#98-9f - eError,eError,eError,eError,eError, 12,eError,eError,#a0-a7 - eError,eError,eError,eError,eError,eError,eError,eError,#a8-af - eError,eError, 12, 12, 12,eError,eError,eError,#b0-b7 - eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf - eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 - eError,eError,eError,eError,eError,eError,eError,eError #c8-cf -) - -UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) - -UTF8SMModel = {'classTable': UTF8_cls, - 'classFactor': 16, - 'stateTable': UTF8_st, - 'charLenTable': UTF8CharLenTable, - 'name': 'UTF-8'} - -# flake8: noqa diff --git a/vendor-local/lib/python/requests/packages/charade/sbcharsetprober.py b/vendor-local/lib/python/requests/packages/charade/sbcharsetprober.py deleted file mode 100644 index da26715cfcd..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/sbcharsetprober.py +++ /dev/null @@ -1,120 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .charsetprober import CharSetProber -from .compat import wrap_ord - -SAMPLE_SIZE = 64 -SB_ENOUGH_REL_THRESHOLD = 1024 -POSITIVE_SHORTCUT_THRESHOLD = 0.95 -NEGATIVE_SHORTCUT_THRESHOLD = 0.05 -SYMBOL_CAT_ORDER = 250 -NUMBER_OF_SEQ_CAT = 4 -POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1 -#NEGATIVE_CAT = 0 - - -class SingleByteCharSetProber(CharSetProber): - def __init__(self, model, reversed=False, nameProber=None): - CharSetProber.__init__(self) - self._mModel = model - # TRUE if we need to reverse every pair in the model lookup - self._mReversed = reversed - # Optional auxiliary prober for name decision - self._mNameProber = nameProber - self.reset() - - def reset(self): - CharSetProber.reset(self) - # char order of last character - self._mLastOrder = 255 - self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT - self._mTotalSeqs = 0 - self._mTotalChar = 0 - # characters that fall in our sampling range - self._mFreqChar = 0 - - def get_charset_name(self): - if self._mNameProber: - return self._mNameProber.get_charset_name() - else: - return self._mModel['charsetName'] - - def feed(self, aBuf): - if not self._mModel['keepEnglishLetter']: - aBuf = self.filter_without_english_letters(aBuf) - aLen = len(aBuf) - if not aLen: - return self.get_state() - for c in aBuf: - order = self._mModel['charToOrderMap'][wrap_ord(c)] - if order < SYMBOL_CAT_ORDER: - self._mTotalChar += 1 - if order < SAMPLE_SIZE: - self._mFreqChar += 1 - if self._mLastOrder < SAMPLE_SIZE: - self._mTotalSeqs += 1 - if not self._mReversed: - i = (self._mLastOrder * SAMPLE_SIZE) + order - model = self._mModel['precedenceMatrix'][i] - else: # reverse the order of the letters in the lookup - i = (order * SAMPLE_SIZE) + self._mLastOrder - model = self._mModel['precedenceMatrix'][i] - self._mSeqCounters[model] += 1 - self._mLastOrder = order - - if self.get_state() == constants.eDetecting: - if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD: - cf = self.get_confidence() - if cf > POSITIVE_SHORTCUT_THRESHOLD: - if constants._debug: - sys.stderr.write('%s confidence = %s, we have a' - 'winner\n' % - (self._mModel['charsetName'], cf)) - self._mState = constants.eFoundIt - elif cf < NEGATIVE_SHORTCUT_THRESHOLD: - if constants._debug: - sys.stderr.write('%s confidence = %s, below negative' - 'shortcut threshhold %s\n' % - (self._mModel['charsetName'], cf, - NEGATIVE_SHORTCUT_THRESHOLD)) - self._mState = constants.eNotMe - - return self.get_state() - - def get_confidence(self): - r = 0.01 - if self._mTotalSeqs > 0: - r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs - / self._mModel['mTypicalPositiveRatio']) - r = r * self._mFreqChar / self._mTotalChar - if r >= 1.0: - r = 0.99 - return r diff --git a/vendor-local/lib/python/requests/packages/charade/sbcsgroupprober.py b/vendor-local/lib/python/requests/packages/charade/sbcsgroupprober.py deleted file mode 100644 index b224814568f..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/sbcsgroupprober.py +++ /dev/null @@ -1,69 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .sbcharsetprober import SingleByteCharSetProber -from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, - Latin5CyrillicModel, MacCyrillicModel, - Ibm866Model, Ibm855Model) -from .langgreekmodel import Latin7GreekModel, Win1253GreekModel -from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel -from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel -from .langthaimodel import TIS620ThaiModel -from .langhebrewmodel import Win1255HebrewModel -from .hebrewprober import HebrewProber - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ - SingleByteCharSetProber(Win1251CyrillicModel), - SingleByteCharSetProber(Koi8rModel), - SingleByteCharSetProber(Latin5CyrillicModel), - SingleByteCharSetProber(MacCyrillicModel), - SingleByteCharSetProber(Ibm866Model), - SingleByteCharSetProber(Ibm855Model), - SingleByteCharSetProber(Latin7GreekModel), - SingleByteCharSetProber(Win1253GreekModel), - SingleByteCharSetProber(Latin5BulgarianModel), - SingleByteCharSetProber(Win1251BulgarianModel), - SingleByteCharSetProber(Latin2HungarianModel), - SingleByteCharSetProber(Win1250HungarianModel), - SingleByteCharSetProber(TIS620ThaiModel), - ] - hebrewProber = HebrewProber() - logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, - False, hebrewProber) - visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, - hebrewProber) - hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) - self._mProbers.extend([hebrewProber, logicalHebrewProber, - visualHebrewProber]) - - self.reset() diff --git a/vendor-local/lib/python/requests/packages/charade/sjisprober.py b/vendor-local/lib/python/requests/packages/charade/sjisprober.py deleted file mode 100644 index 9bb0cdcf1fd..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/sjisprober.py +++ /dev/null @@ -1,91 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import SJISDistributionAnalysis -from .jpcntx import SJISContextAnalysis -from .mbcssm import SJISSMModel -from . import constants - - -class SJISProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(SJISSMModel) - self._mDistributionAnalyzer = SJISDistributionAnalysis() - self._mContextAnalyzer = SJISContextAnalysis() - self.reset() - - def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() - - def get_charset_name(self): - return "SHIFT_JIS" - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:], - charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3 - - charLen], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) diff --git a/vendor-local/lib/python/requests/packages/charade/universaldetector.py b/vendor-local/lib/python/requests/packages/charade/universaldetector.py deleted file mode 100644 index 6a8e68a8a75..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/universaldetector.py +++ /dev/null @@ -1,168 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import sys -import codecs -from .latin1prober import Latin1Prober # windows-1252 -from .mbcsgroupprober import MBCSGroupProber # multi-byte character sets -from .sbcsgroupprober import SBCSGroupProber # single-byte character sets -from .escprober import EscCharSetProber # ISO-2122, etc. -import re - -MINIMUM_THRESHOLD = 0.20 -ePureAscii = 0 -eEscAscii = 1 -eHighbyte = 2 - - -class UniversalDetector: - def __init__(self): - self._highBitDetector = re.compile(b'[\x80-\xFF]') - self._escDetector = re.compile(b'(\033|~{)') - self._mEscCharSetProber = None - self._mCharSetProbers = [] - self.reset() - - def reset(self): - self.result = {'encoding': None, 'confidence': 0.0} - self.done = False - self._mStart = True - self._mGotData = False - self._mInputState = ePureAscii - self._mLastChar = b'' - if self._mEscCharSetProber: - self._mEscCharSetProber.reset() - for prober in self._mCharSetProbers: - prober.reset() - - def feed(self, aBuf): - if self.done: - return - - aLen = len(aBuf) - if not aLen: - return - - if not self._mGotData: - # If the data starts with BOM, we know it is UTF - if aBuf[:3] == codecs.BOM: - # EF BB BF UTF-8 with BOM - self.result = {'encoding': "UTF-8", 'confidence': 1.0} - elif aBuf[:4] in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): - # FF FE 00 00 UTF-32, little-endian BOM - # 00 00 FE FF UTF-32, big-endian BOM - self.result = {'encoding': "UTF-32", 'confidence': 1.0} - elif aBuf[:4] == b'\xFE\xFF\x00\x00': - # FE FF 00 00 UCS-4, unusual octet order BOM (3412) - self.result = { - 'encoding': "X-ISO-10646-UCS-4-3412", - 'confidence': 1.0 - } - elif aBuf[:4] == b'\x00\x00\xFF\xFE': - # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - self.result = { - 'encoding': "X-ISO-10646-UCS-4-2143", - 'confidence': 1.0 - } - elif aBuf[:2] == codecs.BOM_LE or aBuf[:2] == codecs.BOM_BE: - # FF FE UTF-16, little endian BOM - # FE FF UTF-16, big endian BOM - self.result = {'encoding': "UTF-16", 'confidence': 1.0} - - self._mGotData = True - if self.result['encoding'] and (self.result['confidence'] > 0.0): - self.done = True - return - - if self._mInputState == ePureAscii: - if self._highBitDetector.search(aBuf): - self._mInputState = eHighbyte - elif ((self._mInputState == ePureAscii) and - self._escDetector.search(self._mLastChar + aBuf)): - self._mInputState = eEscAscii - - self._mLastChar = aBuf[-1:] - - if self._mInputState == eEscAscii: - if not self._mEscCharSetProber: - self._mEscCharSetProber = EscCharSetProber() - if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: - self.result = { - 'encoding': self._mEscCharSetProber.get_charset_name(), - 'confidence': self._mEscCharSetProber.get_confidence() - } - self.done = True - elif self._mInputState == eHighbyte: - if not self._mCharSetProbers: - self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), - Latin1Prober()] - for prober in self._mCharSetProbers: - if prober.feed(aBuf) == constants.eFoundIt: - self.result = {'encoding': prober.get_charset_name(), - 'confidence': prober.get_confidence()} - self.done = True - break - - def close(self): - if self.done: - return - if not self._mGotData: - if constants._debug: - sys.stderr.write('no data received!\n') - return - self.done = True - - if self._mInputState == ePureAscii: - self.result = {'encoding': 'ascii', 'confidence': 1.0} - return self.result - - if self._mInputState == eHighbyte: - proberConfidence = None - maxProberConfidence = 0.0 - maxProber = None - for prober in self._mCharSetProbers: - if not prober: - continue - proberConfidence = prober.get_confidence() - if proberConfidence > maxProberConfidence: - maxProberConfidence = proberConfidence - maxProber = prober - if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): - self.result = {'encoding': maxProber.get_charset_name(), - 'confidence': maxProber.get_confidence()} - return self.result - - if constants._debug: - sys.stderr.write('no probers hit minimum threshhold\n') - for prober in self._mCharSetProbers[0].mProbers: - if not prober: - continue - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), - prober.get_confidence())) diff --git a/vendor-local/lib/python/requests/packages/charade/utf8prober.py b/vendor-local/lib/python/requests/packages/charade/utf8prober.py deleted file mode 100644 index 72c8d3d6a9b..00000000000 --- a/vendor-local/lib/python/requests/packages/charade/utf8prober.py +++ /dev/null @@ -1,76 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library 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.1 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8SMModel - -ONE_CHAR_PROB = 0.5 - - -class UTF8Prober(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(UTF8SMModel) - self.reset() - - def reset(self): - CharSetProber.reset(self) - self._mCodingSM.reset() - self._mNumOfMBChar = 0 - - def get_charset_name(self): - return "utf-8" - - def feed(self, aBuf): - for c in aBuf: - codingState = self._mCodingSM.next_state(c) - if codingState == constants.eError: - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - if self._mCodingSM.get_current_charlen() >= 2: - self._mNumOfMBChar += 1 - - if self.get_state() == constants.eDetecting: - if self.get_confidence() > constants.SHORTCUT_THRESHOLD: - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - unlike = 0.99 - if self._mNumOfMBChar < 6: - for i in range(0, self._mNumOfMBChar): - unlike = unlike * ONE_CHAR_PROB - return 1.0 - unlike - else: - return unlike diff --git a/vendor-local/lib/python/requests/packages/urllib3/__init__.py b/vendor-local/lib/python/requests/packages/urllib3/__init__.py deleted file mode 100644 index 73071f7001b..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/__init__.py +++ /dev/null @@ -1,58 +0,0 @@ -# urllib3/__init__.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -""" -urllib3 - Thread-safe connection pooling and re-using. -""" - -__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' -__license__ = 'MIT' -__version__ = 'dev' - - -from .connectionpool import ( - HTTPConnectionPool, - HTTPSConnectionPool, - connection_from_url -) - -from . import exceptions -from .filepost import encode_multipart_formdata -from .poolmanager import PoolManager, ProxyManager, proxy_from_url -from .response import HTTPResponse -from .util import make_headers, get_host, Timeout - - -# Set default logging handler to avoid "No handler found" warnings. -import logging -try: # Python 2.7+ - from logging import NullHandler -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass - -logging.getLogger(__name__).addHandler(NullHandler()) - -def add_stderr_logger(level=logging.DEBUG): - """ - Helper for quickly adding a StreamHandler to the logger. Useful for - debugging. - - Returns the handler after adding it. - """ - # This method needs to be in this __init__.py to get the __name__ correct - # even if urllib3 is vendored within another package. - logger = logging.getLogger(__name__) - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) - logger.addHandler(handler) - logger.setLevel(level) - logger.debug('Added an stderr logging handler to logger: %s' % __name__) - return handler - -# ... Clean up. -del NullHandler diff --git a/vendor-local/lib/python/requests/packages/urllib3/_collections.py b/vendor-local/lib/python/requests/packages/urllib3/_collections.py deleted file mode 100644 index 282b8d5e058..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/_collections.py +++ /dev/null @@ -1,94 +0,0 @@ -# urllib3/_collections.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -from collections import MutableMapping -from threading import RLock - -try: # Python 2.7+ - from collections import OrderedDict -except ImportError: - from .packages.ordered_dict import OrderedDict - - -__all__ = ['RecentlyUsedContainer'] - - -_Null = object() - - -class RecentlyUsedContainer(MutableMapping): - """ - Provides a thread-safe dict-like container which maintains up to - ``maxsize`` keys while throwing away the least-recently-used keys beyond - ``maxsize``. - - :param maxsize: - Maximum number of recent elements to retain. - - :param dispose_func: - Every time an item is evicted from the container, - ``dispose_func(value)`` is called. Callback which will get called - """ - - ContainerCls = OrderedDict - - def __init__(self, maxsize=10, dispose_func=None): - self._maxsize = maxsize - self.dispose_func = dispose_func - - self._container = self.ContainerCls() - self.lock = RLock() - - def __getitem__(self, key): - # Re-insert the item, moving it to the end of the eviction line. - with self.lock: - item = self._container.pop(key) - self._container[key] = item - return item - - def __setitem__(self, key, value): - evicted_value = _Null - with self.lock: - # Possibly evict the existing value of 'key' - evicted_value = self._container.get(key, _Null) - self._container[key] = value - - # If we didn't evict an existing value, we might have to evict the - # least recently used item from the beginning of the container. - if len(self._container) > self._maxsize: - _key, evicted_value = self._container.popitem(last=False) - - if self.dispose_func and evicted_value is not _Null: - self.dispose_func(evicted_value) - - def __delitem__(self, key): - with self.lock: - value = self._container.pop(key) - - if self.dispose_func: - self.dispose_func(value) - - def __len__(self): - with self.lock: - return len(self._container) - - def __iter__(self): - raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') - - def clear(self): - with self.lock: - # Copy pointers to all values, then wipe the mapping - # under Python 2, this copies the list of values twice :-| - values = list(self._container.values()) - self._container.clear() - - if self.dispose_func: - for value in values: - self.dispose_func(value) - - def keys(self): - with self.lock: - return self._container.keys() diff --git a/vendor-local/lib/python/requests/packages/urllib3/connection.py b/vendor-local/lib/python/requests/packages/urllib3/connection.py deleted file mode 100644 index e240786a676..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/connection.py +++ /dev/null @@ -1,107 +0,0 @@ -# urllib3/connection.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import socket -from socket import timeout as SocketTimeout - -try: # Python 3 - from http.client import HTTPConnection, HTTPException -except ImportError: - from httplib import HTTPConnection, HTTPException - -class DummyConnection(object): - "Used to detect a failed ConnectionCls import." - pass - -try: # Compiled with SSL? - ssl = None - HTTPSConnection = DummyConnection - - class BaseSSLError(BaseException): - pass - - try: # Python 3 - from http.client import HTTPSConnection - except ImportError: - from httplib import HTTPSConnection - - import ssl - BaseSSLError = ssl.SSLError - -except (ImportError, AttributeError): # Platform-specific: No SSL. - pass - -from .exceptions import ( - ConnectTimeoutError, -) -from .packages.ssl_match_hostname import match_hostname -from .util import ( - assert_fingerprint, - resolve_cert_reqs, - resolve_ssl_version, - ssl_wrap_socket, -) - -class VerifiedHTTPSConnection(HTTPSConnection): - """ - Based on httplib.HTTPSConnection but wraps the socket with - SSL certification. - """ - cert_reqs = None - ca_certs = None - ssl_version = None - - def set_cert(self, key_file=None, cert_file=None, - cert_reqs=None, ca_certs=None, - assert_hostname=None, assert_fingerprint=None): - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.ca_certs = ca_certs - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - - def connect(self): - # Add certificate verification - try: - sock = socket.create_connection( - address=(self.host, self.port), - timeout=self.timeout, - ) - except SocketTimeout: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) - - resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs) - resolved_ssl_version = resolve_ssl_version(self.ssl_version) - - if self._tunnel_host: - self.sock = sock - # Calls self._set_hostport(), so self.host is - # self._tunnel_host below. - self._tunnel() - - # Wrap socket using verification with the root certs in - # trusted_root_certs - self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file, - cert_reqs=resolved_cert_reqs, - ca_certs=self.ca_certs, - server_hostname=self.host, - ssl_version=resolved_ssl_version) - - if resolved_cert_reqs != ssl.CERT_NONE: - if self.assert_fingerprint: - assert_fingerprint(self.sock.getpeercert(binary_form=True), - self.assert_fingerprint) - elif self.assert_hostname is not False: - match_hostname(self.sock.getpeercert(), - self.assert_hostname or self.host) - - -if ssl: - HTTPSConnection = VerifiedHTTPSConnection diff --git a/vendor-local/lib/python/requests/packages/urllib3/connectionpool.py b/vendor-local/lib/python/requests/packages/urllib3/connectionpool.py deleted file mode 100644 index 1e5814357a1..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/connectionpool.py +++ /dev/null @@ -1,674 +0,0 @@ -# urllib3/connectionpool.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import errno -import logging - -from socket import error as SocketError, timeout as SocketTimeout -import socket - -try: # Python 3 - from queue import LifoQueue, Empty, Full -except ImportError: - from Queue import LifoQueue, Empty, Full - import Queue as _ # Platform-specific: Windows - - -from .exceptions import ( - ClosedPoolError, - ConnectTimeoutError, - EmptyPoolError, - HostChangedError, - MaxRetryError, - SSLError, - TimeoutError, - ReadTimeoutError, - ProxyError, -) -from .packages.ssl_match_hostname import CertificateError -from .packages import six -from .connection import ( - DummyConnection, - HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, - HTTPException, BaseSSLError, -) -from .request import RequestMethods -from .response import HTTPResponse -from .util import ( - assert_fingerprint, - get_host, - is_connection_dropped, - Timeout, -) - - -xrange = six.moves.xrange - -log = logging.getLogger(__name__) - -_Default = object() - -port_by_scheme = { - 'http': 80, - 'https': 443, -} - - -## Pool objects - -class ConnectionPool(object): - """ - Base class for all connection pools, such as - :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. - """ - - scheme = None - QueueCls = LifoQueue - - def __init__(self, host, port=None): - # httplib doesn't like it when we include brackets in ipv6 addresses - host = host.strip('[]') - - self.host = host - self.port = port - - def __str__(self): - return '%s(host=%r, port=%r)' % (type(self).__name__, - self.host, self.port) - -# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 -_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK]) - -class HTTPConnectionPool(ConnectionPool, RequestMethods): - """ - Thread-safe connection pool for one host. - - :param host: - Host used for this HTTP Connection (e.g. "localhost"), passed into - :class:`httplib.HTTPConnection`. - - :param port: - Port used for this HTTP Connection (None is equivalent to 80), passed - into :class:`httplib.HTTPConnection`. - - :param strict: - Causes BadStatusLine to be raised if the status line can't be parsed - as a valid HTTP/1.0 or 1.1 status line, passed into - :class:`httplib.HTTPConnection`. - - .. note:: - Only works in Python 2. This parameter is ignored in Python 3. - - :param timeout: - Socket timeout in seconds for each individual connection. This can - be a float or integer, which sets the timeout for the HTTP request, - or an instance of :class:`urllib3.util.Timeout` which gives you more - fine-grained control over request timeouts. After the constructor has - been parsed, this is always a `urllib3.util.Timeout` object. - - :param maxsize: - Number of connections to save that can be reused. More than 1 is useful - in multithreaded situations. If ``block`` is set to false, more - connections will be created but they will not be saved once they've - been used. - - :param block: - If set to True, no more than ``maxsize`` connections will be used at - a time. When no free connections are available, the call will block - until a connection has been released. This is a useful side effect for - particular multithreaded situations where one does not want to use more - than maxsize connections per host to prevent flooding. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param _proxy: - Parsed proxy URL, should not be used directly, instead, see - :class:`urllib3.connectionpool.ProxyManager`" - - :param _proxy_headers: - A dictionary with proxy headers, should not be used directly, - instead, see :class:`urllib3.connectionpool.ProxyManager`" - """ - - scheme = 'http' - ConnectionCls = HTTPConnection - - def __init__(self, host, port=None, strict=False, - timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, - headers=None, _proxy=None, _proxy_headers=None): - ConnectionPool.__init__(self, host, port) - RequestMethods.__init__(self, headers) - - self.strict = strict - - # This is for backwards compatibility and can be removed once a timeout - # can only be set to a Timeout object - if not isinstance(timeout, Timeout): - timeout = Timeout.from_float(timeout) - - self.timeout = timeout - - self.pool = self.QueueCls(maxsize) - self.block = block - - self.proxy = _proxy - self.proxy_headers = _proxy_headers or {} - - # Fill the queue up so that doing get() on it will block properly - for _ in xrange(maxsize): - self.pool.put(None) - - # These are mostly for testing and debugging purposes. - self.num_connections = 0 - self.num_requests = 0 - - def _new_conn(self): - """ - Return a fresh :class:`httplib.HTTPConnection`. - """ - self.num_connections += 1 - log.info("Starting new HTTP connection (%d): %s" % - (self.num_connections, self.host)) - - extra_params = {} - if not six.PY3: # Python 2 - extra_params['strict'] = self.strict - - return self.ConnectionCls(host=self.host, port=self.port, - timeout=self.timeout.connect_timeout, - **extra_params) - - def _get_conn(self, timeout=None): - """ - Get a connection. Will return a pooled connection if one is available. - - If no connections are available and :prop:`.block` is ``False``, then a - fresh connection is returned. - - :param timeout: - Seconds to wait before giving up and raising - :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and - :prop:`.block` is ``True``. - """ - conn = None - try: - conn = self.pool.get(block=self.block, timeout=timeout) - - except AttributeError: # self.pool is None - raise ClosedPoolError(self, "Pool is closed.") - - except Empty: - if self.block: - raise EmptyPoolError(self, - "Pool reached maximum size and no more " - "connections are allowed.") - pass # Oh well, we'll create a new connection then - - # If this is a persistent connection, check if it got disconnected - if conn and is_connection_dropped(conn): - log.info("Resetting dropped connection: %s" % self.host) - conn.close() - - return conn or self._new_conn() - - def _put_conn(self, conn): - """ - Put a connection back into the pool. - - :param conn: - Connection object for the current host and port as returned by - :meth:`._new_conn` or :meth:`._get_conn`. - - If the pool is already full, the connection is closed and discarded - because we exceeded maxsize. If connections are discarded frequently, - then maxsize should be increased. - - If the pool is closed, then the connection will be closed and discarded. - """ - try: - self.pool.put(conn, block=False) - return # Everything is dandy, done. - except AttributeError: - # self.pool is None. - pass - except Full: - # This should never happen if self.block == True - log.warning("HttpConnectionPool is full, discarding connection: %s" - % self.host) - - # Connection never got put back into the pool, close it. - if conn: - conn.close() - - def _get_timeout(self, timeout): - """ Helper that always returns a :class:`urllib3.util.Timeout` """ - if timeout is _Default: - return self.timeout.clone() - - if isinstance(timeout, Timeout): - return timeout.clone() - else: - # User passed us an int/float. This is for backwards compatibility, - # can be removed later - return Timeout.from_float(timeout) - - def _make_request(self, conn, method, url, timeout=_Default, - **httplib_request_kw): - """ - Perform a request on a given httplib connection object taken from our - pool. - - :param conn: - a connection from one of our connection pools - - :param timeout: - Socket timeout in seconds for the request. This can be a - float or integer, which will set the same timeout value for - the socket connect and the socket read, or an instance of - :class:`urllib3.util.Timeout`, which gives you more fine-grained - control over your timeouts. - """ - self.num_requests += 1 - - timeout_obj = self._get_timeout(timeout) - - try: - timeout_obj.start_connect() - conn.timeout = timeout_obj.connect_timeout - # conn.request() calls httplib.*.request, not the method in - # urllib3.request. It also calls makefile (recv) on the socket. - conn.request(method, url, **httplib_request_kw) - except SocketTimeout: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, timeout_obj.connect_timeout)) - - # Reset the timeout for the recv() on the socket - read_timeout = timeout_obj.read_timeout - - # App Engine doesn't have a sock attr - if hasattr(conn, 'sock'): - # In Python 3 socket.py will catch EAGAIN and return None when you - # try and read into the file pointer created by http.client, which - # instead raises a BadStatusLine exception. Instead of catching - # the exception and assuming all BadStatusLine exceptions are read - # timeouts, check for a zero timeout before making the request. - if read_timeout == 0: - raise ReadTimeoutError( - self, url, - "Read timed out. (read timeout=%s)" % read_timeout) - if read_timeout is Timeout.DEFAULT_TIMEOUT: - conn.sock.settimeout(socket.getdefaulttimeout()) - else: # None or a value - conn.sock.settimeout(read_timeout) - - # Receive the response from the server - try: - try: # Python 2.7+, use buffering of HTTP responses - httplib_response = conn.getresponse(buffering=True) - except TypeError: # Python 2.6 and older - httplib_response = conn.getresponse() - except SocketTimeout: - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % read_timeout) - - except BaseSSLError as e: - # Catch possible read timeouts thrown as SSL errors. If not the - # case, rethrow the original. We need to do this because of: - # http://bugs.python.org/issue10272 - if 'timed out' in str(e) or \ - 'did not complete (read)' in str(e): # Python 2.6 - raise ReadTimeoutError(self, url, "Read timed out.") - - raise - - except SocketError as e: # Platform-specific: Python 2 - # See the above comment about EAGAIN in Python 3. In Python 2 we - # have to specifically catch it and throw the timeout error - if e.errno in _blocking_errnos: - raise ReadTimeoutError( - self, url, - "Read timed out. (read timeout=%s)" % read_timeout) - - raise - - # AppEngine doesn't have a version attr. - http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') - log.debug("\"%s %s %s\" %s %s" % (method, url, http_version, - httplib_response.status, - httplib_response.length)) - return httplib_response - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - # Disable access to the pool - old_pool, self.pool = self.pool, None - - try: - while True: - conn = old_pool.get(block=False) - if conn: - conn.close() - - except Empty: - pass # Done. - - def is_same_host(self, url): - """ - Check if the given ``url`` is a member of the same host as this - connection pool. - """ - if url.startswith('/'): - return True - - # TODO: Add optional support for socket.gethostbyname checking. - scheme, host, port = get_host(url) - - if self.port and not port: - # Use explicit default port for comparison when none is given. - port = port_by_scheme.get(scheme) - - return (scheme, host, port) == (self.scheme, self.host, self.port) - - def urlopen(self, method, url, body=None, headers=None, retries=3, - redirect=True, assert_same_host=True, timeout=_Default, - pool_timeout=None, release_conn=None, **response_kw): - """ - Get a connection from the pool and perform an HTTP request. This is the - lowest level call for making a request, so you'll need to specify all - the raw details. - - .. note:: - - More commonly, it's appropriate to use a convenience method provided - by :class:`.RequestMethods`, such as :meth:`request`. - - .. note:: - - `release_conn` will only behave as expected if - `preload_content=False` because we want to make - `preload_content=False` the default behaviour someday soon without - breaking backwards compatibility. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param body: - Data to send in the request body (useful for creating - POST requests, see HTTPConnectionPool.post_url for - more convenience). - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param retries: - Number of retries to allow before raising a MaxRetryError exception. - - :param redirect: - If True, automatically handle redirects (status codes 301, 302, - 303, 307, 308). Each redirect counts as a retry. - - :param assert_same_host: - If ``True``, will make sure that the host of the pool requests is - consistent else will raise HostChangedError. When False, you can - use the pool on an HTTP proxy and request foreign hosts. - - :param timeout: - If specified, overrides the default timeout for this one - request. It may be a float (in seconds) or an instance of - :class:`urllib3.util.Timeout`. - - :param pool_timeout: - If set and the pool is set to block=True, then this method will - block for ``pool_timeout`` seconds and raise EmptyPoolError if no - connection is available within the time period. - - :param release_conn: - If False, then the urlopen call will not release the connection - back into the pool once a response is received (but will release if - you read the entire contents of the response such as when - `preload_content=True`). This is useful if you're not preloading - the response's content immediately. You will need to call - ``r.release_conn()`` on the response ``r`` to return the connection - back into the pool. If None, it takes the value of - ``response_kw.get('preload_content', True)``. - - :param \**response_kw: - Additional parameters are passed to - :meth:`urllib3.response.HTTPResponse.from_httplib` - """ - if headers is None: - headers = self.headers - - if retries < 0: - raise MaxRetryError(self, url) - - if release_conn is None: - release_conn = response_kw.get('preload_content', True) - - # Check host - if assert_same_host and not self.is_same_host(url): - raise HostChangedError(self, url, retries - 1) - - conn = None - - try: - # Request a connection from the queue - conn = self._get_conn(timeout=pool_timeout) - - # Make the request on the httplib connection object - httplib_response = self._make_request(conn, method, url, - timeout=timeout, - body=body, headers=headers) - - # If we're going to release the connection in ``finally:``, then - # the request doesn't need to know about the connection. Otherwise - # it will also try to release it and we'll have a double-release - # mess. - response_conn = not release_conn and conn - - # Import httplib's response into our own wrapper object - response = HTTPResponse.from_httplib(httplib_response, - pool=self, - connection=response_conn, - **response_kw) - - # else: - # The connection will be put back into the pool when - # ``response.release_conn()`` is called (implicitly by - # ``response.read()``) - - except Empty: - # Timed out by queue - raise EmptyPoolError(self, "No pool connections are available.") - - except BaseSSLError as e: - raise SSLError(e) - - except CertificateError as e: - # Name mismatch - raise SSLError(e) - - except TimeoutError as e: - # Connection broken, discard. - conn = None - # Save the error off for retry logic. - err = e - - if retries == 0: - raise - - except (HTTPException, SocketError) as e: - if isinstance(e, SocketError) and self.proxy is not None: - raise ProxyError('Cannot connect to proxy. ' - 'Socket error: %s.' % e) - - # Connection broken, discard. It will be replaced next _get_conn(). - conn = None - # This is necessary so we can access e below - err = e - - if retries == 0: - raise MaxRetryError(self, url, e) - - finally: - if release_conn: - # Put the connection back to be reused. If the connection is - # expired then it will be None, which will get replaced with a - # fresh connection during _get_conn. - self._put_conn(conn) - - if not conn: - # Try again - log.warn("Retrying (%d attempts remain) after connection " - "broken by '%r': %s" % (retries, err, url)) - return self.urlopen(method, url, body, headers, retries - 1, - redirect, assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, **response_kw) - - # Handle redirect? - redirect_location = redirect and response.get_redirect_location() - if redirect_location: - if response.status == 303: - method = 'GET' - log.info("Redirecting %s -> %s" % (url, redirect_location)) - return self.urlopen(method, redirect_location, body, headers, - retries - 1, redirect, assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, **response_kw) - - return response - - -class HTTPSConnectionPool(HTTPConnectionPool): - """ - Same as :class:`.HTTPConnectionPool`, but HTTPS. - - When Python is compiled with the :mod:`ssl` module, then - :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, - instead of :class:`httplib.HTTPSConnection`. - - :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, - ``assert_hostname`` and ``host`` in this order to verify connections. - If ``assert_hostname`` is False, no verification is done. - - The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs`` and - ``ssl_version`` are only used if :mod:`ssl` is available and are fed into - :meth:`urllib3.util.ssl_wrap_socket` to upgrade the connection socket - into an SSL socket. - """ - - scheme = 'https' - ConnectionCls = HTTPSConnection - - def __init__(self, host, port=None, - strict=False, timeout=None, maxsize=1, - block=False, headers=None, - _proxy=None, _proxy_headers=None, - key_file=None, cert_file=None, cert_reqs=None, - ca_certs=None, ssl_version=None, - assert_hostname=None, assert_fingerprint=None): - - HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, - block, headers, _proxy, _proxy_headers) - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.ca_certs = ca_certs - self.ssl_version = ssl_version - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - - def _prepare_conn(self, conn): - """ - Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` - and establish the tunnel if proxy is used. - """ - - if isinstance(conn, VerifiedHTTPSConnection): - conn.set_cert(key_file=self.key_file, - cert_file=self.cert_file, - cert_reqs=self.cert_reqs, - ca_certs=self.ca_certs, - assert_hostname=self.assert_hostname, - assert_fingerprint=self.assert_fingerprint) - conn.ssl_version = self.ssl_version - - if self.proxy is not None: - # Python 2.7+ - try: - set_tunnel = conn.set_tunnel - except AttributeError: # Platform-specific: Python 2.6 - set_tunnel = conn._set_tunnel - set_tunnel(self.host, self.port, self.proxy_headers) - # Establish tunnel connection early, because otherwise httplib - # would improperly set Host: header to proxy's IP:port. - conn.connect() - - return conn - - def _new_conn(self): - """ - Return a fresh :class:`httplib.HTTPSConnection`. - """ - self.num_connections += 1 - log.info("Starting new HTTPS connection (%d): %s" - % (self.num_connections, self.host)) - - if not self.ConnectionCls or self.ConnectionCls is DummyConnection: - # Platform-specific: Python without ssl - raise SSLError("Can't connect to HTTPS URL because the SSL " - "module is not available.") - - actual_host = self.host - actual_port = self.port - if self.proxy is not None: - actual_host = self.proxy.host - actual_port = self.proxy.port - - extra_params = {} - if not six.PY3: # Python 2 - extra_params['strict'] = self.strict - - conn = self.ConnectionCls(host=actual_host, port=actual_port, - timeout=self.timeout.connect_timeout, - **extra_params) - - return self._prepare_conn(conn) - - -def connection_from_url(url, **kw): - """ - Given a url, return an :class:`.ConnectionPool` instance of its host. - - This is a shortcut for not having to parse out the scheme, host, and port - of the url before creating an :class:`.ConnectionPool` instance. - - :param url: - Absolute URL string that must include the scheme. Port is optional. - - :param \**kw: - Passes additional parameters to the constructor of the appropriate - :class:`.ConnectionPool`. Useful for specifying things like - timeout, maxsize, headers, etc. - - Example: :: - - >>> conn = connection_from_url('http://google.com/') - >>> r = conn.request('GET', '/') - """ - scheme, host, port = get_host(url) - if scheme == 'https': - return HTTPSConnectionPool(host, port=port, **kw) - else: - return HTTPConnectionPool(host, port=port, **kw) diff --git a/vendor-local/lib/python/requests/packages/urllib3/contrib/__init__.py b/vendor-local/lib/python/requests/packages/urllib3/contrib/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/requests/packages/urllib3/contrib/ntlmpool.py b/vendor-local/lib/python/requests/packages/urllib3/contrib/ntlmpool.py deleted file mode 100644 index b8cd933034c..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/contrib/ntlmpool.py +++ /dev/null @@ -1,120 +0,0 @@ -# urllib3/contrib/ntlmpool.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -""" -NTLM authenticating pool, contributed by erikcederstran - -Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 -""" - -try: - from http.client import HTTPSConnection -except ImportError: - from httplib import HTTPSConnection -from logging import getLogger -from ntlm import ntlm - -from urllib3 import HTTPSConnectionPool - - -log = getLogger(__name__) - - -class NTLMConnectionPool(HTTPSConnectionPool): - """ - Implements an NTLM authentication version of an urllib3 connection pool - """ - - scheme = 'https' - - def __init__(self, user, pw, authurl, *args, **kwargs): - """ - authurl is a random URL on the server that is protected by NTLM. - user is the Windows user, probably in the DOMAIN\\username format. - pw is the password for the user. - """ - super(NTLMConnectionPool, self).__init__(*args, **kwargs) - self.authurl = authurl - self.rawuser = user - user_parts = user.split('\\', 1) - self.domain = user_parts[0].upper() - self.user = user_parts[1] - self.pw = pw - - def _new_conn(self): - # Performs the NTLM handshake that secures the connection. The socket - # must be kept open while requests are performed. - self.num_connections += 1 - log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s' % - (self.num_connections, self.host, self.authurl)) - - headers = {} - headers['Connection'] = 'Keep-Alive' - req_header = 'Authorization' - resp_header = 'www-authenticate' - - conn = HTTPSConnection(host=self.host, port=self.port) - - # Send negotiation message - headers[req_header] = ( - 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) - log.debug('Request headers: %s' % headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - reshdr = dict(res.getheaders()) - log.debug('Response status: %s %s' % (res.status, res.reason)) - log.debug('Response headers: %s' % reshdr) - log.debug('Response data: %s [...]' % res.read(100)) - - # Remove the reference to the socket, so that it can not be closed by - # the response object (we want to keep the socket open) - res.fp = None - - # Server should respond with a challenge message - auth_header_values = reshdr[resp_header].split(', ') - auth_header_value = None - for s in auth_header_values: - if s[:5] == 'NTLM ': - auth_header_value = s[5:] - if auth_header_value is None: - raise Exception('Unexpected %s response header: %s' % - (resp_header, reshdr[resp_header])) - - # Send authentication message - ServerChallenge, NegotiateFlags = \ - ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) - auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, - self.user, - self.domain, - self.pw, - NegotiateFlags) - headers[req_header] = 'NTLM %s' % auth_msg - log.debug('Request headers: %s' % headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - log.debug('Response status: %s %s' % (res.status, res.reason)) - log.debug('Response headers: %s' % dict(res.getheaders())) - log.debug('Response data: %s [...]' % res.read()[:100]) - if res.status != 200: - if res.status == 401: - raise Exception('Server rejected request: wrong ' - 'username or password') - raise Exception('Wrong server response: %s %s' % - (res.status, res.reason)) - - res.fp = None - log.debug('Connection established') - return conn - - def urlopen(self, method, url, body=None, headers=None, retries=3, - redirect=True, assert_same_host=True): - if headers is None: - headers = {} - headers['Connection'] = 'Keep-Alive' - return super(NTLMConnectionPool, self).urlopen(method, url, body, - headers, retries, - redirect, - assert_same_host) diff --git a/vendor-local/lib/python/requests/packages/urllib3/contrib/pyopenssl.py b/vendor-local/lib/python/requests/packages/urllib3/contrib/pyopenssl.py deleted file mode 100644 index 91bc2fa4f75..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/contrib/pyopenssl.py +++ /dev/null @@ -1,346 +0,0 @@ -'''SSL with SNI-support for Python 2. - -This needs the following packages installed: - -* pyOpenSSL (tested with 0.13) -* ndg-httpsclient (tested with 0.3.2) -* pyasn1 (tested with 0.1.6) - -To activate it call :func:`~urllib3.contrib.pyopenssl.inject_into_urllib3`. -This can be done in a ``sitecustomize`` module, or at any other time before -your application begins using ``urllib3``, like this:: - - try: - import urllib3.contrib.pyopenssl - urllib3.contrib.pyopenssl.inject_into_urllib3() - except ImportError: - pass - -Now you can use :mod:`urllib3` as you normally would, and it will support SNI -when the required modules are installed. -''' - -from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT -from ndg.httpsclient.subj_alt_name import SubjectAltName -import OpenSSL.SSL -from pyasn1.codec.der import decoder as der_decoder -from socket import _fileobject -import ssl -import select -from cStringIO import StringIO - -from .. import connectionpool -from .. import util - -__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] - -# SNI only *really* works if we can read the subjectAltName of certificates. -HAS_SNI = SUBJ_ALT_NAME_SUPPORT - -# Map from urllib3 to PyOpenSSL compatible parameter-values. -_openssl_versions = { - ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, - ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD, - ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, -} -_openssl_verify = { - ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, - ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, - ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER - + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, -} - - -orig_util_HAS_SNI = util.HAS_SNI -orig_connectionpool_ssl_wrap_socket = connectionpool.ssl_wrap_socket - - -def inject_into_urllib3(): - 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' - - connectionpool.ssl_wrap_socket = ssl_wrap_socket - util.HAS_SNI = HAS_SNI - - -def extract_from_urllib3(): - 'Undo monkey-patching by :func:`inject_into_urllib3`.' - - connectionpool.ssl_wrap_socket = orig_connectionpool_ssl_wrap_socket - util.HAS_SNI = orig_util_HAS_SNI - - -### Note: This is a slightly bug-fixed version of same from ndg-httpsclient. -def get_subj_alt_name(peer_cert): - # Search through extensions - dns_name = [] - if not SUBJ_ALT_NAME_SUPPORT: - return dns_name - - general_names = SubjectAltName() - for i in range(peer_cert.get_extension_count()): - ext = peer_cert.get_extension(i) - ext_name = ext.get_short_name() - if ext_name != 'subjectAltName': - continue - - # PyOpenSSL returns extension data in ASN.1 encoded form - ext_dat = ext.get_data() - decoded_dat = der_decoder.decode(ext_dat, - asn1Spec=general_names) - - for name in decoded_dat: - if not isinstance(name, SubjectAltName): - continue - for entry in range(len(name)): - component = name.getComponentByPosition(entry) - if component.getName() != 'dNSName': - continue - dns_name.append(str(component.getComponent())) - - return dns_name - - -class fileobject(_fileobject): - - def read(self, size=-1): - # Use max, disallow tiny reads in a loop as they are very inefficient. - # We never leave read() with any leftover data from a new recv() call - # in our internal buffer. - rbufsize = max(self._rbufsize, self.default_bufsize) - # Our use of StringIO rather than lists of string objects returned by - # recv() minimizes memory usage and fragmentation that occurs when - # rbufsize is large compared to the typical return value of recv(). - buf = self._rbuf - buf.seek(0, 2) # seek end - if size < 0: - # Read until EOF - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - while True: - try: - data = self._sock.recv(rbufsize) - except OpenSSL.SSL.WantReadError: - continue - if not data: - break - buf.write(data) - return buf.getvalue() - else: - # Read until size bytes or EOF seen, whichever comes first - buf_len = buf.tell() - if buf_len >= size: - # Already have size bytes in our buffer? Extract and return. - buf.seek(0) - rv = buf.read(size) - self._rbuf = StringIO() - self._rbuf.write(buf.read()) - return rv - - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - while True: - left = size - buf_len - # recv() will malloc the amount of memory given as its - # parameter even though it often returns much less data - # than that. The returned data string is short lived - # as we copy it into a StringIO and free it. This avoids - # fragmentation issues on many platforms. - try: - data = self._sock.recv(left) - except OpenSSL.SSL.WantReadError: - continue - if not data: - break - n = len(data) - if n == size and not buf_len: - # Shortcut. Avoid buffer data copies when: - # - We have no data in our buffer. - # AND - # - Our call to recv returned exactly the - # number of bytes we were asked to read. - return data - if n == left: - buf.write(data) - del data # explicit free - break - assert n <= left, "recv(%d) returned %d bytes" % (left, n) - buf.write(data) - buf_len += n - del data # explicit free - #assert buf_len == buf.tell() - return buf.getvalue() - - def readline(self, size=-1): - buf = self._rbuf - buf.seek(0, 2) # seek end - if buf.tell() > 0: - # check if we already have it in our buffer - buf.seek(0) - bline = buf.readline(size) - if bline.endswith('\n') or len(bline) == size: - self._rbuf = StringIO() - self._rbuf.write(buf.read()) - return bline - del bline - if size < 0: - # Read until \n or EOF, whichever comes first - if self._rbufsize <= 1: - # Speed up unbuffered case - buf.seek(0) - buffers = [buf.read()] - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - data = None - recv = self._sock.recv - while True: - try: - while data != "\n": - data = recv(1) - if not data: - break - buffers.append(data) - except OpenSSL.SSL.WantReadError: - continue - break - return "".join(buffers) - - buf.seek(0, 2) # seek end - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - while True: - try: - data = self._sock.recv(self._rbufsize) - except OpenSSL.SSL.WantReadError: - continue - if not data: - break - nl = data.find('\n') - if nl >= 0: - nl += 1 - buf.write(data[:nl]) - self._rbuf.write(data[nl:]) - del data - break - buf.write(data) - return buf.getvalue() - else: - # Read until size bytes or \n or EOF seen, whichever comes first - buf.seek(0, 2) # seek end - buf_len = buf.tell() - if buf_len >= size: - buf.seek(0) - rv = buf.read(size) - self._rbuf = StringIO() - self._rbuf.write(buf.read()) - return rv - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - while True: - try: - data = self._sock.recv(self._rbufsize) - except OpenSSL.SSL.WantReadError: - continue - if not data: - break - left = size - buf_len - # did we just receive a newline? - nl = data.find('\n', 0, left) - if nl >= 0: - nl += 1 - # save the excess data to _rbuf - self._rbuf.write(data[nl:]) - if buf_len: - buf.write(data[:nl]) - break - else: - # Shortcut. Avoid data copy through buf when returning - # a substring of our first recv(). - return data[:nl] - n = len(data) - if n == size and not buf_len: - # Shortcut. Avoid data copy through buf when - # returning exactly all of our first recv(). - return data - if n >= left: - buf.write(data[:left]) - self._rbuf.write(data[left:]) - break - buf.write(data) - buf_len += n - #assert buf_len == buf.tell() - return buf.getvalue() - - -class WrappedSocket(object): - '''API-compatibility wrapper for Python OpenSSL's Connection-class.''' - - def __init__(self, connection, socket): - self.connection = connection - self.socket = socket - - def fileno(self): - return self.socket.fileno() - - def makefile(self, mode, bufsize=-1): - return fileobject(self.connection, mode, bufsize) - - def settimeout(self, timeout): - return self.socket.settimeout(timeout) - - def sendall(self, data): - return self.connection.sendall(data) - - def close(self): - return self.connection.shutdown() - - def getpeercert(self, binary_form=False): - x509 = self.connection.get_peer_certificate() - - if not x509: - return x509 - - if binary_form: - return OpenSSL.crypto.dump_certificate( - OpenSSL.crypto.FILETYPE_ASN1, - x509) - - return { - 'subject': ( - (('commonName', x509.get_subject().CN),), - ), - 'subjectAltName': [ - ('DNS', value) - for value in get_subj_alt_name(x509) - ] - } - - -def _verify_callback(cnx, x509, err_no, err_depth, return_code): - return err_no == 0 - - -def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, - ca_certs=None, server_hostname=None, - ssl_version=None): - ctx = OpenSSL.SSL.Context(_openssl_versions[ssl_version]) - if certfile: - ctx.use_certificate_file(certfile) - if keyfile: - ctx.use_privatekey_file(keyfile) - if cert_reqs != ssl.CERT_NONE: - ctx.set_verify(_openssl_verify[cert_reqs], _verify_callback) - if ca_certs: - try: - ctx.load_verify_locations(ca_certs, None) - except OpenSSL.SSL.Error as e: - raise ssl.SSLError('bad ca_certs: %r' % ca_certs, e) - - cnx = OpenSSL.SSL.Connection(ctx, sock) - cnx.set_tlsext_host_name(server_hostname) - cnx.set_connect_state() - while True: - try: - cnx.do_handshake() - except OpenSSL.SSL.WantReadError: - select.select([sock], [], []) - continue - except OpenSSL.SSL.Error as e: - raise ssl.SSLError('bad handshake', e) - break - - return WrappedSocket(cnx, sock) diff --git a/vendor-local/lib/python/requests/packages/urllib3/exceptions.py b/vendor-local/lib/python/requests/packages/urllib3/exceptions.py deleted file mode 100644 index 98ef9abc7f0..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/exceptions.py +++ /dev/null @@ -1,121 +0,0 @@ -# urllib3/exceptions.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - - -## Base Exceptions - -class HTTPError(Exception): - "Base exception used by this module." - pass - - -class PoolError(HTTPError): - "Base exception for errors caused within a pool." - def __init__(self, pool, message): - self.pool = pool - HTTPError.__init__(self, "%s: %s" % (pool, message)) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, None) - - -class RequestError(PoolError): - "Base exception for PoolErrors that have associated URLs." - def __init__(self, pool, url, message): - self.url = url - PoolError.__init__(self, pool, message) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, self.url, None) - - -class SSLError(HTTPError): - "Raised when SSL certificate fails in an HTTPS connection." - pass - - -class ProxyError(HTTPError): - "Raised when the connection to a proxy fails." - pass - - -class DecodeError(HTTPError): - "Raised when automatic decoding based on Content-Type fails." - pass - - -## Leaf Exceptions - -class MaxRetryError(RequestError): - "Raised when the maximum number of retries is exceeded." - - def __init__(self, pool, url, reason=None): - self.reason = reason - - message = "Max retries exceeded with url: %s" % url - if reason: - message += " (Caused by %s: %s)" % (type(reason), reason) - else: - message += " (Caused by redirect)" - - RequestError.__init__(self, pool, url, message) - - -class HostChangedError(RequestError): - "Raised when an existing pool gets a request for a foreign host." - - def __init__(self, pool, url, retries=3): - message = "Tried to open a foreign host with url: %s" % url - RequestError.__init__(self, pool, url, message) - self.retries = retries - - -class TimeoutStateError(HTTPError): - """ Raised when passing an invalid state to a timeout """ - pass - - -class TimeoutError(HTTPError): - """ Raised when a socket timeout error occurs. - - Catching this error will catch both :exc:`ReadTimeoutErrors - <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`. - """ - pass - - -class ReadTimeoutError(TimeoutError, RequestError): - "Raised when a socket timeout occurs while receiving data from a server" - pass - - -# This timeout error does not have a URL attached and needs to inherit from the -# base HTTPError -class ConnectTimeoutError(TimeoutError): - "Raised when a socket timeout occurs while connecting to a server" - pass - - -class EmptyPoolError(PoolError): - "Raised when a pool runs out of connections and no more are allowed." - pass - - -class ClosedPoolError(PoolError): - "Raised when a request enters a pool after the pool has been closed." - pass - - -class LocationParseError(ValueError, HTTPError): - "Raised when get_host or similar fails to parse the URL input." - - def __init__(self, location): - message = "Failed to parse: %s" % location - HTTPError.__init__(self, message) - - self.location = location diff --git a/vendor-local/lib/python/requests/packages/urllib3/fields.py b/vendor-local/lib/python/requests/packages/urllib3/fields.py deleted file mode 100644 index ed017657a29..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/fields.py +++ /dev/null @@ -1,177 +0,0 @@ -# urllib3/fields.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import email.utils -import mimetypes - -from .packages import six - - -def guess_content_type(filename, default='application/octet-stream'): - """ - Guess the "Content-Type" of a file. - - :param filename: - The filename to guess the "Content-Type" of using :mod:`mimetimes`. - :param default: - If no "Content-Type" can be guessed, default to `default`. - """ - if filename: - return mimetypes.guess_type(filename)[0] or default - return default - - -def format_header_param(name, value): - """ - Helper function to format and quote a single header parameter. - - Particularly useful for header parameters which might contain - non-ASCII values, like file names. This follows RFC 2231, as - suggested by RFC 2388 Section 4.4. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - if not any(ch in value for ch in '"\\\r\n'): - result = '%s="%s"' % (name, value) - try: - result.encode('ascii') - except UnicodeEncodeError: - pass - else: - return result - if not six.PY3: # Python 2: - value = value.encode('utf-8') - value = email.utils.encode_rfc2231(value, 'utf-8') - value = '%s*=%s' % (name, value) - return value - - -class RequestField(object): - """ - A data container for request body parameters. - - :param name: - The name of this request field. - :param data: - The data/value body. - :param filename: - An optional filename of the request field. - :param headers: - An optional dict-like object of headers to initially use for the field. - """ - def __init__(self, name, data, filename=None, headers=None): - self._name = name - self._filename = filename - self.data = data - self.headers = {} - if headers: - self.headers = dict(headers) - - @classmethod - def from_tuples(cls, fieldname, value): - """ - A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. - - Supports constructing :class:`~urllib3.fields.RequestField` from parameter - of key/value strings AND key/filetuple. A filetuple is a (filename, data, MIME type) - tuple where the MIME type is optional. For example: :: - - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - - Field names and filenames must be unicode. - """ - if isinstance(value, tuple): - if len(value) == 3: - filename, data, content_type = value - else: - filename, data = value - content_type = guess_content_type(filename) - else: - filename = None - content_type = None - data = value - - request_param = cls(fieldname, data, filename=filename) - request_param.make_multipart(content_type=content_type) - - return request_param - - def _render_part(self, name, value): - """ - Overridable helper function to format a single header parameter. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - return format_header_param(name, value) - - def _render_parts(self, header_parts): - """ - Helper function to format and quote a single header. - - Useful for single headers that are composed of multiple items. E.g., - 'Content-Disposition' fields. - - :param header_parts: - A sequence of (k, v) typles or a :class:`dict` of (k, v) to format as - `k1="v1"; k2="v2"; ...`. - """ - parts = [] - iterable = header_parts - if isinstance(header_parts, dict): - iterable = header_parts.items() - - for name, value in iterable: - if value: - parts.append(self._render_part(name, value)) - - return '; '.join(parts) - - def render_headers(self): - """ - Renders the headers for this request field. - """ - lines = [] - - sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] - for sort_key in sort_keys: - if self.headers.get(sort_key, False): - lines.append('%s: %s' % (sort_key, self.headers[sort_key])) - - for header_name, header_value in self.headers.items(): - if header_name not in sort_keys: - if header_value: - lines.append('%s: %s' % (header_name, header_value)) - - lines.append('\r\n') - return '\r\n'.join(lines) - - def make_multipart(self, content_disposition=None, content_type=None, content_location=None): - """ - Makes this request field into a multipart request field. - - This method overrides "Content-Disposition", "Content-Type" and - "Content-Location" headers to the request parameter. - - :param content_type: - The 'Content-Type' of the request body. - :param content_location: - The 'Content-Location' of the request body. - - """ - self.headers['Content-Disposition'] = content_disposition or 'form-data' - self.headers['Content-Disposition'] += '; '.join(['', self._render_parts((('name', self._name), ('filename', self._filename)))]) - self.headers['Content-Type'] = content_type - self.headers['Content-Location'] = content_location diff --git a/vendor-local/lib/python/requests/packages/urllib3/filepost.py b/vendor-local/lib/python/requests/packages/urllib3/filepost.py deleted file mode 100644 index 4575582e91c..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/filepost.py +++ /dev/null @@ -1,101 +0,0 @@ -# urllib3/filepost.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import codecs -import mimetypes - -from uuid import uuid4 -from io import BytesIO - -from .packages import six -from .packages.six import b -from .fields import RequestField - -writer = codecs.lookup('utf-8')[3] - - -def choose_boundary(): - """ - Our embarassingly-simple replacement for mimetools.choose_boundary. - """ - return uuid4().hex - - -def iter_field_objects(fields): - """ - Iterate over fields. - - Supports list of (k, v) tuples and dicts, and lists of - :class:`~urllib3.fields.RequestField`. - - """ - if isinstance(fields, dict): - i = six.iteritems(fields) - else: - i = iter(fields) - - for field in i: - if isinstance(field, RequestField): - yield field - else: - yield RequestField.from_tuples(*field) - - -def iter_fields(fields): - """ - Iterate over fields. - - .. deprecated :: - - The addition of `~urllib3.fields.RequestField` makes this function - obsolete. Instead, use :func:`iter_field_objects`, which returns - `~urllib3.fields.RequestField` objects, instead. - - Supports list of (k, v) tuples and dicts. - - """ - if isinstance(fields, dict): - return ((k, v) for k, v in six.iteritems(fields)) - - return ((k, v) for k, v in fields) - - -def encode_multipart_formdata(fields, boundary=None): - """ - Encode a dictionary of ``fields`` using the multipart/form-data MIME format. - - :param fields: - Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). - - :param boundary: - If not specified, then a random boundary will be generated using - :func:`mimetools.choose_boundary`. - """ - body = BytesIO() - if boundary is None: - boundary = choose_boundary() - - for field in iter_field_objects(fields): - body.write(b('--%s\r\n' % (boundary))) - - writer(body).write(field.render_headers()) - data = field.data - - if isinstance(data, int): - data = str(data) # Backwards compatibility - - if isinstance(data, six.text_type): - writer(body).write(data) - else: - body.write(data) - - body.write(b'\r\n') - - body.write(b('--%s--\r\n' % (boundary))) - - content_type = str('multipart/form-data; boundary=%s' % boundary) - - return body.getvalue(), content_type diff --git a/vendor-local/lib/python/requests/packages/urllib3/packages/__init__.py b/vendor-local/lib/python/requests/packages/urllib3/packages/__init__.py deleted file mode 100644 index 37e83515776..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/packages/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from __future__ import absolute_import - -from . import ssl_match_hostname - diff --git a/vendor-local/lib/python/requests/packages/urllib3/packages/ordered_dict.py b/vendor-local/lib/python/requests/packages/urllib3/packages/ordered_dict.py deleted file mode 100644 index 7f8ee154360..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/packages/ordered_dict.py +++ /dev/null @@ -1,260 +0,0 @@ -# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. -# Passes Python2.7's test suite and incorporates all the latest updates. -# Copyright 2009 Raymond Hettinger, released under the MIT License. -# http://code.activestate.com/recipes/576693/ - -try: - from thread import get_ident as _get_ident -except ImportError: - from dummy_thread import get_ident as _get_ident - -try: - from _abcoll import KeysView, ValuesView, ItemsView -except ImportError: - pass - - -class OrderedDict(dict): - 'Dictionary that remembers insertion order' - # An inherited dict maps keys to values. - # The inherited dict provides __getitem__, __len__, __contains__, and get. - # The remaining methods are order-aware. - # Big-O running times for all methods are the same as for regular dictionaries. - - # The internal self.__map dictionary maps keys to links in a doubly linked list. - # The circular doubly linked list starts and ends with a sentinel element. - # The sentinel element never gets deleted (this simplifies the algorithm). - # Each link is stored as a list of length three: [PREV, NEXT, KEY]. - - def __init__(self, *args, **kwds): - '''Initialize an ordered dictionary. Signature is the same as for - regular dictionaries, but keyword arguments are not recommended - because their insertion order is arbitrary. - - ''' - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - try: - self.__root - except AttributeError: - self.__root = root = [] # sentinel node - root[:] = [root, root, None] - self.__map = {} - self.__update(*args, **kwds) - - def __setitem__(self, key, value, dict_setitem=dict.__setitem__): - 'od.__setitem__(i, y) <==> od[i]=y' - # Setting a new item creates a new link which goes at the end of the linked - # list, and the inherited dictionary is updated with the new key/value pair. - if key not in self: - root = self.__root - last = root[0] - last[1] = root[0] = self.__map[key] = [last, root, key] - dict_setitem(self, key, value) - - def __delitem__(self, key, dict_delitem=dict.__delitem__): - 'od.__delitem__(y) <==> del od[y]' - # Deleting an existing item uses self.__map to find the link which is - # then removed by updating the links in the predecessor and successor nodes. - dict_delitem(self, key) - link_prev, link_next, key = self.__map.pop(key) - link_prev[1] = link_next - link_next[0] = link_prev - - def __iter__(self): - 'od.__iter__() <==> iter(od)' - root = self.__root - curr = root[1] - while curr is not root: - yield curr[2] - curr = curr[1] - - def __reversed__(self): - 'od.__reversed__() <==> reversed(od)' - root = self.__root - curr = root[0] - while curr is not root: - yield curr[2] - curr = curr[0] - - def clear(self): - 'od.clear() -> None. Remove all items from od.' - try: - for node in self.__map.itervalues(): - del node[:] - root = self.__root - root[:] = [root, root, None] - self.__map.clear() - except AttributeError: - pass - dict.clear(self) - - def popitem(self, last=True): - '''od.popitem() -> (k, v), return and remove a (key, value) pair. - Pairs are returned in LIFO order if last is true or FIFO order if false. - - ''' - if not self: - raise KeyError('dictionary is empty') - root = self.__root - if last: - link = root[0] - link_prev = link[0] - link_prev[1] = root - root[0] = link_prev - else: - link = root[1] - link_next = link[1] - root[1] = link_next - link_next[0] = root - key = link[2] - del self.__map[key] - value = dict.pop(self, key) - return key, value - - # -- the following methods do not depend on the internal structure -- - - def keys(self): - 'od.keys() -> list of keys in od' - return list(self) - - def values(self): - 'od.values() -> list of values in od' - return [self[key] for key in self] - - def items(self): - 'od.items() -> list of (key, value) pairs in od' - return [(key, self[key]) for key in self] - - def iterkeys(self): - 'od.iterkeys() -> an iterator over the keys in od' - return iter(self) - - def itervalues(self): - 'od.itervalues -> an iterator over the values in od' - for k in self: - yield self[k] - - def iteritems(self): - 'od.iteritems -> an iterator over the (key, value) items in od' - for k in self: - yield (k, self[k]) - - def update(*args, **kwds): - '''od.update(E, **F) -> None. Update od from dict/iterable E and F. - - If E is a dict instance, does: for k in E: od[k] = E[k] - If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] - Or if E is an iterable of items, does: for k, v in E: od[k] = v - In either case, this is followed by: for k, v in F.items(): od[k] = v - - ''' - if len(args) > 2: - raise TypeError('update() takes at most 2 positional ' - 'arguments (%d given)' % (len(args),)) - elif not args: - raise TypeError('update() takes at least 1 argument (0 given)') - self = args[0] - # Make progressively weaker assumptions about "other" - other = () - if len(args) == 2: - other = args[1] - if isinstance(other, dict): - for key in other: - self[key] = other[key] - elif hasattr(other, 'keys'): - for key in other.keys(): - self[key] = other[key] - else: - for key, value in other: - self[key] = value - for key, value in kwds.items(): - self[key] = value - - __update = update # let subclasses override update without breaking __init__ - - __marker = object() - - def pop(self, key, default=__marker): - '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - - ''' - if key in self: - result = self[key] - del self[key] - return result - if default is self.__marker: - raise KeyError(key) - return default - - def setdefault(self, key, default=None): - 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' - if key in self: - return self[key] - self[key] = default - return default - - def __repr__(self, _repr_running={}): - 'od.__repr__() <==> repr(od)' - call_key = id(self), _get_ident() - if call_key in _repr_running: - return '...' - _repr_running[call_key] = 1 - try: - if not self: - return '%s()' % (self.__class__.__name__,) - return '%s(%r)' % (self.__class__.__name__, self.items()) - finally: - del _repr_running[call_key] - - def __reduce__(self): - 'Return state information for pickling' - items = [[k, self[k]] for k in self] - inst_dict = vars(self).copy() - for k in vars(OrderedDict()): - inst_dict.pop(k, None) - if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) - - def copy(self): - 'od.copy() -> a shallow copy of od' - return self.__class__(self) - - @classmethod - def fromkeys(cls, iterable, value=None): - '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S - and values equal to v (which defaults to None). - - ''' - d = cls() - for key in iterable: - d[key] = value - return d - - def __eq__(self, other): - '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive - while comparison to a regular mapping is order-insensitive. - - ''' - if isinstance(other, OrderedDict): - return len(self)==len(other) and self.items() == other.items() - return dict.__eq__(self, other) - - def __ne__(self, other): - return not self == other - - # -- the following methods are only used in Python 2.7 -- - - def viewkeys(self): - "od.viewkeys() -> a set-like object providing a view on od's keys" - return KeysView(self) - - def viewvalues(self): - "od.viewvalues() -> an object providing a view on od's values" - return ValuesView(self) - - def viewitems(self): - "od.viewitems() -> a set-like object providing a view on od's items" - return ItemsView(self) diff --git a/vendor-local/lib/python/requests/packages/urllib3/packages/six.py b/vendor-local/lib/python/requests/packages/urllib3/packages/six.py deleted file mode 100644 index 27d80112bf9..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/packages/six.py +++ /dev/null @@ -1,385 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -#Copyright (c) 2010-2011 Benjamin Peterson - -#Permission is hereby granted, free of charge, to any person obtaining a copy of -#this software and associated documentation files (the "Software"), to deal in -#the Software without restriction, including without limitation the rights to -#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -#the Software, and to permit persons to whom the Software is furnished to do so, -#subject to the following conditions: - -#The above copyright notice and this permission notice shall be included in all -#copies or substantial portions of the Software. - -#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -#FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -#COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -#IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -#CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.2.0" # Revision 41c74fef2ded - - -# True if we are running on Python 3. -PY3 = sys.version_info[0] == 3 - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) - # This is a bit ugly, but it avoids running this again. - delattr(tp, self.name) - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - - -class _MovedItems(types.ModuleType): - """Lazy loading of moved objects""" - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("reload_module", "__builtin__", "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("winreg", "_winreg"), -] -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) -del attr - -moves = sys.modules[__name__ + ".moves"] = _MovedItems("moves") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_code = "__code__" - _func_defaults = "__defaults__" - - _iterkeys = "keys" - _itervalues = "values" - _iteritems = "items" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_code = "func_code" - _func_defaults = "func_defaults" - - _iterkeys = "iterkeys" - _itervalues = "itervalues" - _iteritems = "iteritems" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -if PY3: - def get_unbound_function(unbound): - return unbound - - Iterator = object - - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) -else: - def get_unbound_function(unbound): - return unbound.im_func - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) - - -def iterkeys(d): - """Return an iterator over the keys of a dictionary.""" - return iter(getattr(d, _iterkeys)()) - -def itervalues(d): - """Return an iterator over the values of a dictionary.""" - return iter(getattr(d, _itervalues)()) - -def iteritems(d): - """Return an iterator over the (key, value) pairs of a dictionary.""" - return iter(getattr(d, _iteritems)()) - - -if PY3: - def b(s): - return s.encode("latin-1") - def u(s): - return s - if sys.version_info[1] <= 1: - def int2byte(i): - return bytes((i,)) - else: - # This is about 2x faster than the implementation above on 3.2+ - int2byte = operator.methodcaller("to_bytes", 1, "big") - import io - StringIO = io.StringIO - BytesIO = io.BytesIO -else: - def b(s): - return s - def u(s): - return unicode(s, "unicode_escape") - int2byte = chr - import StringIO - StringIO = BytesIO = StringIO.StringIO -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -if PY3: - import builtins - exec_ = getattr(builtins, "exec") - - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - - print_ = getattr(builtins, "print") - del builtins - -else: - def exec_(code, globs=None, locs=None): - """Execute code in a namespace.""" - if globs is None: - frame = sys._getframe(1) - globs = frame.f_globals - if locs is None: - locs = frame.f_locals - del frame - elif locs is None: - locs = globs - exec("""exec code in globs, locs""") - - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - - def print_(*args, **kwargs): - """The new-style print function.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - def write(data): - if not isinstance(data, basestring): - data = str(data) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) - -_add_doc(reraise, """Reraise an exception.""") - - -def with_metaclass(meta, base=object): - """Create a base class with a metaclass.""" - return meta("NewBase", (base,), {}) diff --git a/vendor-local/lib/python/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py b/vendor-local/lib/python/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py deleted file mode 100644 index 2d61ac21399..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py +++ /dev/null @@ -1,98 +0,0 @@ -"""The match_hostname() function from Python 3.2, essential when using SSL.""" - -import re - -__version__ = '3.2.2' - -class CertificateError(ValueError): - pass - -def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - parts = dn.split(r'.') - leftmost = parts[0] - - wildcards = leftmost.count('*') - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survery of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in parts[1:]: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - -def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate") - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") diff --git a/vendor-local/lib/python/requests/packages/urllib3/poolmanager.py b/vendor-local/lib/python/requests/packages/urllib3/poolmanager.py deleted file mode 100644 index e7f8667ee6f..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/poolmanager.py +++ /dev/null @@ -1,259 +0,0 @@ -# urllib3/poolmanager.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import logging - -try: # Python 3 - from urllib.parse import urljoin -except ImportError: - from urlparse import urljoin - -from ._collections import RecentlyUsedContainer -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from .connectionpool import port_by_scheme -from .request import RequestMethods -from .util import parse_url - - -__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] - - -pool_classes_by_scheme = { - 'http': HTTPConnectionPool, - 'https': HTTPSConnectionPool, -} - -log = logging.getLogger(__name__) - -SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', - 'ssl_version') - - -class PoolManager(RequestMethods): - """ - Allows for arbitrary requests while transparently keeping track of - necessary connection pools for you. - - :param num_pools: - Number of connection pools to cache before discarding the least - recently used pool. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param \**connection_pool_kw: - Additional parameters are used to create fresh - :class:`urllib3.connectionpool.ConnectionPool` instances. - - Example: :: - - >>> manager = PoolManager(num_pools=2) - >>> r = manager.request('GET', 'http://google.com/') - >>> r = manager.request('GET', 'http://google.com/mail') - >>> r = manager.request('GET', 'http://yahoo.com/') - >>> len(manager.pools) - 2 - - """ - - proxy = None - - def __init__(self, num_pools=10, headers=None, **connection_pool_kw): - RequestMethods.__init__(self, headers) - self.connection_pool_kw = connection_pool_kw - self.pools = RecentlyUsedContainer(num_pools, - dispose_func=lambda p: p.close()) - - def _new_pool(self, scheme, host, port): - """ - Create a new :class:`ConnectionPool` based on host, port and scheme. - - This method is used to actually create the connection pools handed out - by :meth:`connection_from_url` and companion methods. It is intended - to be overridden for customization. - """ - pool_cls = pool_classes_by_scheme[scheme] - kwargs = self.connection_pool_kw - if scheme == 'http': - kwargs = self.connection_pool_kw.copy() - for kw in SSL_KEYWORDS: - kwargs.pop(kw, None) - - return pool_cls(host, port, **kwargs) - - def clear(self): - """ - Empty our store of pools and direct them all to close. - - This will not affect in-flight connections, but they will not be - re-used after completion. - """ - self.pools.clear() - - def connection_from_host(self, host, port=None, scheme='http'): - """ - Get a :class:`ConnectionPool` based on the host, port, and scheme. - - If ``port`` isn't given, it will be derived from the ``scheme`` using - ``urllib3.connectionpool.port_by_scheme``. - """ - - scheme = scheme or 'http' - - port = port or port_by_scheme.get(scheme, 80) - - pool_key = (scheme, host, port) - - with self.pools.lock: - # If the scheme, host, or port doesn't match existing open - # connections, open a new ConnectionPool. - pool = self.pools.get(pool_key) - if pool: - return pool - - # Make a fresh ConnectionPool of the desired type - pool = self._new_pool(scheme, host, port) - self.pools[pool_key] = pool - return pool - - def connection_from_url(self, url): - """ - Similar to :func:`urllib3.connectionpool.connection_from_url` but - doesn't pass any additional parameters to the - :class:`urllib3.connectionpool.ConnectionPool` constructor. - - Additional parameters are taken from the :class:`.PoolManager` - constructor. - """ - u = parse_url(url) - return self.connection_from_host(u.host, port=u.port, scheme=u.scheme) - - def urlopen(self, method, url, redirect=True, **kw): - """ - Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` - with custom cross-host redirect logic and only sends the request-uri - portion of the ``url``. - - The given ``url`` parameter must be absolute, such that an appropriate - :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. - """ - u = parse_url(url) - conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) - - kw['assert_same_host'] = False - kw['redirect'] = False - if 'headers' not in kw: - kw['headers'] = self.headers - - if self.proxy is not None and u.scheme == "http": - response = conn.urlopen(method, url, **kw) - else: - response = conn.urlopen(method, u.request_uri, **kw) - - redirect_location = redirect and response.get_redirect_location() - if not redirect_location: - return response - - # Support relative URLs for redirecting. - redirect_location = urljoin(url, redirect_location) - - # RFC 2616, Section 10.3.4 - if response.status == 303: - method = 'GET' - - log.info("Redirecting %s -> %s" % (url, redirect_location)) - kw['retries'] = kw.get('retries', 3) - 1 # Persist retries countdown - kw['redirect'] = redirect - return self.urlopen(method, redirect_location, **kw) - - -class ProxyManager(PoolManager): - """ - Behaves just like :class:`PoolManager`, but sends all requests through - the defined proxy, using the CONNECT method for HTTPS URLs. - - :param poxy_url: - The URL of the proxy to be used. - - :param proxy_headers: - A dictionary contaning headers that will be sent to the proxy. In case - of HTTP they are being sent with each request, while in the - HTTPS/CONNECT case they are sent only once. Could be used for proxy - authentication. - - Example: - >>> proxy = urllib3.ProxyManager('http://localhost:3128/') - >>> r1 = proxy.request('GET', 'http://google.com/') - >>> r2 = proxy.request('GET', 'http://httpbin.org/') - >>> len(proxy.pools) - 1 - >>> r3 = proxy.request('GET', 'https://httpbin.org/') - >>> r4 = proxy.request('GET', 'https://twitter.com/') - >>> len(proxy.pools) - 3 - - """ - - def __init__(self, proxy_url, num_pools=10, headers=None, - proxy_headers=None, **connection_pool_kw): - - if isinstance(proxy_url, HTTPConnectionPool): - proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, - proxy_url.port) - proxy = parse_url(proxy_url) - if not proxy.port: - port = port_by_scheme.get(proxy.scheme, 80) - proxy = proxy._replace(port=port) - self.proxy = proxy - self.proxy_headers = proxy_headers or {} - assert self.proxy.scheme in ("http", "https"), \ - 'Not supported proxy scheme %s' % self.proxy.scheme - connection_pool_kw['_proxy'] = self.proxy - connection_pool_kw['_proxy_headers'] = self.proxy_headers - super(ProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw) - - def connection_from_host(self, host, port=None, scheme='http'): - if scheme == "https": - return super(ProxyManager, self).connection_from_host( - host, port, scheme) - - return super(ProxyManager, self).connection_from_host( - self.proxy.host, self.proxy.port, self.proxy.scheme) - - def _set_proxy_headers(self, url, headers=None): - """ - Sets headers needed by proxies: specifically, the Accept and Host - headers. Only sets headers not provided by the user. - """ - headers_ = {'Accept': '*/*'} - - netloc = parse_url(url).netloc - if netloc: - headers_['Host'] = netloc - - if headers: - headers_.update(headers) - return headers_ - - def urlopen(self, method, url, redirect=True, **kw): - "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." - u = parse_url(url) - - if u.scheme == "http": - # It's too late to set proxy headers on per-request basis for - # tunnelled HTTPS connections, should use - # constructor's proxy_headers instead. - kw['headers'] = self._set_proxy_headers(url, kw.get('headers', - self.headers)) - kw['headers'].update(self.proxy_headers) - - return super(ProxyManager, self).urlopen(method, url, redirect, **kw) - - -def proxy_from_url(url, **kw): - return ProxyManager(proxy_url=url, **kw) diff --git a/vendor-local/lib/python/requests/packages/urllib3/request.py b/vendor-local/lib/python/requests/packages/urllib3/request.py deleted file mode 100644 index 66a9a0e6907..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/request.py +++ /dev/null @@ -1,142 +0,0 @@ -# urllib3/request.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -try: - from urllib.parse import urlencode -except ImportError: - from urllib import urlencode - -from .filepost import encode_multipart_formdata - - -__all__ = ['RequestMethods'] - - -class RequestMethods(object): - """ - Convenience mixin for classes who implement a :meth:`urlopen` method, such - as :class:`~urllib3.connectionpool.HTTPConnectionPool` and - :class:`~urllib3.poolmanager.PoolManager`. - - Provides behavior for making common types of HTTP request methods and - decides which type of request field encoding to use. - - Specifically, - - :meth:`.request_encode_url` is for sending requests whose fields are encoded - in the URL (such as GET, HEAD, DELETE). - - :meth:`.request_encode_body` is for sending requests whose fields are - encoded in the *body* of the request using multipart or www-form-urlencoded - (such as for POST, PUT, PATCH). - - :meth:`.request` is for making any kind of request, it will look up the - appropriate encoding format and use one of the above two methods to make - the request. - - Initializer parameters: - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - """ - - _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS']) - _encode_body_methods = set(['PATCH', 'POST', 'PUT', 'TRACE']) - - def __init__(self, headers=None): - self.headers = headers or {} - - def urlopen(self, method, url, body=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **kw): # Abstract - raise NotImplemented("Classes extending RequestMethods must implement " - "their own ``urlopen`` method.") - - def request(self, method, url, fields=None, headers=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the appropriate encoding of - ``fields`` based on the ``method`` used. - - This is a convenience method that requires the least amount of manual - effort. It can be used in most situations, while still having the option - to drop down to more specific methods when necessary, such as - :meth:`request_encode_url`, :meth:`request_encode_body`, - or even the lowest level :meth:`urlopen`. - """ - method = method.upper() - - if method in self._encode_url_methods: - return self.request_encode_url(method, url, fields=fields, - headers=headers, - **urlopen_kw) - else: - return self.request_encode_body(method, url, fields=fields, - headers=headers, - **urlopen_kw) - - def request_encode_url(self, method, url, fields=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the url. This is useful for request methods like GET, HEAD, DELETE, etc. - """ - if fields: - url += '?' + urlencode(fields) - return self.urlopen(method, url, **urlopen_kw) - - def request_encode_body(self, method, url, fields=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the body. This is useful for request methods like POST, PUT, PATCH, etc. - - When ``encode_multipart=True`` (default), then - :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode the - payload with the appropriate content type. Otherwise - :meth:`urllib.urlencode` is used with the - 'application/x-www-form-urlencoded' content type. - - Multipart encoding must be used when posting files, and it's reasonably - safe to use it in other times too. However, it may break request signing, - such as with OAuth. - - Supports an optional ``fields`` parameter of key/value strings AND - key/filetuple. A filetuple is a (filename, data, MIME type) tuple where - the MIME type is optional. For example: :: - - fields = { - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), - 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - } - - When uploading a file, providing a filename (the first parameter of the - tuple) is optional but recommended to best mimick behavior of browsers. - - Note that if ``headers`` are supplied, the 'Content-Type' header will be - overwritten because it depends on the dynamic random boundary string - which is used to compose the body of the request. The random boundary - string can be explicitly set with the ``multipart_boundary`` parameter. - """ - if encode_multipart: - body, content_type = encode_multipart_formdata(fields or {}, - boundary=multipart_boundary) - else: - body, content_type = (urlencode(fields or {}), - 'application/x-www-form-urlencoded') - - if headers is None: - headers = self.headers - - headers_ = {'Content-Type': content_type} - headers_.update(headers) - - return self.urlopen(method, url, body=body, headers=headers_, - **urlopen_kw) diff --git a/vendor-local/lib/python/requests/packages/urllib3/response.py b/vendor-local/lib/python/requests/packages/urllib3/response.py deleted file mode 100644 index 4efff5a13b6..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/response.py +++ /dev/null @@ -1,301 +0,0 @@ -# urllib3/response.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - - -import logging -import zlib -import io - -from .exceptions import DecodeError -from .packages.six import string_types as basestring, binary_type -from .util import is_fp_closed - - -log = logging.getLogger(__name__) - - -class DeflateDecoder(object): - - def __init__(self): - self._first_try = True - self._data = binary_type() - self._obj = zlib.decompressobj() - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - if not self._first_try: - return self._obj.decompress(data) - - self._data += data - try: - return self._obj.decompress(data) - except zlib.error: - self._first_try = False - self._obj = zlib.decompressobj(-zlib.MAX_WBITS) - try: - return self.decompress(self._data) - finally: - self._data = None - - -def _get_decoder(mode): - if mode == 'gzip': - return zlib.decompressobj(16 + zlib.MAX_WBITS) - - return DeflateDecoder() - - -class HTTPResponse(io.IOBase): - """ - HTTP Response container. - - Backwards-compatible to httplib's HTTPResponse but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. - - Extra parameters for behaviour not present in httplib.HTTPResponse: - - :param preload_content: - If True, the response's body will be preloaded during construction. - - :param decode_content: - If True, attempts to decode specific content-encoding's based on headers - (like 'gzip' and 'deflate') will be skipped and raw data will be used - instead. - - :param original_response: - When this HTTPResponse wrapper is generated from an httplib.HTTPResponse - object, it's convenient to include the original for debug purposes. It's - otherwise unused. - """ - - CONTENT_DECODERS = ['gzip', 'deflate'] - REDIRECT_STATUSES = [301, 302, 303, 307, 308] - - def __init__(self, body='', headers=None, status=0, version=0, reason=None, - strict=0, preload_content=True, decode_content=True, - original_response=None, pool=None, connection=None): - self.headers = headers or {} - self.status = status - self.version = version - self.reason = reason - self.strict = strict - self.decode_content = decode_content - - self._decoder = None - self._body = body if body and isinstance(body, basestring) else None - self._fp = None - self._original_response = original_response - - self._pool = pool - self._connection = connection - - if hasattr(body, 'read'): - self._fp = body - - if preload_content and not self._body: - self._body = self.read(decode_content=decode_content) - - def get_redirect_location(self): - """ - Should we redirect and where to? - - :returns: Truthy redirect location string if we got a redirect status - code and valid location. ``None`` if redirect status and no - location. ``False`` if not a redirect status code. - """ - if self.status in self.REDIRECT_STATUSES: - return self.headers.get('location') - - return False - - def release_conn(self): - if not self._pool or not self._connection: - return - - self._pool._put_conn(self._connection) - self._connection = None - - @property - def data(self): - # For backwords-compat with earlier urllib3 0.4 and earlier. - if self._body: - return self._body - - if self._fp: - return self.read(cache_content=True) - - def read(self, amt=None, decode_content=None, cache_content=False): - """ - Similar to :meth:`httplib.HTTPResponse.read`, but with two additional - parameters: ``decode_content`` and ``cache_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param cache_content: - If True, will save the returned data such that the same result is - returned despite of the state of the underlying file object. This - is useful if you want the ``.data`` property to continue working - after having ``.read()`` the file object. (Overridden if ``amt`` is - set.) - """ - # Note: content-encoding value should be case-insensitive, per RFC 2616 - # Section 3.5 - content_encoding = self.headers.get('content-encoding', '').lower() - if self._decoder is None: - if content_encoding in self.CONTENT_DECODERS: - self._decoder = _get_decoder(content_encoding) - if decode_content is None: - decode_content = self.decode_content - - if self._fp is None: - return - - flush_decoder = False - - try: - if amt is None: - # cStringIO doesn't like amt=None - data = self._fp.read() - flush_decoder = True - else: - cache_content = False - data = self._fp.read(amt) - if amt != 0 and not data: # Platform-specific: Buggy versions of Python. - # Close the connection when no data is returned - # - # This is redundant to what httplib/http.client _should_ - # already do. However, versions of python released before - # December 15, 2012 (http://bugs.python.org/issue16298) do not - # properly close the connection in all cases. There is no harm - # in redundantly calling close. - self._fp.close() - flush_decoder = True - - try: - if decode_content and self._decoder: - data = self._decoder.decompress(data) - except (IOError, zlib.error) as e: - raise DecodeError( - "Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding, - e) - - if flush_decoder and decode_content and self._decoder: - buf = self._decoder.decompress(binary_type()) - data += buf + self._decoder.flush() - - if cache_content: - self._body = data - - return data - - finally: - if self._original_response and self._original_response.isclosed(): - self.release_conn() - - def stream(self, amt=2**16, decode_content=None): - """ - A generator wrapper for the read() method. A call will block until - ``amt`` bytes have been read from the connection or until the - connection is closed. - - :param amt: - How much of the content to read. The generator will return up to - much data per iteration, but may return less. This is particularly - likely when using compressed data. However, the empty string will - never be returned. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - while not is_fp_closed(self._fp): - data = self.read(amt=amt, decode_content=decode_content) - - if data: - yield data - - - @classmethod - def from_httplib(ResponseCls, r, **response_kw): - """ - Given an :class:`httplib.HTTPResponse` instance ``r``, return a - corresponding :class:`urllib3.response.HTTPResponse` object. - - Remaining parameters are passed to the HTTPResponse constructor, along - with ``original_response=r``. - """ - - # Normalize headers between different versions of Python - headers = {} - for k, v in r.getheaders(): - # Python 3: Header keys are returned capitalised - k = k.lower() - - has_value = headers.get(k) - if has_value: # Python 3: Repeating header keys are unmerged. - v = ', '.join([has_value, v]) - - headers[k] = v - - # HTTPResponse objects in Python 3 don't have a .strict attribute - strict = getattr(r, 'strict', 0) - return ResponseCls(body=r, - headers=headers, - status=r.status, - version=r.version, - reason=r.reason, - strict=strict, - original_response=r, - **response_kw) - - # Backwards-compatibility methods for httplib.HTTPResponse - def getheaders(self): - return self.headers - - def getheader(self, name, default=None): - return self.headers.get(name, default) - - # Overrides from io.IOBase - def close(self): - if not self.closed: - self._fp.close() - - @property - def closed(self): - if self._fp is None: - return True - elif hasattr(self._fp, 'closed'): - return self._fp.closed - elif hasattr(self._fp, 'isclosed'): # Python 2 - return self._fp.isclosed() - else: - return True - - def fileno(self): - if self._fp is None: - raise IOError("HTTPResponse has no file to get a fileno from") - elif hasattr(self._fp, "fileno"): - return self._fp.fileno() - else: - raise IOError("The file-like object this HTTPResponse is wrapped " - "around has no file descriptor") - - def flush(self): - if self._fp is not None and hasattr(self._fp, 'flush'): - return self._fp.flush() - - def readable(self): - return True diff --git a/vendor-local/lib/python/requests/packages/urllib3/util.py b/vendor-local/lib/python/requests/packages/urllib3/util.py deleted file mode 100644 index cf934d4246f..00000000000 --- a/vendor-local/lib/python/requests/packages/urllib3/util.py +++ /dev/null @@ -1,635 +0,0 @@ -# urllib3/util.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - - -from base64 import b64encode -from binascii import hexlify, unhexlify -from collections import namedtuple -from hashlib import md5, sha1 -from socket import error as SocketError, _GLOBAL_DEFAULT_TIMEOUT -import time - -try: - from select import poll, POLLIN -except ImportError: # `poll` doesn't exist on OSX and other platforms - poll = False - try: - from select import select - except ImportError: # `select` doesn't exist on AppEngine. - select = False - -try: # Test for SSL features - SSLContext = None - HAS_SNI = False - - import ssl - from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 - from ssl import SSLContext # Modern SSL? - from ssl import HAS_SNI # Has SNI? -except ImportError: - pass - -from .packages import six -from .exceptions import LocationParseError, SSLError, TimeoutStateError - - -_Default = object() -# The default timeout to use for socket connections. This is the attribute used -# by httplib to define the default timeout - - -def current_time(): - """ - Retrieve the current time, this function is mocked out in unit testing. - """ - return time.time() - - -class Timeout(object): - """ - Utility object for storing timeout values. - - Example usage: - - .. code-block:: python - - timeout = urllib3.util.Timeout(connect=2.0, read=7.0) - pool = HTTPConnectionPool('www.google.com', 80, timeout=timeout) - pool.request(...) # Etc, etc - - :param connect: - The maximum amount of time to wait for a connection attempt to a server - to succeed. Omitting the parameter will default the connect timeout to - the system default, probably `the global default timeout in socket.py - <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. - None will set an infinite timeout for connection attempts. - - :type connect: integer, float, or None - - :param read: - The maximum amount of time to wait between consecutive - read operations for a response from the server. Omitting - the parameter will default the read timeout to the system - default, probably `the global default timeout in socket.py - <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. - None will set an infinite timeout. - - :type read: integer, float, or None - - :param total: - This combines the connect and read timeouts into one; the read timeout - will be set to the time leftover from the connect attempt. In the - event that both a connect timeout and a total are specified, or a read - timeout and a total are specified, the shorter timeout will be applied. - - Defaults to None. - - :type total: integer, float, or None - - .. note:: - - Many factors can affect the total amount of time for urllib3 to return - an HTTP response. Specifically, Python's DNS resolver does not obey the - timeout specified on the socket. Other factors that can affect total - request time include high CPU load, high swap, the program running at a - low priority level, or other behaviors. The observed running time for - urllib3 to return a response may be greater than the value passed to - `total`. - - In addition, the read and total timeouts only measure the time between - read operations on the socket connecting the client and the server, - not the total amount of time for the request to return a complete - response. For most requests, the timeout is raised because the server - has not sent the first byte in the specified time. This is not always - the case; if a server streams one byte every fifteen seconds, a timeout - of 20 seconds will not ever trigger, even though the request will - take several minutes to complete. - - If your goal is to cut off any request after a set amount of wall clock - time, consider having a second "watcher" thread to cut off a slow - request. - """ - - #: A sentinel object representing the default timeout value - DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT - - def __init__(self, total=None, connect=_Default, read=_Default): - self._connect = self._validate_timeout(connect, 'connect') - self._read = self._validate_timeout(read, 'read') - self.total = self._validate_timeout(total, 'total') - self._start_connect = None - - def __str__(self): - return '%s(connect=%r, read=%r, total=%r)' % ( - type(self).__name__, self._connect, self._read, self.total) - - - @classmethod - def _validate_timeout(cls, value, name): - """ Check that a timeout attribute is valid - - :param value: The timeout value to validate - :param name: The name of the timeout attribute to validate. This is used - for clear error messages - :return: the value - :raises ValueError: if the type is not an integer or a float, or if it - is a numeric value less than zero - """ - if value is _Default: - return cls.DEFAULT_TIMEOUT - - if value is None or value is cls.DEFAULT_TIMEOUT: - return value - - try: - float(value) - except (TypeError, ValueError): - raise ValueError("Timeout value %s was %s, but it must be an " - "int or float." % (name, value)) - - try: - if value < 0: - raise ValueError("Attempted to set %s timeout to %s, but the " - "timeout cannot be set to a value less " - "than 0." % (name, value)) - except TypeError: # Python 3 - raise ValueError("Timeout value %s was %s, but it must be an " - "int or float." % (name, value)) - - return value - - @classmethod - def from_float(cls, timeout): - """ Create a new Timeout from a legacy timeout value. - - The timeout value used by httplib.py sets the same timeout on the - connect(), and recv() socket requests. This creates a :class:`Timeout` - object that sets the individual timeouts to the ``timeout`` value passed - to this function. - - :param timeout: The legacy timeout value - :type timeout: integer, float, sentinel default object, or None - :return: a Timeout object - :rtype: :class:`Timeout` - """ - return Timeout(read=timeout, connect=timeout) - - def clone(self): - """ Create a copy of the timeout object - - Timeout properties are stored per-pool but each request needs a fresh - Timeout object to ensure each one has its own start/stop configured. - - :return: a copy of the timeout object - :rtype: :class:`Timeout` - """ - # We can't use copy.deepcopy because that will also create a new object - # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to - # detect the user default. - return Timeout(connect=self._connect, read=self._read, - total=self.total) - - def start_connect(self): - """ Start the timeout clock, used during a connect() attempt - - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to start a timer that has been started already. - """ - if self._start_connect is not None: - raise TimeoutStateError("Timeout timer has already been started.") - self._start_connect = current_time() - return self._start_connect - - def get_connect_duration(self): - """ Gets the time elapsed since the call to :meth:`start_connect`. - - :return: the elapsed time - :rtype: float - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to get duration for a timer that hasn't been started. - """ - if self._start_connect is None: - raise TimeoutStateError("Can't get connect duration for timer " - "that has not started.") - return current_time() - self._start_connect - - @property - def connect_timeout(self): - """ Get the value to use when setting a connection timeout. - - This will be a positive float or integer, the value None - (never timeout), or the default system timeout. - - :return: the connect timeout - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - """ - if self.total is None: - return self._connect - - if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: - return self.total - - return min(self._connect, self.total) - - @property - def read_timeout(self): - """ Get the value for the read timeout. - - This assumes some time has elapsed in the connection timeout and - computes the read timeout appropriately. - - If self.total is set, the read timeout is dependent on the amount of - time taken by the connect timeout. If the connection time has not been - established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be - raised. - - :return: the value to use for the read timeout - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` - has not yet been called on this object. - """ - if (self.total is not None and - self.total is not self.DEFAULT_TIMEOUT and - self._read is not None and - self._read is not self.DEFAULT_TIMEOUT): - # in case the connect timeout has not yet been established. - if self._start_connect is None: - return self._read - return max(0, min(self.total - self.get_connect_duration(), - self._read)) - elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: - return max(0, self.total - self.get_connect_duration()) - else: - return self._read - - -class Url(namedtuple('Url', ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'])): - """ - Datastructure for representing an HTTP URL. Used as a return value for - :func:`parse_url`. - """ - slots = () - - def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, query=None, fragment=None): - return super(Url, cls).__new__(cls, scheme, auth, host, port, path, query, fragment) - - @property - def hostname(self): - """For backwards-compatibility with urlparse. We're nice like that.""" - return self.host - - @property - def request_uri(self): - """Absolute path including the query string.""" - uri = self.path or '/' - - if self.query is not None: - uri += '?' + self.query - - return uri - - @property - def netloc(self): - """Network location including host and port""" - if self.port: - return '%s:%d' % (self.host, self.port) - return self.host - - -def split_first(s, delims): - """ - Given a string and an iterable of delimiters, split on the first found - delimiter. Return two split parts and the matched delimiter. - - If not found, then the first part is the full input string. - - Example: :: - - >>> split_first('foo/bar?baz', '?/=') - ('foo', 'bar?baz', '/') - >>> split_first('foo/bar?baz', '123') - ('foo/bar?baz', '', None) - - Scales linearly with number of delims. Not ideal for large number of delims. - """ - min_idx = None - min_delim = None - for d in delims: - idx = s.find(d) - if idx < 0: - continue - - if min_idx is None or idx < min_idx: - min_idx = idx - min_delim = d - - if min_idx is None or min_idx < 0: - return s, '', None - - return s[:min_idx], s[min_idx+1:], min_delim - - -def parse_url(url): - """ - Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is - performed to parse incomplete urls. Fields not provided will be None. - - Partly backwards-compatible with :mod:`urlparse`. - - Example: :: - - >>> parse_url('http://google.com/mail/') - Url(scheme='http', host='google.com', port=None, path='/', ...) - >>> parse_url('google.com:80') - Url(scheme=None, host='google.com', port=80, path=None, ...) - >>> parse_url('/foo?bar') - Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) - """ - - # While this code has overlap with stdlib's urlparse, it is much - # simplified for our needs and less annoying. - # Additionally, this implementations does silly things to be optimal - # on CPython. - - scheme = None - auth = None - host = None - port = None - path = None - fragment = None - query = None - - # Scheme - if '://' in url: - scheme, url = url.split('://', 1) - - # Find the earliest Authority Terminator - # (http://tools.ietf.org/html/rfc3986#section-3.2) - url, path_, delim = split_first(url, ['/', '?', '#']) - - if delim: - # Reassemble the path - path = delim + path_ - - # Auth - if '@' in url: - # Last '@' denotes end of auth part - auth, url = url.rsplit('@', 1) - - # IPv6 - if url and url[0] == '[': - host, url = url.split(']', 1) - host += ']' - - # Port - if ':' in url: - _host, port = url.split(':', 1) - - if not host: - host = _host - - if port: - # If given, ports must be integers. - if not port.isdigit(): - raise LocationParseError("Failed to parse: %s" % url) - port = int(port) - else: - # Blank ports are cool, too. (rfc3986#section-3.2.3) - port = None - - elif not host and url: - host = url - - if not path: - return Url(scheme, auth, host, port, path, query, fragment) - - # Fragment - if '#' in path: - path, fragment = path.split('#', 1) - - # Query - if '?' in path: - path, query = path.split('?', 1) - - return Url(scheme, auth, host, port, path, query, fragment) - - -def get_host(url): - """ - Deprecated. Use :func:`.parse_url` instead. - """ - p = parse_url(url) - return p.scheme or 'http', p.hostname, p.port - - -def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, - basic_auth=None): - """ - Shortcuts for generating request headers. - - :param keep_alive: - If ``True``, adds 'connection: keep-alive' header. - - :param accept_encoding: - Can be a boolean, list, or string. - ``True`` translates to 'gzip,deflate'. - List will get joined by comma. - String will be used as provided. - - :param user_agent: - String representing the user-agent you want, such as - "python-urllib3/0.6" - - :param basic_auth: - Colon-separated username:password string for 'authorization: basic ...' - auth header. - - Example: :: - - >>> make_headers(keep_alive=True, user_agent="Batman/1.0") - {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} - >>> make_headers(accept_encoding=True) - {'accept-encoding': 'gzip,deflate'} - """ - headers = {} - if accept_encoding: - if isinstance(accept_encoding, str): - pass - elif isinstance(accept_encoding, list): - accept_encoding = ','.join(accept_encoding) - else: - accept_encoding = 'gzip,deflate' - headers['accept-encoding'] = accept_encoding - - if user_agent: - headers['user-agent'] = user_agent - - if keep_alive: - headers['connection'] = 'keep-alive' - - if basic_auth: - headers['authorization'] = 'Basic ' + \ - b64encode(six.b(basic_auth)).decode('utf-8') - - return headers - - -def is_connection_dropped(conn): # Platform-specific - """ - Returns True if the connection is dropped and should be closed. - - :param conn: - :class:`httplib.HTTPConnection` object. - - Note: For platforms like AppEngine, this will always return ``False`` to - let the platform handle connection recycling transparently for us. - """ - sock = getattr(conn, 'sock', False) - if not sock: # Platform-specific: AppEngine - return False - - if not poll: - if not select: # Platform-specific: AppEngine - return False - - try: - return select([sock], [], [], 0.0)[0] - except SocketError: - return True - - # This version is better on platforms that support it. - p = poll() - p.register(sock, POLLIN) - for (fno, ev) in p.poll(0.0): - if fno == sock.fileno(): - # Either data is buffered (bad), or the connection is dropped. - return True - - -def resolve_cert_reqs(candidate): - """ - Resolves the argument to a numeric constant, which can be passed to - the wrap_socket function/method from the ssl module. - Defaults to :data:`ssl.CERT_NONE`. - If given a string it is assumed to be the name of the constant in the - :mod:`ssl` module or its abbrevation. - (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. - If it's neither `None` nor a string we assume it is already the numeric - constant which can directly be passed to wrap_socket. - """ - if candidate is None: - return CERT_NONE - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'CERT_' + candidate) - return res - - return candidate - - -def resolve_ssl_version(candidate): - """ - like resolve_cert_reqs - """ - if candidate is None: - return PROTOCOL_SSLv23 - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'PROTOCOL_' + candidate) - return res - - return candidate - - -def assert_fingerprint(cert, fingerprint): - """ - Checks if given fingerprint matches the supplied certificate. - - :param cert: - Certificate as bytes object. - :param fingerprint: - Fingerprint as string of hexdigits, can be interspersed by colons. - """ - - # Maps the length of a digest to a possible hash function producing - # this digest. - hashfunc_map = { - 16: md5, - 20: sha1 - } - - fingerprint = fingerprint.replace(':', '').lower() - - digest_length, rest = divmod(len(fingerprint), 2) - - if rest or digest_length not in hashfunc_map: - raise SSLError('Fingerprint is of invalid length.') - - # We need encode() here for py32; works on py2 and p33. - fingerprint_bytes = unhexlify(fingerprint.encode()) - - hashfunc = hashfunc_map[digest_length] - - cert_digest = hashfunc(cert).digest() - - if not cert_digest == fingerprint_bytes: - raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' - .format(hexlify(fingerprint_bytes), - hexlify(cert_digest))) - -def is_fp_closed(obj): - """ - Checks whether a given file-like object is closed. - - :param obj: - The file-like object to check. - """ - if hasattr(obj, 'fp'): - # Object is a container for another file-like object that gets released - # on exhaustion (e.g. HTTPResponse) - return obj.fp is None - - return obj.closed - - -if SSLContext is not None: # Python 3.2+ - def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, - ca_certs=None, server_hostname=None, - ssl_version=None): - """ - All arguments except `server_hostname` have the same meaning as for - :func:`ssl.wrap_socket` - - :param server_hostname: - Hostname of the expected certificate - """ - context = SSLContext(ssl_version) - context.verify_mode = cert_reqs - if ca_certs: - try: - context.load_verify_locations(ca_certs) - # Py32 raises IOError - # Py33 raises FileNotFoundError - except Exception as e: # Reraise as SSLError - raise SSLError(e) - if certfile: - # FIXME: This block needs a test. - context.load_cert_chain(certfile, keyfile) - if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI - return context.wrap_socket(sock, server_hostname=server_hostname) - return context.wrap_socket(sock) - -else: # Python 3.1 and earlier - def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, - ca_certs=None, server_hostname=None, - ssl_version=None): - return wrap_socket(sock, keyfile=keyfile, certfile=certfile, - ca_certs=ca_certs, cert_reqs=cert_reqs, - ssl_version=ssl_version) diff --git a/vendor-local/lib/python/requests/sessions.py b/vendor-local/lib/python/requests/sessions.py deleted file mode 100644 index cc72f65d9dc..00000000000 --- a/vendor-local/lib/python/requests/sessions.py +++ /dev/null @@ -1,531 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.session -~~~~~~~~~~~~~~~~ - -This module provides a Session object to manage and persist settings across -requests (cookies, auth, proxies). - -""" -import os -from collections import Mapping -from datetime import datetime - -from .compat import cookielib, OrderedDict, urljoin, urlparse, urlunparse -from .cookies import cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar -from .models import Request, PreparedRequest -from .hooks import default_hooks, dispatch_hook -from .utils import to_key_val_list, default_headers -from .exceptions import TooManyRedirects, InvalidSchema -from .structures import CaseInsensitiveDict - -from .adapters import HTTPAdapter - -from .utils import requote_uri, get_environ_proxies, get_netrc_auth - -from .status_codes import codes -REDIRECT_STATI = ( - codes.moved, # 301 - codes.found, # 302 - codes.other, # 303 - codes.temporary_moved, # 307 -) -DEFAULT_REDIRECT_LIMIT = 30 - - -def merge_setting(request_setting, session_setting, dict_class=OrderedDict): - """ - Determines appropriate setting for a given request, taking into account the - explicit setting on that request, and the setting in the session. If a - setting is a dictionary, they will be merged together using `dict_class` - """ - - if session_setting is None: - return request_setting - - if request_setting is None: - return session_setting - - # Bypass if not a dictionary (e.g. verify) - if not ( - isinstance(session_setting, Mapping) and - isinstance(request_setting, Mapping) - ): - return request_setting - - merged_setting = dict_class(to_key_val_list(session_setting)) - merged_setting.update(to_key_val_list(request_setting)) - - # Remove keys that are set to None. - for (k, v) in request_setting.items(): - if v is None: - del merged_setting[k] - - return merged_setting - - -class SessionRedirectMixin(object): - def resolve_redirects(self, resp, req, stream=False, timeout=None, - verify=True, cert=None, proxies=None): - """Receives a Response. Returns a generator of Responses.""" - - i = 0 - - # ((resp.status_code is codes.see_other)) - while ('location' in resp.headers and resp.status_code in REDIRECT_STATI): - prepared_request = req.copy() - - resp.content # Consume socket so it can be released - - if i >= self.max_redirects: - raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects) - - # Release the connection back into the pool. - resp.close() - - url = resp.headers['location'] - method = req.method - - # Handle redirection without scheme (see: RFC 1808 Section 4) - if url.startswith('//'): - parsed_rurl = urlparse(resp.url) - url = '%s:%s' % (parsed_rurl.scheme, url) - - # The scheme should be lower case... - parsed = urlparse(url) - parsed = (parsed.scheme.lower(), parsed.netloc, parsed.path, - parsed.params, parsed.query, parsed.fragment) - url = urlunparse(parsed) - - # Facilitate non-RFC2616-compliant 'location' headers - # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') - # Compliant with RFC3986, we percent encode the url. - if not urlparse(url).netloc: - url = urljoin(resp.url, requote_uri(url)) - else: - url = requote_uri(url) - - prepared_request.url = url - - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4 - if (resp.status_code == codes.see_other and - method != 'HEAD'): - method = 'GET' - - # Do what the browsers do, despite standards... - if (resp.status_code in (codes.moved, codes.found) and - method not in ('GET', 'HEAD')): - method = 'GET' - - prepared_request.method = method - - # https://github.com/kennethreitz/requests/issues/1084 - if resp.status_code not in (codes.temporary, codes.resume): - if 'Content-Length' in prepared_request.headers: - del prepared_request.headers['Content-Length'] - - prepared_request.body = None - - headers = prepared_request.headers - try: - del headers['Cookie'] - except KeyError: - pass - - prepared_request.prepare_cookies(self.cookies) - - resp = self.send( - prepared_request, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - allow_redirects=False, - ) - - extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) - - i += 1 - yield resp - - -class Session(SessionRedirectMixin): - """A Requests session. - - Provides cookie persistence, connection-pooling, and configuration. - - Basic Usage:: - - >>> import requests - >>> s = requests.Session() - >>> s.get('http://httpbin.org/get') - 200 - """ - - __attrs__ = [ - 'headers', 'cookies', 'auth', 'timeout', 'proxies', 'hooks', - 'params', 'verify', 'cert', 'prefetch', 'adapters', 'stream', - 'trust_env', 'max_redirects'] - - def __init__(self): - - #: A case-insensitive dictionary of headers to be sent on each - #: :class:`Request <Request>` sent from this - #: :class:`Session <Session>`. - self.headers = default_headers() - - #: Default Authentication tuple or object to attach to - #: :class:`Request <Request>`. - self.auth = None - - #: Dictionary mapping protocol to the URL of the proxy (e.g. - #: {'http': 'foo.bar:3128'}) to be used on each - #: :class:`Request <Request>`. - self.proxies = {} - - #: Event-handling hooks. - self.hooks = default_hooks() - - #: Dictionary of querystring data to attach to each - #: :class:`Request <Request>`. The dictionary values may be lists for - #: representing multivalued query parameters. - self.params = {} - - #: Stream response content default. - self.stream = False - - #: SSL Verification default. - self.verify = True - - #: SSL certificate default. - self.cert = None - - #: Maximum number of redirects allowed. If the request exceeds this - #: limit, a :class:`TooManyRedirects` exception is raised. - self.max_redirects = DEFAULT_REDIRECT_LIMIT - - #: Should we trust the environment? - self.trust_env = True - - #: A CookieJar containing all currently outstanding cookies set on this - #: session. By default it is a - #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but - #: may be any other ``cookielib.CookieJar`` compatible object. - self.cookies = cookiejar_from_dict({}) - - # Default connection adapters. - self.adapters = OrderedDict() - self.mount('https://', HTTPAdapter()) - self.mount('http://', HTTPAdapter()) - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def prepare_request(self, request): - """Constructs a :class:`PreparedRequest <PreparedRequest>` for - transmission and returns it. The :class:`PreparedRequest` has settings - merged from the :class:`Request <Request>` instance and those of the - :class:`Session`. - - :param request: :class:`Request` instance to prepare with this - session's settings. - """ - cookies = request.cookies or {} - - # Bootstrap CookieJar. - if not isinstance(cookies, cookielib.CookieJar): - cookies = cookiejar_from_dict(cookies) - - # Merge with session cookies - merged_cookies = RequestsCookieJar() - merged_cookies.update(self.cookies) - merged_cookies.update(cookies) - - - # Set environment's basic authentication if not explicitly set. - auth = request.auth - if self.trust_env and not auth and not self.auth: - auth = get_netrc_auth(request.url) - - p = PreparedRequest() - p.prepare( - method=request.method.upper(), - url=request.url, - files=request.files, - data=request.data, - headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), - params=merge_setting(request.params, self.params), - auth=merge_setting(auth, self.auth), - cookies=merged_cookies, - hooks=merge_setting(request.hooks, self.hooks), - ) - return p - - def request(self, method, url, - params=None, - data=None, - headers=None, - cookies=None, - files=None, - auth=None, - timeout=None, - allow_redirects=True, - proxies=None, - hooks=None, - stream=None, - verify=None, - cert=None): - """Constructs a :class:`Request <Request>`, prepares it and sends it. - Returns :class:`Response <Response>` object. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query - string for the :class:`Request`. - :param data: (optional) Dictionary or bytes to send in the body of the - :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the - :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the - :class:`Request`. - :param files: (optional) Dictionary of 'filename': file-like-objects - for multipart encoding upload. - :param auth: (optional) Auth tuple or callable to enable - Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) Float describing the timeout of the - request. - :param allow_redirects: (optional) Boolean. Set to True by default. - :param proxies: (optional) Dictionary mapping protocol to the URL of - the proxy. - :param stream: (optional) whether to immediately download the response - content. Defaults to ``False``. - :param verify: (optional) if ``True``, the SSL cert will be verified. - A CA_BUNDLE path can also be provided. - :param cert: (optional) if String, path to ssl client cert file (.pem). - If Tuple, ('cert', 'key') pair. - """ - # Create the Request. - req = Request( - method = method.upper(), - url = url, - headers = headers, - files = files, - data = data or {}, - params = params or {}, - auth = auth, - cookies = cookies, - hooks = hooks, - ) - prep = self.prepare_request(req) - - # Add param cookies to session cookies - self.cookies = cookiejar_from_dict(cookies, cookiejar=self.cookies, overwrite=False) - - proxies = proxies or {} - - # Gather clues from the surrounding environment. - if self.trust_env: - # Set environment's proxies. - env_proxies = get_environ_proxies(url) or {} - for (k, v) in env_proxies.items(): - proxies.setdefault(k, v) - - # Look for configuration. - if not verify and verify is not False: - verify = os.environ.get('REQUESTS_CA_BUNDLE') - - # Curl compatibility. - if not verify and verify is not False: - verify = os.environ.get('CURL_CA_BUNDLE') - - # Merge all the kwargs. - proxies = merge_setting(proxies, self.proxies) - stream = merge_setting(stream, self.stream) - verify = merge_setting(verify, self.verify) - cert = merge_setting(cert, self.cert) - - # Send the request. - send_kwargs = { - 'stream': stream, - 'timeout': timeout, - 'verify': verify, - 'cert': cert, - 'proxies': proxies, - 'allow_redirects': allow_redirects, - } - resp = self.send(prep, **send_kwargs) - - return resp - - def get(self, url, **kwargs): - """Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('GET', url, **kwargs) - - def options(self, url, **kwargs): - """Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('OPTIONS', url, **kwargs) - - def head(self, url, **kwargs): - """Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', False) - return self.request('HEAD', url, **kwargs) - - def post(self, url, data=None, **kwargs): - """Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return self.request('POST', url, data=data, **kwargs) - - def put(self, url, data=None, **kwargs): - """Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return self.request('PUT', url, data=data, **kwargs) - - def patch(self, url, data=None, **kwargs): - """Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return self.request('PATCH', url, data=data, **kwargs) - - def delete(self, url, **kwargs): - """Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return self.request('DELETE', url, **kwargs) - - def send(self, request, **kwargs): - """Send a given PreparedRequest.""" - # Set defaults that the hooks can utilize to ensure they always have - # the correct parameters to reproduce the previous request. - kwargs.setdefault('stream', self.stream) - kwargs.setdefault('verify', self.verify) - kwargs.setdefault('cert', self.cert) - kwargs.setdefault('proxies', self.proxies) - - # It's possible that users might accidentally send a Request object. - # Guard against that specific failure case. - if not isinstance(request, PreparedRequest): - raise ValueError('You can only send PreparedRequests.') - - # Set up variables needed for resolve_redirects and dispatching of - # hooks - allow_redirects = kwargs.pop('allow_redirects', True) - stream = kwargs.get('stream') - timeout = kwargs.get('timeout') - verify = kwargs.get('verify') - cert = kwargs.get('cert') - proxies = kwargs.get('proxies') - hooks = request.hooks - - # Get the appropriate adapter to use - adapter = self.get_adapter(url=request.url) - - # Start time (approximately) of the request - start = datetime.utcnow() - # Send the request - r = adapter.send(request, **kwargs) - # Total elapsed time of the request (approximately) - r.elapsed = datetime.utcnow() - start - - # Response manipulation hooks - r = dispatch_hook('response', hooks, r, **kwargs) - - # Persist cookies - if r.history: - # If the hooks create history then we want those cookies too - for resp in r.history: - extract_cookies_to_jar(self.cookies, resp.request, resp.raw) - extract_cookies_to_jar(self.cookies, request, r.raw) - - # Redirect resolving generator. - gen = self.resolve_redirects(r, request, stream=stream, - timeout=timeout, verify=verify, cert=cert, - proxies=proxies) - - # Resolve redirects if allowed. - history = [resp for resp in gen] if allow_redirects else [] - - # Shuffle things around if there's history. - if history: - # Insert the first (original) request at the start - history.insert(0, r) - # Get the last request made - r = history.pop() - r.history = tuple(history) - - return r - - def get_adapter(self, url): - """Returns the appropriate connnection adapter for the given URL.""" - for (prefix, adapter) in self.adapters.items(): - - if url.lower().startswith(prefix): - return adapter - - # Nothing matches :-/ - raise InvalidSchema("No connection adapters were found for '%s'" % url) - - def close(self): - """Closes all adapters and as such the session""" - for v in self.adapters.values(): - v.close() - - def mount(self, prefix, adapter): - """Registers a connection adapter to a prefix. - - Adapters are sorted in descending order by key length.""" - self.adapters[prefix] = adapter - keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] - for key in keys_to_move: - self.adapters[key] = self.adapters.pop(key) - - def __getstate__(self): - return dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) - - def __setstate__(self, state): - for attr, value in state.items(): - setattr(self, attr, value) - - -def session(): - """Returns a :class:`Session` for context-management.""" - - return Session() diff --git a/vendor-local/lib/python/requests/status_codes.py b/vendor-local/lib/python/requests/status_codes.py deleted file mode 100644 index ed7a8660a6f..00000000000 --- a/vendor-local/lib/python/requests/status_codes.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- - -from .structures import LookupDict - -_codes = { - - # Informational. - 100: ('continue',), - 101: ('switching_protocols',), - 102: ('processing',), - 103: ('checkpoint',), - 122: ('uri_too_long', 'request_uri_too_long'), - 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), - 201: ('created',), - 202: ('accepted',), - 203: ('non_authoritative_info', 'non_authoritative_information'), - 204: ('no_content',), - 205: ('reset_content', 'reset'), - 206: ('partial_content', 'partial'), - 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), - 208: ('already_reported',), - 226: ('im_used',), - - # Redirection. - 300: ('multiple_choices',), - 301: ('moved_permanently', 'moved', '\\o-'), - 302: ('found',), - 303: ('see_other', 'other'), - 304: ('not_modified',), - 305: ('use_proxy',), - 306: ('switch_proxy',), - 307: ('temporary_redirect', 'temporary_moved', 'temporary'), - 308: ('resume_incomplete', 'resume'), - - # Client Error. - 400: ('bad_request', 'bad'), - 401: ('unauthorized',), - 402: ('payment_required', 'payment'), - 403: ('forbidden',), - 404: ('not_found', '-o-'), - 405: ('method_not_allowed', 'not_allowed'), - 406: ('not_acceptable',), - 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), - 408: ('request_timeout', 'timeout'), - 409: ('conflict',), - 410: ('gone',), - 411: ('length_required',), - 412: ('precondition_failed', 'precondition'), - 413: ('request_entity_too_large',), - 414: ('request_uri_too_large',), - 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), - 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), - 417: ('expectation_failed',), - 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), - 422: ('unprocessable_entity', 'unprocessable'), - 423: ('locked',), - 424: ('failed_dependency', 'dependency'), - 425: ('unordered_collection', 'unordered'), - 426: ('upgrade_required', 'upgrade'), - 428: ('precondition_required', 'precondition'), - 429: ('too_many_requests', 'too_many'), - 431: ('header_fields_too_large', 'fields_too_large'), - 444: ('no_response', 'none'), - 449: ('retry_with', 'retry'), - 450: ('blocked_by_windows_parental_controls', 'parental_controls'), - 451: ('unavailable_for_legal_reasons', 'legal_reasons'), - 499: ('client_closed_request',), - - # Server Error. - 500: ('internal_server_error', 'server_error', '/o\\', '✗'), - 501: ('not_implemented',), - 502: ('bad_gateway',), - 503: ('service_unavailable', 'unavailable'), - 504: ('gateway_timeout',), - 505: ('http_version_not_supported', 'http_version'), - 506: ('variant_also_negotiates',), - 507: ('insufficient_storage',), - 509: ('bandwidth_limit_exceeded', 'bandwidth'), - 510: ('not_extended',), -} - -codes = LookupDict(name='status_codes') - -for (code, titles) in list(_codes.items()): - for title in titles: - setattr(codes, title, code) - if not title.startswith('\\'): - setattr(codes, title.upper(), code) diff --git a/vendor-local/lib/python/requests/structures.py b/vendor-local/lib/python/requests/structures.py deleted file mode 100644 index a1759137aa0..00000000000 --- a/vendor-local/lib/python/requests/structures.py +++ /dev/null @@ -1,128 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.structures -~~~~~~~~~~~~~~~~~~~ - -Data structures that power Requests. - -""" - -import os -import collections -from itertools import islice - - -class IteratorProxy(object): - """docstring for IteratorProxy""" - def __init__(self, i): - self.i = i - # self.i = chain.from_iterable(i) - - def __iter__(self): - return self.i - - def __len__(self): - if hasattr(self.i, '__len__'): - return len(self.i) - if hasattr(self.i, 'len'): - return self.i.len - if hasattr(self.i, 'fileno'): - return os.fstat(self.i.fileno()).st_size - - def read(self, n): - return "".join(islice(self.i, None, n)) - - -class CaseInsensitiveDict(collections.MutableMapping): - """ - A case-insensitive ``dict``-like object. - - Implements all methods and operations of - ``collections.MutableMapping`` as well as dict's ``copy``. Also - provides ``lower_items``. - - All keys are expected to be strings. The structure remembers the - case of the last key to be set, and ``iter(instance)``, - ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` - will contain case-sensitive keys. However, querying and contains - testing is case insensitive: - - cid = CaseInsensitiveDict() - cid['Accept'] = 'application/json' - cid['aCCEPT'] == 'application/json' # True - list(cid) == ['Accept'] # True - - For example, ``headers['content-encoding']`` will return the - value of a ``'Content-Encoding'`` response header, regardless - of how the header name was originally stored. - - If the constructor, ``.update``, or equality comparison - operations are given keys that have equal ``.lower()``s, the - behavior is undefined. - - """ - def __init__(self, data=None, **kwargs): - self._store = dict() - if data is None: - data = {} - self.update(data, **kwargs) - - def __setitem__(self, key, value): - # Use the lowercased key for lookups, but store the actual - # key alongside the value. - self._store[key.lower()] = (key, value) - - def __getitem__(self, key): - return self._store[key.lower()][1] - - def __delitem__(self, key): - del self._store[key.lower()] - - def __iter__(self): - return (casedkey for casedkey, mappedvalue in self._store.values()) - - def __len__(self): - return len(self._store) - - def lower_items(self): - """Like iteritems(), but with all lowercase keys.""" - return ( - (lowerkey, keyval[1]) - for (lowerkey, keyval) - in self._store.items() - ) - - def __eq__(self, other): - if isinstance(other, collections.Mapping): - other = CaseInsensitiveDict(other) - else: - return NotImplemented - # Compare insensitively - return dict(self.lower_items()) == dict(other.lower_items()) - - # Copy is required - def copy(self): - return CaseInsensitiveDict(self._store.values()) - - def __repr__(self): - return '%s(%r)' % (self.__class__.__name__, dict(self.items())) - - -class LookupDict(dict): - """Dictionary lookup object.""" - - def __init__(self, name=None): - self.name = name - super(LookupDict, self).__init__() - - def __repr__(self): - return '<lookup \'%s\'>' % (self.name) - - def __getitem__(self, key): - # We allow fall-through here, so values default to None - - return self.__dict__.get(key, None) - - def get(self, key, default=None): - return self.__dict__.get(key, default) diff --git a/vendor-local/lib/python/requests/utils.py b/vendor-local/lib/python/requests/utils.py deleted file mode 100644 index 5000105a65e..00000000000 --- a/vendor-local/lib/python/requests/utils.py +++ /dev/null @@ -1,582 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. - -""" - -import cgi -import codecs -import collections -import io -import os -import platform -import re -import sys -from netrc import netrc, NetrcParseError - -from . import __version__ -from . import certs -from .compat import parse_http_list as _parse_list_header -from .compat import (quote, urlparse, bytes, str, OrderedDict, urlunparse, - is_py2, is_py3, builtin_str, getproxies, proxy_bypass) -from .cookies import RequestsCookieJar, cookiejar_from_dict -from .structures import CaseInsensitiveDict -from .exceptions import MissingSchema, InvalidURL - -_hush_pyflakes = (RequestsCookieJar,) - -NETRC_FILES = ('.netrc', '_netrc') - -DEFAULT_CA_BUNDLE_PATH = certs.where() - - -def dict_to_sequence(d): - """Returns an internal sequence dictionary update.""" - - if hasattr(d, 'items'): - d = d.items() - - return d - - -def super_len(o): - if hasattr(o, '__len__'): - return len(o) - - if hasattr(o, 'len'): - return o.len - - if hasattr(o, 'fileno'): - try: - fileno = o.fileno() - except io.UnsupportedOperation: - pass - else: - return os.fstat(fileno).st_size - - if hasattr(o, 'getvalue'): - # e.g. BytesIO, cStringIO.StringI - return len(o.getvalue()) - -def get_netrc_auth(url): - """Returns the Requests tuple auth for a given url from netrc.""" - - try: - locations = (os.path.expanduser('~/{0}'.format(f)) for f in NETRC_FILES) - netrc_path = None - - for loc in locations: - if os.path.exists(loc) and not netrc_path: - netrc_path = loc - - # Abort early if there isn't one. - if netrc_path is None: - return netrc_path - - ri = urlparse(url) - - # Strip port numbers from netloc - host = ri.netloc.split(':')[0] - - try: - _netrc = netrc(netrc_path).authenticators(host) - if _netrc: - # Return with login / password - login_i = (0 if _netrc[0] else 1) - return (_netrc[login_i], _netrc[2]) - except (NetrcParseError, IOError): - # If there was a parsing error or a permissions issue reading the file, - # we'll just skip netrc auth - pass - - # AppEngine hackiness. - except (ImportError, AttributeError): - pass - - -def guess_filename(obj): - """Tries to guess the filename of the given object.""" - name = getattr(obj, 'name', None) - if name and name[0] != '<' and name[-1] != '>': - return os.path.basename(name) - - -def from_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. Unless it can not be represented as such, return an - OrderedDict, e.g., - - :: - - >>> from_key_val_list([('key', 'val')]) - OrderedDict([('key', 'val')]) - >>> from_key_val_list('string') - ValueError: need more than 1 value to unpack - >>> from_key_val_list({'key': 'val'}) - OrderedDict([('key', 'val')]) - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - return OrderedDict(value) - - -def to_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. If it can be, return a list of tuples, e.g., - - :: - - >>> to_key_val_list([('key', 'val')]) - [('key', 'val')] - >>> to_key_val_list({'key': 'val'}) - [('key', 'val')] - >>> to_key_val_list('string') - ValueError: cannot encode objects that are not 2-tuples. - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - if isinstance(value, collections.Mapping): - value = value.items() - - return list(value) - - -# From mitsuhiko/werkzeug (used with permission). -def parse_list_header(value): - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -# From mitsuhiko/werkzeug (used with permission). -def parse_dict_header(value): - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict: - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - :param value: a string with a dict header. - :return: :class:`dict` - """ - result = {} - for item in _parse_list_header(value): - if '=' not in item: - result[item] = None - continue - name, value = item.split('=', 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -# From mitsuhiko/werkzeug (used with permission). -def unquote_header_value(value, is_filename=False): - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - :param value: the header value to unquote. - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != '\\\\': - return value.replace('\\\\', '\\').replace('\\"', '"') - return value - - -def dict_from_cookiejar(cj): - """Returns a key/value dictionary from a CookieJar. - - :param cj: CookieJar object to extract cookies from. - """ - - cookie_dict = {} - - for cookie in cj: - cookie_dict[cookie.name] = cookie.value - - return cookie_dict - - -def add_dict_to_cookiejar(cj, cookie_dict): - """Returns a CookieJar from a key/value dictionary. - - :param cj: CookieJar to insert cookies into. - :param cookie_dict: Dict of key/values to insert into CookieJar. - """ - - cj2 = cookiejar_from_dict(cookie_dict) - cj.update(cj2) - return cj - - -def get_encodings_from_content(content): - """Returns encodings from given content string. - - :param content: bytestring to extract encodings from. - """ - - charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) - pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I) - xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') - - return (charset_re.findall(content) + - pragma_re.findall(content) + - xml_re.findall(content)) - - -def get_encoding_from_headers(headers): - """Returns encodings from given HTTP Header Dict. - - :param headers: dictionary to extract encoding from. - """ - - content_type = headers.get('content-type') - - if not content_type: - return None - - content_type, params = cgi.parse_header(content_type) - - if 'charset' in params: - return params['charset'].strip("'\"") - - if 'text' in content_type: - return 'ISO-8859-1' - - -def stream_decode_response_unicode(iterator, r): - """Stream decodes a iterator.""" - - if r.encoding is None: - for item in iterator: - yield item - return - - decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') - for chunk in iterator: - rv = decoder.decode(chunk) - if rv: - yield rv - rv = decoder.decode(b'', final=True) - if rv: - yield rv - - -def iter_slices(string, slice_length): - """Iterate over slices of a string.""" - pos = 0 - while pos < len(string): - yield string[pos:pos + slice_length] - pos += slice_length - - -def get_unicode_from_response(r): - """Returns the requested content back in unicode. - - :param r: Response object to get unicode content from. - - Tried: - - 1. charset from content-type - - 2. every encodings from ``<meta ... charset=XXX>`` - - 3. fall back and replace all unicode characters - - """ - - tried_encodings = [] - - # Try charset from content-type - encoding = get_encoding_from_headers(r.headers) - - if encoding: - try: - return str(r.content, encoding) - except UnicodeError: - tried_encodings.append(encoding) - - # Fall back: - try: - return str(r.content, encoding, errors='replace') - except TypeError: - return r.content - - -# The unreserved URI characters (RFC 3986) -UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - + "0123456789-._~") - - -def unquote_unreserved(uri): - """Un-escape any percent-escape sequences in a URI that are unreserved - characters. This leaves all reserved, illegal and non-ASCII bytes encoded. - """ - parts = uri.split('%') - for i in range(1, len(parts)): - h = parts[i][0:2] - if len(h) == 2 and h.isalnum(): - try: - c = chr(int(h, 16)) - except ValueError: - raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) - - if c in UNRESERVED_SET: - parts[i] = c + parts[i][2:] - else: - parts[i] = '%' + parts[i] - else: - parts[i] = '%' + parts[i] - return ''.join(parts) - - -def requote_uri(uri): - """Re-quote the given URI. - - This function passes the given URI through an unquote/quote cycle to - ensure that it is fully and consistently quoted. - """ - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, unreserved, - # or '%') - return quote(unquote_unreserved(uri), safe="!#$%&'()*+,/:;=?@[]~") - - -def get_environ_proxies(url): - """Return a dict of environment proxies.""" - - get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) - - # First check whether no_proxy is defined. If it is, check that the URL - # we're getting isn't in the no_proxy list. - no_proxy = get_proxy('no_proxy') - netloc = urlparse(url).netloc - - if no_proxy: - # We need to check whether we match here. We need to see if we match - # the end of the netloc, both with and without the port. - no_proxy = no_proxy.replace(' ', '').split(',') - - for host in no_proxy: - if netloc.endswith(host) or netloc.split(':')[0].endswith(host): - # The URL does match something in no_proxy, so we don't want - # to apply the proxies on this URL. - return {} - - # If the system proxy settings indicate that this URL should be bypassed, - # don't proxy. - if proxy_bypass(netloc): - return {} - - # If we get here, we either didn't have no_proxy set or we're not going - # anywhere that no_proxy applies to, and the system settings don't require - # bypassing the proxy for the current URL. - return getproxies() - - -def default_user_agent(): - """Return a string representing the default user agent.""" - _implementation = platform.python_implementation() - - if _implementation == 'CPython': - _implementation_version = platform.python_version() - elif _implementation == 'PyPy': - _implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, - sys.pypy_version_info.minor, - sys.pypy_version_info.micro) - if sys.pypy_version_info.releaselevel != 'final': - _implementation_version = ''.join([_implementation_version, sys.pypy_version_info.releaselevel]) - elif _implementation == 'Jython': - _implementation_version = platform.python_version() # Complete Guess - elif _implementation == 'IronPython': - _implementation_version = platform.python_version() # Complete Guess - else: - _implementation_version = 'Unknown' - - try: - p_system = platform.system() - p_release = platform.release() - except IOError: - p_system = 'Unknown' - p_release = 'Unknown' - - return " ".join(['python-requests/%s' % __version__, - '%s/%s' % (_implementation, _implementation_version), - '%s/%s' % (p_system, p_release)]) - - -def default_headers(): - return CaseInsensitiveDict({ - 'User-Agent': default_user_agent(), - 'Accept-Encoding': ', '.join(('gzip', 'deflate', 'compress')), - 'Accept': '*/*' - }) - - -def parse_header_links(value): - """Return a dict of parsed link headers proxies. - - i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg" - - """ - - links = [] - - replace_chars = " '\"" - - for val in value.split(","): - try: - url, params = val.split(";", 1) - except ValueError: - url, params = val, '' - - link = {} - - link["url"] = url.strip("<> '\"") - - for param in params.split(";"): - try: - key, value = param.split("=") - except ValueError: - break - - link[key.strip(replace_chars)] = value.strip(replace_chars) - - links.append(link) - - return links - - -# Null bytes; no need to recreate these on each call to guess_json_utf -_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 -_null2 = _null * 2 -_null3 = _null * 3 - - -def guess_json_utf(data): - # JSON always starts with two ASCII characters, so detection is as - # easy as counting the nulls and from their location and count - # determine the encoding. Also detect a BOM, if present. - sample = data[:4] - if sample in (codecs.BOM_UTF32_LE, codecs.BOM32_BE): - return 'utf-32' # BOM included - if sample[:3] == codecs.BOM_UTF8: - return 'utf-8-sig' # BOM included, MS style (discouraged) - if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): - return 'utf-16' # BOM included - nullcount = sample.count(_null) - if nullcount == 0: - return 'utf-8' - if nullcount == 2: - if sample[::2] == _null2: # 1st and 3rd are null - return 'utf-16-be' - if sample[1::2] == _null2: # 2nd and 4th are null - return 'utf-16-le' - # Did not detect 2 valid UTF-16 ascii-range characters - if nullcount == 3: - if sample[:3] == _null3: - return 'utf-32-be' - if sample[1:] == _null3: - return 'utf-32-le' - # Did not detect a valid UTF-32 ascii-range character - return None - - -def except_on_missing_scheme(url): - """Given a URL, raise a MissingSchema exception if the scheme is missing. - """ - scheme, netloc, path, params, query, fragment = urlparse(url) - - if not scheme: - raise MissingSchema('Proxy URLs must have explicit schemes.') - - -def get_auth_from_url(url): - """Given a url with authentication components, extract them into a tuple of - username,password.""" - if url: - parsed = urlparse(url) - return (parsed.username, parsed.password) - else: - return ('', '') - - -def to_native_string(string, encoding='ascii'): - """ - Given a string object, regardless of type, returns a representation of that - string in the native string type, encoding and decoding where necessary. - This assumes ASCII unless told otherwise. - """ - out = None - - if isinstance(string, builtin_str): - out = string - else: - if is_py2: - out = string.encode(encoding) - else: - out = string.decode(encoding) - - return out diff --git a/vendor-local/lib/python/rest_framework/__init__.py b/vendor-local/lib/python/rest_framework/__init__.py deleted file mode 100644 index 087808e0b20..00000000000 --- a/vendor-local/lib/python/rest_framework/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -__version__ = '2.3.7' - -VERSION = __version__ # synonym - -# Header encoding (see RFC5987) -HTTP_HEADER_ENCODING = 'iso-8859-1' - -# Default datetime input and output formats -ISO_8601 = 'iso-8601' diff --git a/vendor-local/lib/python/rest_framework/authentication.py b/vendor-local/lib/python/rest_framework/authentication.py deleted file mode 100644 index cf001a24dd1..00000000000 --- a/vendor-local/lib/python/rest_framework/authentication.py +++ /dev/null @@ -1,348 +0,0 @@ -""" -Provides various authentication policies. -""" -from __future__ import unicode_literals -import base64 - -from django.contrib.auth import authenticate -from django.core.exceptions import ImproperlyConfigured -from rest_framework import exceptions, HTTP_HEADER_ENCODING -from rest_framework.compat import CsrfViewMiddleware -from rest_framework.compat import oauth, oauth_provider, oauth_provider_store -from rest_framework.compat import oauth2_provider, provider_now -from rest_framework.authtoken.models import Token - - -def get_authorization_header(request): - """ - Return request's 'Authorization:' header, as a bytestring. - - Hide some test client ickyness where the header can be unicode. - """ - auth = request.META.get('HTTP_AUTHORIZATION', b'') - if type(auth) == type(''): - # Work around django test client oddness - auth = auth.encode(HTTP_HEADER_ENCODING) - return auth - - -class CSRFCheck(CsrfViewMiddleware): - def _reject(self, request, reason): - # Return the failure reason instead of an HttpResponse - return reason - - -class BaseAuthentication(object): - """ - All authentication classes should extend BaseAuthentication. - """ - - def authenticate(self, request): - """ - Authenticate the request and return a two-tuple of (user, token). - """ - raise NotImplementedError(".authenticate() must be overridden.") - - def authenticate_header(self, request): - """ - Return a string to be used as the value of the `WWW-Authenticate` - header in a `401 Unauthenticated` response, or `None` if the - authentication scheme should return `403 Permission Denied` responses. - """ - pass - - -class BasicAuthentication(BaseAuthentication): - """ - HTTP Basic authentication against username/password. - """ - www_authenticate_realm = 'api' - - def authenticate(self, request): - """ - Returns a `User` if a correct username and password have been supplied - using HTTP Basic authentication. Otherwise returns `None`. - """ - auth = get_authorization_header(request).split() - - if not auth or auth[0].lower() != b'basic': - return None - - if len(auth) == 1: - msg = 'Invalid basic header. No credentials provided.' - raise exceptions.AuthenticationFailed(msg) - elif len(auth) > 2: - msg = 'Invalid basic header. Credentials string should not contain spaces.' - raise exceptions.AuthenticationFailed(msg) - - try: - auth_parts = base64.b64decode(auth[1]).decode(HTTP_HEADER_ENCODING).partition(':') - except (TypeError, UnicodeDecodeError): - msg = 'Invalid basic header. Credentials not correctly base64 encoded' - raise exceptions.AuthenticationFailed(msg) - - userid, password = auth_parts[0], auth_parts[2] - return self.authenticate_credentials(userid, password) - - def authenticate_credentials(self, userid, password): - """ - Authenticate the userid and password against username and password. - """ - user = authenticate(username=userid, password=password) - if user is None or not user.is_active: - raise exceptions.AuthenticationFailed('Invalid username/password') - return (user, None) - - def authenticate_header(self, request): - return 'Basic realm="%s"' % self.www_authenticate_realm - - -class SessionAuthentication(BaseAuthentication): - """ - Use Django's session framework for authentication. - """ - - def authenticate(self, request): - """ - Returns a `User` if the request session currently has a logged in user. - Otherwise returns `None`. - """ - - # Get the underlying HttpRequest object - request = request._request - user = getattr(request, 'user', None) - - # Unauthenticated, CSRF validation not required - if not user or not user.is_active: - return None - - self.enforce_csrf(request) - - # CSRF passed with authenticated user - return (user, None) - - def enforce_csrf(self, request): - """ - Enforce CSRF validation for session based authentication. - """ - reason = CSRFCheck().process_view(request, None, (), {}) - if reason: - # CSRF failed, bail with explicit error message - raise exceptions.AuthenticationFailed('CSRF Failed: %s' % reason) - - -class TokenAuthentication(BaseAuthentication): - """ - Simple token based authentication. - - Clients should authenticate by passing the token key in the "Authorization" - HTTP header, prepended with the string "Token ". For example: - - Authorization: Token 401f7ac837da42b97f613d789819ff93537bee6a - """ - - model = Token - """ - A custom token model may be used, but must have the following properties. - - * key -- The string identifying the token - * user -- The user to which the token belongs - """ - - def authenticate(self, request): - auth = get_authorization_header(request).split() - - if not auth or auth[0].lower() != b'token': - return None - - if len(auth) == 1: - msg = 'Invalid token header. No credentials provided.' - raise exceptions.AuthenticationFailed(msg) - elif len(auth) > 2: - msg = 'Invalid token header. Token string should not contain spaces.' - raise exceptions.AuthenticationFailed(msg) - - return self.authenticate_credentials(auth[1]) - - def authenticate_credentials(self, key): - try: - token = self.model.objects.get(key=key) - except self.model.DoesNotExist: - raise exceptions.AuthenticationFailed('Invalid token') - - if not token.user.is_active: - raise exceptions.AuthenticationFailed('User inactive or deleted') - - return (token.user, token) - - def authenticate_header(self, request): - return 'Token' - - -class OAuthAuthentication(BaseAuthentication): - """ - OAuth 1.0a authentication backend using `django-oauth-plus` and `oauth2`. - - Note: The `oauth2` package actually provides oauth1.0a support. Urg. - We import it from the `compat` module as `oauth`. - """ - www_authenticate_realm = 'api' - - def __init__(self, *args, **kwargs): - super(OAuthAuthentication, self).__init__(*args, **kwargs) - - if oauth is None: - raise ImproperlyConfigured( - "The 'oauth2' package could not be imported." - "It is required for use with the 'OAuthAuthentication' class.") - - if oauth_provider is None: - raise ImproperlyConfigured( - "The 'django-oauth-plus' package could not be imported." - "It is required for use with the 'OAuthAuthentication' class.") - - def authenticate(self, request): - """ - Returns two-tuple of (user, token) if authentication succeeds, - or None otherwise. - """ - try: - oauth_request = oauth_provider.utils.get_oauth_request(request) - except oauth.Error as err: - raise exceptions.AuthenticationFailed(err.message) - - if not oauth_request: - return None - - oauth_params = oauth_provider.consts.OAUTH_PARAMETERS_NAMES - - found = any(param for param in oauth_params if param in oauth_request) - missing = list(param for param in oauth_params if param not in oauth_request) - - if not found: - # OAuth authentication was not attempted. - return None - - if missing: - # OAuth was attempted but missing parameters. - msg = 'Missing parameters: %s' % (', '.join(missing)) - raise exceptions.AuthenticationFailed(msg) - - if not self.check_nonce(request, oauth_request): - msg = 'Nonce check failed' - raise exceptions.AuthenticationFailed(msg) - - try: - consumer_key = oauth_request.get_parameter('oauth_consumer_key') - consumer = oauth_provider_store.get_consumer(request, oauth_request, consumer_key) - except oauth_provider.store.InvalidConsumerError: - msg = 'Invalid consumer token: %s' % oauth_request.get_parameter('oauth_consumer_key') - raise exceptions.AuthenticationFailed(msg) - - if consumer.status != oauth_provider.consts.ACCEPTED: - msg = 'Invalid consumer key status: %s' % consumer.get_status_display() - raise exceptions.AuthenticationFailed(msg) - - try: - token_param = oauth_request.get_parameter('oauth_token') - token = oauth_provider_store.get_access_token(request, oauth_request, consumer, token_param) - except oauth_provider.store.InvalidTokenError: - msg = 'Invalid access token: %s' % oauth_request.get_parameter('oauth_token') - raise exceptions.AuthenticationFailed(msg) - - try: - self.validate_token(request, consumer, token) - except oauth.Error as err: - raise exceptions.AuthenticationFailed(err.message) - - user = token.user - - if not user.is_active: - msg = 'User inactive or deleted: %s' % user.username - raise exceptions.AuthenticationFailed(msg) - - return (token.user, token) - - def authenticate_header(self, request): - """ - If permission is denied, return a '401 Unauthorized' response, - with an appropraite 'WWW-Authenticate' header. - """ - return 'OAuth realm="%s"' % self.www_authenticate_realm - - def validate_token(self, request, consumer, token): - """ - Check the token and raise an `oauth.Error` exception if invalid. - """ - oauth_server, oauth_request = oauth_provider.utils.initialize_server_request(request) - oauth_server.verify_request(oauth_request, consumer, token) - - def check_nonce(self, request, oauth_request): - """ - Checks nonce of request, and return True if valid. - """ - return oauth_provider_store.check_nonce(request, oauth_request, oauth_request['oauth_nonce']) - - -class OAuth2Authentication(BaseAuthentication): - """ - OAuth 2 authentication backend using `django-oauth2-provider` - """ - www_authenticate_realm = 'api' - - def __init__(self, *args, **kwargs): - super(OAuth2Authentication, self).__init__(*args, **kwargs) - - if oauth2_provider is None: - raise ImproperlyConfigured( - "The 'django-oauth2-provider' package could not be imported. " - "It is required for use with the 'OAuth2Authentication' class.") - - def authenticate(self, request): - """ - Returns two-tuple of (user, token) if authentication succeeds, - or None otherwise. - """ - - auth = get_authorization_header(request).split() - - if not auth or auth[0].lower() != b'bearer': - return None - - if len(auth) == 1: - msg = 'Invalid bearer header. No credentials provided.' - raise exceptions.AuthenticationFailed(msg) - elif len(auth) > 2: - msg = 'Invalid bearer header. Token string should not contain spaces.' - raise exceptions.AuthenticationFailed(msg) - - return self.authenticate_credentials(request, auth[1]) - - def authenticate_credentials(self, request, access_token): - """ - Authenticate the request, given the access token. - """ - - try: - token = oauth2_provider.models.AccessToken.objects.select_related('user') - # provider_now switches to timezone aware datetime when - # the oauth2_provider version supports to it. - token = token.get(token=access_token, expires__gt=provider_now()) - except oauth2_provider.models.AccessToken.DoesNotExist: - raise exceptions.AuthenticationFailed('Invalid token') - - user = token.user - - if not user.is_active: - msg = 'User inactive or deleted: %s' % user.username - raise exceptions.AuthenticationFailed(msg) - - return (user, token) - - def authenticate_header(self, request): - """ - Bearer is the only finalized type currently - - Check details on the `OAuth2Authentication.authenticate` method - """ - return 'Bearer realm="%s"' % self.www_authenticate_realm diff --git a/vendor-local/lib/python/rest_framework/authtoken/__init__.py b/vendor-local/lib/python/rest_framework/authtoken/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/rest_framework/authtoken/admin.py b/vendor-local/lib/python/rest_framework/authtoken/admin.py deleted file mode 100644 index ec28eb1ca2a..00000000000 --- a/vendor-local/lib/python/rest_framework/authtoken/admin.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.contrib import admin -from rest_framework.authtoken.models import Token - - -class TokenAdmin(admin.ModelAdmin): - list_display = ('key', 'user', 'created') - fields = ('user',) - ordering = ('-created',) - - -admin.site.register(Token, TokenAdmin) diff --git a/vendor-local/lib/python/rest_framework/authtoken/migrations/0001_initial.py b/vendor-local/lib/python/rest_framework/authtoken/migrations/0001_initial.py deleted file mode 100644 index d5965e4042c..00000000000 --- a/vendor-local/lib/python/rest_framework/authtoken/migrations/0001_initial.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - -from rest_framework.settings import api_settings - - -try: - from django.contrib.auth import get_user_model -except ImportError: # django < 1.5 - from django.contrib.auth.models import User -else: - User = get_user_model() - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding model 'Token' - db.create_table('authtoken_token', ( - ('key', self.gf('django.db.models.fields.CharField')(max_length=40, primary_key=True)), - ('user', self.gf('django.db.models.fields.related.OneToOneField')(related_name='auth_token', unique=True, to=orm['%s.%s' % (User._meta.app_label, User._meta.object_name)])), - ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), - )) - db.send_create_signal('authtoken', ['Token']) - - - def backwards(self, orm): - # Deleting model 'Token' - db.delete_table('authtoken_token') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - "%s.%s" % (User._meta.app_label, User._meta.module_name): { - 'Meta': {'object_name': User._meta.module_name}, - }, - 'authtoken.token': { - 'Meta': {'object_name': 'Token'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'primary_key': 'True'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'auth_token'", 'unique': 'True', 'to': "orm['%s.%s']" % (User._meta.app_label, User._meta.object_name)}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['authtoken'] diff --git a/vendor-local/lib/python/rest_framework/authtoken/migrations/__init__.py b/vendor-local/lib/python/rest_framework/authtoken/migrations/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/rest_framework/authtoken/models.py b/vendor-local/lib/python/rest_framework/authtoken/models.py deleted file mode 100644 index 7601f5b791c..00000000000 --- a/vendor-local/lib/python/rest_framework/authtoken/models.py +++ /dev/null @@ -1,35 +0,0 @@ -import uuid -import hmac -from hashlib import sha1 -from rest_framework.compat import AUTH_USER_MODEL -from django.conf import settings -from django.db import models - - -class Token(models.Model): - """ - The default authorization token model. - """ - key = models.CharField(max_length=40, primary_key=True) - user = models.OneToOneField(AUTH_USER_MODEL, related_name='auth_token') - created = models.DateTimeField(auto_now_add=True) - - class Meta: - # Work around for a bug in Django: - # https://code.djangoproject.com/ticket/19422 - # - # Also see corresponding ticket: - # https://github.com/tomchristie/django-rest-framework/issues/705 - abstract = 'rest_framework.authtoken' not in settings.INSTALLED_APPS - - def save(self, *args, **kwargs): - if not self.key: - self.key = self.generate_key() - return super(Token, self).save(*args, **kwargs) - - def generate_key(self): - unique = uuid.uuid4() - return hmac.new(unique.bytes, digestmod=sha1).hexdigest() - - def __unicode__(self): - return self.key diff --git a/vendor-local/lib/python/rest_framework/authtoken/serializers.py b/vendor-local/lib/python/rest_framework/authtoken/serializers.py deleted file mode 100644 index 60a3740e76e..00000000000 --- a/vendor-local/lib/python/rest_framework/authtoken/serializers.py +++ /dev/null @@ -1,24 +0,0 @@ -from django.contrib.auth import authenticate -from rest_framework import serializers - - -class AuthTokenSerializer(serializers.Serializer): - username = serializers.CharField() - password = serializers.CharField() - - def validate(self, attrs): - username = attrs.get('username') - password = attrs.get('password') - - if username and password: - user = authenticate(username=username, password=password) - - if user: - if not user.is_active: - raise serializers.ValidationError('User account is disabled.') - attrs['user'] = user - return attrs - else: - raise serializers.ValidationError('Unable to login with provided credentials.') - else: - raise serializers.ValidationError('Must include "username" and "password"') diff --git a/vendor-local/lib/python/rest_framework/authtoken/views.py b/vendor-local/lib/python/rest_framework/authtoken/views.py deleted file mode 100644 index 7c03cb76660..00000000000 --- a/vendor-local/lib/python/rest_framework/authtoken/views.py +++ /dev/null @@ -1,26 +0,0 @@ -from rest_framework.views import APIView -from rest_framework import status -from rest_framework import parsers -from rest_framework import renderers -from rest_framework.response import Response -from rest_framework.authtoken.models import Token -from rest_framework.authtoken.serializers import AuthTokenSerializer - - -class ObtainAuthToken(APIView): - throttle_classes = () - permission_classes = () - parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,) - renderer_classes = (renderers.JSONRenderer,) - serializer_class = AuthTokenSerializer - model = Token - - def post(self, request): - serializer = self.serializer_class(data=request.DATA) - if serializer.is_valid(): - token, created = Token.objects.get_or_create(user=serializer.object['user']) - return Response({'token': token.key}) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - - -obtain_auth_token = ObtainAuthToken.as_view() diff --git a/vendor-local/lib/python/rest_framework/compat.py b/vendor-local/lib/python/rest_framework/compat.py deleted file mode 100644 index 6f7447add08..00000000000 --- a/vendor-local/lib/python/rest_framework/compat.py +++ /dev/null @@ -1,557 +0,0 @@ -""" -The `compat` module provides support for backwards compatibility with older -versions of django/python, and compatibility wrappers around optional packages. -""" - -# flake8: noqa -from __future__ import unicode_literals - -import django -from django.core.exceptions import ImproperlyConfigured -from django.conf import settings - -# Try to import six from Django, fallback to included `six`. -try: - from django.utils import six -except ImportError: - from rest_framework import six - -# location of patterns, url, include changes in 1.4 onwards -try: - from django.conf.urls import patterns, url, include -except ImportError: - from django.conf.urls.defaults import patterns, url, include - -# Handle django.utils.encoding rename: -# smart_unicode -> smart_text -# force_unicode -> force_text -try: - from django.utils.encoding import smart_text -except ImportError: - from django.utils.encoding import smart_unicode as smart_text -try: - from django.utils.encoding import force_text -except ImportError: - from django.utils.encoding import force_unicode as force_text - - -# HttpResponseBase only exists from 1.5 onwards -try: - from django.http.response import HttpResponseBase -except ImportError: - from django.http import HttpResponse as HttpResponseBase - -# django-filter is optional -try: - import django_filters -except ImportError: - django_filters = None - - -# cStringIO only if it's available, otherwise StringIO -try: - import cStringIO.StringIO as StringIO -except ImportError: - StringIO = six.StringIO - -BytesIO = six.BytesIO - - -# urlparse compat import (Required because it changed in python 3.x) -try: - from urllib import parse as urlparse -except ImportError: - import urlparse - - -# Try to import PIL in either of the two ways it can end up installed. -try: - from PIL import Image -except ImportError: - try: - import Image - except ImportError: - Image = None - - -def get_concrete_model(model_cls): - try: - return model_cls._meta.concrete_model - except AttributeError: - # 1.3 does not include concrete model - return model_cls - - -# Django 1.5 add support for custom auth user model -if django.VERSION >= (1, 5): - AUTH_USER_MODEL = settings.AUTH_USER_MODEL -else: - AUTH_USER_MODEL = 'auth.User' - - -if django.VERSION >= (1, 5): - from django.views.generic import View -else: - from django.views.generic import View as _View - from django.utils.decorators import classonlymethod - from django.utils.functional import update_wrapper - - class View(_View): - # 1.3 does not include head method in base View class - # See: https://code.djangoproject.com/ticket/15668 - @classonlymethod - def as_view(cls, **initkwargs): - """ - Main entry point for a request-response process. - """ - # sanitize keyword arguments - for key in initkwargs: - if key in cls.http_method_names: - raise TypeError("You tried to pass in the %s method name as a " - "keyword argument to %s(). Don't do that." - % (key, cls.__name__)) - if not hasattr(cls, key): - raise TypeError("%s() received an invalid keyword %r" % ( - cls.__name__, key)) - - def view(request, *args, **kwargs): - self = cls(**initkwargs) - if hasattr(self, 'get') and not hasattr(self, 'head'): - self.head = self.get - return self.dispatch(request, *args, **kwargs) - - # take name and docstring from class - update_wrapper(view, cls, updated=()) - - # and possible attributes set by decorators - # like csrf_exempt from dispatch - update_wrapper(view, cls.dispatch, assigned=()) - return view - - # _allowed_methods only present from 1.5 onwards - def _allowed_methods(self): - return [m.upper() for m in self.http_method_names if hasattr(self, m)] - - -# PATCH method is not implemented by Django -if 'patch' not in View.http_method_names: - View.http_method_names = View.http_method_names + ['patch'] - - -# PUT, DELETE do not require CSRF until 1.4. They should. Make it better. -if django.VERSION >= (1, 4): - from django.middleware.csrf import CsrfViewMiddleware -else: - import hashlib - import re - import random - import logging - - from django.conf import settings - from django.core.urlresolvers import get_callable - - try: - from logging import NullHandler - except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass - - logger = logging.getLogger('django.request') - - if not logger.handlers: - logger.addHandler(NullHandler()) - - def same_origin(url1, url2): - """ - Checks if two URLs are 'same-origin' - """ - p1, p2 = urlparse.urlparse(url1), urlparse.urlparse(url2) - return p1[0:2] == p2[0:2] - - def constant_time_compare(val1, val2): - """ - Returns True if the two strings are equal, False otherwise. - - The time taken is independent of the number of characters that match. - """ - if len(val1) != len(val2): - return False - result = 0 - for x, y in zip(val1, val2): - result |= ord(x) ^ ord(y) - return result == 0 - - # Use the system (hardware-based) random number generator if it exists. - if hasattr(random, 'SystemRandom'): - randrange = random.SystemRandom().randrange - else: - randrange = random.randrange - - _MAX_CSRF_KEY = 18446744073709551616 # 2 << 63 - - REASON_NO_REFERER = "Referer checking failed - no Referer." - REASON_BAD_REFERER = "Referer checking failed - %s does not match %s." - REASON_NO_CSRF_COOKIE = "CSRF cookie not set." - REASON_BAD_TOKEN = "CSRF token missing or incorrect." - - def _get_failure_view(): - """ - Returns the view to be used for CSRF rejections - """ - return get_callable(settings.CSRF_FAILURE_VIEW) - - def _get_new_csrf_key(): - return hashlib.md5("%s%s" % (randrange(0, _MAX_CSRF_KEY), settings.SECRET_KEY)).hexdigest() - - def get_token(request): - """ - Returns the the CSRF token required for a POST form. The token is an - alphanumeric value. - - A side effect of calling this function is to make the the csrf_protect - decorator and the CsrfViewMiddleware add a CSRF cookie and a 'Vary: Cookie' - header to the outgoing response. For this reason, you may need to use this - function lazily, as is done by the csrf context processor. - """ - request.META["CSRF_COOKIE_USED"] = True - return request.META.get("CSRF_COOKIE", None) - - def _sanitize_token(token): - # Allow only alphanum, and ensure we return a 'str' for the sake of the post - # processing middleware. - token = re.sub('[^a-zA-Z0-9]', '', str(token.decode('ascii', 'ignore'))) - if token == "": - # In case the cookie has been truncated to nothing at some point. - return _get_new_csrf_key() - else: - return token - - class CsrfViewMiddleware(object): - """ - Middleware that requires a present and correct csrfmiddlewaretoken - for POST requests that have a CSRF cookie, and sets an outgoing - CSRF cookie. - - This middleware should be used in conjunction with the csrf_token template - tag. - """ - # The _accept and _reject methods currently only exist for the sake of the - # requires_csrf_token decorator. - def _accept(self, request): - # Avoid checking the request twice by adding a custom attribute to - # request. This will be relevant when both decorator and middleware - # are used. - request.csrf_processing_done = True - return None - - def _reject(self, request, reason): - return _get_failure_view()(request, reason=reason) - - def process_view(self, request, callback, callback_args, callback_kwargs): - - if getattr(request, 'csrf_processing_done', False): - return None - - try: - csrf_token = _sanitize_token(request.COOKIES[settings.CSRF_COOKIE_NAME]) - # Use same token next time - request.META['CSRF_COOKIE'] = csrf_token - except KeyError: - csrf_token = None - # Generate token and store it in the request, so it's available to the view. - request.META["CSRF_COOKIE"] = _get_new_csrf_key() - - # Wait until request.META["CSRF_COOKIE"] has been manipulated before - # bailing out, so that get_token still works - if getattr(callback, 'csrf_exempt', False): - return None - - # Assume that anything not defined as 'safe' by RC2616 needs protection. - if request.method not in ('GET', 'HEAD', 'OPTIONS', 'TRACE'): - if getattr(request, '_dont_enforce_csrf_checks', False): - # Mechanism to turn off CSRF checks for test suite. It comes after - # the creation of CSRF cookies, so that everything else continues to - # work exactly the same (e.g. cookies are sent etc), but before the - # any branches that call reject() - return self._accept(request) - - if request.is_secure(): - # Suppose user visits http://example.com/ - # An active network attacker,(man-in-the-middle, MITM) sends a - # POST form which targets https://example.com/detonate-bomb/ and - # submits it via javascript. - # - # The attacker will need to provide a CSRF cookie and token, but - # that is no problem for a MITM and the session independent - # nonce we are using. So the MITM can circumvent the CSRF - # protection. This is true for any HTTP connection, but anyone - # using HTTPS expects better! For this reason, for - # https://example.com/ we need additional protection that treats - # http://example.com/ as completely untrusted. Under HTTPS, - # Barth et al. found that the Referer header is missing for - # same-domain requests in only about 0.2% of cases or less, so - # we can use strict Referer checking. - referer = request.META.get('HTTP_REFERER') - if referer is None: - logger.warning('Forbidden (%s): %s' % (REASON_NO_REFERER, request.path), - extra={ - 'status_code': 403, - 'request': request, - } - ) - return self._reject(request, REASON_NO_REFERER) - - # Note that request.get_host() includes the port - good_referer = 'https://%s/' % request.get_host() - if not same_origin(referer, good_referer): - reason = REASON_BAD_REFERER % (referer, good_referer) - logger.warning('Forbidden (%s): %s' % (reason, request.path), - extra={ - 'status_code': 403, - 'request': request, - } - ) - return self._reject(request, reason) - - if csrf_token is None: - # No CSRF cookie. For POST requests, we insist on a CSRF cookie, - # and in this way we can avoid all CSRF attacks, including login - # CSRF. - logger.warning('Forbidden (%s): %s' % (REASON_NO_CSRF_COOKIE, request.path), - extra={ - 'status_code': 403, - 'request': request, - } - ) - return self._reject(request, REASON_NO_CSRF_COOKIE) - - # check non-cookie token for match - request_csrf_token = "" - if request.method == "POST": - request_csrf_token = request.POST.get('csrfmiddlewaretoken', '') - - if request_csrf_token == "": - # Fall back to X-CSRFToken, to make things easier for AJAX, - # and possible for PUT/DELETE - request_csrf_token = request.META.get('HTTP_X_CSRFTOKEN', '') - - if not constant_time_compare(request_csrf_token, csrf_token): - logger.warning('Forbidden (%s): %s' % (REASON_BAD_TOKEN, request.path), - extra={ - 'status_code': 403, - 'request': request, - } - ) - return self._reject(request, REASON_BAD_TOKEN) - - return self._accept(request) - -# timezone support is new in Django 1.4 -try: - from django.utils import timezone -except ImportError: - timezone = None - -# dateparse is ALSO new in Django 1.4 -try: - from django.utils.dateparse import parse_date, parse_datetime, parse_time -except ImportError: - import datetime - import re - - date_re = re.compile( - r'(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})$' - ) - - datetime_re = re.compile( - r'(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})' - r'[T ](?P<hour>\d{1,2}):(?P<minute>\d{1,2})' - r'(?::(?P<second>\d{1,2})(?:\.(?P<microsecond>\d{1,6})\d{0,6})?)?' - r'(?P<tzinfo>Z|[+-]\d{1,2}:\d{1,2})?$' - ) - - time_re = re.compile( - r'(?P<hour>\d{1,2}):(?P<minute>\d{1,2})' - r'(?::(?P<second>\d{1,2})(?:\.(?P<microsecond>\d{1,6})\d{0,6})?)?' - ) - - def parse_date(value): - match = date_re.match(value) - if match: - kw = dict((k, int(v)) for k, v in match.groupdict().iteritems()) - return datetime.date(**kw) - - def parse_time(value): - match = time_re.match(value) - if match: - kw = match.groupdict() - if kw['microsecond']: - kw['microsecond'] = kw['microsecond'].ljust(6, '0') - kw = dict((k, int(v)) for k, v in kw.iteritems() if v is not None) - return datetime.time(**kw) - - def parse_datetime(value): - """Parse datetime, but w/o the timezone awareness in 1.4""" - match = datetime_re.match(value) - if match: - kw = match.groupdict() - if kw['microsecond']: - kw['microsecond'] = kw['microsecond'].ljust(6, '0') - kw = dict((k, int(v)) for k, v in kw.iteritems() if v is not None) - return datetime.datetime(**kw) - - -# smart_urlquote is new on Django 1.4 -try: - from django.utils.html import smart_urlquote -except ImportError: - import re - from django.utils.encoding import smart_str - try: - from urllib.parse import quote, urlsplit, urlunsplit - except ImportError: # Python 2 - from urllib import quote - from urlparse import urlsplit, urlunsplit - - unquoted_percents_re = re.compile(r'%(?![0-9A-Fa-f]{2})') - - def smart_urlquote(url): - "Quotes a URL if it isn't already quoted." - # Handle IDN before quoting. - scheme, netloc, path, query, fragment = urlsplit(url) - try: - netloc = netloc.encode('idna').decode('ascii') # IDN -> ACE - except UnicodeError: # invalid domain part - pass - else: - url = urlunsplit((scheme, netloc, path, query, fragment)) - - # An URL is considered unquoted if it contains no % characters or - # contains a % not followed by two hexadecimal digits. See #9655. - if '%' not in url or unquoted_percents_re.search(url): - # See http://bugs.python.org/issue2637 - url = quote(smart_str(url), safe=b'!*\'();:@&=+$,/?#[]~') - - return force_text(url) - - -# RequestFactory only provide `generic` from 1.5 onwards - -from django.test.client import RequestFactory as DjangoRequestFactory -from django.test.client import FakePayload -try: - # In 1.5 the test client uses force_bytes - from django.utils.encoding import force_bytes_or_smart_bytes -except ImportError: - # In 1.3 and 1.4 the test client just uses smart_str - from django.utils.encoding import smart_str as force_bytes_or_smart_bytes - - -class RequestFactory(DjangoRequestFactory): - def generic(self, method, path, - data='', content_type='application/octet-stream', **extra): - parsed = urlparse.urlparse(path) - data = force_bytes_or_smart_bytes(data, settings.DEFAULT_CHARSET) - r = { - 'PATH_INFO': self._get_path(parsed), - 'QUERY_STRING': force_text(parsed[4]), - 'REQUEST_METHOD': str(method), - } - if data: - r.update({ - 'CONTENT_LENGTH': len(data), - 'CONTENT_TYPE': str(content_type), - 'wsgi.input': FakePayload(data), - }) - elif django.VERSION <= (1, 4): - # For 1.3 we need an empty WSGI payload - r.update({ - 'wsgi.input': FakePayload('') - }) - r.update(extra) - return self.request(**r) - -# Markdown is optional -try: - import markdown - - def apply_markdown(text): - """ - Simple wrapper around :func:`markdown.markdown` to set the base level - of '#' style headers to <h2>. - """ - - extensions = ['headerid(level=2)'] - safe_mode = False - md = markdown.Markdown(extensions=extensions, safe_mode=safe_mode) - return md.convert(text) - -except ImportError: - apply_markdown = None - - -# Yaml is optional -try: - import yaml -except ImportError: - yaml = None - - -# XML is optional -try: - import defusedxml.ElementTree as etree -except ImportError: - etree = None - -# OAuth is optional -try: - # Note: The `oauth2` package actually provides oauth1.0a support. Urg. - import oauth2 as oauth -except ImportError: - oauth = None - -# OAuth is optional -try: - import oauth_provider - from oauth_provider.store import store as oauth_provider_store -except (ImportError, ImproperlyConfigured): - oauth_provider = None - oauth_provider_store = None - -# OAuth 2 support is optional -try: - import provider.oauth2 as oauth2_provider - from provider.oauth2 import models as oauth2_provider_models - from provider.oauth2 import forms as oauth2_provider_forms - from provider import scope as oauth2_provider_scope - from provider import constants as oauth2_constants - from provider import __version__ as provider_version - if provider_version in ('0.2.3', '0.2.4'): - # 0.2.3 and 0.2.4 are supported version that do not support - # timezone aware datetimes - import datetime - provider_now = datetime.datetime.now - else: - # Any other supported version does use timezone aware datetimes - from django.utils.timezone import now as provider_now -except ImportError: - oauth2_provider = None - oauth2_provider_models = None - oauth2_provider_forms = None - oauth2_provider_scope = None - oauth2_constants = None - provider_now = None - -# Handle lazy strings -from django.utils.functional import Promise - -if six.PY3: - def is_non_str_iterable(obj): - if (isinstance(obj, str) or - (isinstance(obj, Promise) and obj._delegate_text)): - return False - return hasattr(obj, '__iter__') -else: - def is_non_str_iterable(obj): - return hasattr(obj, '__iter__') diff --git a/vendor-local/lib/python/rest_framework/decorators.py b/vendor-local/lib/python/rest_framework/decorators.py deleted file mode 100644 index c69756a430a..00000000000 --- a/vendor-local/lib/python/rest_framework/decorators.py +++ /dev/null @@ -1,129 +0,0 @@ -""" -The most important decorator in this module is `@api_view`, which is used -for writing function-based views with REST framework. - -There are also various decorators for setting the API policies on function -based views, as well as the `@action` and `@link` decorators, which are -used to annotate methods on viewsets that should be included by routers. -""" -from __future__ import unicode_literals -from rest_framework.compat import six -from rest_framework.views import APIView -import types - - -def api_view(http_method_names): - - """ - Decorator that converts a function-based view into an APIView subclass. - Takes a list of allowed methods for the view as an argument. - """ - - def decorator(func): - - WrappedAPIView = type( - six.PY3 and 'WrappedAPIView' or b'WrappedAPIView', - (APIView,), - {'__doc__': func.__doc__} - ) - - # Note, the above allows us to set the docstring. - # It is the equivalent of: - # - # class WrappedAPIView(APIView): - # pass - # WrappedAPIView.__doc__ = func.doc <--- Not possible to do this - - # api_view applied without (method_names) - assert not(isinstance(http_method_names, types.FunctionType)), \ - '@api_view missing list of allowed HTTP methods' - - # api_view applied with eg. string instead of list of strings - assert isinstance(http_method_names, (list, tuple)), \ - '@api_view expected a list of strings, received %s' % type(http_method_names).__name__ - - allowed_methods = set(http_method_names) | set(('options',)) - WrappedAPIView.http_method_names = [method.lower() for method in allowed_methods] - - def handler(self, *args, **kwargs): - return func(*args, **kwargs) - - for method in http_method_names: - setattr(WrappedAPIView, method.lower(), handler) - - WrappedAPIView.__name__ = func.__name__ - - WrappedAPIView.renderer_classes = getattr(func, 'renderer_classes', - APIView.renderer_classes) - - WrappedAPIView.parser_classes = getattr(func, 'parser_classes', - APIView.parser_classes) - - WrappedAPIView.authentication_classes = getattr(func, 'authentication_classes', - APIView.authentication_classes) - - WrappedAPIView.throttle_classes = getattr(func, 'throttle_classes', - APIView.throttle_classes) - - WrappedAPIView.permission_classes = getattr(func, 'permission_classes', - APIView.permission_classes) - - return WrappedAPIView.as_view() - return decorator - - -def renderer_classes(renderer_classes): - def decorator(func): - func.renderer_classes = renderer_classes - return func - return decorator - - -def parser_classes(parser_classes): - def decorator(func): - func.parser_classes = parser_classes - return func - return decorator - - -def authentication_classes(authentication_classes): - def decorator(func): - func.authentication_classes = authentication_classes - return func - return decorator - - -def throttle_classes(throttle_classes): - def decorator(func): - func.throttle_classes = throttle_classes - return func - return decorator - - -def permission_classes(permission_classes): - def decorator(func): - func.permission_classes = permission_classes - return func - return decorator - - -def link(**kwargs): - """ - Used to mark a method on a ViewSet that should be routed for GET requests. - """ - def decorator(func): - func.bind_to_methods = ['get'] - func.kwargs = kwargs - return func - return decorator - - -def action(methods=['post'], **kwargs): - """ - Used to mark a method on a ViewSet that should be routed for POST requests. - """ - def decorator(func): - func.bind_to_methods = methods - func.kwargs = kwargs - return func - return decorator diff --git a/vendor-local/lib/python/rest_framework/exceptions.py b/vendor-local/lib/python/rest_framework/exceptions.py deleted file mode 100644 index 425a7214991..00000000000 --- a/vendor-local/lib/python/rest_framework/exceptions.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Handled exceptions raised by REST framework. - -In addition Django's built in 403 and 404 exceptions are handled. -(`django.http.Http404` and `django.core.exceptions.PermissionDenied`) -""" -from __future__ import unicode_literals -from rest_framework import status - - -class APIException(Exception): - """ - Base class for REST framework exceptions. - Subclasses should provide `.status_code` and `.detail` properties. - """ - pass - - -class ParseError(APIException): - status_code = status.HTTP_400_BAD_REQUEST - default_detail = 'Malformed request.' - - def __init__(self, detail=None): - self.detail = detail or self.default_detail - - -class AuthenticationFailed(APIException): - status_code = status.HTTP_401_UNAUTHORIZED - default_detail = 'Incorrect authentication credentials.' - - def __init__(self, detail=None): - self.detail = detail or self.default_detail - - -class NotAuthenticated(APIException): - status_code = status.HTTP_401_UNAUTHORIZED - default_detail = 'Authentication credentials were not provided.' - - def __init__(self, detail=None): - self.detail = detail or self.default_detail - - -class PermissionDenied(APIException): - status_code = status.HTTP_403_FORBIDDEN - default_detail = 'You do not have permission to perform this action.' - - def __init__(self, detail=None): - self.detail = detail or self.default_detail - - -class MethodNotAllowed(APIException): - status_code = status.HTTP_405_METHOD_NOT_ALLOWED - default_detail = "Method '%s' not allowed." - - def __init__(self, method, detail=None): - self.detail = (detail or self.default_detail) % method - - -class NotAcceptable(APIException): - status_code = status.HTTP_406_NOT_ACCEPTABLE - default_detail = "Could not satisfy the request's Accept header" - - def __init__(self, detail=None, available_renderers=None): - self.detail = detail or self.default_detail - self.available_renderers = available_renderers - - -class UnsupportedMediaType(APIException): - status_code = status.HTTP_415_UNSUPPORTED_MEDIA_TYPE - default_detail = "Unsupported media type '%s' in request." - - def __init__(self, media_type, detail=None): - self.detail = (detail or self.default_detail) % media_type - - -class Throttled(APIException): - status_code = status.HTTP_429_TOO_MANY_REQUESTS - default_detail = "Request was throttled." - extra_detail = "Expected available in %d second%s." - - def __init__(self, wait=None, detail=None): - import math - self.wait = wait and math.ceil(wait) or None - if wait is not None: - format = detail or self.default_detail + self.extra_detail - self.detail = format % (self.wait, self.wait != 1 and 's' or '') - else: - self.detail = detail or self.default_detail diff --git a/vendor-local/lib/python/rest_framework/fields.py b/vendor-local/lib/python/rest_framework/fields.py deleted file mode 100644 index add9d224d3d..00000000000 --- a/vendor-local/lib/python/rest_framework/fields.py +++ /dev/null @@ -1,968 +0,0 @@ -""" -Serializer fields perform validation on incoming data. - -They are very similar to Django's form fields. -""" -from __future__ import unicode_literals - -import copy -import datetime -import inspect -import re -import warnings -from decimal import Decimal, DecimalException -from django import forms -from django.core import validators -from django.core.exceptions import ValidationError -from django.conf import settings -from django.db.models.fields import BLANK_CHOICE_DASH -from django.forms import widgets -from django.utils.encoding import is_protected_type -from django.utils.translation import ugettext_lazy as _ -from django.utils.datastructures import SortedDict -from rest_framework import ISO_8601 -from rest_framework.compat import ( - timezone, parse_date, parse_datetime, parse_time, BytesIO, six, smart_text, - force_text, is_non_str_iterable -) -from rest_framework.settings import api_settings - - -def is_simple_callable(obj): - """ - True if the object is a callable that takes no arguments. - """ - function = inspect.isfunction(obj) - method = inspect.ismethod(obj) - - if not (function or method): - return False - - args, _, _, defaults = inspect.getargspec(obj) - len_args = len(args) if function else len(args) - 1 - len_defaults = len(defaults) if defaults else 0 - return len_args <= len_defaults - - -def get_component(obj, attr_name): - """ - Given an object, and an attribute name, - return that attribute on the object. - """ - if isinstance(obj, dict): - val = obj.get(attr_name) - else: - val = getattr(obj, attr_name) - - if is_simple_callable(val): - return val() - return val - - -def readable_datetime_formats(formats): - format = ', '.join(formats).replace(ISO_8601, - 'YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HHMM|-HHMM|Z]') - return humanize_strptime(format) - - -def readable_date_formats(formats): - format = ', '.join(formats).replace(ISO_8601, 'YYYY[-MM[-DD]]') - return humanize_strptime(format) - - -def readable_time_formats(formats): - format = ', '.join(formats).replace(ISO_8601, 'hh:mm[:ss[.uuuuuu]]') - return humanize_strptime(format) - - -def humanize_strptime(format_string): - # Note that we're missing some of the locale specific mappings that - # don't really make sense. - mapping = { - "%Y": "YYYY", - "%y": "YY", - "%m": "MM", - "%b": "[Jan-Dec]", - "%B": "[January-December]", - "%d": "DD", - "%H": "hh", - "%I": "hh", # Requires '%p' to differentiate from '%H'. - "%M": "mm", - "%S": "ss", - "%f": "uuuuuu", - "%a": "[Mon-Sun]", - "%A": "[Monday-Sunday]", - "%p": "[AM|PM]", - "%z": "[+HHMM|-HHMM]" - } - for key, val in mapping.items(): - format_string = format_string.replace(key, val) - return format_string - - -def strip_multiple_choice_msg(help_text): - """ - Remove the 'Hold down "control" ...' message that is Django enforces in - select multiple fields on ModelForms. (Required for 1.5 and earlier) - - See https://code.djangoproject.com/ticket/9321 - """ - multiple_choice_msg = _(' Hold down "Control", or "Command" on a Mac, to select more than one.') - multiple_choice_msg = force_text(multiple_choice_msg) - - return help_text.replace(multiple_choice_msg, '') - - -class Field(object): - read_only = True - creation_counter = 0 - empty = '' - type_name = None - partial = False - use_files = False - form_field_class = forms.CharField - type_label = 'field' - - def __init__(self, source=None, label=None, help_text=None): - self.parent = None - - self.creation_counter = Field.creation_counter - Field.creation_counter += 1 - - self.source = source - - if label is not None: - self.label = smart_text(label) - - if help_text is not None: - self.help_text = strip_multiple_choice_msg(smart_text(help_text)) - - def initialize(self, parent, field_name): - """ - Called to set up a field prior to field_to_native or field_from_native. - - parent - The parent serializer. - model_field - The model field this field corresponds to, if one exists. - """ - self.parent = parent - self.root = parent.root or parent - self.context = self.root.context - self.partial = self.root.partial - if self.partial: - self.required = False - - def field_from_native(self, data, files, field_name, into): - """ - Given a dictionary and a field name, updates the dictionary `into`, - with the field and it's deserialized value. - """ - return - - def field_to_native(self, obj, field_name): - """ - Given and object and a field name, returns the value that should be - serialized for that field. - """ - if obj is None: - return self.empty - - if self.source == '*': - return self.to_native(obj) - - source = self.source or field_name - value = obj - - for component in source.split('.'): - value = get_component(value, component) - if value is None: - break - - return self.to_native(value) - - def to_native(self, value): - """ - Converts the field's value into it's simple representation. - """ - if is_simple_callable(value): - value = value() - - if is_protected_type(value): - return value - elif (is_non_str_iterable(value) and - not isinstance(value, (dict, six.string_types))): - return [self.to_native(item) for item in value] - elif isinstance(value, dict): - # Make sure we preserve field ordering, if it exists - ret = SortedDict() - for key, val in value.items(): - ret[key] = self.to_native(val) - return ret - return force_text(value) - - def attributes(self): - """ - Returns a dictionary of attributes to be used when serializing to xml. - """ - if self.type_name: - return {'type': self.type_name} - return {} - - def metadata(self): - metadata = SortedDict() - metadata['type'] = self.type_label - metadata['required'] = getattr(self, 'required', False) - optional_attrs = ['read_only', 'label', 'help_text', - 'min_length', 'max_length'] - for attr in optional_attrs: - value = getattr(self, attr, None) - if value is not None and value != '': - metadata[attr] = force_text(value, strings_only=True) - return metadata - - -class WritableField(Field): - """ - Base for read/write fields. - """ - default_validators = [] - default_error_messages = { - 'required': _('This field is required.'), - 'invalid': _('Invalid value.'), - } - widget = widgets.TextInput - default = None - - def __init__(self, source=None, label=None, help_text=None, - read_only=False, required=None, - validators=[], error_messages=None, widget=None, - default=None, blank=None): - - # 'blank' is to be deprecated in favor of 'required' - if blank is not None: - warnings.warn('The `blank` keyword argument is deprecated. ' - 'Use the `required` keyword argument instead.', - DeprecationWarning, stacklevel=2) - required = not(blank) - - super(WritableField, self).__init__(source=source, label=label, help_text=help_text) - - self.read_only = read_only - if required is None: - self.required = not(read_only) - else: - assert not (read_only and required), "Cannot set required=True and read_only=True" - self.required = required - - messages = {} - for c in reversed(self.__class__.__mro__): - messages.update(getattr(c, 'default_error_messages', {})) - messages.update(error_messages or {}) - self.error_messages = messages - - self.validators = self.default_validators + validators - self.default = default if default is not None else self.default - - # Widgets are ony used for HTML forms. - widget = widget or self.widget - if isinstance(widget, type): - widget = widget() - self.widget = widget - - def __deepcopy__(self, memo): - result = copy.copy(self) - memo[id(self)] = result - result.validators = self.validators[:] - return result - - def validate(self, value): - if value in validators.EMPTY_VALUES and self.required: - raise ValidationError(self.error_messages['required']) - - def run_validators(self, value): - if value in validators.EMPTY_VALUES: - return - errors = [] - for v in self.validators: - try: - v(value) - except ValidationError as e: - if hasattr(e, 'code') and e.code in self.error_messages: - message = self.error_messages[e.code] - if e.params: - message = message % e.params - errors.append(message) - else: - errors.extend(e.messages) - if errors: - raise ValidationError(errors) - - def field_from_native(self, data, files, field_name, into): - """ - Given a dictionary and a field name, updates the dictionary `into`, - with the field and it's deserialized value. - """ - if self.read_only: - return - - try: - if self.use_files: - files = files or {} - native = files[field_name] - else: - native = data[field_name] - except KeyError: - if self.default is not None and not self.partial: - # Note: partial updates shouldn't set defaults - if is_simple_callable(self.default): - native = self.default() - else: - native = self.default - else: - if self.required: - raise ValidationError(self.error_messages['required']) - return - - value = self.from_native(native) - if self.source == '*': - if value: - into.update(value) - else: - self.validate(value) - self.run_validators(value) - into[self.source or field_name] = value - - def from_native(self, value): - """ - Reverts a simple representation back to the field's value. - """ - return value - - -class ModelField(WritableField): - """ - A generic field that can be used against an arbitrary model field. - """ - def __init__(self, *args, **kwargs): - try: - self.model_field = kwargs.pop('model_field') - except KeyError: - raise ValueError("ModelField requires 'model_field' kwarg") - - self.min_length = kwargs.pop('min_length', - getattr(self.model_field, 'min_length', None)) - self.max_length = kwargs.pop('max_length', - getattr(self.model_field, 'max_length', None)) - self.min_value = kwargs.pop('min_value', - getattr(self.model_field, 'min_value', None)) - self.max_value = kwargs.pop('max_value', - getattr(self.model_field, 'max_value', None)) - - super(ModelField, self).__init__(*args, **kwargs) - - if self.min_length is not None: - self.validators.append(validators.MinLengthValidator(self.min_length)) - if self.max_length is not None: - self.validators.append(validators.MaxLengthValidator(self.max_length)) - if self.min_value is not None: - self.validators.append(validators.MinValueValidator(self.min_value)) - if self.max_value is not None: - self.validators.append(validators.MaxValueValidator(self.max_value)) - - def from_native(self, value): - rel = getattr(self.model_field, "rel", None) - if rel is not None: - return rel.to._meta.get_field(rel.field_name).to_python(value) - else: - return self.model_field.to_python(value) - - def field_to_native(self, obj, field_name): - value = self.model_field._get_val_from_obj(obj) - if is_protected_type(value): - return value - return self.model_field.value_to_string(obj) - - def attributes(self): - return { - "type": self.model_field.get_internal_type() - } - - -##### Typed Fields ##### - -class BooleanField(WritableField): - type_name = 'BooleanField' - type_label = 'boolean' - form_field_class = forms.BooleanField - widget = widgets.CheckboxInput - default_error_messages = { - 'invalid': _("'%s' value must be either True or False."), - } - empty = False - - # Note: we set default to `False` in order to fill in missing value not - # supplied by html form. TODO: Fix so that only html form input gets - # this behavior. - default = False - - def from_native(self, value): - if value in ('true', 't', 'True', '1'): - return True - if value in ('false', 'f', 'False', '0'): - return False - return bool(value) - - -class CharField(WritableField): - type_name = 'CharField' - type_label = 'string' - form_field_class = forms.CharField - - def __init__(self, max_length=None, min_length=None, *args, **kwargs): - self.max_length, self.min_length = max_length, min_length - super(CharField, self).__init__(*args, **kwargs) - if min_length is not None: - self.validators.append(validators.MinLengthValidator(min_length)) - if max_length is not None: - self.validators.append(validators.MaxLengthValidator(max_length)) - - def from_native(self, value): - if isinstance(value, six.string_types) or value is None: - return value - return smart_text(value) - - -class URLField(CharField): - type_name = 'URLField' - type_label = 'url' - - def __init__(self, **kwargs): - kwargs['validators'] = [validators.URLValidator()] - super(URLField, self).__init__(**kwargs) - - -class SlugField(CharField): - type_name = 'SlugField' - type_label = 'slug' - form_field_class = forms.SlugField - - default_error_messages = { - 'invalid': _("Enter a valid 'slug' consisting of letters, numbers," - " underscores or hyphens."), - } - default_validators = [validators.validate_slug] - - def __init__(self, *args, **kwargs): - super(SlugField, self).__init__(*args, **kwargs) - - -class ChoiceField(WritableField): - type_name = 'ChoiceField' - type_label = 'multiple choice' - form_field_class = forms.ChoiceField - widget = widgets.Select - default_error_messages = { - 'invalid_choice': _('Select a valid choice. %(value)s is not one of ' - 'the available choices.'), - } - - def __init__(self, choices=(), *args, **kwargs): - super(ChoiceField, self).__init__(*args, **kwargs) - self.choices = choices - if not self.required: - self.choices = BLANK_CHOICE_DASH + self.choices - - def _get_choices(self): - return self._choices - - def _set_choices(self, value): - # Setting choices also sets the choices on the widget. - # choices can be any iterable, but we call list() on it because - # it will be consumed more than once. - self._choices = self.widget.choices = list(value) - - choices = property(_get_choices, _set_choices) - - def validate(self, value): - """ - Validates that the input is in self.choices. - """ - super(ChoiceField, self).validate(value) - if value and not self.valid_value(value): - raise ValidationError(self.error_messages['invalid_choice'] % {'value': value}) - - def valid_value(self, value): - """ - Check to see if the provided value is a valid choice. - """ - for k, v in self.choices: - if isinstance(v, (list, tuple)): - # This is an optgroup, so look inside the group for options - for k2, v2 in v: - if value == smart_text(k2): - return True - else: - if value == smart_text(k) or value == k: - return True - return False - - -class EmailField(CharField): - type_name = 'EmailField' - type_label = 'email' - form_field_class = forms.EmailField - - default_error_messages = { - 'invalid': _('Enter a valid email address.'), - } - default_validators = [validators.validate_email] - - def from_native(self, value): - ret = super(EmailField, self).from_native(value) - if ret is None: - return None - return ret.strip() - - -class RegexField(CharField): - type_name = 'RegexField' - type_label = 'regex' - form_field_class = forms.RegexField - - def __init__(self, regex, max_length=None, min_length=None, *args, **kwargs): - super(RegexField, self).__init__(max_length, min_length, *args, **kwargs) - self.regex = regex - - def _get_regex(self): - return self._regex - - def _set_regex(self, regex): - if isinstance(regex, six.string_types): - regex = re.compile(regex) - self._regex = regex - if hasattr(self, '_regex_validator') and self._regex_validator in self.validators: - self.validators.remove(self._regex_validator) - self._regex_validator = validators.RegexValidator(regex=regex) - self.validators.append(self._regex_validator) - - regex = property(_get_regex, _set_regex) - - -class DateField(WritableField): - type_name = 'DateField' - type_label = 'date' - widget = widgets.DateInput - form_field_class = forms.DateField - - default_error_messages = { - 'invalid': _("Date has wrong format. Use one of these formats instead: %s"), - } - empty = None - input_formats = api_settings.DATE_INPUT_FORMATS - format = api_settings.DATE_FORMAT - - def __init__(self, input_formats=None, format=None, *args, **kwargs): - self.input_formats = input_formats if input_formats is not None else self.input_formats - self.format = format if format is not None else self.format - super(DateField, self).__init__(*args, **kwargs) - - def from_native(self, value): - if value in validators.EMPTY_VALUES: - return None - - if isinstance(value, datetime.datetime): - if timezone and settings.USE_TZ and timezone.is_aware(value): - # Convert aware datetimes to the default time zone - # before casting them to dates (#17742). - default_timezone = timezone.get_default_timezone() - value = timezone.make_naive(value, default_timezone) - return value.date() - if isinstance(value, datetime.date): - return value - - for format in self.input_formats: - if format.lower() == ISO_8601: - try: - parsed = parse_date(value) - except (ValueError, TypeError): - pass - else: - if parsed is not None: - return parsed - else: - try: - parsed = datetime.datetime.strptime(value, format) - except (ValueError, TypeError): - pass - else: - return parsed.date() - - msg = self.error_messages['invalid'] % readable_date_formats(self.input_formats) - raise ValidationError(msg) - - def to_native(self, value): - if value is None or self.format is None: - return value - - if isinstance(value, datetime.datetime): - value = value.date() - - if self.format.lower() == ISO_8601: - return value.isoformat() - return value.strftime(self.format) - - -class DateTimeField(WritableField): - type_name = 'DateTimeField' - type_label = 'datetime' - widget = widgets.DateTimeInput - form_field_class = forms.DateTimeField - - default_error_messages = { - 'invalid': _("Datetime has wrong format. Use one of these formats instead: %s"), - } - empty = None - input_formats = api_settings.DATETIME_INPUT_FORMATS - format = api_settings.DATETIME_FORMAT - - def __init__(self, input_formats=None, format=None, *args, **kwargs): - self.input_formats = input_formats if input_formats is not None else self.input_formats - self.format = format if format is not None else self.format - super(DateTimeField, self).__init__(*args, **kwargs) - - def from_native(self, value): - if value in validators.EMPTY_VALUES: - return None - - if isinstance(value, datetime.datetime): - return value - if isinstance(value, datetime.date): - value = datetime.datetime(value.year, value.month, value.day) - if settings.USE_TZ: - # For backwards compatibility, interpret naive datetimes in - # local time. This won't work during DST change, but we can't - # do much about it, so we let the exceptions percolate up the - # call stack. - warnings.warn("DateTimeField received a naive datetime (%s)" - " while time zone support is active." % value, - RuntimeWarning) - default_timezone = timezone.get_default_timezone() - value = timezone.make_aware(value, default_timezone) - return value - - for format in self.input_formats: - if format.lower() == ISO_8601: - try: - parsed = parse_datetime(value) - except (ValueError, TypeError): - pass - else: - if parsed is not None: - return parsed - else: - try: - parsed = datetime.datetime.strptime(value, format) - except (ValueError, TypeError): - pass - else: - return parsed - - msg = self.error_messages['invalid'] % readable_datetime_formats(self.input_formats) - raise ValidationError(msg) - - def to_native(self, value): - if value is None or self.format is None: - return value - - if self.format.lower() == ISO_8601: - ret = value.isoformat() - if ret.endswith('+00:00'): - ret = ret[:-6] + 'Z' - return ret - return value.strftime(self.format) - - -class TimeField(WritableField): - type_name = 'TimeField' - type_label = 'time' - widget = widgets.TimeInput - form_field_class = forms.TimeField - - default_error_messages = { - 'invalid': _("Time has wrong format. Use one of these formats instead: %s"), - } - empty = None - input_formats = api_settings.TIME_INPUT_FORMATS - format = api_settings.TIME_FORMAT - - def __init__(self, input_formats=None, format=None, *args, **kwargs): - self.input_formats = input_formats if input_formats is not None else self.input_formats - self.format = format if format is not None else self.format - super(TimeField, self).__init__(*args, **kwargs) - - def from_native(self, value): - if value in validators.EMPTY_VALUES: - return None - - if isinstance(value, datetime.time): - return value - - for format in self.input_formats: - if format.lower() == ISO_8601: - try: - parsed = parse_time(value) - except (ValueError, TypeError): - pass - else: - if parsed is not None: - return parsed - else: - try: - parsed = datetime.datetime.strptime(value, format) - except (ValueError, TypeError): - pass - else: - return parsed.time() - - msg = self.error_messages['invalid'] % readable_time_formats(self.input_formats) - raise ValidationError(msg) - - def to_native(self, value): - if value is None or self.format is None: - return value - - if isinstance(value, datetime.datetime): - value = value.time() - - if self.format.lower() == ISO_8601: - return value.isoformat() - return value.strftime(self.format) - - -class IntegerField(WritableField): - type_name = 'IntegerField' - type_label = 'integer' - form_field_class = forms.IntegerField - - default_error_messages = { - 'invalid': _('Enter a whole number.'), - 'max_value': _('Ensure this value is less than or equal to %(limit_value)s.'), - 'min_value': _('Ensure this value is greater than or equal to %(limit_value)s.'), - } - - def __init__(self, max_value=None, min_value=None, *args, **kwargs): - self.max_value, self.min_value = max_value, min_value - super(IntegerField, self).__init__(*args, **kwargs) - - if max_value is not None: - self.validators.append(validators.MaxValueValidator(max_value)) - if min_value is not None: - self.validators.append(validators.MinValueValidator(min_value)) - - def from_native(self, value): - if value in validators.EMPTY_VALUES: - return None - - try: - value = int(str(value)) - except (ValueError, TypeError): - raise ValidationError(self.error_messages['invalid']) - return value - - -class FloatField(WritableField): - type_name = 'FloatField' - type_label = 'float' - form_field_class = forms.FloatField - - default_error_messages = { - 'invalid': _("'%s' value must be a float."), - } - - def from_native(self, value): - if value in validators.EMPTY_VALUES: - return None - - try: - return float(value) - except (TypeError, ValueError): - msg = self.error_messages['invalid'] % value - raise ValidationError(msg) - - -class DecimalField(WritableField): - type_name = 'DecimalField' - type_label = 'decimal' - form_field_class = forms.DecimalField - - default_error_messages = { - 'invalid': _('Enter a number.'), - 'max_value': _('Ensure this value is less than or equal to %(limit_value)s.'), - 'min_value': _('Ensure this value is greater than or equal to %(limit_value)s.'), - 'max_digits': _('Ensure that there are no more than %s digits in total.'), - 'max_decimal_places': _('Ensure that there are no more than %s decimal places.'), - 'max_whole_digits': _('Ensure that there are no more than %s digits before the decimal point.') - } - - def __init__(self, max_value=None, min_value=None, max_digits=None, decimal_places=None, *args, **kwargs): - self.max_value, self.min_value = max_value, min_value - self.max_digits, self.decimal_places = max_digits, decimal_places - super(DecimalField, self).__init__(*args, **kwargs) - - if max_value is not None: - self.validators.append(validators.MaxValueValidator(max_value)) - if min_value is not None: - self.validators.append(validators.MinValueValidator(min_value)) - - def from_native(self, value): - """ - Validates that the input is a decimal number. Returns a Decimal - instance. Returns None for empty values. Ensures that there are no more - than max_digits in the number, and no more than decimal_places digits - after the decimal point. - """ - if value in validators.EMPTY_VALUES: - return None - value = smart_text(value).strip() - try: - value = Decimal(value) - except DecimalException: - raise ValidationError(self.error_messages['invalid']) - return value - - def validate(self, value): - super(DecimalField, self).validate(value) - if value in validators.EMPTY_VALUES: - return - # Check for NaN, Inf and -Inf values. We can't compare directly for NaN, - # since it is never equal to itself. However, NaN is the only value that - # isn't equal to itself, so we can use this to identify NaN - if value != value or value == Decimal("Inf") or value == Decimal("-Inf"): - raise ValidationError(self.error_messages['invalid']) - sign, digittuple, exponent = value.as_tuple() - decimals = abs(exponent) - # digittuple doesn't include any leading zeros. - digits = len(digittuple) - if decimals > digits: - # We have leading zeros up to or past the decimal point. Count - # everything past the decimal point as a digit. We do not count - # 0 before the decimal point as a digit since that would mean - # we would not allow max_digits = decimal_places. - digits = decimals - whole_digits = digits - decimals - - if self.max_digits is not None and digits > self.max_digits: - raise ValidationError(self.error_messages['max_digits'] % self.max_digits) - if self.decimal_places is not None and decimals > self.decimal_places: - raise ValidationError(self.error_messages['max_decimal_places'] % self.decimal_places) - if self.max_digits is not None and self.decimal_places is not None and whole_digits > (self.max_digits - self.decimal_places): - raise ValidationError(self.error_messages['max_whole_digits'] % (self.max_digits - self.decimal_places)) - return value - - -class FileField(WritableField): - use_files = True - type_name = 'FileField' - type_label = 'file upload' - form_field_class = forms.FileField - widget = widgets.FileInput - - default_error_messages = { - 'invalid': _("No file was submitted. Check the encoding type on the form."), - 'missing': _("No file was submitted."), - 'empty': _("The submitted file is empty."), - 'max_length': _('Ensure this filename has at most %(max)d characters (it has %(length)d).'), - 'contradiction': _('Please either submit a file or check the clear checkbox, not both.') - } - - def __init__(self, *args, **kwargs): - self.max_length = kwargs.pop('max_length', None) - self.allow_empty_file = kwargs.pop('allow_empty_file', False) - super(FileField, self).__init__(*args, **kwargs) - - def from_native(self, data): - if data in validators.EMPTY_VALUES: - return None - - # UploadedFile objects should have name and size attributes. - try: - file_name = data.name - file_size = data.size - except AttributeError: - raise ValidationError(self.error_messages['invalid']) - - if self.max_length is not None and len(file_name) > self.max_length: - error_values = {'max': self.max_length, 'length': len(file_name)} - raise ValidationError(self.error_messages['max_length'] % error_values) - if not file_name: - raise ValidationError(self.error_messages['invalid']) - if not self.allow_empty_file and not file_size: - raise ValidationError(self.error_messages['empty']) - - return data - - def to_native(self, value): - return value.name - - -class ImageField(FileField): - use_files = True - type_name = 'ImageField' - type_label = 'image upload' - form_field_class = forms.ImageField - - default_error_messages = { - 'invalid_image': _("Upload a valid image. The file you uploaded was " - "either not an image or a corrupted image."), - } - - def from_native(self, data): - """ - Checks that the file-upload field data contains a valid image (GIF, JPG, - PNG, possibly others -- whatever the Python Imaging Library supports). - """ - f = super(ImageField, self).from_native(data) - if f is None: - return None - - from rest_framework.compat import Image - assert Image is not None, 'PIL must be installed for ImageField support' - - # We need to get a file object for PIL. We might have a path or we might - # have to read the data into memory. - if hasattr(data, 'temporary_file_path'): - file = data.temporary_file_path() - else: - if hasattr(data, 'read'): - file = BytesIO(data.read()) - else: - file = BytesIO(data['content']) - - try: - # load() could spot a truncated JPEG, but it loads the entire - # image in memory, which is a DoS vector. See #3848 and #18520. - # verify() must be called immediately after the constructor. - Image.open(file).verify() - except ImportError: - # Under PyPy, it is possible to import PIL. However, the underlying - # _imaging C module isn't available, so an ImportError will be - # raised. Catch and re-raise. - raise - except Exception: # Python Imaging Library doesn't recognize it as an image - raise ValidationError(self.error_messages['invalid_image']) - if hasattr(f, 'seek') and callable(f.seek): - f.seek(0) - return f - - -class SerializerMethodField(Field): - """ - A field that gets its value by calling a method on the serializer it's attached to. - """ - - def __init__(self, method_name): - self.method_name = method_name - super(SerializerMethodField, self).__init__() - - def field_to_native(self, obj, field_name): - value = getattr(self.parent, self.method_name)(obj) - return self.to_native(value) diff --git a/vendor-local/lib/python/rest_framework/filters.py b/vendor-local/lib/python/rest_framework/filters.py deleted file mode 100644 index 4079e1bd55b..00000000000 --- a/vendor-local/lib/python/rest_framework/filters.py +++ /dev/null @@ -1,142 +0,0 @@ -""" -Provides generic filtering backends that can be used to filter the results -returned by list views. -""" -from __future__ import unicode_literals -from django.db import models -from rest_framework.compat import django_filters, six -from functools import reduce -import operator - -FilterSet = django_filters and django_filters.FilterSet or None - - -class BaseFilterBackend(object): - """ - A base class from which all filter backend classes should inherit. - """ - - def filter_queryset(self, request, queryset, view): - """ - Return a filtered queryset. - """ - raise NotImplementedError(".filter_queryset() must be overridden.") - - -class DjangoFilterBackend(BaseFilterBackend): - """ - A filter backend that uses django-filter. - """ - default_filter_set = FilterSet - - def __init__(self): - assert django_filters, 'Using DjangoFilterBackend, but django-filter is not installed' - - def get_filter_class(self, view, queryset=None): - """ - Return the django-filters `FilterSet` used to filter the queryset. - """ - filter_class = getattr(view, 'filter_class', None) - filter_fields = getattr(view, 'filter_fields', None) - - if filter_class: - filter_model = filter_class.Meta.model - - assert issubclass(filter_model, queryset.model), \ - 'FilterSet model %s does not match queryset model %s' % \ - (filter_model, queryset.model) - - return filter_class - - if filter_fields: - class AutoFilterSet(self.default_filter_set): - class Meta: - model = queryset.model - fields = filter_fields - return AutoFilterSet - - return None - - def filter_queryset(self, request, queryset, view): - filter_class = self.get_filter_class(view, queryset) - - if filter_class: - return filter_class(request.QUERY_PARAMS, queryset=queryset).qs - - return queryset - - -class SearchFilter(BaseFilterBackend): - search_param = 'search' # The URL query parameter used for the search. - - def get_search_terms(self, request): - """ - Search terms are set by a ?search=... query parameter, - and may be comma and/or whitespace delimited. - """ - params = request.QUERY_PARAMS.get(self.search_param, '') - return params.replace(',', ' ').split() - - def construct_search(self, field_name): - if field_name.startswith('^'): - return "%s__istartswith" % field_name[1:] - elif field_name.startswith('='): - return "%s__iexact" % field_name[1:] - elif field_name.startswith('@'): - return "%s__search" % field_name[1:] - else: - return "%s__icontains" % field_name - - def filter_queryset(self, request, queryset, view): - search_fields = getattr(view, 'search_fields', None) - - if not search_fields: - return queryset - - orm_lookups = [self.construct_search(str(search_field)) - for search_field in search_fields] - - for search_term in self.get_search_terms(request): - or_queries = [models.Q(**{orm_lookup: search_term}) - for orm_lookup in orm_lookups] - queryset = queryset.filter(reduce(operator.or_, or_queries)) - - return queryset - - -class OrderingFilter(BaseFilterBackend): - ordering_param = 'ordering' # The URL query parameter used for the ordering. - - def get_ordering(self, request): - """ - Ordering is set by a comma delimited ?ordering=... query parameter. - """ - params = request.QUERY_PARAMS.get(self.ordering_param) - if params: - return [param.strip() for param in params.split(',')] - - def get_default_ordering(self, view): - ordering = getattr(view, 'ordering', None) - if isinstance(ordering, six.string_types): - return (ordering,) - return ordering - - def remove_invalid_fields(self, queryset, ordering): - field_names = [field.name for field in queryset.model._meta.fields] - return [term for term in ordering if term.lstrip('-') in field_names] - - def filter_queryset(self, request, queryset, view): - ordering = self.get_ordering(request) - - if ordering: - # Skip any incorrect parameters - ordering = self.remove_invalid_fields(queryset, ordering) - - if not ordering: - # Use 'ordering' attribute by default - ordering = self.get_default_ordering(view) - - if ordering: - return queryset.order_by(*ordering) - - return queryset diff --git a/vendor-local/lib/python/rest_framework/generics.py b/vendor-local/lib/python/rest_framework/generics.py deleted file mode 100644 index 99e9782e21a..00000000000 --- a/vendor-local/lib/python/rest_framework/generics.py +++ /dev/null @@ -1,499 +0,0 @@ -""" -Generic views that provide commonly needed behaviour. -""" -from __future__ import unicode_literals - -from django.core.exceptions import ImproperlyConfigured, PermissionDenied -from django.core.paginator import Paginator, InvalidPage -from django.http import Http404 -from django.shortcuts import get_object_or_404 as _get_object_or_404 -from django.utils.translation import ugettext as _ -from rest_framework import views, mixins, exceptions -from rest_framework.request import clone_request -from rest_framework.settings import api_settings -import warnings - - -def get_object_or_404(queryset, **filter_kwargs): - """ - Same as Django's standard shortcut, but make sure to raise 404 - if the filter_kwargs don't match the required types. - """ - try: - return _get_object_or_404(queryset, **filter_kwargs) - except (TypeError, ValueError): - raise Http404 - - -class GenericAPIView(views.APIView): - """ - Base class for all other generic views. - """ - - # You'll need to either set these attributes, - # or override `get_queryset()`/`get_serializer_class()`. - queryset = None - serializer_class = None - - # This shortcut may be used instead of setting either or both - # of the `queryset`/`serializer_class` attributes, although using - # the explicit style is generally preferred. - model = None - - # If you want to use object lookups other than pk, set this attribute. - # For more complex lookup requirements override `get_object()`. - lookup_field = 'pk' - - # Pagination settings - paginate_by = api_settings.PAGINATE_BY - paginate_by_param = api_settings.PAGINATE_BY_PARAM - pagination_serializer_class = api_settings.DEFAULT_PAGINATION_SERIALIZER_CLASS - page_kwarg = 'page' - - # The filter backend classes to use for queryset filtering - filter_backends = api_settings.DEFAULT_FILTER_BACKENDS - - # The following attributes may be subject to change, - # and should be considered private API. - model_serializer_class = api_settings.DEFAULT_MODEL_SERIALIZER_CLASS - paginator_class = Paginator - - ###################################### - # These are pending deprecation... - - pk_url_kwarg = 'pk' - slug_url_kwarg = 'slug' - slug_field = 'slug' - allow_empty = True - filter_backend = api_settings.FILTER_BACKEND - - def get_serializer_context(self): - """ - Extra context provided to the serializer class. - """ - return { - 'request': self.request, - 'format': self.format_kwarg, - 'view': self - } - - def get_serializer(self, instance=None, data=None, - files=None, many=False, partial=False): - """ - Return the serializer instance that should be used for validating and - deserializing input, and for serializing output. - """ - serializer_class = self.get_serializer_class() - context = self.get_serializer_context() - return serializer_class(instance, data=data, files=files, - many=many, partial=partial, context=context) - - def get_pagination_serializer(self, page): - """ - Return a serializer instance to use with paginated data. - """ - class SerializerClass(self.pagination_serializer_class): - class Meta: - object_serializer_class = self.get_serializer_class() - - pagination_serializer_class = SerializerClass - context = self.get_serializer_context() - return pagination_serializer_class(instance=page, context=context) - - def paginate_queryset(self, queryset, page_size=None): - """ - Paginate a queryset if required, either returning a page object, - or `None` if pagination is not configured for this view. - """ - deprecated_style = False - if page_size is not None: - warnings.warn('The `page_size` parameter to `paginate_queryset()` ' - 'is due to be deprecated. ' - 'Note that the return style of this method is also ' - 'changed, and will simply return a page object ' - 'when called without a `page_size` argument.', - PendingDeprecationWarning, stacklevel=2) - deprecated_style = True - else: - # Determine the required page size. - # If pagination is not configured, simply return None. - page_size = self.get_paginate_by() - if not page_size: - return None - - if not self.allow_empty: - warnings.warn( - 'The `allow_empty` parameter is due to be deprecated. ' - 'To use `allow_empty=False` style behavior, You should override ' - '`get_queryset()` and explicitly raise a 404 on empty querysets.', - PendingDeprecationWarning, stacklevel=2 - ) - - paginator = self.paginator_class(queryset, page_size, - allow_empty_first_page=self.allow_empty) - page_kwarg = self.kwargs.get(self.page_kwarg) - page_query_param = self.request.QUERY_PARAMS.get(self.page_kwarg) - page = page_kwarg or page_query_param or 1 - try: - page_number = int(page) - except ValueError: - if page == 'last': - page_number = paginator.num_pages - else: - raise Http404(_("Page is not 'last', nor can it be converted to an int.")) - try: - page = paginator.page(page_number) - except InvalidPage as e: - raise Http404(_('Invalid page (%(page_number)s): %(message)s') % { - 'page_number': page_number, - 'message': str(e) - }) - - if deprecated_style: - return (paginator, page, page.object_list, page.has_other_pages()) - return page - - def filter_queryset(self, queryset): - """ - Given a queryset, filter it with whichever filter backend is in use. - - You are unlikely to want to override this method, although you may need - to call it either from a list view, or from a custom `get_object` - method if you want to apply the configured filtering backend to the - default queryset. - """ - filter_backends = self.filter_backends or [] - if not filter_backends and self.filter_backend: - warnings.warn( - 'The `filter_backend` attribute and `FILTER_BACKEND` setting ' - 'are due to be deprecated in favor of a `filter_backends` ' - 'attribute and `DEFAULT_FILTER_BACKENDS` setting, that take ' - 'a *list* of filter backend classes.', - PendingDeprecationWarning, stacklevel=2 - ) - filter_backends = [self.filter_backend] - - for backend in filter_backends: - queryset = backend().filter_queryset(self.request, queryset, self) - return queryset - - ######################## - ### The following methods provide default implementations - ### that you may want to override for more complex cases. - - def get_paginate_by(self, queryset=None): - """ - Return the size of pages to use with pagination. - - If `PAGINATE_BY_PARAM` is set it will attempt to get the page size - from a named query parameter in the url, eg. ?page_size=100 - - Otherwise defaults to using `self.paginate_by`. - """ - if queryset is not None: - warnings.warn('The `queryset` parameter to `get_paginate_by()` ' - 'is due to be deprecated.', - PendingDeprecationWarning, stacklevel=2) - - if self.paginate_by_param: - query_params = self.request.QUERY_PARAMS - try: - return int(query_params[self.paginate_by_param]) - except (KeyError, ValueError): - pass - - return self.paginate_by - - def get_serializer_class(self): - """ - Return the class to use for the serializer. - Defaults to using `self.serializer_class`. - - You may want to override this if you need to provide different - serializations depending on the incoming request. - - (Eg. admins get full serialization, others get basic serialization) - """ - serializer_class = self.serializer_class - if serializer_class is not None: - return serializer_class - - assert self.model is not None, \ - "'%s' should either include a 'serializer_class' attribute, " \ - "or use the 'model' attribute as a shortcut for " \ - "automatically generating a serializer class." \ - % self.__class__.__name__ - - class DefaultSerializer(self.model_serializer_class): - class Meta: - model = self.model - return DefaultSerializer - - def get_queryset(self): - """ - Get the list of items for this view. - This must be an iterable, and may be a queryset. - Defaults to using `self.queryset`. - - You may want to override this if you need to provide different - querysets depending on the incoming request. - - (Eg. return a list of items that is specific to the user) - """ - if self.queryset is not None: - return self.queryset._clone() - - if self.model is not None: - return self.model._default_manager.all() - - raise ImproperlyConfigured("'%s' must define 'queryset' or 'model'" - % self.__class__.__name__) - - def get_object(self, queryset=None): - """ - Returns the object the view is displaying. - - You may want to override this if you need to provide non-standard - queryset lookups. Eg if objects are referenced using multiple - keyword arguments in the url conf. - """ - # Determine the base queryset to use. - if queryset is None: - queryset = self.filter_queryset(self.get_queryset()) - else: - pass # Deprecation warning - - # Perform the lookup filtering. - pk = self.kwargs.get(self.pk_url_kwarg, None) - slug = self.kwargs.get(self.slug_url_kwarg, None) - lookup = self.kwargs.get(self.lookup_field, None) - - if lookup is not None: - filter_kwargs = {self.lookup_field: lookup} - elif pk is not None and self.lookup_field == 'pk': - warnings.warn( - 'The `pk_url_kwarg` attribute is due to be deprecated. ' - 'Use the `lookup_field` attribute instead', - PendingDeprecationWarning - ) - filter_kwargs = {'pk': pk} - elif slug is not None and self.lookup_field == 'pk': - warnings.warn( - 'The `slug_url_kwarg` attribute is due to be deprecated. ' - 'Use the `lookup_field` attribute instead', - PendingDeprecationWarning - ) - filter_kwargs = {self.slug_field: slug} - else: - raise ImproperlyConfigured( - 'Expected view %s to be called with a URL keyword argument ' - 'named "%s". Fix your URL conf, or set the `.lookup_field` ' - 'attribute on the view correctly.' % - (self.__class__.__name__, self.lookup_field) - ) - - obj = get_object_or_404(queryset, **filter_kwargs) - - # May raise a permission denied - self.check_object_permissions(self.request, obj) - - return obj - - ######################## - ### The following are placeholder methods, - ### and are intended to be overridden. - ### - ### The are not called by GenericAPIView directly, - ### but are used by the mixin methods. - - def pre_save(self, obj): - """ - Placeholder method for calling before saving an object. - - May be used to set attributes on the object that are implicit - in either the request, or the url. - """ - pass - - def post_save(self, obj, created=False): - """ - Placeholder method for calling after saving an object. - """ - pass - - def metadata(self, request): - """ - Return a dictionary of metadata about the view. - Used to return responses for OPTIONS requests. - - We override the default behavior, and add some extra information - about the required request body for POST and PUT operations. - """ - ret = super(GenericAPIView, self).metadata(request) - - actions = {} - for method in ('PUT', 'POST'): - if method not in self.allowed_methods: - continue - - cloned_request = clone_request(request, method) - try: - # Test global permissions - self.check_permissions(cloned_request) - # Test object permissions - if method == 'PUT': - self.get_object() - except (exceptions.APIException, PermissionDenied, Http404): - pass - else: - # If user has appropriate permissions for the view, include - # appropriate metadata about the fields that should be supplied. - serializer = self.get_serializer() - actions[method] = serializer.metadata() - - if actions: - ret['actions'] = actions - - return ret - - -########################################################## -### Concrete view classes that provide method handlers ### -### by composing the mixin classes with the base view. ### -########################################################## - -class CreateAPIView(mixins.CreateModelMixin, - GenericAPIView): - - """ - Concrete view for creating a model instance. - """ - def post(self, request, *args, **kwargs): - return self.create(request, *args, **kwargs) - - -class ListAPIView(mixins.ListModelMixin, - GenericAPIView): - """ - Concrete view for listing a queryset. - """ - def get(self, request, *args, **kwargs): - return self.list(request, *args, **kwargs) - - -class RetrieveAPIView(mixins.RetrieveModelMixin, - GenericAPIView): - """ - Concrete view for retrieving a model instance. - """ - def get(self, request, *args, **kwargs): - return self.retrieve(request, *args, **kwargs) - - -class DestroyAPIView(mixins.DestroyModelMixin, - GenericAPIView): - - """ - Concrete view for deleting a model instance. - """ - def delete(self, request, *args, **kwargs): - return self.destroy(request, *args, **kwargs) - - -class UpdateAPIView(mixins.UpdateModelMixin, - GenericAPIView): - - """ - Concrete view for updating a model instance. - """ - def put(self, request, *args, **kwargs): - return self.update(request, *args, **kwargs) - - def patch(self, request, *args, **kwargs): - return self.partial_update(request, *args, **kwargs) - - -class ListCreateAPIView(mixins.ListModelMixin, - mixins.CreateModelMixin, - GenericAPIView): - """ - Concrete view for listing a queryset or creating a model instance. - """ - def get(self, request, *args, **kwargs): - return self.list(request, *args, **kwargs) - - def post(self, request, *args, **kwargs): - return self.create(request, *args, **kwargs) - - -class RetrieveUpdateAPIView(mixins.RetrieveModelMixin, - mixins.UpdateModelMixin, - GenericAPIView): - """ - Concrete view for retrieving, updating a model instance. - """ - def get(self, request, *args, **kwargs): - return self.retrieve(request, *args, **kwargs) - - def put(self, request, *args, **kwargs): - return self.update(request, *args, **kwargs) - - def patch(self, request, *args, **kwargs): - return self.partial_update(request, *args, **kwargs) - - -class RetrieveDestroyAPIView(mixins.RetrieveModelMixin, - mixins.DestroyModelMixin, - GenericAPIView): - """ - Concrete view for retrieving or deleting a model instance. - """ - def get(self, request, *args, **kwargs): - return self.retrieve(request, *args, **kwargs) - - def delete(self, request, *args, **kwargs): - return self.destroy(request, *args, **kwargs) - - -class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin, - mixins.UpdateModelMixin, - mixins.DestroyModelMixin, - GenericAPIView): - """ - Concrete view for retrieving, updating or deleting a model instance. - """ - def get(self, request, *args, **kwargs): - return self.retrieve(request, *args, **kwargs) - - def put(self, request, *args, **kwargs): - return self.update(request, *args, **kwargs) - - def patch(self, request, *args, **kwargs): - return self.partial_update(request, *args, **kwargs) - - def delete(self, request, *args, **kwargs): - return self.destroy(request, *args, **kwargs) - - -########################## -### Deprecated classes ### -########################## - -class MultipleObjectAPIView(GenericAPIView): - def __init__(self, *args, **kwargs): - warnings.warn( - 'Subclassing `MultipleObjectAPIView` is due to be deprecated. ' - 'You should simply subclass `GenericAPIView` instead.', - PendingDeprecationWarning, stacklevel=2 - ) - super(MultipleObjectAPIView, self).__init__(*args, **kwargs) - - -class SingleObjectAPIView(GenericAPIView): - def __init__(self, *args, **kwargs): - warnings.warn( - 'Subclassing `SingleObjectAPIView` is due to be deprecated. ' - 'You should simply subclass `GenericAPIView` instead.', - PendingDeprecationWarning, stacklevel=2 - ) - super(SingleObjectAPIView, self).__init__(*args, **kwargs) diff --git a/vendor-local/lib/python/rest_framework/mixins.py b/vendor-local/lib/python/rest_framework/mixins.py deleted file mode 100644 index f11def6d41e..00000000000 --- a/vendor-local/lib/python/rest_framework/mixins.py +++ /dev/null @@ -1,184 +0,0 @@ -""" -Basic building blocks for generic class based views. - -We don't bind behaviour to http method handlers yet, -which allows mixin classes to be composed in interesting ways. -""" -from __future__ import unicode_literals - -from django.http import Http404 -from rest_framework import status -from rest_framework.response import Response -from rest_framework.request import clone_request -import warnings - - -def _get_validation_exclusions(obj, pk=None, slug_field=None, lookup_field=None): - """ - Given a model instance, and an optional pk and slug field, - return the full list of all other field names on that model. - - For use when performing full_clean on a model instance, - so we only clean the required fields. - """ - include = [] - - if pk: - # Pending deprecation - pk_field = obj._meta.pk - while pk_field.rel: - pk_field = pk_field.rel.to._meta.pk - include.append(pk_field.name) - - if slug_field: - # Pending deprecation - include.append(slug_field) - - if lookup_field and lookup_field != 'pk': - include.append(lookup_field) - - return [field.name for field in obj._meta.fields if field.name not in include] - - -class CreateModelMixin(object): - """ - Create a model instance. - """ - def create(self, request, *args, **kwargs): - serializer = self.get_serializer(data=request.DATA, files=request.FILES) - - if serializer.is_valid(): - self.pre_save(serializer.object) - self.object = serializer.save(force_insert=True) - self.post_save(self.object, created=True) - headers = self.get_success_headers(serializer.data) - return Response(serializer.data, status=status.HTTP_201_CREATED, - headers=headers) - - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - - def get_success_headers(self, data): - try: - return {'Location': data['url']} - except (TypeError, KeyError): - return {} - - -class ListModelMixin(object): - """ - List a queryset. - """ - empty_error = "Empty list and '%(class_name)s.allow_empty' is False." - - def list(self, request, *args, **kwargs): - self.object_list = self.filter_queryset(self.get_queryset()) - - # Default is to allow empty querysets. This can be altered by setting - # `.allow_empty = False`, to raise 404 errors on empty querysets. - if not self.allow_empty and not self.object_list: - warnings.warn( - 'The `allow_empty` parameter is due to be deprecated. ' - 'To use `allow_empty=False` style behavior, You should override ' - '`get_queryset()` and explicitly raise a 404 on empty querysets.', - PendingDeprecationWarning - ) - class_name = self.__class__.__name__ - error_msg = self.empty_error % {'class_name': class_name} - raise Http404(error_msg) - - # Switch between paginated or standard style responses - page = self.paginate_queryset(self.object_list) - if page is not None: - serializer = self.get_pagination_serializer(page) - else: - serializer = self.get_serializer(self.object_list, many=True) - - return Response(serializer.data) - - -class RetrieveModelMixin(object): - """ - Retrieve a model instance. - """ - def retrieve(self, request, *args, **kwargs): - self.object = self.get_object() - serializer = self.get_serializer(self.object) - return Response(serializer.data) - - -class UpdateModelMixin(object): - """ - Update a model instance. - """ - def update(self, request, *args, **kwargs): - partial = kwargs.pop('partial', False) - self.object = self.get_object_or_none() - - if self.object is None: - created = True - save_kwargs = {'force_insert': True} - success_status_code = status.HTTP_201_CREATED - else: - created = False - save_kwargs = {'force_update': True} - success_status_code = status.HTTP_200_OK - - serializer = self.get_serializer(self.object, data=request.DATA, - files=request.FILES, partial=partial) - - if serializer.is_valid(): - self.pre_save(serializer.object) - self.object = serializer.save(**save_kwargs) - self.post_save(self.object, created=created) - return Response(serializer.data, status=success_status_code) - - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - - def partial_update(self, request, *args, **kwargs): - kwargs['partial'] = True - return self.update(request, *args, **kwargs) - - def get_object_or_none(self): - try: - return self.get_object() - except Http404: - # If this is a PUT-as-create operation, we need to ensure that - # we have relevant permissions, as if this was a POST request. - # This will either raise a PermissionDenied exception, - # or simply return None - self.check_permissions(clone_request(self.request, 'POST')) - - def pre_save(self, obj): - """ - Set any attributes on the object that are implicit in the request. - """ - # pk and/or slug attributes are implicit in the URL. - lookup = self.kwargs.get(self.lookup_field, None) - pk = self.kwargs.get(self.pk_url_kwarg, None) - slug = self.kwargs.get(self.slug_url_kwarg, None) - slug_field = slug and self.slug_field or None - - if lookup: - setattr(obj, self.lookup_field, lookup) - - if pk: - setattr(obj, 'pk', pk) - - if slug: - setattr(obj, slug_field, slug) - - # Ensure we clean the attributes so that we don't eg return integer - # pk using a string representation, as provided by the url conf kwarg. - if hasattr(obj, 'full_clean'): - exclude = _get_validation_exclusions(obj, pk, slug_field, self.lookup_field) - obj.full_clean(exclude) - - -class DestroyModelMixin(object): - """ - Destroy a model instance. - """ - def destroy(self, request, *args, **kwargs): - obj = self.get_object() - obj.delete() - return Response(status=status.HTTP_204_NO_CONTENT) diff --git a/vendor-local/lib/python/rest_framework/models.py b/vendor-local/lib/python/rest_framework/models.py deleted file mode 100644 index 5b53a52641c..00000000000 --- a/vendor-local/lib/python/rest_framework/models.py +++ /dev/null @@ -1 +0,0 @@ -# Just to keep things like ./manage.py test happy diff --git a/vendor-local/lib/python/rest_framework/negotiation.py b/vendor-local/lib/python/rest_framework/negotiation.py deleted file mode 100644 index 4d205c0e854..00000000000 --- a/vendor-local/lib/python/rest_framework/negotiation.py +++ /dev/null @@ -1,89 +0,0 @@ -""" -Content negotiation deals with selecting an appropriate renderer given the -incoming request. Typically this will be based on the request's Accept header. -""" -from __future__ import unicode_literals -from django.http import Http404 -from rest_framework import exceptions -from rest_framework.settings import api_settings -from rest_framework.utils.mediatypes import order_by_precedence, media_type_matches -from rest_framework.utils.mediatypes import _MediaType - - -class BaseContentNegotiation(object): - def select_parser(self, request, parsers): - raise NotImplementedError('.select_parser() must be implemented') - - def select_renderer(self, request, renderers, format_suffix=None): - raise NotImplementedError('.select_renderer() must be implemented') - - -class DefaultContentNegotiation(BaseContentNegotiation): - settings = api_settings - - def select_parser(self, request, parsers): - """ - Given a list of parsers and a media type, return the appropriate - parser to handle the incoming request. - """ - for parser in parsers: - if media_type_matches(parser.media_type, request.content_type): - return parser - return None - - def select_renderer(self, request, renderers, format_suffix=None): - """ - Given a request and a list of renderers, return a two-tuple of: - (renderer, media type). - """ - # Allow URL style format override. eg. "?format=json - format_query_param = self.settings.URL_FORMAT_OVERRIDE - format = format_suffix or request.QUERY_PARAMS.get(format_query_param) - - if format: - renderers = self.filter_renderers(renderers, format) - - accepts = self.get_accept_list(request) - - # Check the acceptable media types against each renderer, - # attempting more specific media types first - # NB. The inner loop here isn't as bad as it first looks :) - # Worst case is we're looping over len(accept_list) * len(self.renderers) - for media_type_set in order_by_precedence(accepts): - for renderer in renderers: - for media_type in media_type_set: - if media_type_matches(renderer.media_type, media_type): - # Return the most specific media type as accepted. - if (_MediaType(renderer.media_type).precedence > - _MediaType(media_type).precedence): - # Eg client requests '*/*' - # Accepted media type is 'application/json' - return renderer, renderer.media_type - else: - # Eg client requests 'application/json; indent=8' - # Accepted media type is 'application/json; indent=8' - return renderer, media_type - - raise exceptions.NotAcceptable(available_renderers=renderers) - - def filter_renderers(self, renderers, format): - """ - If there is a '.json' style format suffix, filter the renderers - so that we only negotiation against those that accept that format. - """ - renderers = [renderer for renderer in renderers - if renderer.format == format] - if not renderers: - raise Http404 - return renderers - - def get_accept_list(self, request): - """ - Given the incoming request, return a tokenised list of media - type strings. - - Allows URL style accept override. eg. "?accept=application/json" - """ - header = request.META.get('HTTP_ACCEPT', '*/*') - header = request.QUERY_PARAMS.get(self.settings.URL_ACCEPT_OVERRIDE, header) - return [token.strip() for token in header.split(',')] diff --git a/vendor-local/lib/python/rest_framework/pagination.py b/vendor-local/lib/python/rest_framework/pagination.py deleted file mode 100644 index d51ea929be8..00000000000 --- a/vendor-local/lib/python/rest_framework/pagination.py +++ /dev/null @@ -1,94 +0,0 @@ -""" -Pagination serializers determine the structure of the output that should -be used for paginated responses. -""" -from __future__ import unicode_literals -from rest_framework import serializers -from rest_framework.templatetags.rest_framework import replace_query_param - - -class NextPageField(serializers.Field): - """ - Field that returns a link to the next page in paginated results. - """ - page_field = 'page' - - def to_native(self, value): - if not value.has_next(): - return None - page = value.next_page_number() - request = self.context.get('request') - url = request and request.build_absolute_uri() or '' - return replace_query_param(url, self.page_field, page) - - -class PreviousPageField(serializers.Field): - """ - Field that returns a link to the previous page in paginated results. - """ - page_field = 'page' - - def to_native(self, value): - if not value.has_previous(): - return None - page = value.previous_page_number() - request = self.context.get('request') - url = request and request.build_absolute_uri() or '' - return replace_query_param(url, self.page_field, page) - - -class DefaultObjectSerializer(serializers.Field): - """ - If no object serializer is specified, then this serializer will be applied - as the default. - """ - - def __init__(self, source=None, context=None): - # Note: Swallow context kwarg - only required for eg. ModelSerializer. - super(DefaultObjectSerializer, self).__init__(source=source) - - -class PaginationSerializerOptions(serializers.SerializerOptions): - """ - An object that stores the options that may be provided to a - pagination serializer by using the inner `Meta` class. - - Accessible on the instance as `serializer.opts`. - """ - def __init__(self, meta): - super(PaginationSerializerOptions, self).__init__(meta) - self.object_serializer_class = getattr(meta, 'object_serializer_class', - DefaultObjectSerializer) - - -class BasePaginationSerializer(serializers.Serializer): - """ - A base class for pagination serializers to inherit from, - to make implementing custom serializers more easy. - """ - _options_class = PaginationSerializerOptions - results_field = 'results' - - def __init__(self, *args, **kwargs): - """ - Override init to add in the object serializer field on-the-fly. - """ - super(BasePaginationSerializer, self).__init__(*args, **kwargs) - results_field = self.results_field - object_serializer = self.opts.object_serializer_class - - if 'context' in kwargs: - context_kwarg = {'context': kwargs['context']} - else: - context_kwarg = {} - - self.fields[results_field] = object_serializer(source='object_list', **context_kwarg) - - -class PaginationSerializer(BasePaginationSerializer): - """ - A default implementation of a pagination serializer. - """ - count = serializers.Field(source='paginator.count') - next = NextPageField(source='*') - previous = PreviousPageField(source='*') diff --git a/vendor-local/lib/python/rest_framework/parsers.py b/vendor-local/lib/python/rest_framework/parsers.py deleted file mode 100644 index 96bfac84a04..00000000000 --- a/vendor-local/lib/python/rest_framework/parsers.py +++ /dev/null @@ -1,292 +0,0 @@ -""" -Parsers are used to parse the content of incoming HTTP requests. - -They give us a generic way of being able to handle various media types -on the request, such as form content or json encoded data. -""" -from __future__ import unicode_literals -from django.conf import settings -from django.core.files.uploadhandler import StopFutureHandlers -from django.http import QueryDict -from django.http.multipartparser import MultiPartParser as DjangoMultiPartParser -from django.http.multipartparser import MultiPartParserError, parse_header, ChunkIter -from rest_framework.compat import yaml, etree -from rest_framework.exceptions import ParseError -from rest_framework.compat import six -import json -import datetime -import decimal - - -class DataAndFiles(object): - def __init__(self, data, files): - self.data = data - self.files = files - - -class BaseParser(object): - """ - All parsers should extend `BaseParser`, specifying a `media_type` - attribute, and overriding the `.parse()` method. - """ - - media_type = None - - def parse(self, stream, media_type=None, parser_context=None): - """ - Given a stream to read from, return the parsed representation. - Should return parsed data, or a `DataAndFiles` object consisting of the - parsed data and files. - """ - raise NotImplementedError(".parse() must be overridden.") - - -class JSONParser(BaseParser): - """ - Parses JSON-serialized data. - """ - - media_type = 'application/json' - - def parse(self, stream, media_type=None, parser_context=None): - """ - Parses the incoming bytestream as JSON and returns the resulting data. - """ - parser_context = parser_context or {} - encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) - - try: - data = stream.read().decode(encoding) - return json.loads(data) - except ValueError as exc: - raise ParseError('JSON parse error - %s' % six.text_type(exc)) - - -class YAMLParser(BaseParser): - """ - Parses YAML-serialized data. - """ - - media_type = 'application/yaml' - - def parse(self, stream, media_type=None, parser_context=None): - """ - Parses the incoming bytestream as YAML and returns the resulting data. - """ - assert yaml, 'YAMLParser requires pyyaml to be installed' - - parser_context = parser_context or {} - encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) - - try: - data = stream.read().decode(encoding) - return yaml.safe_load(data) - except (ValueError, yaml.parser.ParserError) as exc: - raise ParseError('YAML parse error - %s' % six.u(exc)) - - -class FormParser(BaseParser): - """ - Parser for form data. - """ - - media_type = 'application/x-www-form-urlencoded' - - def parse(self, stream, media_type=None, parser_context=None): - """ - Parses the incoming bytestream as a URL encoded form, - and returns the resulting QueryDict. - """ - parser_context = parser_context or {} - encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) - data = QueryDict(stream.read(), encoding=encoding) - return data - - -class MultiPartParser(BaseParser): - """ - Parser for multipart form data, which may include file data. - """ - - media_type = 'multipart/form-data' - - def parse(self, stream, media_type=None, parser_context=None): - """ - Parses the incoming bytestream as a multipart encoded form, - and returns a DataAndFiles object. - - `.data` will be a `QueryDict` containing all the form parameters. - `.files` will be a `QueryDict` containing all the form files. - """ - parser_context = parser_context or {} - request = parser_context['request'] - encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) - meta = request.META - upload_handlers = request.upload_handlers - - try: - parser = DjangoMultiPartParser(meta, stream, upload_handlers, encoding) - data, files = parser.parse() - return DataAndFiles(data, files) - except MultiPartParserError as exc: - raise ParseError('Multipart form parse error - %s' % six.u(exc)) - - -class XMLParser(BaseParser): - """ - XML parser. - """ - - media_type = 'application/xml' - - def parse(self, stream, media_type=None, parser_context=None): - """ - Parses the incoming bytestream as XML and returns the resulting data. - """ - assert etree, 'XMLParser requires defusedxml to be installed' - - parser_context = parser_context or {} - encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) - parser = etree.DefusedXMLParser(encoding=encoding) - try: - tree = etree.parse(stream, parser=parser, forbid_dtd=True) - except (etree.ParseError, ValueError) as exc: - raise ParseError('XML parse error - %s' % six.u(exc)) - data = self._xml_convert(tree.getroot()) - - return data - - def _xml_convert(self, element): - """ - convert the xml `element` into the corresponding python object - """ - - children = list(element) - - if len(children) == 0: - return self._type_convert(element.text) - else: - # if the fist child tag is list-item means all children are list-item - if children[0].tag == "list-item": - data = [] - for child in children: - data.append(self._xml_convert(child)) - else: - data = {} - for child in children: - data[child.tag] = self._xml_convert(child) - - return data - - def _type_convert(self, value): - """ - Converts the value returned by the XMl parse into the equivalent - Python type - """ - if value is None: - return value - - try: - return datetime.datetime.strptime(value, '%Y-%m-%d %H:%M:%S') - except ValueError: - pass - - try: - return int(value) - except ValueError: - pass - - try: - return decimal.Decimal(value) - except decimal.InvalidOperation: - pass - - return value - - -class FileUploadParser(BaseParser): - """ - Parser for file upload data. - """ - media_type = '*/*' - - def parse(self, stream, media_type=None, parser_context=None): - """ - Treats the incoming bytestream as a raw file upload and returns - a `DateAndFiles` object. - - `.data` will be None (we expect request body to be a file content). - `.files` will be a `QueryDict` containing one 'file' element. - """ - - parser_context = parser_context or {} - request = parser_context['request'] - encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) - meta = request.META - upload_handlers = request.upload_handlers - filename = self.get_filename(stream, media_type, parser_context) - - # Note that this code is extracted from Django's handling of - # file uploads in MultiPartParser. - content_type = meta.get('HTTP_CONTENT_TYPE', - meta.get('CONTENT_TYPE', '')) - try: - content_length = int(meta.get('HTTP_CONTENT_LENGTH', - meta.get('CONTENT_LENGTH', 0))) - except (ValueError, TypeError): - content_length = None - - # See if the handler will want to take care of the parsing. - for handler in upload_handlers: - result = handler.handle_raw_input(None, - meta, - content_length, - None, - encoding) - if result is not None: - return DataAndFiles(None, {'file': result[1]}) - - # This is the standard case. - possible_sizes = [x.chunk_size for x in upload_handlers if x.chunk_size] - chunk_size = min([2 ** 31 - 4] + possible_sizes) - chunks = ChunkIter(stream, chunk_size) - counters = [0] * len(upload_handlers) - - for handler in upload_handlers: - try: - handler.new_file(None, filename, content_type, - content_length, encoding) - except StopFutureHandlers: - break - - for chunk in chunks: - for i, handler in enumerate(upload_handlers): - chunk_length = len(chunk) - chunk = handler.receive_data_chunk(chunk, counters[i]) - counters[i] += chunk_length - if chunk is None: - break - - for i, handler in enumerate(upload_handlers): - file_obj = handler.file_complete(counters[i]) - if file_obj: - return DataAndFiles(None, {'file': file_obj}) - raise ParseError("FileUpload parse error - " - "none of upload handlers can handle the stream") - - def get_filename(self, stream, media_type, parser_context): - """ - Detects the uploaded file name. First searches a 'filename' url kwarg. - Then tries to parse Content-Disposition header. - """ - try: - return parser_context['kwargs']['filename'] - except KeyError: - pass - - try: - meta = parser_context['request'].META - disposition = parse_header(meta['HTTP_CONTENT_DISPOSITION']) - return disposition[1]['filename'] - except (AttributeError, KeyError): - pass diff --git a/vendor-local/lib/python/rest_framework/permissions.py b/vendor-local/lib/python/rest_framework/permissions.py deleted file mode 100644 index 1036663e05c..00000000000 --- a/vendor-local/lib/python/rest_framework/permissions.py +++ /dev/null @@ -1,174 +0,0 @@ -""" -Provides a set of pluggable permission policies. -""" -from __future__ import unicode_literals -import inspect -import warnings - -SAFE_METHODS = ['GET', 'HEAD', 'OPTIONS'] - -from rest_framework.compat import oauth2_provider_scope, oauth2_constants - - -class BasePermission(object): - """ - A base class from which all permission classes should inherit. - """ - - def has_permission(self, request, view): - """ - Return `True` if permission is granted, `False` otherwise. - """ - return True - - def has_object_permission(self, request, view, obj): - """ - Return `True` if permission is granted, `False` otherwise. - """ - if len(inspect.getargspec(self.has_permission).args) == 4: - warnings.warn( - 'The `obj` argument in `has_permission` is deprecated. ' - 'Use `has_object_permission()` instead for object permissions.', - DeprecationWarning, stacklevel=2 - ) - return self.has_permission(request, view, obj) - return True - - -class AllowAny(BasePermission): - """ - Allow any access. - This isn't strictly required, since you could use an empty - permission_classes list, but it's useful because it makes the intention - more explicit. - """ - def has_permission(self, request, view): - return True - - -class IsAuthenticated(BasePermission): - """ - Allows access only to authenticated users. - """ - - def has_permission(self, request, view): - if request.user and request.user.is_authenticated(): - return True - return False - - -class IsAdminUser(BasePermission): - """ - Allows access only to admin users. - """ - - def has_permission(self, request, view): - if request.user and request.user.is_staff: - return True - return False - - -class IsAuthenticatedOrReadOnly(BasePermission): - """ - The request is authenticated as a user, or is a read-only request. - """ - - def has_permission(self, request, view): - if (request.method in SAFE_METHODS or - request.user and - request.user.is_authenticated()): - return True - return False - - -class DjangoModelPermissions(BasePermission): - """ - The request is authenticated using `django.contrib.auth` permissions. - See: https://docs.djangoproject.com/en/dev/topics/auth/#permissions - - It ensures that the user is authenticated, and has the appropriate - `add`/`change`/`delete` permissions on the model. - - This permission can only be applied against view classes that - provide a `.model` or `.queryset` attribute. - """ - - # Map methods into required permission codes. - # Override this if you need to also provide 'view' permissions, - # or if you want to provide custom permission codes. - perms_map = { - 'GET': [], - 'OPTIONS': [], - 'HEAD': [], - 'POST': ['%(app_label)s.add_%(model_name)s'], - 'PUT': ['%(app_label)s.change_%(model_name)s'], - 'PATCH': ['%(app_label)s.change_%(model_name)s'], - 'DELETE': ['%(app_label)s.delete_%(model_name)s'], - } - - authenticated_users_only = True - - def get_required_permissions(self, method, model_cls): - """ - Given a model and an HTTP method, return the list of permission - codes that the user is required to have. - """ - kwargs = { - 'app_label': model_cls._meta.app_label, - 'model_name': model_cls._meta.module_name - } - return [perm % kwargs for perm in self.perms_map[method]] - - def has_permission(self, request, view): - model_cls = getattr(view, 'model', None) - queryset = getattr(view, 'queryset', None) - - if model_cls is None and queryset is not None: - model_cls = queryset.model - - # Workaround to ensure DjangoModelPermissions are not applied - # to the root view when using DefaultRouter. - if model_cls is None and getattr(view, '_ignore_model_permissions', False): - return True - - assert model_cls, ('Cannot apply DjangoModelPermissions on a view that' - ' does not have `.model` or `.queryset` property.') - - perms = self.get_required_permissions(request.method, model_cls) - - if (request.user and - (request.user.is_authenticated() or not self.authenticated_users_only) and - request.user.has_perms(perms)): - return True - return False - - -class DjangoModelPermissionsOrAnonReadOnly(DjangoModelPermissions): - """ - Similar to DjangoModelPermissions, except that anonymous users are - allowed read-only access. - """ - authenticated_users_only = False - - -class TokenHasReadWriteScope(BasePermission): - """ - The request is authenticated as a user and the token used has the right scope - """ - - def has_permission(self, request, view): - token = request.auth - read_only = request.method in SAFE_METHODS - - if not token: - return False - - if hasattr(token, 'resource'): # OAuth 1 - return read_only or not request.auth.resource.is_readonly - elif hasattr(token, 'scope'): # OAuth 2 - required = oauth2_constants.READ if read_only else oauth2_constants.WRITE - return oauth2_provider_scope.check(required, request.auth.scope) - - assert False, ('TokenHasReadWriteScope requires either the' - '`OAuthAuthentication` or `OAuth2Authentication` authentication ' - 'class to be used.') diff --git a/vendor-local/lib/python/rest_framework/relations.py b/vendor-local/lib/python/rest_framework/relations.py deleted file mode 100644 index edaf76d6eee..00000000000 --- a/vendor-local/lib/python/rest_framework/relations.py +++ /dev/null @@ -1,633 +0,0 @@ -""" -Serializer fields that deal with relationships. - -These fields allow you to specify the style that should be used to represent -model relationships, including hyperlinks, primary keys, or slugs. -""" -from __future__ import unicode_literals -from django.core.exceptions import ObjectDoesNotExist, ValidationError -from django.core.urlresolvers import resolve, get_script_prefix, NoReverseMatch -from django import forms -from django.db.models.fields import BLANK_CHOICE_DASH -from django.forms import widgets -from django.forms.models import ModelChoiceIterator -from django.utils.translation import ugettext_lazy as _ -from rest_framework.fields import Field, WritableField, get_component, is_simple_callable -from rest_framework.reverse import reverse -from rest_framework.compat import urlparse -from rest_framework.compat import smart_text -import warnings - - -##### Relational fields ##### - - -# Not actually Writable, but subclasses may need to be. -class RelatedField(WritableField): - """ - Base class for related model fields. - - This represents a relationship using the unicode representation of the target. - """ - widget = widgets.Select - many_widget = widgets.SelectMultiple - form_field_class = forms.ChoiceField - many_form_field_class = forms.MultipleChoiceField - - cache_choices = False - empty_label = None - read_only = True - many = False - - def __init__(self, *args, **kwargs): - - # 'null' is to be deprecated in favor of 'required' - if 'null' in kwargs: - warnings.warn('The `null` keyword argument is deprecated. ' - 'Use the `required` keyword argument instead.', - DeprecationWarning, stacklevel=2) - kwargs['required'] = not kwargs.pop('null') - - queryset = kwargs.pop('queryset', None) - self.many = kwargs.pop('many', self.many) - if self.many: - self.widget = self.many_widget - self.form_field_class = self.many_form_field_class - - kwargs['read_only'] = kwargs.pop('read_only', self.read_only) - super(RelatedField, self).__init__(*args, **kwargs) - - if not self.required: - self.empty_label = BLANK_CHOICE_DASH[0][1] - - self.queryset = queryset - - def initialize(self, parent, field_name): - super(RelatedField, self).initialize(parent, field_name) - if self.queryset is None and not self.read_only: - try: - manager = getattr(self.parent.opts.model, self.source or field_name) - if hasattr(manager, 'related'): # Forward - self.queryset = manager.related.model._default_manager.all() - else: # Reverse - self.queryset = manager.field.rel.to._default_manager.all() - except Exception: - msg = ('Serializer related fields must include a `queryset`' + - ' argument or set `read_only=True') - raise Exception(msg) - - ### We need this stuff to make form choices work... - - def prepare_value(self, obj): - return self.to_native(obj) - - def label_from_instance(self, obj): - """ - Return a readable representation for use with eg. select widgets. - """ - desc = smart_text(obj) - ident = smart_text(self.to_native(obj)) - if desc == ident: - return desc - return "%s - %s" % (desc, ident) - - def _get_queryset(self): - return self._queryset - - def _set_queryset(self, queryset): - self._queryset = queryset - self.widget.choices = self.choices - - queryset = property(_get_queryset, _set_queryset) - - def _get_choices(self): - # If self._choices is set, then somebody must have manually set - # the property self.choices. In this case, just return self._choices. - if hasattr(self, '_choices'): - return self._choices - - # Otherwise, execute the QuerySet in self.queryset to determine the - # choices dynamically. Return a fresh ModelChoiceIterator that has not been - # consumed. Note that we're instantiating a new ModelChoiceIterator *each* - # time _get_choices() is called (and, thus, each time self.choices is - # accessed) so that we can ensure the QuerySet has not been consumed. This - # construct might look complicated but it allows for lazy evaluation of - # the queryset. - return ModelChoiceIterator(self) - - def _set_choices(self, value): - # Setting choices also sets the choices on the widget. - # choices can be any iterable, but we call list() on it because - # it will be consumed more than once. - self._choices = self.widget.choices = list(value) - - choices = property(_get_choices, _set_choices) - - ### Regular serializer stuff... - - def field_to_native(self, obj, field_name): - try: - if self.source == '*': - return self.to_native(obj) - - source = self.source or field_name - value = obj - - for component in source.split('.'): - value = get_component(value, component) - if value is None: - break - except ObjectDoesNotExist: - return None - - if value is None: - return None - - if self.many: - if is_simple_callable(getattr(value, 'all', None)): - return [self.to_native(item) for item in value.all()] - else: - # Also support non-queryset iterables. - # This allows us to also support plain lists of related items. - return [self.to_native(item) for item in value] - return self.to_native(value) - - def field_from_native(self, data, files, field_name, into): - if self.read_only: - return - - try: - if self.many: - try: - # Form data - value = data.getlist(field_name) - if value == [''] or value == []: - raise KeyError - except AttributeError: - # Non-form data - value = data[field_name] - else: - value = data[field_name] - except KeyError: - if self.partial: - return - value = [] if self.many else None - - if value in (None, '') and self.required: - raise ValidationError(self.error_messages['required']) - elif value in (None, ''): - into[(self.source or field_name)] = None - elif self.many: - into[(self.source or field_name)] = [self.from_native(item) for item in value] - else: - into[(self.source or field_name)] = self.from_native(value) - - -### PrimaryKey relationships - -class PrimaryKeyRelatedField(RelatedField): - """ - Represents a relationship as a pk value. - """ - read_only = False - - default_error_messages = { - 'does_not_exist': _("Invalid pk '%s' - object does not exist."), - 'incorrect_type': _('Incorrect type. Expected pk value, received %s.'), - } - - # TODO: Remove these field hacks... - def prepare_value(self, obj): - return self.to_native(obj.pk) - - def label_from_instance(self, obj): - """ - Return a readable representation for use with eg. select widgets. - """ - desc = smart_text(obj) - ident = smart_text(self.to_native(obj.pk)) - if desc == ident: - return desc - return "%s - %s" % (desc, ident) - - # TODO: Possibly change this to just take `obj`, through prob less performant - def to_native(self, pk): - return pk - - def from_native(self, data): - if self.queryset is None: - raise Exception('Writable related fields must include a `queryset` argument') - - try: - return self.queryset.get(pk=data) - except ObjectDoesNotExist: - msg = self.error_messages['does_not_exist'] % smart_text(data) - raise ValidationError(msg) - except (TypeError, ValueError): - received = type(data).__name__ - msg = self.error_messages['incorrect_type'] % received - raise ValidationError(msg) - - def field_to_native(self, obj, field_name): - if self.many: - # To-many relationship - - queryset = None - if not self.source: - # Prefer obj.serializable_value for performance reasons - try: - queryset = obj.serializable_value(field_name) - except AttributeError: - pass - if queryset is None: - # RelatedManager (reverse relationship) - source = self.source or field_name - queryset = obj - for component in source.split('.'): - queryset = get_component(queryset, component) - - # Forward relationship - if is_simple_callable(getattr(queryset, 'all', None)): - return [self.to_native(item.pk) for item in queryset.all()] - else: - # Also support non-queryset iterables. - # This allows us to also support plain lists of related items. - return [self.to_native(item.pk) for item in queryset] - - # To-one relationship - try: - # Prefer obj.serializable_value for performance reasons - pk = obj.serializable_value(self.source or field_name) - except AttributeError: - # RelatedObject (reverse relationship) - try: - pk = getattr(obj, self.source or field_name).pk - except ObjectDoesNotExist: - return None - - # Forward relationship - return self.to_native(pk) - - -### Slug relationships - - -class SlugRelatedField(RelatedField): - """ - Represents a relationship using a unique field on the target. - """ - read_only = False - - default_error_messages = { - 'does_not_exist': _("Object with %s=%s does not exist."), - 'invalid': _('Invalid value.'), - } - - def __init__(self, *args, **kwargs): - self.slug_field = kwargs.pop('slug_field', None) - assert self.slug_field, 'slug_field is required' - super(SlugRelatedField, self).__init__(*args, **kwargs) - - def to_native(self, obj): - return getattr(obj, self.slug_field) - - def from_native(self, data): - if self.queryset is None: - raise Exception('Writable related fields must include a `queryset` argument') - - try: - return self.queryset.get(**{self.slug_field: data}) - except ObjectDoesNotExist: - raise ValidationError(self.error_messages['does_not_exist'] % - (self.slug_field, smart_text(data))) - except (TypeError, ValueError): - msg = self.error_messages['invalid'] - raise ValidationError(msg) - - -### Hyperlinked relationships - -class HyperlinkedRelatedField(RelatedField): - """ - Represents a relationship using hyperlinking. - """ - read_only = False - lookup_field = 'pk' - - default_error_messages = { - 'no_match': _('Invalid hyperlink - No URL match'), - 'incorrect_match': _('Invalid hyperlink - Incorrect URL match'), - 'configuration_error': _('Invalid hyperlink due to configuration error'), - 'does_not_exist': _("Invalid hyperlink - object does not exist."), - 'incorrect_type': _('Incorrect type. Expected url string, received %s.'), - } - - # These are all pending deprecation - pk_url_kwarg = 'pk' - slug_field = 'slug' - slug_url_kwarg = None # Defaults to same as `slug_field` unless overridden - - def __init__(self, *args, **kwargs): - try: - self.view_name = kwargs.pop('view_name') - except KeyError: - raise ValueError("Hyperlinked field requires 'view_name' kwarg") - - self.lookup_field = kwargs.pop('lookup_field', self.lookup_field) - self.format = kwargs.pop('format', None) - - # These are pending deprecation - if 'pk_url_kwarg' in kwargs: - msg = 'pk_url_kwarg is pending deprecation. Use lookup_field instead.' - warnings.warn(msg, PendingDeprecationWarning, stacklevel=2) - if 'slug_url_kwarg' in kwargs: - msg = 'slug_url_kwarg is pending deprecation. Use lookup_field instead.' - warnings.warn(msg, PendingDeprecationWarning, stacklevel=2) - if 'slug_field' in kwargs: - msg = 'slug_field is pending deprecation. Use lookup_field instead.' - warnings.warn(msg, PendingDeprecationWarning, stacklevel=2) - - self.pk_url_kwarg = kwargs.pop('pk_url_kwarg', self.pk_url_kwarg) - self.slug_field = kwargs.pop('slug_field', self.slug_field) - default_slug_kwarg = self.slug_url_kwarg or self.slug_field - self.slug_url_kwarg = kwargs.pop('slug_url_kwarg', default_slug_kwarg) - - super(HyperlinkedRelatedField, self).__init__(*args, **kwargs) - - def get_url(self, obj, view_name, request, format): - """ - Given an object, return the URL that hyperlinks to the object. - - May raise a `NoReverseMatch` if the `view_name` and `lookup_field` - attributes are not configured to correctly match the URL conf. - """ - lookup_field = getattr(obj, self.lookup_field) - kwargs = {self.lookup_field: lookup_field} - try: - return reverse(view_name, kwargs=kwargs, request=request, format=format) - except NoReverseMatch: - pass - - if self.pk_url_kwarg != 'pk': - # Only try pk if it has been explicitly set. - # Otherwise, the default `lookup_field = 'pk'` has us covered. - pk = obj.pk - kwargs = {self.pk_url_kwarg: pk} - try: - return reverse(view_name, kwargs=kwargs, request=request, format=format) - except NoReverseMatch: - pass - - slug = getattr(obj, self.slug_field, None) - if slug is not None: - # Only try slug if it corresponds to an attribute on the object. - kwargs = {self.slug_url_kwarg: slug} - try: - ret = reverse(view_name, kwargs=kwargs, request=request, format=format) - if self.slug_field == 'slug' and self.slug_url_kwarg == 'slug': - # If the lookup succeeds using the default slug params, - # then `slug_field` is being used implicitly, and we - # we need to warn about the pending deprecation. - msg = 'Implicit slug field hyperlinked fields are pending deprecation.' \ - 'You should set `lookup_field=slug` on the HyperlinkedRelatedField.' - warnings.warn(msg, PendingDeprecationWarning, stacklevel=2) - return ret - except NoReverseMatch: - pass - - raise NoReverseMatch() - - def get_object(self, queryset, view_name, view_args, view_kwargs): - """ - Return the object corresponding to a matched URL. - - Takes the matched URL conf arguments, and the queryset, and should - return an object instance, or raise an `ObjectDoesNotExist` exception. - """ - lookup = view_kwargs.get(self.lookup_field, None) - pk = view_kwargs.get(self.pk_url_kwarg, None) - slug = view_kwargs.get(self.slug_url_kwarg, None) - - if lookup is not None: - filter_kwargs = {self.lookup_field: lookup} - elif pk is not None: - filter_kwargs = {'pk': pk} - elif slug is not None: - filter_kwargs = {self.slug_field: slug} - else: - raise ObjectDoesNotExist() - - return queryset.get(**filter_kwargs) - - def to_native(self, obj): - view_name = self.view_name - request = self.context.get('request', None) - format = self.format or self.context.get('format', None) - - if request is None: - msg = ( - "Using `HyperlinkedRelatedField` without including the request " - "in the serializer context is deprecated. " - "Add `context={'request': request}` when instantiating " - "the serializer." - ) - warnings.warn(msg, DeprecationWarning, stacklevel=4) - - # If the object has not yet been saved then we cannot hyperlink to it. - if getattr(obj, 'pk', None) is None: - return - - # Return the hyperlink, or error if incorrectly configured. - try: - return self.get_url(obj, view_name, request, format) - except NoReverseMatch: - msg = ( - 'Could not resolve URL for hyperlinked relationship using ' - 'view name "%s". You may have failed to include the related ' - 'model in your API, or incorrectly configured the ' - '`lookup_field` attribute on this field.' - ) - raise Exception(msg % view_name) - - def from_native(self, value): - # Convert URL -> model instance pk - # TODO: Use values_list - queryset = self.queryset - if queryset is None: - raise Exception('Writable related fields must include a `queryset` argument') - - try: - http_prefix = value.startswith(('http:', 'https:')) - except AttributeError: - msg = self.error_messages['incorrect_type'] - raise ValidationError(msg % type(value).__name__) - - if http_prefix: - # If needed convert absolute URLs to relative path - value = urlparse.urlparse(value).path - prefix = get_script_prefix() - if value.startswith(prefix): - value = '/' + value[len(prefix):] - - try: - match = resolve(value) - except Exception: - raise ValidationError(self.error_messages['no_match']) - - if match.view_name != self.view_name: - raise ValidationError(self.error_messages['incorrect_match']) - - try: - return self.get_object(queryset, match.view_name, - match.args, match.kwargs) - except (ObjectDoesNotExist, TypeError, ValueError): - raise ValidationError(self.error_messages['does_not_exist']) - - -class HyperlinkedIdentityField(Field): - """ - Represents the instance, or a property on the instance, using hyperlinking. - """ - lookup_field = 'pk' - read_only = True - - # These are all pending deprecation - pk_url_kwarg = 'pk' - slug_field = 'slug' - slug_url_kwarg = None # Defaults to same as `slug_field` unless overridden - - def __init__(self, *args, **kwargs): - try: - self.view_name = kwargs.pop('view_name') - except KeyError: - msg = "HyperlinkedIdentityField requires 'view_name' argument" - raise ValueError(msg) - - self.format = kwargs.pop('format', None) - lookup_field = kwargs.pop('lookup_field', None) - self.lookup_field = lookup_field or self.lookup_field - - # These are pending deprecation - if 'pk_url_kwarg' in kwargs: - msg = 'pk_url_kwarg is pending deprecation. Use lookup_field instead.' - warnings.warn(msg, PendingDeprecationWarning, stacklevel=2) - if 'slug_url_kwarg' in kwargs: - msg = 'slug_url_kwarg is pending deprecation. Use lookup_field instead.' - warnings.warn(msg, PendingDeprecationWarning, stacklevel=2) - if 'slug_field' in kwargs: - msg = 'slug_field is pending deprecation. Use lookup_field instead.' - warnings.warn(msg, PendingDeprecationWarning, stacklevel=2) - - self.slug_field = kwargs.pop('slug_field', self.slug_field) - default_slug_kwarg = self.slug_url_kwarg or self.slug_field - self.pk_url_kwarg = kwargs.pop('pk_url_kwarg', self.pk_url_kwarg) - self.slug_url_kwarg = kwargs.pop('slug_url_kwarg', default_slug_kwarg) - - super(HyperlinkedIdentityField, self).__init__(*args, **kwargs) - - def field_to_native(self, obj, field_name): - request = self.context.get('request', None) - format = self.context.get('format', None) - view_name = self.view_name - - if request is None: - warnings.warn("Using `HyperlinkedIdentityField` without including the " - "request in the serializer context is deprecated. " - "Add `context={'request': request}` when instantiating the serializer.", - DeprecationWarning, stacklevel=4) - - # By default use whatever format is given for the current context - # unless the target is a different type to the source. - # - # Eg. Consider a HyperlinkedIdentityField pointing from a json - # representation to an html property of that representation... - # - # '/snippets/1/' should link to '/snippets/1/highlight/' - # ...but... - # '/snippets/1/.json' should link to '/snippets/1/highlight/.html' - if format and self.format and self.format != format: - format = self.format - - # Return the hyperlink, or error if incorrectly configured. - try: - return self.get_url(obj, view_name, request, format) - except NoReverseMatch: - msg = ( - 'Could not resolve URL for hyperlinked relationship using ' - 'view name "%s". You may have failed to include the related ' - 'model in your API, or incorrectly configured the ' - '`lookup_field` attribute on this field.' - ) - raise Exception(msg % view_name) - - def get_url(self, obj, view_name, request, format): - """ - Given an object, return the URL that hyperlinks to the object. - - May raise a `NoReverseMatch` if the `view_name` and `lookup_field` - attributes are not configured to correctly match the URL conf. - """ - lookup_field = getattr(obj, self.lookup_field) - kwargs = {self.lookup_field: lookup_field} - try: - return reverse(view_name, kwargs=kwargs, request=request, format=format) - except NoReverseMatch: - pass - - if self.pk_url_kwarg != 'pk': - # Only try pk lookup if it has been explicitly set. - # Otherwise, the default `lookup_field = 'pk'` has us covered. - kwargs = {self.pk_url_kwarg: obj.pk} - try: - return reverse(view_name, kwargs=kwargs, request=request, format=format) - except NoReverseMatch: - pass - - slug = getattr(obj, self.slug_field, None) - if slug: - # Only use slug lookup if a slug field exists on the model - kwargs = {self.slug_url_kwarg: slug} - try: - return reverse(view_name, kwargs=kwargs, request=request, format=format) - except NoReverseMatch: - pass - - raise NoReverseMatch() - - -### Old-style many classes for backwards compat - -class ManyRelatedField(RelatedField): - def __init__(self, *args, **kwargs): - warnings.warn('`ManyRelatedField()` is deprecated. ' - 'Use `RelatedField(many=True)` instead.', - DeprecationWarning, stacklevel=2) - kwargs['many'] = True - super(ManyRelatedField, self).__init__(*args, **kwargs) - - -class ManyPrimaryKeyRelatedField(PrimaryKeyRelatedField): - def __init__(self, *args, **kwargs): - warnings.warn('`ManyPrimaryKeyRelatedField()` is deprecated. ' - 'Use `PrimaryKeyRelatedField(many=True)` instead.', - DeprecationWarning, stacklevel=2) - kwargs['many'] = True - super(ManyPrimaryKeyRelatedField, self).__init__(*args, **kwargs) - - -class ManySlugRelatedField(SlugRelatedField): - def __init__(self, *args, **kwargs): - warnings.warn('`ManySlugRelatedField()` is deprecated. ' - 'Use `SlugRelatedField(many=True)` instead.', - DeprecationWarning, stacklevel=2) - kwargs['many'] = True - super(ManySlugRelatedField, self).__init__(*args, **kwargs) - - -class ManyHyperlinkedRelatedField(HyperlinkedRelatedField): - def __init__(self, *args, **kwargs): - warnings.warn('`ManyHyperlinkedRelatedField()` is deprecated. ' - 'Use `HyperlinkedRelatedField(many=True)` instead.', - DeprecationWarning, stacklevel=2) - kwargs['many'] = True - super(ManyHyperlinkedRelatedField, self).__init__(*args, **kwargs) diff --git a/vendor-local/lib/python/rest_framework/renderers.py b/vendor-local/lib/python/rest_framework/renderers.py deleted file mode 100644 index 3a03ca3324e..00000000000 --- a/vendor-local/lib/python/rest_framework/renderers.py +++ /dev/null @@ -1,584 +0,0 @@ -""" -Renderers are used to serialize a response into specific media types. - -They give us a generic way of being able to handle various media types -on the response, such as JSON encoded data or HTML output. - -REST framework also provides an HTML renderer the renders the browsable API. -""" -from __future__ import unicode_literals - -import copy -import json -from django import forms -from django.core.exceptions import ImproperlyConfigured -from django.http.multipartparser import parse_header -from django.template import RequestContext, loader, Template -from django.test.client import encode_multipart -from django.utils.xmlutils import SimplerXMLGenerator -from rest_framework.compat import StringIO -from rest_framework.compat import six -from rest_framework.compat import smart_text -from rest_framework.compat import yaml -from rest_framework.settings import api_settings -from rest_framework.request import clone_request -from rest_framework.utils import encoders -from rest_framework.utils.breadcrumbs import get_breadcrumbs -from rest_framework.utils.formatting import get_view_name, get_view_description -from rest_framework import exceptions, parsers, status, VERSION - - -class BaseRenderer(object): - """ - All renderers should extend this class, setting the `media_type` - and `format` attributes, and override the `.render()` method. - """ - - media_type = None - format = None - charset = 'utf-8' - - def render(self, data, accepted_media_type=None, renderer_context=None): - raise NotImplemented('Renderer class requires .render() to be implemented') - - -class JSONRenderer(BaseRenderer): - """ - Renderer which serializes to JSON. - Applies JSON's backslash-u character escaping for non-ascii characters. - """ - - media_type = 'application/json' - format = 'json' - encoder_class = encoders.JSONEncoder - ensure_ascii = True - charset = 'utf-8' - # Note that JSON encodings must be utf-8, utf-16 or utf-32. - # See: http://www.ietf.org/rfc/rfc4627.txt - - def render(self, data, accepted_media_type=None, renderer_context=None): - """ - Render `data` into JSON. - """ - if data is None: - return '' - - # If 'indent' is provided in the context, then pretty print the result. - # E.g. If we're being called by the BrowsableAPIRenderer. - renderer_context = renderer_context or {} - indent = renderer_context.get('indent', None) - - if accepted_media_type: - # If the media type looks like 'application/json; indent=4', - # then pretty print the result. - base_media_type, params = parse_header(accepted_media_type.encode('ascii')) - indent = params.get('indent', indent) - try: - indent = max(min(int(indent), 8), 0) - except (ValueError, TypeError): - indent = None - - ret = json.dumps(data, cls=self.encoder_class, - indent=indent, ensure_ascii=self.ensure_ascii) - - # On python 2.x json.dumps() returns bytestrings if ensure_ascii=True, - # but if ensure_ascii=False, the return type is underspecified, - # and may (or may not) be unicode. - # On python 3.x json.dumps() returns unicode strings. - if isinstance(ret, six.text_type): - return bytes(ret.encode(self.charset)) - return ret - - -class UnicodeJSONRenderer(JSONRenderer): - ensure_ascii = False - charset = 'utf-8' - """ - Renderer which serializes to JSON. - Does *not* apply JSON's character escaping for non-ascii characters. - """ - - -class JSONPRenderer(JSONRenderer): - """ - Renderer which serializes to json, - wrapping the json output in a callback function. - """ - - media_type = 'application/javascript' - format = 'jsonp' - callback_parameter = 'callback' - default_callback = 'callback' - - def get_callback(self, renderer_context): - """ - Determine the name of the callback to wrap around the json output. - """ - request = renderer_context.get('request', None) - params = request and request.QUERY_PARAMS or {} - return params.get(self.callback_parameter, self.default_callback) - - def render(self, data, accepted_media_type=None, renderer_context=None): - """ - Renders into jsonp, wrapping the json output in a callback function. - - Clients may set the callback function name using a query parameter - on the URL, for example: ?callback=exampleCallbackName - """ - renderer_context = renderer_context or {} - callback = self.get_callback(renderer_context) - json = super(JSONPRenderer, self).render(data, accepted_media_type, - renderer_context) - return callback.encode(self.charset) + b'(' + json + b');' - - -class XMLRenderer(BaseRenderer): - """ - Renderer which serializes to XML. - """ - - media_type = 'application/xml' - format = 'xml' - charset = 'utf-8' - - def render(self, data, accepted_media_type=None, renderer_context=None): - """ - Renders *obj* into serialized XML. - """ - if data is None: - return '' - - stream = StringIO() - - xml = SimplerXMLGenerator(stream, self.charset) - xml.startDocument() - xml.startElement("root", {}) - - self._to_xml(xml, data) - - xml.endElement("root") - xml.endDocument() - return stream.getvalue() - - def _to_xml(self, xml, data): - if isinstance(data, (list, tuple)): - for item in data: - xml.startElement("list-item", {}) - self._to_xml(xml, item) - xml.endElement("list-item") - - elif isinstance(data, dict): - for key, value in six.iteritems(data): - xml.startElement(key, {}) - self._to_xml(xml, value) - xml.endElement(key) - - elif data is None: - # Don't output any value - pass - - else: - xml.characters(smart_text(data)) - - -class YAMLRenderer(BaseRenderer): - """ - Renderer which serializes to YAML. - """ - - media_type = 'application/yaml' - format = 'yaml' - encoder = encoders.SafeDumper - charset = 'utf-8' - - def render(self, data, accepted_media_type=None, renderer_context=None): - """ - Renders *obj* into serialized YAML. - """ - assert yaml, 'YAMLRenderer requires pyyaml to be installed' - - if data is None: - return '' - - return yaml.dump(data, stream=None, encoding=self.charset, Dumper=self.encoder) - - -class TemplateHTMLRenderer(BaseRenderer): - """ - An HTML renderer for use with templates. - - The data supplied to the Response object should be a dictionary that will - be used as context for the template. - - The template name is determined by (in order of preference): - - 1. An explicit `.template_name` attribute set on the response. - 2. An explicit `.template_name` attribute set on this class. - 3. The return result of calling `view.get_template_names()`. - - For example: - data = {'users': User.objects.all()} - return Response(data, template_name='users.html') - - For pre-rendered HTML, see StaticHTMLRenderer. - """ - - media_type = 'text/html' - format = 'html' - template_name = None - exception_template_names = [ - '%(status_code)s.html', - 'api_exception.html' - ] - charset = 'utf-8' - - def render(self, data, accepted_media_type=None, renderer_context=None): - """ - Renders data to HTML, using Django's standard template rendering. - - The template name is determined by (in order of preference): - - 1. An explicit .template_name set on the response. - 2. An explicit .template_name set on this class. - 3. The return result of calling view.get_template_names(). - """ - renderer_context = renderer_context or {} - view = renderer_context['view'] - request = renderer_context['request'] - response = renderer_context['response'] - - if response.exception: - template = self.get_exception_template(response) - else: - template_names = self.get_template_names(response, view) - template = self.resolve_template(template_names) - - context = self.resolve_context(data, request, response) - return template.render(context) - - def resolve_template(self, template_names): - return loader.select_template(template_names) - - def resolve_context(self, data, request, response): - if response.exception: - data['status_code'] = response.status_code - return RequestContext(request, data) - - def get_template_names(self, response, view): - if response.template_name: - return [response.template_name] - elif self.template_name: - return [self.template_name] - elif hasattr(view, 'get_template_names'): - return view.get_template_names() - raise ImproperlyConfigured('Returned a template response with no template_name') - - def get_exception_template(self, response): - template_names = [name % {'status_code': response.status_code} - for name in self.exception_template_names] - - try: - # Try to find an appropriate error template - return self.resolve_template(template_names) - except Exception: - # Fall back to using eg '404 Not Found' - return Template('%d %s' % (response.status_code, - response.status_text.title())) - - -# Note, subclass TemplateHTMLRenderer simply for the exception behavior -class StaticHTMLRenderer(TemplateHTMLRenderer): - """ - An HTML renderer class that simply returns pre-rendered HTML. - - The data supplied to the Response object should be a string representing - the pre-rendered HTML content. - - For example: - data = '<html><body>example</body></html>' - return Response(data) - - For template rendered HTML, see TemplateHTMLRenderer. - """ - media_type = 'text/html' - format = 'html' - charset = 'utf-8' - - def render(self, data, accepted_media_type=None, renderer_context=None): - renderer_context = renderer_context or {} - response = renderer_context['response'] - - if response and response.exception: - request = renderer_context['request'] - template = self.get_exception_template(response) - context = self.resolve_context(data, request, response) - return template.render(context) - - return data - - -class BrowsableAPIRenderer(BaseRenderer): - """ - HTML renderer used to self-document the API. - """ - media_type = 'text/html' - format = 'api' - template = 'rest_framework/api.html' - charset = 'utf-8' - - def get_default_renderer(self, view): - """ - Return an instance of the first valid renderer. - (Don't use another documenting renderer.) - """ - renderers = [renderer for renderer in view.renderer_classes - if not issubclass(renderer, BrowsableAPIRenderer)] - if not renderers: - return None - return renderers[0]() - - def get_content(self, renderer, data, - accepted_media_type, renderer_context): - """ - Get the content as if it had been rendered by the default - non-documenting renderer. - """ - if not renderer: - return '[No renderers were found]' - - renderer_context['indent'] = 4 - content = renderer.render(data, accepted_media_type, renderer_context) - - if renderer.charset is None: - return '[%d bytes of binary content]' % len(content) - - return content - - def show_form_for_method(self, view, method, request, obj): - """ - Returns True if a form should be shown for this method. - """ - if not method in view.allowed_methods: - return # Not a valid method - - if not api_settings.FORM_METHOD_OVERRIDE: - return # Cannot use form overloading - - try: - view.check_permissions(request) - if obj is not None: - view.check_object_permissions(request, obj) - except exceptions.APIException: - return False # Doesn't have permissions - return True - - def serializer_to_form_fields(self, serializer): - fields = {} - for k, v in serializer.get_fields().items(): - if getattr(v, 'read_only', True): - continue - - kwargs = {} - kwargs['required'] = v.required - - #if getattr(v, 'queryset', None): - # kwargs['queryset'] = v.queryset - - if getattr(v, 'choices', None) is not None: - kwargs['choices'] = v.choices - - if getattr(v, 'regex', None) is not None: - kwargs['regex'] = v.regex - - if getattr(v, 'widget', None): - widget = copy.deepcopy(v.widget) - kwargs['widget'] = widget - - if getattr(v, 'default', None) is not None: - kwargs['initial'] = v.default - - if getattr(v, 'label', None) is not None: - kwargs['label'] = v.label - - if getattr(v, 'help_text', None) is not None: - kwargs['help_text'] = v.help_text - - fields[k] = v.form_field_class(**kwargs) - - return fields - - def _get_form(self, view, method, request): - # We need to impersonate a request with the correct method, - # so that eg. any dynamic get_serializer_class methods return the - # correct form for each method. - restore = view.request - request = clone_request(request, method) - view.request = request - try: - return self.get_form(view, method, request) - finally: - view.request = restore - - def _get_raw_data_form(self, view, method, request, media_types): - # We need to impersonate a request with the correct method, - # so that eg. any dynamic get_serializer_class methods return the - # correct form for each method. - restore = view.request - request = clone_request(request, method) - view.request = request - try: - return self.get_raw_data_form(view, method, request, media_types) - finally: - view.request = restore - - def get_form(self, view, method, request): - """ - Get a form, possibly bound to either the input or output data. - In the absence on of the Resource having an associated form then - provide a form that can be used to submit arbitrary content. - """ - obj = getattr(view, 'object', None) - if not self.show_form_for_method(view, method, request, obj): - return - - if method in ('DELETE', 'OPTIONS'): - return True # Don't actually need to return a form - - if not getattr(view, 'get_serializer', None) or not parsers.FormParser in view.parser_classes: - return - - serializer = view.get_serializer(instance=obj) - fields = self.serializer_to_form_fields(serializer) - - # Creating an on the fly form see: - # http://stackoverflow.com/questions/3915024/dynamically-creating-classes-python - OnTheFlyForm = type(str("OnTheFlyForm"), (forms.Form,), fields) - data = (obj is not None) and serializer.data or None - form_instance = OnTheFlyForm(data) - return form_instance - - def get_raw_data_form(self, view, method, request, media_types): - """ - Returns a form that allows for arbitrary content types to be tunneled - via standard HTML forms. - (Which are typically application/x-www-form-urlencoded) - """ - - # If we're not using content overloading there's no point in supplying a generic form, - # as the view won't treat the form's value as the content of the request. - if not (api_settings.FORM_CONTENT_OVERRIDE - and api_settings.FORM_CONTENTTYPE_OVERRIDE): - return None - - # Check permissions - obj = getattr(view, 'object', None) - if not self.show_form_for_method(view, method, request, obj): - return - - content_type_field = api_settings.FORM_CONTENTTYPE_OVERRIDE - content_field = api_settings.FORM_CONTENT_OVERRIDE - choices = [(media_type, media_type) for media_type in media_types] - initial = media_types[0] - - # NB. http://jacobian.org/writing/dynamic-form-generation/ - class GenericContentForm(forms.Form): - def __init__(self): - super(GenericContentForm, self).__init__() - - self.fields[content_type_field] = forms.ChoiceField( - label='Media type', - choices=choices, - initial=initial - ) - self.fields[content_field] = forms.CharField( - label='Content', - widget=forms.Textarea - ) - - return GenericContentForm() - - def get_name(self, view): - return get_view_name(view.__class__, getattr(view, 'suffix', None)) - - def get_description(self, view): - return get_view_description(view.__class__, html=True) - - def get_breadcrumbs(self, request): - return get_breadcrumbs(request.path) - - def render(self, data, accepted_media_type=None, renderer_context=None): - """ - Render the HTML for the browsable API representation. - """ - accepted_media_type = accepted_media_type or '' - renderer_context = renderer_context or {} - - view = renderer_context['view'] - request = renderer_context['request'] - response = renderer_context['response'] - media_types = [parser.media_type for parser in view.parser_classes] - - renderer = self.get_default_renderer(view) - content = self.get_content(renderer, data, accepted_media_type, renderer_context) - - put_form = self._get_form(view, 'PUT', request) - post_form = self._get_form(view, 'POST', request) - patch_form = self._get_form(view, 'PATCH', request) - delete_form = self._get_form(view, 'DELETE', request) - options_form = self._get_form(view, 'OPTIONS', request) - - raw_data_put_form = self._get_raw_data_form(view, 'PUT', request, media_types) - raw_data_post_form = self._get_raw_data_form(view, 'POST', request, media_types) - raw_data_patch_form = self._get_raw_data_form(view, 'PATCH', request, media_types) - raw_data_put_or_patch_form = raw_data_put_form or raw_data_patch_form - - name = self.get_name(view) - description = self.get_description(view) - breadcrumb_list = self.get_breadcrumbs(request) - - template = loader.get_template(self.template) - context = RequestContext(request, { - 'content': content, - 'view': view, - 'request': request, - 'response': response, - 'description': description, - 'name': name, - 'version': VERSION, - 'breadcrumblist': breadcrumb_list, - 'allowed_methods': view.allowed_methods, - 'available_formats': [renderer.format for renderer in view.renderer_classes], - - 'put_form': put_form, - 'post_form': post_form, - 'patch_form': patch_form, - 'delete_form': delete_form, - 'options_form': options_form, - - 'raw_data_put_form': raw_data_put_form, - 'raw_data_post_form': raw_data_post_form, - 'raw_data_patch_form': raw_data_patch_form, - 'raw_data_put_or_patch_form': raw_data_put_or_patch_form, - - 'api_settings': api_settings - }) - - ret = template.render(context) - - # Munge DELETE Response code to allow us to return content - # (Do this *after* we've rendered the template so that we include - # the normal deletion response code in the output) - if response.status_code == status.HTTP_204_NO_CONTENT: - response.status_code = status.HTTP_200_OK - - return ret - - -class MultiPartRenderer(BaseRenderer): - media_type = 'multipart/form-data; boundary=BoUnDaRyStRiNg' - format = 'multipart' - charset = 'utf-8' - BOUNDARY = 'BoUnDaRyStRiNg' - - def render(self, data, accepted_media_type=None, renderer_context=None): - return encode_multipart(self.BOUNDARY, data) diff --git a/vendor-local/lib/python/rest_framework/request.py b/vendor-local/lib/python/rest_framework/request.py deleted file mode 100644 index 919716f49a8..00000000000 --- a/vendor-local/lib/python/rest_framework/request.py +++ /dev/null @@ -1,389 +0,0 @@ -""" -The Request class is used as a wrapper around the standard request object. - -The wrapped request then offers a richer API, in particular : - - - content automatically parsed according to `Content-Type` header, - and available as `request.DATA` - - full support of PUT method, including support for file uploads - - form overloading of HTTP method, content type and content -""" -from __future__ import unicode_literals -from django.conf import settings -from django.http import QueryDict -from django.http.multipartparser import parse_header -from django.utils.datastructures import MultiValueDict -from rest_framework import HTTP_HEADER_ENCODING -from rest_framework import exceptions -from rest_framework.compat import BytesIO -from rest_framework.settings import api_settings - - -def is_form_media_type(media_type): - """ - Return True if the media type is a valid form media type. - """ - base_media_type, params = parse_header(media_type.encode(HTTP_HEADER_ENCODING)) - return (base_media_type == 'application/x-www-form-urlencoded' or - base_media_type == 'multipart/form-data') - - -class Empty(object): - """ - Placeholder for unset attributes. - Cannot use `None`, as that may be a valid value. - """ - pass - - -def _hasattr(obj, name): - return not getattr(obj, name) is Empty - - -def clone_request(request, method): - """ - Internal helper method to clone a request, replacing with a different - HTTP method. Used for checking permissions against other methods. - """ - ret = Request(request=request._request, - parsers=request.parsers, - authenticators=request.authenticators, - negotiator=request.negotiator, - parser_context=request.parser_context) - ret._data = request._data - ret._files = request._files - ret._content_type = request._content_type - ret._stream = request._stream - ret._method = method - if hasattr(request, '_user'): - ret._user = request._user - if hasattr(request, '_auth'): - ret._auth = request._auth - if hasattr(request, '_authenticator'): - ret._authenticator = request._authenticator - return ret - - -class ForcedAuthentication(object): - """ - This authentication class is used if the test client or request factory - forcibly authenticated the request. - """ - - def __init__(self, force_user, force_token): - self.force_user = force_user - self.force_token = force_token - - def authenticate(self, request): - return (self.force_user, self.force_token) - - -class Request(object): - """ - Wrapper allowing to enhance a standard `HttpRequest` instance. - - Kwargs: - - request(HttpRequest). The original request instance. - - parsers_classes(list/tuple). The parsers to use for parsing the - request content. - - authentication_classes(list/tuple). The authentications used to try - authenticating the request's user. - """ - - _METHOD_PARAM = api_settings.FORM_METHOD_OVERRIDE - _CONTENT_PARAM = api_settings.FORM_CONTENT_OVERRIDE - _CONTENTTYPE_PARAM = api_settings.FORM_CONTENTTYPE_OVERRIDE - - def __init__(self, request, parsers=None, authenticators=None, - negotiator=None, parser_context=None): - self._request = request - self.parsers = parsers or () - self.authenticators = authenticators or () - self.negotiator = negotiator or self._default_negotiator() - self.parser_context = parser_context - self._data = Empty - self._files = Empty - self._method = Empty - self._content_type = Empty - self._stream = Empty - - if self.parser_context is None: - self.parser_context = {} - self.parser_context['request'] = self - self.parser_context['encoding'] = request.encoding or settings.DEFAULT_CHARSET - - force_user = getattr(request, '_force_auth_user', None) - force_token = getattr(request, '_force_auth_token', None) - if (force_user is not None or force_token is not None): - forced_auth = ForcedAuthentication(force_user, force_token) - self.authenticators = (forced_auth,) - - def _default_negotiator(self): - return api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS() - - @property - def method(self): - """ - Returns the HTTP method. - - This allows the `method` to be overridden by using a hidden `form` - field on a form POST request. - """ - if not _hasattr(self, '_method'): - self._load_method_and_content_type() - return self._method - - @property - def content_type(self): - """ - Returns the content type header. - - This should be used instead of `request.META.get('HTTP_CONTENT_TYPE')`, - as it allows the content type to be overridden by using a hidden form - field on a form POST request. - """ - if not _hasattr(self, '_content_type'): - self._load_method_and_content_type() - return self._content_type - - @property - def stream(self): - """ - Returns an object that may be used to stream the request content. - """ - if not _hasattr(self, '_stream'): - self._load_stream() - return self._stream - - @property - def QUERY_PARAMS(self): - """ - More semantically correct name for request.GET. - """ - return self._request.GET - - @property - def DATA(self): - """ - Parses the request body and returns the data. - - Similar to usual behaviour of `request.POST`, except that it handles - arbitrary parsers, and also works on methods other than POST (eg PUT). - """ - if not _hasattr(self, '_data'): - self._load_data_and_files() - return self._data - - @property - def FILES(self): - """ - Parses the request body and returns any files uploaded in the request. - - Similar to usual behaviour of `request.FILES`, except that it handles - arbitrary parsers, and also works on methods other than POST (eg PUT). - """ - if not _hasattr(self, '_files'): - self._load_data_and_files() - return self._files - - @property - def user(self): - """ - Returns the user associated with the current request, as authenticated - by the authentication classes provided to the request. - """ - if not hasattr(self, '_user'): - self._authenticate() - return self._user - - @user.setter - def user(self, value): - """ - Sets the user on the current request. This is necessary to maintain - compatilbility with django.contrib.auth where the user proprety is - set in the login and logout functions. - """ - self._user = value - - @property - def auth(self): - """ - Returns any non-user authentication information associated with the - request, such as an authentication token. - """ - if not hasattr(self, '_auth'): - self._authenticate() - return self._auth - - @auth.setter - def auth(self, value): - """ - Sets any non-user authentication information associated with the - request, such as an authentication token. - """ - self._auth = value - - @property - def successful_authenticator(self): - """ - Return the instance of the authentication instance class that was used - to authenticate the request, or `None`. - """ - if not hasattr(self, '_authenticator'): - self._authenticate() - return self._authenticator - - def _load_data_and_files(self): - """ - Parses the request content into self.DATA and self.FILES. - """ - if not _hasattr(self, '_content_type'): - self._load_method_and_content_type() - - if not _hasattr(self, '_data'): - self._data, self._files = self._parse() - - def _load_method_and_content_type(self): - """ - Sets the method and content_type, and then check if they've - been overridden. - """ - self._content_type = self.META.get('HTTP_CONTENT_TYPE', - self.META.get('CONTENT_TYPE', '')) - - self._perform_form_overloading() - - if not _hasattr(self, '_method'): - self._method = self._request.method - - if self._method == 'POST': - # Allow X-HTTP-METHOD-OVERRIDE header - self._method = self.META.get('HTTP_X_HTTP_METHOD_OVERRIDE', - self._method) - - def _load_stream(self): - """ - Return the content body of the request, as a stream. - """ - try: - content_length = int(self.META.get('CONTENT_LENGTH', - self.META.get('HTTP_CONTENT_LENGTH'))) - except (ValueError, TypeError): - content_length = 0 - - if content_length == 0: - self._stream = None - elif hasattr(self._request, 'read'): - self._stream = self._request - else: - self._stream = BytesIO(self.raw_post_data) - - def _perform_form_overloading(self): - """ - If this is a form POST request, then we need to check if the method and - content/content_type have been overridden by setting them in hidden - form fields or not. - """ - - USE_FORM_OVERLOADING = ( - self._METHOD_PARAM or - (self._CONTENT_PARAM and self._CONTENTTYPE_PARAM) - ) - - # We only need to use form overloading on form POST requests. - if (not USE_FORM_OVERLOADING - or self._request.method != 'POST' - or not is_form_media_type(self._content_type)): - return - - # At this point we're committed to parsing the request as form data. - self._data = self._request.POST - self._files = self._request.FILES - - # Method overloading - change the method and remove the param from the content. - if (self._METHOD_PARAM and - self._METHOD_PARAM in self._data): - self._method = self._data[self._METHOD_PARAM].upper() - - # Content overloading - modify the content type, and force re-parse. - if (self._CONTENT_PARAM and - self._CONTENTTYPE_PARAM and - self._CONTENT_PARAM in self._data and - self._CONTENTTYPE_PARAM in self._data): - self._content_type = self._data[self._CONTENTTYPE_PARAM] - self._stream = BytesIO(self._data[self._CONTENT_PARAM].encode(HTTP_HEADER_ENCODING)) - self._data, self._files = (Empty, Empty) - - def _parse(self): - """ - Parse the request content, returning a two-tuple of (data, files) - - May raise an `UnsupportedMediaType`, or `ParseError` exception. - """ - stream = self.stream - media_type = self.content_type - - if stream is None or media_type is None: - empty_data = QueryDict('', self._request._encoding) - empty_files = MultiValueDict() - return (empty_data, empty_files) - - parser = self.negotiator.select_parser(self, self.parsers) - - if not parser: - raise exceptions.UnsupportedMediaType(media_type) - - parsed = parser.parse(stream, media_type, self.parser_context) - - # Parser classes may return the raw data, or a - # DataAndFiles object. Unpack the result as required. - try: - return (parsed.data, parsed.files) - except AttributeError: - empty_files = MultiValueDict() - return (parsed, empty_files) - - def _authenticate(self): - """ - Attempt to authenticate the request using each authentication instance - in turn. - Returns a three-tuple of (authenticator, user, authtoken). - """ - for authenticator in self.authenticators: - try: - user_auth_tuple = authenticator.authenticate(self) - except exceptions.APIException: - self._not_authenticated() - raise - - if not user_auth_tuple is None: - self._authenticator = authenticator - self._user, self._auth = user_auth_tuple - return - - self._not_authenticated() - - def _not_authenticated(self): - """ - Return a three-tuple of (authenticator, user, authtoken), representing - an unauthenticated request. - - By default this will be (None, AnonymousUser, None). - """ - self._authenticator = None - - if api_settings.UNAUTHENTICATED_USER: - self._user = api_settings.UNAUTHENTICATED_USER() - else: - self._user = None - - if api_settings.UNAUTHENTICATED_TOKEN: - self._auth = api_settings.UNAUTHENTICATED_TOKEN() - else: - self._auth = None - - def __getattr__(self, attr): - """ - Proxy other attributes to the underlying HttpRequest object. - """ - return getattr(self._request, attr) diff --git a/vendor-local/lib/python/rest_framework/response.py b/vendor-local/lib/python/rest_framework/response.py deleted file mode 100644 index 5877c8a3e91..00000000000 --- a/vendor-local/lib/python/rest_framework/response.py +++ /dev/null @@ -1,84 +0,0 @@ -""" -The Response class in REST framework is similar to HTTPResponse, except that -it is initialized with unrendered data, instead of a pre-rendered string. - -The appropriate renderer is called during Django's template response rendering. -""" -from __future__ import unicode_literals -from django.core.handlers.wsgi import STATUS_CODE_TEXT -from django.template.response import SimpleTemplateResponse -from rest_framework.compat import six - - -class Response(SimpleTemplateResponse): - """ - An HttpResponse that allows its data to be rendered into - arbitrary media types. - """ - - def __init__(self, data=None, status=200, - template_name=None, headers=None, - exception=False, content_type=None): - """ - Alters the init arguments slightly. - For example, drop 'template_name', and instead use 'data'. - - Setting 'renderer' and 'media_type' will typically be deferred, - For example being set automatically by the `APIView`. - """ - super(Response, self).__init__(None, status=status) - self.data = data - self.template_name = template_name - self.exception = exception - self.content_type = content_type - - if headers: - for name, value in six.iteritems(headers): - self[name] = value - - @property - def rendered_content(self): - renderer = getattr(self, 'accepted_renderer', None) - media_type = getattr(self, 'accepted_media_type', None) - context = getattr(self, 'renderer_context', None) - - assert renderer, ".accepted_renderer not set on Response" - assert media_type, ".accepted_media_type not set on Response" - assert context, ".renderer_context not set on Response" - context['response'] = self - - charset = renderer.charset - content_type = self.content_type - - if content_type is None and charset is not None: - content_type = "{0}; charset={1}".format(media_type, charset) - elif content_type is None: - content_type = media_type - self['Content-Type'] = content_type - - ret = renderer.render(self.data, media_type, context) - if isinstance(ret, six.text_type): - assert charset, 'renderer returned unicode, and did not specify ' \ - 'a charset value.' - return bytes(ret.encode(charset)) - return ret - - @property - def status_text(self): - """ - Returns reason text corresponding to our HTTP response status code. - Provided for convenience. - """ - # TODO: Deprecate and use a template tag instead - # TODO: Status code text for RFC 6585 status codes - return STATUS_CODE_TEXT.get(self.status_code, '') - - def __getstate__(self): - """ - Remove attributes from the response that shouldn't be cached - """ - state = super(Response, self).__getstate__() - for key in ('accepted_renderer', 'renderer_context', 'data'): - if key in state: - del state[key] - return state diff --git a/vendor-local/lib/python/rest_framework/reverse.py b/vendor-local/lib/python/rest_framework/reverse.py deleted file mode 100644 index a51b07f540e..00000000000 --- a/vendor-local/lib/python/rest_framework/reverse.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -Provide reverse functions that return fully qualified URLs -""" -from __future__ import unicode_literals -from django.core.urlresolvers import reverse as django_reverse -from django.utils.functional import lazy - - -def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra): - """ - Same as `django.core.urlresolvers.reverse`, but optionally takes a request - and returns a fully qualified URL, using the request to get the base URL. - """ - if format is not None: - kwargs = kwargs or {} - kwargs['format'] = format - url = django_reverse(viewname, args=args, kwargs=kwargs, **extra) - if request: - return request.build_absolute_uri(url) - return url - - -reverse_lazy = lazy(reverse, str) diff --git a/vendor-local/lib/python/rest_framework/routers.py b/vendor-local/lib/python/rest_framework/routers.py deleted file mode 100644 index 930011d39e0..00000000000 --- a/vendor-local/lib/python/rest_framework/routers.py +++ /dev/null @@ -1,272 +0,0 @@ -""" -Routers provide a convenient and consistent way of automatically -determining the URL conf for your API. - -They are used by simply instantiating a Router class, and then registering -all the required ViewSets with that router. - -For example, you might have a `urls.py` that looks something like this: - - router = routers.DefaultRouter() - router.register('users', UserViewSet, 'user') - router.register('accounts', AccountViewSet, 'account') - - urlpatterns = router.urls -""" -from __future__ import unicode_literals - -import itertools -from collections import namedtuple -from django.core.exceptions import ImproperlyConfigured -from rest_framework import views -from rest_framework.compat import patterns, url -from rest_framework.response import Response -from rest_framework.reverse import reverse -from rest_framework.urlpatterns import format_suffix_patterns - - -Route = namedtuple('Route', ['url', 'mapping', 'name', 'initkwargs']) - - -def replace_methodname(format_string, methodname): - """ - Partially format a format_string, swapping out any - '{methodname}' or '{methodnamehyphen}' components. - """ - methodnamehyphen = methodname.replace('_', '-') - ret = format_string - ret = ret.replace('{methodname}', methodname) - ret = ret.replace('{methodnamehyphen}', methodnamehyphen) - return ret - - -def flatten(list_of_lists): - """ - Takes an iterable of iterables, returns a single iterable containing all items - """ - return itertools.chain(*list_of_lists) - - -class BaseRouter(object): - def __init__(self): - self.registry = [] - - def register(self, prefix, viewset, base_name=None): - if base_name is None: - base_name = self.get_default_base_name(viewset) - self.registry.append((prefix, viewset, base_name)) - - def get_default_base_name(self, viewset): - """ - If `base_name` is not specified, attempt to automatically determine - it from the viewset. - """ - raise NotImplemented('get_default_base_name must be overridden') - - def get_urls(self): - """ - Return a list of URL patterns, given the registered viewsets. - """ - raise NotImplemented('get_urls must be overridden') - - @property - def urls(self): - if not hasattr(self, '_urls'): - self._urls = patterns('', *self.get_urls()) - return self._urls - - -class SimpleRouter(BaseRouter): - routes = [ - # List route. - Route( - url=r'^{prefix}{trailing_slash}$', - mapping={ - 'get': 'list', - 'post': 'create' - }, - name='{basename}-list', - initkwargs={'suffix': 'List'} - ), - # Detail route. - Route( - url=r'^{prefix}/{lookup}{trailing_slash}$', - mapping={ - 'get': 'retrieve', - 'put': 'update', - 'patch': 'partial_update', - 'delete': 'destroy' - }, - name='{basename}-detail', - initkwargs={'suffix': 'Instance'} - ), - # Dynamically generated routes. - # Generated using @action or @link decorators on methods of the viewset. - Route( - url=r'^{prefix}/{lookup}/{methodname}{trailing_slash}$', - mapping={ - '{httpmethod}': '{methodname}', - }, - name='{basename}-{methodnamehyphen}', - initkwargs={} - ), - ] - - def __init__(self, trailing_slash=True): - self.trailing_slash = trailing_slash and '/' or '' - super(SimpleRouter, self).__init__() - - def get_default_base_name(self, viewset): - """ - If `base_name` is not specified, attempt to automatically determine - it from the viewset. - """ - model_cls = getattr(viewset, 'model', None) - queryset = getattr(viewset, 'queryset', None) - if model_cls is None and queryset is not None: - model_cls = queryset.model - - assert model_cls, '`base_name` argument not specified, and could ' \ - 'not automatically determine the name from the viewset, as ' \ - 'it does not have a `.model` or `.queryset` attribute.' - - return model_cls._meta.object_name.lower() - - def get_routes(self, viewset): - """ - Augment `self.routes` with any dynamically generated routes. - - Returns a list of the Route namedtuple. - """ - - known_actions = flatten([route.mapping.values() for route in self.routes]) - - # Determine any `@action` or `@link` decorated methods on the viewset - dynamic_routes = [] - for methodname in dir(viewset): - attr = getattr(viewset, methodname) - httpmethods = getattr(attr, 'bind_to_methods', None) - if httpmethods: - if methodname in known_actions: - raise ImproperlyConfigured('Cannot use @action or @link decorator on ' - 'method "%s" as it is an existing route' % methodname) - httpmethods = [method.lower() for method in httpmethods] - dynamic_routes.append((httpmethods, methodname)) - - ret = [] - for route in self.routes: - if route.mapping == {'{httpmethod}': '{methodname}'}: - # Dynamic routes (@link or @action decorator) - for httpmethods, methodname in dynamic_routes: - initkwargs = route.initkwargs.copy() - initkwargs.update(getattr(viewset, methodname).kwargs) - ret.append(Route( - url=replace_methodname(route.url, methodname), - mapping=dict((httpmethod, methodname) for httpmethod in httpmethods), - name=replace_methodname(route.name, methodname), - initkwargs=initkwargs, - )) - else: - # Standard route - ret.append(route) - - return ret - - def get_method_map(self, viewset, method_map): - """ - Given a viewset, and a mapping of http methods to actions, - return a new mapping which only includes any mappings that - are actually implemented by the viewset. - """ - bound_methods = {} - for method, action in method_map.items(): - if hasattr(viewset, action): - bound_methods[method] = action - return bound_methods - - def get_lookup_regex(self, viewset): - """ - Given a viewset, return the portion of URL regex that is used - to match against a single instance. - """ - base_regex = '(?P<{lookup_field}>[^/]+)' - lookup_field = getattr(viewset, 'lookup_field', 'pk') - return base_regex.format(lookup_field=lookup_field) - - def get_urls(self): - """ - Use the registered viewsets to generate a list of URL patterns. - """ - ret = [] - - for prefix, viewset, basename in self.registry: - lookup = self.get_lookup_regex(viewset) - routes = self.get_routes(viewset) - - for route in routes: - - # Only actions which actually exist on the viewset will be bound - mapping = self.get_method_map(viewset, route.mapping) - if not mapping: - continue - - # Build the url pattern - regex = route.url.format( - prefix=prefix, - lookup=lookup, - trailing_slash=self.trailing_slash - ) - view = viewset.as_view(mapping, **route.initkwargs) - name = route.name.format(basename=basename) - ret.append(url(regex, view, name=name)) - - return ret - - -class DefaultRouter(SimpleRouter): - """ - The default router extends the SimpleRouter, but also adds in a default - API root view, and adds format suffix patterns to the URLs. - """ - include_root_view = True - include_format_suffixes = True - root_view_name = 'api-root' - - def get_api_root_view(self): - """ - Return a view to use as the API root. - """ - api_root_dict = {} - list_name = self.routes[0].name - for prefix, viewset, basename in self.registry: - api_root_dict[prefix] = list_name.format(basename=basename) - - class APIRoot(views.APIView): - _ignore_model_permissions = True - - def get(self, request, format=None): - ret = {} - for key, url_name in api_root_dict.items(): - ret[key] = reverse(url_name, request=request, format=format) - return Response(ret) - - return APIRoot.as_view() - - def get_urls(self): - """ - Generate the list of URL patterns, including a default root view - for the API, and appending `.json` style format suffixes. - """ - urls = [] - - if self.include_root_view: - root_url = url(r'^$', self.get_api_root_view(), name=self.root_view_name) - urls.append(root_url) - - default_urls = super(DefaultRouter, self).get_urls() - urls.extend(default_urls) - - if self.include_format_suffixes: - urls = format_suffix_patterns(urls) - - return urls diff --git a/vendor-local/lib/python/rest_framework/runtests/__init__.py b/vendor-local/lib/python/rest_framework/runtests/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/rest_framework/runtests/runcoverage.py b/vendor-local/lib/python/rest_framework/runtests/runcoverage.py deleted file mode 100644 index ce11b213e5a..00000000000 --- a/vendor-local/lib/python/rest_framework/runtests/runcoverage.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python -""" -Useful tool to run the test suite for rest_framework and generate a coverage report. -""" - -# http://ericholscher.com/blog/2009/jun/29/enable-setuppy-test-your-django-apps/ -# http://www.travisswicegood.com/2010/01/17/django-virtualenv-pip-and-fabric/ -# http://code.djangoproject.com/svn/django/trunk/tests/runtests.py -import os -import sys - -# fix sys path so we don't need to setup PYTHONPATH -sys.path.append(os.path.join(os.path.dirname(__file__), "../..")) -os.environ['DJANGO_SETTINGS_MODULE'] = 'rest_framework.runtests.settings' - -from coverage import coverage - - -def main(): - """Run the tests for rest_framework and generate a coverage report.""" - - cov = coverage() - cov.erase() - cov.start() - - from django.conf import settings - from django.test.utils import get_runner - TestRunner = get_runner(settings) - - if hasattr(TestRunner, 'func_name'): - # Pre 1.2 test runners were just functions, - # and did not support the 'failfast' option. - import warnings - warnings.warn( - 'Function-based test runners are deprecated. Test runners should be classes with a run_tests() method.', - DeprecationWarning - ) - failures = TestRunner(['tests']) - else: - test_runner = TestRunner() - failures = test_runner.run_tests(['tests']) - cov.stop() - - # Discover the list of all modules that we should test coverage for - import rest_framework - - project_dir = os.path.dirname(rest_framework.__file__) - cov_files = [] - - for (path, dirs, files) in os.walk(project_dir): - # Drop tests and runtests directories from the test coverage report - if os.path.basename(path) in ['tests', 'runtests', 'migrations']: - continue - - # Drop the compat and six modules from coverage, since we're not interested in the coverage - # of modules which are specifically for resolving environment dependant imports. - # (Because we'll end up getting different coverage reports for it for each environment) - if 'compat.py' in files: - files.remove('compat.py') - - if 'six.py' in files: - files.remove('six.py') - - # Same applies to template tags module. - # This module has to include branching on Django versions, - # so it's never possible for it to have full coverage. - if 'rest_framework.py' in files: - files.remove('rest_framework.py') - - cov_files.extend([os.path.join(path, file) for file in files if file.endswith('.py')]) - - cov.report(cov_files) - if '--html' in sys.argv: - cov.html_report(cov_files, directory='coverage') - sys.exit(failures) - -if __name__ == '__main__': - main() diff --git a/vendor-local/lib/python/rest_framework/runtests/runtests.py b/vendor-local/lib/python/rest_framework/runtests/runtests.py deleted file mode 100644 index da36d23fcce..00000000000 --- a/vendor-local/lib/python/rest_framework/runtests/runtests.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python - -# http://ericholscher.com/blog/2009/jun/29/enable-setuppy-test-your-django-apps/ -# http://www.travisswicegood.com/2010/01/17/django-virtualenv-pip-and-fabric/ -# http://code.djangoproject.com/svn/django/trunk/tests/runtests.py -import os -import sys - -# fix sys path so we don't need to setup PYTHONPATH -sys.path.append(os.path.join(os.path.dirname(__file__), "../..")) -os.environ['DJANGO_SETTINGS_MODULE'] = 'rest_framework.runtests.settings' - -import django -from django.conf import settings -from django.test.utils import get_runner - - -def usage(): - return """ - Usage: python runtests.py [UnitTestClass].[method] - - You can pass the Class name of the `UnitTestClass` you want to test. - - Append a method name if you only want to test a specific method of that class. - """ - - -def main(): - TestRunner = get_runner(settings) - - test_runner = TestRunner() - if len(sys.argv) == 2: - test_case = '.' + sys.argv[1] - elif len(sys.argv) == 1: - test_case = '' - else: - print(usage()) - sys.exit(1) - test_module_name = 'rest_framework.tests' - if django.VERSION[0] == 1 and django.VERSION[1] < 6: - test_module_name = 'tests' - - failures = test_runner.run_tests([test_module_name + test_case]) - - sys.exit(failures) - -if __name__ == '__main__': - main() diff --git a/vendor-local/lib/python/rest_framework/runtests/settings.py b/vendor-local/lib/python/rest_framework/runtests/settings.py deleted file mode 100644 index b3702d0bfa0..00000000000 --- a/vendor-local/lib/python/rest_framework/runtests/settings.py +++ /dev/null @@ -1,151 +0,0 @@ -# Django settings for testproject project. - -DEBUG = True -TEMPLATE_DEBUG = DEBUG -DEBUG_PROPAGATE_EXCEPTIONS = True - -ALLOWED_HOSTS = ['*'] - -ADMINS = ( - # ('Your Name', 'your_email@domain.com'), -) - -MANAGERS = ADMINS - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. - 'NAME': 'sqlite.db', # Or path to database file if using sqlite3. - 'USER': '', # Not used with sqlite3. - 'PASSWORD': '', # Not used with sqlite3. - 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. - 'PORT': '', # Set to empty string for default. Not used with sqlite3. - } -} - -CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - } -} - -# Local time zone for this installation. Choices can be found here: -# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name -# although not all choices may be available on all operating systems. -# On Unix systems, a value of None will cause Django to use the same -# timezone as the operating system. -# If running in a Windows environment this must be set to the same as your -# system time zone. -TIME_ZONE = 'Europe/London' - -# Language code for this installation. All choices can be found here: -# http://www.i18nguy.com/unicode/language-identifiers.html -LANGUAGE_CODE = 'en-uk' - -SITE_ID = 1 - -# If you set this to False, Django will make some optimizations so as not -# to load the internationalization machinery. -USE_I18N = True - -# If you set this to False, Django will not format dates, numbers and -# calendars according to the current locale -USE_L10N = True - -# Absolute filesystem path to the directory that will hold user-uploaded files. -# Example: "/home/media/media.lawrence.com/" -MEDIA_ROOT = '' - -# URL that handles the media served from MEDIA_ROOT. Make sure to use a -# trailing slash if there is a path component (optional in other cases). -# Examples: "http://media.lawrence.com", "http://example.com/media/" -MEDIA_URL = '' - -# Make this unique, and don't share it with anybody. -SECRET_KEY = 'u@x-aj9(hoh#rb-^ymf#g2jx_hp0vj7u5#b@ag1n^seu9e!%cy' - -# List of callables that know how to import templates from various sources. -TEMPLATE_LOADERS = ( - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', -# 'django.template.loaders.eggs.Loader', -) - -MIDDLEWARE_CLASSES = ( - 'django.middleware.common.CommonMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', -) - -ROOT_URLCONF = 'urls' - -TEMPLATE_DIRS = ( - # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". - # Always use forward slashes, even on Windows. - # Don't forget to use absolute paths, not relative paths. -) - -INSTALLED_APPS = ( - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.sites', - 'django.contrib.messages', - # Uncomment the next line to enable the admin: - # 'django.contrib.admin', - # Uncomment the next line to enable admin documentation: - # 'django.contrib.admindocs', - 'rest_framework', - 'rest_framework.authtoken', - 'rest_framework.tests', -) - -# OAuth is optional and won't work if there is no oauth_provider & oauth2 -try: - import oauth_provider - import oauth2 -except ImportError: - pass -else: - INSTALLED_APPS += ( - 'oauth_provider', - ) - -try: - import provider -except ImportError: - pass -else: - INSTALLED_APPS += ( - 'provider', - 'provider.oauth2', - ) - -STATIC_URL = '/static/' - -PASSWORD_HASHERS = ( - 'django.contrib.auth.hashers.SHA1PasswordHasher', - 'django.contrib.auth.hashers.PBKDF2PasswordHasher', - 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', - 'django.contrib.auth.hashers.BCryptPasswordHasher', - 'django.contrib.auth.hashers.MD5PasswordHasher', - 'django.contrib.auth.hashers.CryptPasswordHasher', -) - -AUTH_USER_MODEL = 'auth.User' - -import django - -if django.VERSION < (1, 3): - INSTALLED_APPS += ('staticfiles',) - - -# If we're running on the Jenkins server we want to archive the coverage reports as XML. -import os -if os.environ.get('HUDSON_URL', None): - TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner' - TEST_OUTPUT_VERBOSE = True - TEST_OUTPUT_DESCRIPTIONS = True - TEST_OUTPUT_DIR = 'xmlrunner' diff --git a/vendor-local/lib/python/rest_framework/runtests/urls.py b/vendor-local/lib/python/rest_framework/runtests/urls.py deleted file mode 100644 index ed5baeae6a1..00000000000 --- a/vendor-local/lib/python/rest_framework/runtests/urls.py +++ /dev/null @@ -1,7 +0,0 @@ -""" -Blank URLConf just to keep runtests.py happy. -""" -from rest_framework.compat import patterns - -urlpatterns = patterns('', -) diff --git a/vendor-local/lib/python/rest_framework/serializers.py b/vendor-local/lib/python/rest_framework/serializers.py deleted file mode 100644 index 31cfa34474b..00000000000 --- a/vendor-local/lib/python/rest_framework/serializers.py +++ /dev/null @@ -1,968 +0,0 @@ -""" -Serializers and ModelSerializers are similar to Forms and ModelForms. -Unlike forms, they are not constrained to dealing with HTML output, and -form encoded input. - -Serialization in REST framework is a two-phase process: - -1. Serializers marshal between complex types like model instances, and -python primatives. -2. The process of marshalling between python primatives and request and -response content is handled by parsers and renderers. -""" -from __future__ import unicode_literals -import copy -import datetime -import types -from decimal import Decimal -from django.core.paginator import Page -from django.db import models -from django.forms import widgets -from django.utils.datastructures import SortedDict -from rest_framework.compat import get_concrete_model, six - -# Note: We do the following so that users of the framework can use this style: -# -# example_field = serializers.CharField(...) -# -# This helps keep the separation between model fields, form fields, and -# serializer fields more explicit. - -from rest_framework.relations import * -from rest_framework.fields import * - - -class NestedValidationError(ValidationError): - """ - The default ValidationError behavior is to stringify each item in the list - if the messages are a list of error messages. - - In the case of nested serializers, where the parent has many children, - then the child's `serializer.errors` will be a list of dicts. In the case - of a single child, the `serializer.errors` will be a dict. - - We need to override the default behavior to get properly nested error dicts. - """ - - def __init__(self, message): - if isinstance(message, dict): - self.messages = [message] - else: - self.messages = message - - -class DictWithMetadata(dict): - """ - A dict-like object, that can have additional properties attached. - """ - def __getstate__(self): - """ - Used by pickle (e.g., caching). - Overridden to remove the metadata from the dict, since it shouldn't be - pickled and may in some instances be unpickleable. - """ - return dict(self) - - -class SortedDictWithMetadata(SortedDict): - """ - A sorted dict-like object, that can have additional properties attached. - """ - def __getstate__(self): - """ - Used by pickle (e.g., caching). - Overriden to remove the metadata from the dict, since it shouldn't be - pickle and may in some instances be unpickleable. - """ - return SortedDict(self).__dict__ - - -def _is_protected_type(obj): - """ - True if the object is a native datatype that does not need to - be serialized further. - """ - return isinstance(obj, ( - types.NoneType, - int, long, - datetime.datetime, datetime.date, datetime.time, - float, Decimal, - basestring) - ) - - -def _get_declared_fields(bases, attrs): - """ - Create a list of serializer field instances from the passed in 'attrs', - plus any fields on the base classes (in 'bases'). - - Note that all fields from the base classes are used. - """ - fields = [(field_name, attrs.pop(field_name)) - for field_name, obj in list(six.iteritems(attrs)) - if isinstance(obj, Field)] - fields.sort(key=lambda x: x[1].creation_counter) - - # If this class is subclassing another Serializer, add that Serializer's - # fields. Note that we loop over the bases in *reverse*. This is necessary - # in order to maintain the correct order of fields. - for base in bases[::-1]: - if hasattr(base, 'base_fields'): - fields = list(base.base_fields.items()) + fields - - return SortedDict(fields) - - -class SerializerMetaclass(type): - def __new__(cls, name, bases, attrs): - attrs['base_fields'] = _get_declared_fields(bases, attrs) - return super(SerializerMetaclass, cls).__new__(cls, name, bases, attrs) - - -class SerializerOptions(object): - """ - Meta class options for Serializer - """ - def __init__(self, meta): - self.depth = getattr(meta, 'depth', 0) - self.fields = getattr(meta, 'fields', ()) - self.exclude = getattr(meta, 'exclude', ()) - - -class BaseSerializer(WritableField): - """ - This is the Serializer implementation. - We need to implement it as `BaseSerializer` due to metaclass magicks. - """ - class Meta(object): - pass - - _options_class = SerializerOptions - _dict_class = SortedDictWithMetadata - - def __init__(self, instance=None, data=None, files=None, - context=None, partial=False, many=None, - allow_add_remove=False, **kwargs): - super(BaseSerializer, self).__init__(**kwargs) - self.opts = self._options_class(self.Meta) - self.parent = None - self.root = None - self.partial = partial - self.many = many - self.allow_add_remove = allow_add_remove - - self.context = context or {} - - self.init_data = data - self.init_files = files - self.object = instance - self.fields = self.get_fields() - - self._data = None - self._files = None - self._errors = None - self._deleted = None - - if many and instance is not None and not hasattr(instance, '__iter__'): - raise ValueError('instance should be a queryset or other iterable with many=True') - - if allow_add_remove and not many: - raise ValueError('allow_add_remove should only be used for bulk updates, but you have not set many=True') - - ##### - # Methods to determine which fields to use when (de)serializing objects. - - def get_default_fields(self): - """ - Return the complete set of default fields for the object, as a dict. - """ - return {} - - def get_fields(self): - """ - Returns the complete set of fields for the object as a dict. - - This will be the set of any explicitly declared fields, - plus the set of fields returned by get_default_fields(). - """ - ret = SortedDict() - - # Get the explicitly declared fields - base_fields = copy.deepcopy(self.base_fields) - for key, field in base_fields.items(): - ret[key] = field - - # Add in the default fields - default_fields = self.get_default_fields() - for key, val in default_fields.items(): - if key not in ret: - ret[key] = val - - # If 'fields' is specified, use those fields, in that order. - if self.opts.fields: - assert isinstance(self.opts.fields, (list, tuple)), '`fields` must be a list or tuple' - new = SortedDict() - for key in self.opts.fields: - new[key] = ret[key] - ret = new - - # Remove anything in 'exclude' - if self.opts.exclude: - assert isinstance(self.opts.exclude, (list, tuple)), '`exclude` must be a list or tuple' - for key in self.opts.exclude: - ret.pop(key, None) - - for key, field in ret.items(): - field.initialize(parent=self, field_name=key) - - return ret - - ##### - # Methods to convert or revert from objects <--> primitive representations. - - def get_field_key(self, field_name): - """ - Return the key that should be used for a given field. - """ - return field_name - - def restore_fields(self, data, files): - """ - Core of deserialization, together with `restore_object`. - Converts a dictionary of data into a dictionary of deserialized fields. - """ - reverted_data = {} - - if data is not None and not isinstance(data, dict): - self._errors['non_field_errors'] = ['Invalid data'] - return None - - for field_name, field in self.fields.items(): - field.initialize(parent=self, field_name=field_name) - try: - field.field_from_native(data, files, field_name, reverted_data) - except ValidationError as err: - self._errors[field_name] = list(err.messages) - - return reverted_data - - def perform_validation(self, attrs): - """ - Run `validate_<fieldname>()` and `validate()` methods on the serializer - """ - for field_name, field in self.fields.items(): - if field_name in self._errors: - continue - try: - validate_method = getattr(self, 'validate_%s' % field_name, None) - if validate_method: - source = field.source or field_name - attrs = validate_method(attrs, source) - except ValidationError as err: - self._errors[field_name] = self._errors.get(field_name, []) + list(err.messages) - - # If there are already errors, we don't run .validate() because - # field-validation failed and thus `attrs` may not be complete. - # which in turn can cause inconsistent validation errors. - if not self._errors: - try: - attrs = self.validate(attrs) - except ValidationError as err: - if hasattr(err, 'message_dict'): - for field_name, error_messages in err.message_dict.items(): - self._errors[field_name] = self._errors.get(field_name, []) + list(error_messages) - elif hasattr(err, 'messages'): - self._errors['non_field_errors'] = err.messages - - return attrs - - def validate(self, attrs): - """ - Stub method, to be overridden in Serializer subclasses - """ - return attrs - - def restore_object(self, attrs, instance=None): - """ - Deserialize a dictionary of attributes into an object instance. - You should override this method to control how deserialized objects - are instantiated. - """ - if instance is not None: - instance.update(attrs) - return instance - return attrs - - def to_native(self, obj): - """ - Serialize objects -> primitives. - """ - ret = self._dict_class() - ret.fields = {} - - for field_name, field in self.fields.items(): - field.initialize(parent=self, field_name=field_name) - key = self.get_field_key(field_name) - value = field.field_to_native(obj, field_name) - ret[key] = value - ret.fields[key] = field - return ret - - def from_native(self, data, files): - """ - Deserialize primitives -> objects. - """ - self._errors = {} - if data is not None or files is not None: - attrs = self.restore_fields(data, files) - if attrs is not None: - attrs = self.perform_validation(attrs) - else: - self._errors['non_field_errors'] = ['No input provided'] - - if not self._errors: - return self.restore_object(attrs, instance=getattr(self, 'object', None)) - - def field_to_native(self, obj, field_name): - """ - Override default so that the serializer can be used as a nested field - across relationships. - """ - if self.source == '*': - return self.to_native(obj) - - try: - source = self.source or field_name - value = obj - - for component in source.split('.'): - value = get_component(value, component) - if value is None: - break - except ObjectDoesNotExist: - return None - - if is_simple_callable(getattr(value, 'all', None)): - return [self.to_native(item) for item in value.all()] - - if value is None: - return None - - if self.many is not None: - many = self.many - else: - many = hasattr(value, '__iter__') and not isinstance(value, (Page, dict, six.text_type)) - - if many: - return [self.to_native(item) for item in value] - return self.to_native(value) - - def field_from_native(self, data, files, field_name, into): - """ - Override default so that the serializer can be used as a writable - nested field across relationships. - """ - if self.read_only: - return - - try: - value = data[field_name] - except KeyError: - if self.default is not None and not self.partial: - # Note: partial updates shouldn't set defaults - value = copy.deepcopy(self.default) - else: - if self.required: - raise ValidationError(self.error_messages['required']) - return - - # Set the serializer object if it exists - obj = getattr(self.parent.object, field_name) if self.parent.object else None - - if self.source == '*': - if value: - into.update(value) - else: - if value in (None, ''): - into[(self.source or field_name)] = None - else: - kwargs = { - 'instance': obj, - 'data': value, - 'context': self.context, - 'partial': self.partial, - 'many': self.many - } - serializer = self.__class__(**kwargs) - - if serializer.is_valid(): - into[self.source or field_name] = serializer.object - else: - # Propagate errors up to our parent - raise NestedValidationError(serializer.errors) - - def get_identity(self, data): - """ - This hook is required for bulk update. - It is used to determine the canonical identity of a given object. - - Note that the data has not been validated at this point, so we need - to make sure that we catch any cases of incorrect datatypes being - passed to this method. - """ - try: - return data.get('id', None) - except AttributeError: - return None - - @property - def errors(self): - """ - Run deserialization and return error data, - setting self.object if no errors occurred. - """ - if self._errors is None: - data, files = self.init_data, self.init_files - - if self.many is not None: - many = self.many - else: - many = hasattr(data, '__iter__') and not isinstance(data, (Page, dict, six.text_type)) - if many: - warnings.warn('Implict list/queryset serialization is deprecated. ' - 'Use the `many=True` flag when instantiating the serializer.', - DeprecationWarning, stacklevel=3) - - if many: - ret = [] - errors = [] - update = self.object is not None - - if update: - # If this is a bulk update we need to map all the objects - # to a canonical identity so we can determine which - # individual object is being updated for each item in the - # incoming data - objects = self.object - identities = [self.get_identity(self.to_native(obj)) for obj in objects] - identity_to_objects = dict(zip(identities, objects)) - - if hasattr(data, '__iter__') and not isinstance(data, (dict, six.text_type)): - for item in data: - if update: - # Determine which object we're updating - identity = self.get_identity(item) - self.object = identity_to_objects.pop(identity, None) - if self.object is None and not self.allow_add_remove: - ret.append(None) - errors.append({'non_field_errors': ['Cannot create a new item, only existing items may be updated.']}) - continue - - ret.append(self.from_native(item, None)) - errors.append(self._errors) - - if update: - self._deleted = identity_to_objects.values() - - self._errors = any(errors) and errors or [] - else: - self._errors = {'non_field_errors': ['Expected a list of items.']} - else: - ret = self.from_native(data, files) - - if not self._errors: - self.object = ret - - return self._errors - - def is_valid(self): - return not self.errors - - @property - def data(self): - """ - Returns the serialized data on the serializer. - """ - if self._data is None: - obj = self.object - - if self.many is not None: - many = self.many - else: - many = hasattr(obj, '__iter__') and not isinstance(obj, (Page, dict)) - if many: - warnings.warn('Implict list/queryset serialization is deprecated. ' - 'Use the `many=True` flag when instantiating the serializer.', - DeprecationWarning, stacklevel=2) - - if many: - self._data = [self.to_native(item) for item in obj] - else: - self._data = self.to_native(obj) - - return self._data - - def save_object(self, obj, **kwargs): - obj.save(**kwargs) - - def delete_object(self, obj): - obj.delete() - - def save(self, **kwargs): - """ - Save the deserialized object and return it. - """ - if isinstance(self.object, list): - [self.save_object(item, **kwargs) for item in self.object] - else: - self.save_object(self.object, **kwargs) - - if self.allow_add_remove and self._deleted: - [self.delete_object(item) for item in self._deleted] - - return self.object - - def metadata(self): - """ - Return a dictionary of metadata about the fields on the serializer. - Useful for things like responding to OPTIONS requests, or generating - API schemas for auto-documentation. - """ - return SortedDict( - [(field_name, field.metadata()) - for field_name, field in six.iteritems(self.fields)] - ) - - -class Serializer(six.with_metaclass(SerializerMetaclass, BaseSerializer)): - pass - - -class ModelSerializerOptions(SerializerOptions): - """ - Meta class options for ModelSerializer - """ - def __init__(self, meta): - super(ModelSerializerOptions, self).__init__(meta) - self.model = getattr(meta, 'model', None) - self.read_only_fields = getattr(meta, 'read_only_fields', ()) - - -class ModelSerializer(Serializer): - """ - A serializer that deals with model instances and querysets. - """ - _options_class = ModelSerializerOptions - - field_mapping = { - models.AutoField: IntegerField, - models.FloatField: FloatField, - models.IntegerField: IntegerField, - models.PositiveIntegerField: IntegerField, - models.SmallIntegerField: IntegerField, - models.PositiveSmallIntegerField: IntegerField, - models.DateTimeField: DateTimeField, - models.DateField: DateField, - models.TimeField: TimeField, - models.DecimalField: DecimalField, - models.EmailField: EmailField, - models.CharField: CharField, - models.URLField: URLField, - models.SlugField: SlugField, - models.TextField: CharField, - models.CommaSeparatedIntegerField: CharField, - models.BooleanField: BooleanField, - models.FileField: FileField, - models.ImageField: ImageField, - } - - def get_default_fields(self): - """ - Return all the fields that should be serialized for the model. - """ - - cls = self.opts.model - assert cls is not None, \ - "Serializer class '%s' is missing 'model' Meta option" % self.__class__.__name__ - opts = get_concrete_model(cls)._meta - ret = SortedDict() - nested = bool(self.opts.depth) - - # Deal with adding the primary key field - pk_field = opts.pk - while pk_field.rel and pk_field.rel.parent_link: - # If model is a child via multitable inheritance, use parent's pk - pk_field = pk_field.rel.to._meta.pk - - field = self.get_pk_field(pk_field) - if field: - ret[pk_field.name] = field - - # Deal with forward relationships - forward_rels = [field for field in opts.fields if field.serialize] - forward_rels += [field for field in opts.many_to_many if field.serialize] - - for model_field in forward_rels: - has_through_model = False - - if model_field.rel: - to_many = isinstance(model_field, - models.fields.related.ManyToManyField) - related_model = model_field.rel.to - - if to_many and not model_field.rel.through._meta.auto_created: - has_through_model = True - - if model_field.rel and nested: - if len(inspect.getargspec(self.get_nested_field).args) == 2: - warnings.warn( - 'The `get_nested_field(model_field)` call signature ' - 'is due to be deprecated. ' - 'Use `get_nested_field(model_field, related_model, ' - 'to_many) instead', - PendingDeprecationWarning - ) - field = self.get_nested_field(model_field) - else: - field = self.get_nested_field(model_field, related_model, to_many) - elif model_field.rel: - if len(inspect.getargspec(self.get_nested_field).args) == 3: - warnings.warn( - 'The `get_related_field(model_field, to_many)` call ' - 'signature is due to be deprecated. ' - 'Use `get_related_field(model_field, related_model, ' - 'to_many) instead', - PendingDeprecationWarning - ) - field = self.get_related_field(model_field, to_many=to_many) - else: - field = self.get_related_field(model_field, related_model, to_many) - else: - field = self.get_field(model_field) - - if field: - if has_through_model: - field.read_only = True - - ret[model_field.name] = field - - # Deal with reverse relationships - if not self.opts.fields: - reverse_rels = [] - else: - # Reverse relationships are only included if they are explicitly - # present in the `fields` option on the serializer - reverse_rels = opts.get_all_related_objects() - reverse_rels += opts.get_all_related_many_to_many_objects() - - for relation in reverse_rels: - accessor_name = relation.get_accessor_name() - if not self.opts.fields or accessor_name not in self.opts.fields: - continue - related_model = relation.model - to_many = relation.field.rel.multiple - has_through_model = False - is_m2m = isinstance(relation.field, - models.fields.related.ManyToManyField) - - if is_m2m and not relation.field.rel.through._meta.auto_created: - has_through_model = True - - if nested: - field = self.get_nested_field(None, related_model, to_many) - else: - field = self.get_related_field(None, related_model, to_many) - - if field: - if has_through_model: - field.read_only = True - - ret[accessor_name] = field - - # Add the `read_only` flag to any fields that have bee specified - # in the `read_only_fields` option - for field_name in self.opts.read_only_fields: - assert field_name not in self.base_fields.keys(), \ - "field '%s' on serializer '%s' specified in " \ - "`read_only_fields`, but also added " \ - "as an explicit field. Remove it from `read_only_fields`." % \ - (field_name, self.__class__.__name__) - assert field_name in ret, \ - "Non-existant field '%s' specified in `read_only_fields` " \ - "on serializer '%s'." % \ - (field_name, self.__class__.__name__) - ret[field_name].read_only = True - - return ret - - def get_pk_field(self, model_field): - """ - Returns a default instance of the pk field. - """ - return self.get_field(model_field) - - def get_nested_field(self, model_field, related_model, to_many): - """ - Creates a default instance of a nested relational field. - - Note that model_field will be `None` for reverse relationships. - """ - class NestedModelSerializer(ModelSerializer): - class Meta: - model = related_model - depth = self.opts.depth - 1 - - return NestedModelSerializer(many=to_many) - - def get_related_field(self, model_field, related_model, to_many): - """ - Creates a default instance of a flat relational field. - - Note that model_field will be `None` for reverse relationships. - """ - # TODO: filter queryset using: - # .using(db).complex_filter(self.rel.limit_choices_to) - - kwargs = { - 'queryset': related_model._default_manager, - 'many': to_many - } - - if model_field: - kwargs['required'] = not(model_field.null or model_field.blank) - - return PrimaryKeyRelatedField(**kwargs) - - def get_field(self, model_field): - """ - Creates a default instance of a basic non-relational field. - """ - kwargs = {} - - if model_field.null or model_field.blank: - kwargs['required'] = False - - if isinstance(model_field, models.AutoField) or not model_field.editable: - kwargs['read_only'] = True - - if model_field.has_default(): - kwargs['default'] = model_field.get_default() - - if issubclass(model_field.__class__, models.TextField): - kwargs['widget'] = widgets.Textarea - - if model_field.verbose_name is not None: - kwargs['label'] = model_field.verbose_name - - if model_field.help_text is not None: - kwargs['help_text'] = model_field.help_text - - # TODO: TypedChoiceField? - if model_field.flatchoices: # This ModelField contains choices - kwargs['choices'] = model_field.flatchoices - return ChoiceField(**kwargs) - - # put this below the ChoiceField because min_value isn't a valid initializer - if issubclass(model_field.__class__, models.PositiveIntegerField) or\ - issubclass(model_field.__class__, models.PositiveSmallIntegerField): - kwargs['min_value'] = 0 - - attribute_dict = { - models.CharField: ['max_length'], - models.CommaSeparatedIntegerField: ['max_length'], - models.DecimalField: ['max_digits', 'decimal_places'], - models.EmailField: ['max_length'], - models.FileField: ['max_length'], - models.ImageField: ['max_length'], - models.SlugField: ['max_length'], - models.URLField: ['max_length'], - } - - if model_field.__class__ in attribute_dict: - attributes = attribute_dict[model_field.__class__] - for attribute in attributes: - kwargs.update({attribute: getattr(model_field, attribute)}) - - try: - return self.field_mapping[model_field.__class__](**kwargs) - except KeyError: - return ModelField(model_field=model_field, **kwargs) - - def get_validation_exclusions(self): - """ - Return a list of field names to exclude from model validation. - """ - cls = self.opts.model - opts = get_concrete_model(cls)._meta - exclusions = [field.name for field in opts.fields + opts.many_to_many] - for field_name, field in self.fields.items(): - field_name = field.source or field_name - if field_name in exclusions and not field.read_only: - exclusions.remove(field_name) - return exclusions - - def full_clean(self, instance): - """ - Perform Django's full_clean, and populate the `errors` dictionary - if any validation errors occur. - - Note that we don't perform this inside the `.restore_object()` method, - so that subclasses can override `.restore_object()`, and still get - the full_clean validation checking. - """ - try: - instance.full_clean(exclude=self.get_validation_exclusions()) - except ValidationError as err: - self._errors = err.message_dict - return None - return instance - - def restore_object(self, attrs, instance=None): - """ - Restore the model instance. - """ - m2m_data = {} - related_data = {} - meta = self.opts.model._meta - - # Reverse fk or one-to-one relations - for (obj, model) in meta.get_all_related_objects_with_model(): - field_name = obj.field.related_query_name() - if field_name in attrs: - related_data[field_name] = attrs.pop(field_name) - - # Reverse m2m relations - for (obj, model) in meta.get_all_related_m2m_objects_with_model(): - field_name = obj.field.related_query_name() - if field_name in attrs: - m2m_data[field_name] = attrs.pop(field_name) - - # Forward m2m relations - for field in meta.many_to_many: - if field.name in attrs: - m2m_data[field.name] = attrs.pop(field.name) - - # Update an existing instance... - if instance is not None: - for key, val in attrs.items(): - setattr(instance, key, val) - - # ...or create a new instance - else: - instance = self.opts.model(**attrs) - - # Any relations that cannot be set until we've - # saved the model get hidden away on these - # private attributes, so we can deal with them - # at the point of save. - instance._related_data = related_data - instance._m2m_data = m2m_data - - return instance - - def from_native(self, data, files): - """ - Override the default method to also include model field validation. - """ - instance = super(ModelSerializer, self).from_native(data, files) - if not self._errors: - return self.full_clean(instance) - - def save_object(self, obj, **kwargs): - """ - Save the deserialized object and return it. - """ - obj.save(**kwargs) - - if getattr(obj, '_m2m_data', None): - for accessor_name, object_list in obj._m2m_data.items(): - setattr(obj, accessor_name, object_list) - del(obj._m2m_data) - - if getattr(obj, '_related_data', None): - for accessor_name, related in obj._related_data.items(): - setattr(obj, accessor_name, related) - del(obj._related_data) - - -class HyperlinkedModelSerializerOptions(ModelSerializerOptions): - """ - Options for HyperlinkedModelSerializer - """ - def __init__(self, meta): - super(HyperlinkedModelSerializerOptions, self).__init__(meta) - self.view_name = getattr(meta, 'view_name', None) - self.lookup_field = getattr(meta, 'lookup_field', None) - - -class HyperlinkedModelSerializer(ModelSerializer): - """ - A subclass of ModelSerializer that uses hyperlinked relationships, - instead of primary key relationships. - """ - _options_class = HyperlinkedModelSerializerOptions - _default_view_name = '%(model_name)s-detail' - _hyperlink_field_class = HyperlinkedRelatedField - - def get_default_fields(self): - fields = super(HyperlinkedModelSerializer, self).get_default_fields() - - if self.opts.view_name is None: - self.opts.view_name = self._get_default_view_name(self.opts.model) - - if 'url' not in fields: - url_field = HyperlinkedIdentityField( - view_name=self.opts.view_name, - lookup_field=self.opts.lookup_field - ) - ret = self._dict_class() - ret['url'] = url_field - ret.update(fields) - fields = ret - - return fields - - def get_pk_field(self, model_field): - if self.opts.fields and model_field.name in self.opts.fields: - return self.get_field(model_field) - - def get_related_field(self, model_field, related_model, to_many): - """ - Creates a default instance of a flat relational field. - """ - # TODO: filter queryset using: - # .using(db).complex_filter(self.rel.limit_choices_to) - kwargs = { - 'queryset': related_model._default_manager, - 'view_name': self._get_default_view_name(related_model), - 'many': to_many - } - - if model_field: - kwargs['required'] = not(model_field.null or model_field.blank) - - if self.opts.lookup_field: - kwargs['lookup_field'] = self.opts.lookup_field - - return self._hyperlink_field_class(**kwargs) - - def get_identity(self, data): - """ - This hook is required for bulk update. - We need to override the default, to use the url as the identity. - """ - try: - return data.get('url', None) - except AttributeError: - return None - - def _get_default_view_name(self, model): - """ - Return the view name to use if 'view_name' is not specified in 'Meta' - """ - model_meta = model._meta - format_kwargs = { - 'app_label': model_meta.app_label, - 'model_name': model_meta.object_name.lower() - } - return self._default_view_name % format_kwargs diff --git a/vendor-local/lib/python/rest_framework/settings.py b/vendor-local/lib/python/rest_framework/settings.py deleted file mode 100644 index 8fd177d5866..00000000000 --- a/vendor-local/lib/python/rest_framework/settings.py +++ /dev/null @@ -1,200 +0,0 @@ -""" -Settings for REST framework are all namespaced in the REST_FRAMEWORK setting. -For example your project's `settings.py` file might look like this: - -REST_FRAMEWORK = { - 'DEFAULT_RENDERER_CLASSES': ( - 'rest_framework.renderers.JSONRenderer', - 'rest_framework.renderers.YAMLRenderer', - ) - 'DEFAULT_PARSER_CLASSES': ( - 'rest_framework.parsers.JSONParser', - 'rest_framework.parsers.YAMLParser', - ) -} - -This module provides the `api_setting` object, that is used to access -REST framework settings, checking for user settings first, then falling -back to the defaults. -""" -from __future__ import unicode_literals - -from django.conf import settings -from django.utils import importlib - -from rest_framework import ISO_8601 -from rest_framework.compat import six - - -USER_SETTINGS = getattr(settings, 'REST_FRAMEWORK', None) - -DEFAULTS = { - # Base API policies - 'DEFAULT_RENDERER_CLASSES': ( - 'rest_framework.renderers.JSONRenderer', - 'rest_framework.renderers.BrowsableAPIRenderer', - ), - 'DEFAULT_PARSER_CLASSES': ( - 'rest_framework.parsers.JSONParser', - 'rest_framework.parsers.FormParser', - 'rest_framework.parsers.MultiPartParser' - ), - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework.authentication.SessionAuthentication', - 'rest_framework.authentication.BasicAuthentication' - ), - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.AllowAny', - ), - 'DEFAULT_THROTTLE_CLASSES': ( - ), - - 'DEFAULT_CONTENT_NEGOTIATION_CLASS': - 'rest_framework.negotiation.DefaultContentNegotiation', - - # Genric view behavior - 'DEFAULT_MODEL_SERIALIZER_CLASS': - 'rest_framework.serializers.ModelSerializer', - 'DEFAULT_PAGINATION_SERIALIZER_CLASS': - 'rest_framework.pagination.PaginationSerializer', - 'DEFAULT_FILTER_BACKENDS': (), - - # Throttling - 'DEFAULT_THROTTLE_RATES': { - 'user': None, - 'anon': None, - }, - - # Pagination - 'PAGINATE_BY': None, - 'PAGINATE_BY_PARAM': None, - - # Authentication - 'UNAUTHENTICATED_USER': 'django.contrib.auth.models.AnonymousUser', - 'UNAUTHENTICATED_TOKEN': None, - - # Testing - 'TEST_REQUEST_RENDERER_CLASSES': ( - 'rest_framework.renderers.MultiPartRenderer', - 'rest_framework.renderers.JSONRenderer' - ), - 'TEST_REQUEST_DEFAULT_FORMAT': 'multipart', - - # Browser enhancements - 'FORM_METHOD_OVERRIDE': '_method', - 'FORM_CONTENT_OVERRIDE': '_content', - 'FORM_CONTENTTYPE_OVERRIDE': '_content_type', - 'URL_ACCEPT_OVERRIDE': 'accept', - 'URL_FORMAT_OVERRIDE': 'format', - - 'FORMAT_SUFFIX_KWARG': 'format', - - # Input and output formats - 'DATE_INPUT_FORMATS': ( - ISO_8601, - ), - 'DATE_FORMAT': None, - - 'DATETIME_INPUT_FORMATS': ( - ISO_8601, - ), - 'DATETIME_FORMAT': None, - - 'TIME_INPUT_FORMATS': ( - ISO_8601, - ), - 'TIME_FORMAT': None, - - # Pending deprecation - 'FILTER_BACKEND': None, -} - - -# List of settings that may be in string import notation. -IMPORT_STRINGS = ( - 'DEFAULT_RENDERER_CLASSES', - 'DEFAULT_PARSER_CLASSES', - 'DEFAULT_AUTHENTICATION_CLASSES', - 'DEFAULT_PERMISSION_CLASSES', - 'DEFAULT_THROTTLE_CLASSES', - 'DEFAULT_CONTENT_NEGOTIATION_CLASS', - 'DEFAULT_MODEL_SERIALIZER_CLASS', - 'DEFAULT_PAGINATION_SERIALIZER_CLASS', - 'DEFAULT_FILTER_BACKENDS', - 'FILTER_BACKEND', - 'TEST_REQUEST_RENDERER_CLASSES', - 'UNAUTHENTICATED_USER', - 'UNAUTHENTICATED_TOKEN', -) - - -def perform_import(val, setting_name): - """ - If the given setting is a string import notation, - then perform the necessary import or imports. - """ - if isinstance(val, six.string_types): - return import_from_string(val, setting_name) - elif isinstance(val, (list, tuple)): - return [import_from_string(item, setting_name) for item in val] - return val - - -def import_from_string(val, setting_name): - """ - Attempt to import a class from a string representation. - """ - try: - # Nod to tastypie's use of importlib. - parts = val.split('.') - module_path, class_name = '.'.join(parts[:-1]), parts[-1] - module = importlib.import_module(module_path) - return getattr(module, class_name) - except ImportError as e: - msg = "Could not import '%s' for API setting '%s'. %s: %s." % (val, setting_name, e.__class__.__name__, e) - raise ImportError(msg) - - -class APISettings(object): - """ - A settings object, that allows API settings to be accessed as properties. - For example: - - from rest_framework.settings import api_settings - print api_settings.DEFAULT_RENDERER_CLASSES - - Any setting with string import paths will be automatically resolved - and return the class, rather than the string literal. - """ - def __init__(self, user_settings=None, defaults=None, import_strings=None): - self.user_settings = user_settings or {} - self.defaults = defaults or {} - self.import_strings = import_strings or () - - def __getattr__(self, attr): - if attr not in self.defaults.keys(): - raise AttributeError("Invalid API setting: '%s'" % attr) - - try: - # Check if present in user settings - val = self.user_settings[attr] - except KeyError: - # Fall back to defaults - val = self.defaults[attr] - - # Coerce import strings into classes - if val and attr in self.import_strings: - val = perform_import(val, attr) - - self.validate_setting(attr, val) - - # Cache the result - setattr(self, attr, val) - return val - - def validate_setting(self, attr, val): - if attr == 'FILTER_BACKEND' and val is not None: - # Make sure we can initialize the class - val() - -api_settings = APISettings(USER_SETTINGS, DEFAULTS, IMPORT_STRINGS) diff --git a/vendor-local/lib/python/rest_framework/six.py b/vendor-local/lib/python/rest_framework/six.py deleted file mode 100644 index 9e3823128fa..00000000000 --- a/vendor-local/lib/python/rest_framework/six.py +++ /dev/null @@ -1,389 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.2.0" - - -# True if we are running on Python 3. -PY3 = sys.version_info[0] == 3 - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform == "java": - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) - # This is a bit ugly, but it avoids running this again. - delattr(tp, self.name) - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - - -class _MovedItems(types.ModuleType): - """Lazy loading of moved objects""" - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("reload_module", "__builtin__", "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("winreg", "_winreg"), -] -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) -del attr - -moves = sys.modules["django.utils.six.moves"] = _MovedItems("moves") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_code = "__code__" - _func_defaults = "__defaults__" - - _iterkeys = "keys" - _itervalues = "values" - _iteritems = "items" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_code = "func_code" - _func_defaults = "func_defaults" - - _iterkeys = "iterkeys" - _itervalues = "itervalues" - _iteritems = "iteritems" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -if PY3: - def get_unbound_function(unbound): - return unbound - - Iterator = object - - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) -else: - def get_unbound_function(unbound): - return unbound.im_func - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) - - -def iterkeys(d): - """Return an iterator over the keys of a dictionary.""" - return iter(getattr(d, _iterkeys)()) - -def itervalues(d): - """Return an iterator over the values of a dictionary.""" - return iter(getattr(d, _itervalues)()) - -def iteritems(d): - """Return an iterator over the (key, value) pairs of a dictionary.""" - return iter(getattr(d, _iteritems)()) - - -if PY3: - def b(s): - return s.encode("latin-1") - def u(s): - return s - if sys.version_info[1] <= 1: - def int2byte(i): - return bytes((i,)) - else: - # This is about 2x faster than the implementation above on 3.2+ - int2byte = operator.methodcaller("to_bytes", 1, "big") - import io - StringIO = io.StringIO - BytesIO = io.BytesIO -else: - def b(s): - return s - def u(s): - return unicode(s, "unicode_escape") - int2byte = chr - import StringIO - StringIO = BytesIO = StringIO.StringIO -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -if PY3: - import builtins - exec_ = getattr(builtins, "exec") - - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - - print_ = getattr(builtins, "print") - del builtins - -else: - def exec_(code, globs=None, locs=None): - """Execute code in a namespace.""" - if globs is None: - frame = sys._getframe(1) - globs = frame.f_globals - if locs is None: - locs = frame.f_locals - del frame - elif locs is None: - locs = globs - exec("""exec code in globs, locs""") - - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - - def print_(*args, **kwargs): - """The new-style print function.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - def write(data): - if not isinstance(data, basestring): - data = str(data) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) - -_add_doc(reraise, """Reraise an exception.""") - - -def with_metaclass(meta, base=object): - """Create a base class with a metaclass.""" - return meta("NewBase", (base,), {}) - - -### Additional customizations for Django ### - -if PY3: - _iterlists = "lists" - _assertRaisesRegex = "assertRaisesRegex" -else: - _iterlists = "iterlists" - _assertRaisesRegex = "assertRaisesRegexp" - - -def iterlists(d): - """Return an iterator over the values of a MultiValueDict.""" - return getattr(d, _iterlists)() - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -add_move(MovedModule("_dummy_thread", "dummy_thread")) -add_move(MovedModule("_thread", "thread")) diff --git a/vendor-local/lib/python/rest_framework/static/rest_framework/css/bootstrap-tweaks.css b/vendor-local/lib/python/rest_framework/static/rest_framework/css/bootstrap-tweaks.css deleted file mode 100644 index 6bfb778ccfd..00000000000 --- a/vendor-local/lib/python/rest_framework/static/rest_framework/css/bootstrap-tweaks.css +++ /dev/null @@ -1,185 +0,0 @@ -/* - -This CSS file contains some tweaks specific to the included Bootstrap theme. -It's separate from `style.css` so that it can be easily overridden by replacing -a single block in the template. - -*/ - - -.form-actions { - background: transparent; - border-top-color: transparent; - padding-top: 0; -} - -.navbar-inverse .brand a { - color: #999; -} -.navbar-inverse .brand:hover a { - color: white; - text-decoration: none; -} - -/* custom navigation styles */ -.wrapper .navbar{ - width: 100%; - position: absolute; - left: 0; - top: 0; -} - -.navbar .navbar-inner{ - background: #2C2C2C; - color: white; - border: none; - border-top: 5px solid #A30000; - border-radius: 0px; -} - -.navbar .navbar-inner .nav li, .navbar .navbar-inner .nav li a, .navbar .navbar-inner .brand:hover{ - color: white; -} - -.nav-list > .active > a, .nav-list > .active > a:hover { - background: #2c2c2c; -} - -.navbar .navbar-inner .dropdown-menu li a, .navbar .navbar-inner .dropdown-menu li{ - color: #A30000; -} -.navbar .navbar-inner .dropdown-menu li a:hover{ - background: #eeeeee; - color: #c20000; -} - -/*=== dabapps bootstrap styles ====*/ - -html{ - width:100%; - background: none; -} - -body, .navbar .navbar-inner .container-fluid { - max-width: 1150px; - margin: 0 auto; -} - -body{ - background: url("../img/grid.png") repeat-x; - background-attachment: fixed; -} - -#content{ - margin: 0; -} - -/* sticky footer and footer */ -html, body { - height: 100%; -} -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -60px; -} - -.form-switcher { - margin-bottom: 0; -} - -.well { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.well .form-actions { - padding-bottom: 0; - margin-bottom: 0; -} - -.well form { - margin-bottom: 0; -} - -.well form .help-block { - color: #999; -} - -.nav-tabs { - border: 0; -} - -.nav-tabs > li { - float: right; -} - -.nav-tabs li a { - margin-right: 0; -} - -.nav-tabs > .active > a { - background: #f5f5f5; -} - -.nav-tabs > .active > a:hover { - background: #f5f5f5; -} - -.tabbable.first-tab-active .tab-content -{ - border-top-right-radius: 0; -} - -#footer, #push { - height: 60px; /* .push must be the same height as .footer */ -} - -#footer{ - text-align: right; -} - -#footer p { - text-align: center; - color: gray; - border-top: 1px solid #DDD; - padding-top: 10px; -} - -#footer a { - color: gray; - font-weight: bold; -} - -#footer a:hover { - color: gray; -} - -.page-header { - border-bottom: none; - padding-bottom: 0px; - margin-bottom: 20px; -} - -/* custom general page styles */ -.hero-unit h2, .hero-unit h1{ - color: #A30000; -} - -body a, body a{ - color: #A30000; -} - -body a:hover{ - color: #c20000; -} - -#content a span{ - text-decoration: underline; - } - -.request-info { - clear:both; -} diff --git a/vendor-local/lib/python/rest_framework/static/rest_framework/css/bootstrap.min.css b/vendor-local/lib/python/rest_framework/static/rest_framework/css/bootstrap.min.css deleted file mode 100644 index 373f4b430b5..00000000000 --- a/vendor-local/lib/python/rest_framework/static/rest_framework/css/bootstrap.min.css +++ /dev/null @@ -1,841 +0,0 @@ -/*! - * Bootstrap v2.1.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;} -.clearfix:after{clear:both;} -.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;} -.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} -article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} -audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} -audio:not([controls]){display:none;} -html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} -a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -a:hover,a:active{outline:0;} -sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} -sup{top:-0.5em;} -sub{bottom:-0.25em;} -img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;} -#map_canvas img{max-width:none;} -button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} -button,input{*overflow:visible;line-height:normal;} -button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} -button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} -input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;} -input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} -textarea{overflow:auto;vertical-align:top;} -body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333333;background-color:#ffffff;} -a{color:#0088cc;text-decoration:none;} -a:hover{color:#005580;text-decoration:underline;} -.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);} -.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;} -.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} -.row:after{clear:both;} -[class*="span"]{float:left;min-height:1px;margin-left:20px;} -.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} -.span12{width:940px;} -.span11{width:860px;} -.span10{width:780px;} -.span9{width:700px;} -.span8{width:620px;} -.span7{width:540px;} -.span6{width:460px;} -.span5{width:380px;} -.span4{width:300px;} -.span3{width:220px;} -.span2{width:140px;} -.span1{width:60px;} -.offset12{margin-left:980px;} -.offset11{margin-left:900px;} -.offset10{margin-left:820px;} -.offset9{margin-left:740px;} -.offset8{margin-left:660px;} -.offset7{margin-left:580px;} -.offset6{margin-left:500px;} -.offset5{margin-left:420px;} -.offset4{margin-left:340px;} -.offset3{margin-left:260px;} -.offset2{margin-left:180px;} -.offset1{margin-left:100px;} -.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} -.row-fluid:after{clear:both;} -.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;} -.row-fluid [class*="span"]:first-child{margin-left:0;} -.row-fluid .span12{width:100%;*width:99.94680851063829%;} -.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;} -.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;} -.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;} -.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;} -.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;} -.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;} -.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;} -.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;} -.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;} -.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;} -.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;} -.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;} -.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;} -.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;} -.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;} -.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;} -.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;} -.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;} -.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;} -.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;} -.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;} -.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;} -.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;} -.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;} -.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;} -.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;} -.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;} -.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;} -.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;} -.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;} -.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;} -.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;} -.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;} -.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;} -.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;} -[class*="span"].hide,.row-fluid [class*="span"].hide{display:none;} -[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;} -.container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;} -.container:after{clear:both;} -.container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;} -.container-fluid:after{clear:both;} -p{margin:0 0 10px;} -.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px;} -small{font-size:85%;} -strong{font-weight:bold;} -em{font-style:italic;} -cite{font-style:normal;} -.muted{color:#999999;} -.text-warning{color:#c09853;} -.text-error{color:#b94a48;} -.text-info{color:#3a87ad;} -.text-success{color:#468847;} -h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:1;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;} -h1{font-size:36px;line-height:40px;} -h2{font-size:30px;line-height:40px;} -h3{font-size:24px;line-height:40px;} -h4{font-size:18px;line-height:20px;} -h5{font-size:14px;line-height:20px;} -h6{font-size:12px;line-height:20px;} -h1 small{font-size:24px;} -h2 small{font-size:18px;} -h3 small{font-size:14px;} -h4 small{font-size:14px;} -.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;} -ul,ol{padding:0;margin:0 0 10px 25px;} -ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} -li{line-height:20px;} -ul.unstyled,ol.unstyled{margin-left:0;list-style:none;} -dl{margin-bottom:20px;} -dt,dd{line-height:20px;} -dt{font-weight:bold;} -dd{margin-left:10px;} -.dl-horizontal{*zoom:1;}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0;} -.dl-horizontal:after{clear:both;} -.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} -.dl-horizontal dd{margin-left:180px;} -hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} -abbr[title]{cursor:help;border-bottom:1px dotted #999999;} -abbr.initialism{font-size:90%;text-transform:uppercase;} -blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px;} -blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} -blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} -blockquote.pull-right small:before{content:'';} -blockquote.pull-right small:after{content:'\00A0 \2014';} -q:before,q:after,blockquote:before,blockquote:after{content:"";} -address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;} -code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} -pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:20px;} -pre code{padding:0;color:inherit;background-color:transparent;border:0;} -.pre-scrollable{max-height:340px;overflow-y:scroll;} -.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;} -.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;} -a.label:hover,a.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;} -.label-important,.badge-important{background-color:#b94a48;} -.label-important[href],.badge-important[href]{background-color:#953b39;} -.label-warning,.badge-warning{background-color:#f89406;} -.label-warning[href],.badge-warning[href]{background-color:#c67605;} -.label-success,.badge-success{background-color:#468847;} -.label-success[href],.badge-success[href]{background-color:#356635;} -.label-info,.badge-info{background-color:#3a87ad;} -.label-info[href],.badge-info[href]{background-color:#2d6987;} -.label-inverse,.badge-inverse{background-color:#333333;} -.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;} -.btn .label,.btn .badge{position:relative;top:-1px;} -.btn-mini .label,.btn-mini .badge{top:0;} -table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;} -.table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;} -.table th{font-weight:bold;} -.table thead th{vertical-align:bottom;} -.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;} -.table tbody+tbody{border-top:2px solid #dddddd;} -.table-condensed th,.table-condensed td{padding:4px 5px;} -.table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;} -.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} -.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;} -.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;} -.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;} -.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;} -.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;} -.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topleft:4px;} -.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} -.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5;} -table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0;} -.table .span1{float:none;width:44px;margin-left:0;} -.table .span2{float:none;width:124px;margin-left:0;} -.table .span3{float:none;width:204px;margin-left:0;} -.table .span4{float:none;width:284px;margin-left:0;} -.table .span5{float:none;width:364px;margin-left:0;} -.table .span6{float:none;width:444px;margin-left:0;} -.table .span7{float:none;width:524px;margin-left:0;} -.table .span8{float:none;width:604px;margin-left:0;} -.table .span9{float:none;width:684px;margin-left:0;} -.table .span10{float:none;width:764px;margin-left:0;} -.table .span11{float:none;width:844px;margin-left:0;} -.table .span12{float:none;width:924px;margin-left:0;} -.table .span13{float:none;width:1004px;margin-left:0;} -.table .span14{float:none;width:1084px;margin-left:0;} -.table .span15{float:none;width:1164px;margin-left:0;} -.table .span16{float:none;width:1244px;margin-left:0;} -.table .span17{float:none;width:1324px;margin-left:0;} -.table .span18{float:none;width:1404px;margin-left:0;} -.table .span19{float:none;width:1484px;margin-left:0;} -.table .span20{float:none;width:1564px;margin-left:0;} -.table .span21{float:none;width:1644px;margin-left:0;} -.table .span22{float:none;width:1724px;margin-left:0;} -.table .span23{float:none;width:1804px;margin-left:0;} -.table .span24{float:none;width:1884px;margin-left:0;} -.table tbody tr.success td{background-color:#dff0d8;} -.table tbody tr.error td{background-color:#f2dede;} -.table tbody tr.warning td{background-color:#fcf8e3;} -.table tbody tr.info td{background-color:#d9edf7;} -.table-hover tbody tr.success:hover td{background-color:#d0e9c6;} -.table-hover tbody tr.error:hover td{background-color:#ebcccc;} -.table-hover tbody tr.warning:hover td{background-color:#faf2cc;} -.table-hover tbody tr.info:hover td{background-color:#c4e3f3;} -form{margin:0 0 20px;} -fieldset{padding:0;margin:0;border:0;} -legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;} -label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px;} -input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} -label{display:block;margin-bottom:5px;} -select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -input,textarea,.uneditable-input{width:206px;} -textarea{height:auto;} -textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);} -input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;cursor:pointer;} -input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;} -select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;} -select{width:220px;border:1px solid #cccccc;background-color:#ffffff;} -select[multiple],select[size]{height:auto;} -select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} -.uneditable-input{overflow:hidden;white-space:nowrap;} -.uneditable-textarea{width:auto;height:auto;} -input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;} -input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;} -input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;} -.radio,.checkbox{min-height:18px;padding-left:18px;} -.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} -.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} -.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;} -.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} -.input-mini{width:60px;} -.input-small{width:90px;} -.input-medium{width:150px;} -.input-large{width:210px;} -.input-xlarge{width:270px;} -.input-xxlarge{width:530px;} -input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;} -.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;} -input,textarea,.uneditable-input{margin-left:0;} -.controls-row [class*="span"]+[class*="span"]{margin-left:20px;} -input.span12, textarea.span12, .uneditable-input.span12{width:926px;} -input.span11, textarea.span11, .uneditable-input.span11{width:846px;} -input.span10, textarea.span10, .uneditable-input.span10{width:766px;} -input.span9, textarea.span9, .uneditable-input.span9{width:686px;} -input.span8, textarea.span8, .uneditable-input.span8{width:606px;} -input.span7, textarea.span7, .uneditable-input.span7{width:526px;} -input.span6, textarea.span6, .uneditable-input.span6{width:446px;} -input.span5, textarea.span5, .uneditable-input.span5{width:366px;} -input.span4, textarea.span4, .uneditable-input.span4{width:286px;} -input.span3, textarea.span3, .uneditable-input.span3{width:206px;} -input.span2, textarea.span2, .uneditable-input.span2{width:126px;} -input.span1, textarea.span1, .uneditable-input.span1{width:46px;} -.controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;} -.controls-row:after{clear:both;} -.controls-row [class*="span"]{float:left;} -input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;} -input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;} -.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} -.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;} -.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;} -.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} -.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} -.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;} -.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;} -.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} -.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} -.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;} -.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;} -.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} -.control-group.info>label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;} -.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;} -.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;} -.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;} -input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} -.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;} -.form-actions:after{clear:both;} -.help-block,.help-inline{color:#595959;} -.help-block{display:block;margin-bottom:10px;} -.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;} -.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2;} -.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;} -.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;} -.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;} -.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.input-append .add-on,.input-append .btn{margin-left:-1px;} -.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} -.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} -input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} -.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} -.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} -.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} -.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} -.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;} -.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;} -.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;} -.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;} -.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;} -.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;} -.control-group{margin-bottom:10px;} -legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;} -.form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;} -.form-horizontal .control-group:after{clear:both;} -.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;} -.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:180px;} -.form-horizontal .help-block{margin-bottom:0;} -.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px;} -.form-horizontal .form-actions{padding-left:180px;} -.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 14px;margin-bottom:0;font-size:14px;line-height:20px;*line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbbbbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;} -.btn:active,.btn.active{background-color:#cccccc \9;} -.btn:first-child{*margin-left:0;} -.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} -.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);} -.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.btn-large [class^="icon-"]{margin-top:2px;} -.btn-small{padding:3px 9px;font-size:12px;line-height:18px;} -.btn-small [class^="icon-"]{margin-top:0;} -.btn-mini{padding:2px 6px;font-size:11px;line-height:17px;} -.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} -.btn-block+.btn-block{margin-top:5px;} -input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%;} -.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);} -.btn{border-color:#c5c5c5;border-color:rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);} -.btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(to bottom, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#0044cc;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;} -.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} -.btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;} -.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} -.btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;} -.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} -.btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;} -.btn-success:active,.btn-success.active{background-color:#408140 \9;} -.btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;} -.btn-info:active,.btn-info.active{background-color:#24748c \9;} -.btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;} -.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;} -button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} -button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;} -button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;} -button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;} -.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -.btn-link{border-color:transparent;cursor:pointer;color:#0088cc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent;} -.btn-link[disabled]:hover{color:#333333;text-decoration:none;} -[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;} -.icon-white,.nav-tabs>.active>a>[class^="icon-"],.nav-tabs>.active>a>[class*=" icon-"],.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");} -.icon-glass{background-position:0 0;} -.icon-music{background-position:-24px 0;} -.icon-search{background-position:-48px 0;} -.icon-envelope{background-position:-72px 0;} -.icon-heart{background-position:-96px 0;} -.icon-star{background-position:-120px 0;} -.icon-star-empty{background-position:-144px 0;} -.icon-user{background-position:-168px 0;} -.icon-film{background-position:-192px 0;} -.icon-th-large{background-position:-216px 0;} -.icon-th{background-position:-240px 0;} -.icon-th-list{background-position:-264px 0;} -.icon-ok{background-position:-288px 0;} -.icon-remove{background-position:-312px 0;} -.icon-zoom-in{background-position:-336px 0;} -.icon-zoom-out{background-position:-360px 0;} -.icon-off{background-position:-384px 0;} -.icon-signal{background-position:-408px 0;} -.icon-cog{background-position:-432px 0;} -.icon-trash{background-position:-456px 0;} -.icon-home{background-position:0 -24px;} -.icon-file{background-position:-24px -24px;} -.icon-time{background-position:-48px -24px;} -.icon-road{background-position:-72px -24px;} -.icon-download-alt{background-position:-96px -24px;} -.icon-download{background-position:-120px -24px;} -.icon-upload{background-position:-144px -24px;} -.icon-inbox{background-position:-168px -24px;} -.icon-play-circle{background-position:-192px -24px;} -.icon-repeat{background-position:-216px -24px;} -.icon-refresh{background-position:-240px -24px;} -.icon-list-alt{background-position:-264px -24px;} -.icon-lock{background-position:-287px -24px;} -.icon-flag{background-position:-312px -24px;} -.icon-headphones{background-position:-336px -24px;} -.icon-volume-off{background-position:-360px -24px;} -.icon-volume-down{background-position:-384px -24px;} -.icon-volume-up{background-position:-408px -24px;} -.icon-qrcode{background-position:-432px -24px;} -.icon-barcode{background-position:-456px -24px;} -.icon-tag{background-position:0 -48px;} -.icon-tags{background-position:-25px -48px;} -.icon-book{background-position:-48px -48px;} -.icon-bookmark{background-position:-72px -48px;} -.icon-print{background-position:-96px -48px;} -.icon-camera{background-position:-120px -48px;} -.icon-font{background-position:-144px -48px;} -.icon-bold{background-position:-167px -48px;} -.icon-italic{background-position:-192px -48px;} -.icon-text-height{background-position:-216px -48px;} -.icon-text-width{background-position:-240px -48px;} -.icon-align-left{background-position:-264px -48px;} -.icon-align-center{background-position:-288px -48px;} -.icon-align-right{background-position:-312px -48px;} -.icon-align-justify{background-position:-336px -48px;} -.icon-list{background-position:-360px -48px;} -.icon-indent-left{background-position:-384px -48px;} -.icon-indent-right{background-position:-408px -48px;} -.icon-facetime-video{background-position:-432px -48px;} -.icon-picture{background-position:-456px -48px;} -.icon-pencil{background-position:0 -72px;} -.icon-map-marker{background-position:-24px -72px;} -.icon-adjust{background-position:-48px -72px;} -.icon-tint{background-position:-72px -72px;} -.icon-edit{background-position:-96px -72px;} -.icon-share{background-position:-120px -72px;} -.icon-check{background-position:-144px -72px;} -.icon-move{background-position:-168px -72px;} -.icon-step-backward{background-position:-192px -72px;} -.icon-fast-backward{background-position:-216px -72px;} -.icon-backward{background-position:-240px -72px;} -.icon-play{background-position:-264px -72px;} -.icon-pause{background-position:-288px -72px;} -.icon-stop{background-position:-312px -72px;} -.icon-forward{background-position:-336px -72px;} -.icon-fast-forward{background-position:-360px -72px;} -.icon-step-forward{background-position:-384px -72px;} -.icon-eject{background-position:-408px -72px;} -.icon-chevron-left{background-position:-432px -72px;} -.icon-chevron-right{background-position:-456px -72px;} -.icon-plus-sign{background-position:0 -96px;} -.icon-minus-sign{background-position:-24px -96px;} -.icon-remove-sign{background-position:-48px -96px;} -.icon-ok-sign{background-position:-72px -96px;} -.icon-question-sign{background-position:-96px -96px;} -.icon-info-sign{background-position:-120px -96px;} -.icon-screenshot{background-position:-144px -96px;} -.icon-remove-circle{background-position:-168px -96px;} -.icon-ok-circle{background-position:-192px -96px;} -.icon-ban-circle{background-position:-216px -96px;} -.icon-arrow-left{background-position:-240px -96px;} -.icon-arrow-right{background-position:-264px -96px;} -.icon-arrow-up{background-position:-289px -96px;} -.icon-arrow-down{background-position:-312px -96px;} -.icon-share-alt{background-position:-336px -96px;} -.icon-resize-full{background-position:-360px -96px;} -.icon-resize-small{background-position:-384px -96px;} -.icon-plus{background-position:-408px -96px;} -.icon-minus{background-position:-433px -96px;} -.icon-asterisk{background-position:-456px -96px;} -.icon-exclamation-sign{background-position:0 -120px;} -.icon-gift{background-position:-24px -120px;} -.icon-leaf{background-position:-48px -120px;} -.icon-fire{background-position:-72px -120px;} -.icon-eye-open{background-position:-96px -120px;} -.icon-eye-close{background-position:-120px -120px;} -.icon-warning-sign{background-position:-144px -120px;} -.icon-plane{background-position:-168px -120px;} -.icon-calendar{background-position:-192px -120px;} -.icon-random{background-position:-216px -120px;width:16px;} -.icon-comment{background-position:-240px -120px;} -.icon-magnet{background-position:-264px -120px;} -.icon-chevron-up{background-position:-288px -120px;} -.icon-chevron-down{background-position:-313px -119px;} -.icon-retweet{background-position:-336px -120px;} -.icon-shopping-cart{background-position:-360px -120px;} -.icon-folder-close{background-position:-384px -120px;} -.icon-folder-open{background-position:-408px -120px;width:16px;} -.icon-resize-vertical{background-position:-432px -119px;} -.icon-resize-horizontal{background-position:-456px -118px;} -.icon-hdd{background-position:0 -144px;} -.icon-bullhorn{background-position:-24px -144px;} -.icon-bell{background-position:-48px -144px;} -.icon-certificate{background-position:-72px -144px;} -.icon-thumbs-up{background-position:-96px -144px;} -.icon-thumbs-down{background-position:-120px -144px;} -.icon-hand-right{background-position:-144px -144px;} -.icon-hand-left{background-position:-168px -144px;} -.icon-hand-up{background-position:-192px -144px;} -.icon-hand-down{background-position:-216px -144px;} -.icon-circle-arrow-right{background-position:-240px -144px;} -.icon-circle-arrow-left{background-position:-264px -144px;} -.icon-circle-arrow-up{background-position:-288px -144px;} -.icon-circle-arrow-down{background-position:-312px -144px;} -.icon-globe{background-position:-336px -144px;} -.icon-wrench{background-position:-360px -144px;} -.icon-tasks{background-position:-384px -144px;} -.icon-filter{background-position:-408px -144px;} -.icon-briefcase{background-position:-432px -144px;} -.icon-fullscreen{background-position:-456px -144px;} -.btn-group{position:relative;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;} -.btn-group+.btn-group{margin-left:5px;} -.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} -.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px;} -.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.btn-group>.btn+.btn{margin-left:-1px;} -.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px;} -.btn-group>.btn-mini{font-size:11px;} -.btn-group>.btn-small{font-size:12px;} -.btn-group>.btn-large{font-size:16px;} -.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} -.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} -.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} -.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} -.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;} -.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} -.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} -.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;} -.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;} -.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;} -.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);} -.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;} -.btn-group.open .btn-primary.dropdown-toggle{background-color:#0044cc;} -.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;} -.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;} -.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;} -.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;} -.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;} -.btn .caret{margin-top:8px;margin-left:0;} -.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px;} -.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;} -.dropup .btn-large .caret{border-bottom:5px solid #000000;border-top:0;} -.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} -.btn-group-vertical{display:inline-block;*display:inline;*zoom:1;} -.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.btn-group-vertical .btn+.btn{margin-left:0;margin-top:-1px;} -.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} -.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} -.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;} -.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} -.nav{margin-left:0;margin-bottom:20px;list-style:none;} -.nav>li>a{display:block;} -.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} -.nav>.pull-right{float:right;} -.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} -.nav li+.nav-header{margin-top:9px;} -.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;} -.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} -.nav-list>li>a{padding:3px 15px;} -.nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} -.nav-list [class^="icon-"]{margin-right:2px;} -.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} -.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;} -.nav-tabs:after,.nav-pills:after{clear:both;} -.nav-tabs>li,.nav-pills>li{float:left;} -.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} -.nav-tabs{border-bottom:1px solid #ddd;} -.nav-tabs>li{margin-bottom:-1px;} -.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} -.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} -.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#0088cc;} -.nav-stacked>li{float:none;} -.nav-stacked>li>a{margin-right:0;} -.nav-tabs.nav-stacked{border-bottom:0;} -.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} -.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} -.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} -.nav-pills.nav-stacked>li>a{margin-bottom:3px;} -.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} -.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} -.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.nav .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;} -.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580;} -.nav-tabs .dropdown-toggle .caret{margin-top:8px;} -.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;} -.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} -.nav>.dropdown.active>a:hover{cursor:pointer;} -.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} -.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);} -.tabs-stacked .open>a:hover{border-color:#999999;} -.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;} -.tabbable:after{clear:both;} -.tab-content{overflow:auto;} -.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;} -.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} -.tab-content>.active,.pill-content>.active{display:block;} -.tabs-below>.nav-tabs{border-top:1px solid #ddd;} -.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;} -.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} -.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd;} -.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;} -.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} -.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} -.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} -.tabs-left>.nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} -.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} -.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} -.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.tabs-right>.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} -.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} -.nav>.disabled>a{color:#999999;} -.nav>.disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;} -.navbar{overflow:visible;margin-bottom:20px;color:#777777;*position:relative;*z-index:2;} -.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top, #ffffff, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #ffffff, #f2f2f2);background-image:-o-linear-gradient(top, #ffffff, #f2f2f2);background-image:linear-gradient(to bottom, #ffffff, #f2f2f2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);-moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);*zoom:1;}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0;} -.navbar-inner:after{clear:both;} -.navbar .container{width:auto;} -.nav-collapse.collapse{height:auto;} -.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777777;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover{text-decoration:none;} -.navbar-text{margin-bottom:0;line-height:40px;} -.navbar-link{color:#777777;}.navbar-link:hover{color:#333333;} -.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff;} -.navbar .btn,.navbar .btn-group{margin-top:5px;} -.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0;} -.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;} -.navbar-form:after{clear:both;} -.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} -.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;} -.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} -.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;} -.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} -.navbar-static-top{position:static;width:100%;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;} -.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px;} -.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0;} -.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} -.navbar-fixed-top{top:0;} -.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);} -.navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);} -.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} -.navbar .nav.pull-right{float:right;margin-right:0;} -.navbar .nav>li{float:left;} -.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777777;text-decoration:none;text-shadow:0 1px 0 #ffffff;} -.navbar .nav .dropdown-toggle .caret{margin-top:8px;} -.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;} -.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);} -.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ededed;background-image:-moz-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));background-image:-webkit-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-o-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:linear-gradient(to bottom, #f2f2f2, #e5e5e5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e5e5e5;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#ffffff;background-color:#e5e5e5;*background-color:#d9d9d9;} -.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#cccccc \9;} -.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} -.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} -.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} -.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} -.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;} -.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;} -.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e5e5e5;color:#555555;} -.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777777;border-bottom-color:#777777;} -.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} -.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;} -.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;} -.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} -.navbar-inverse{color:#999999;}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);border-color:#252525;} -.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#ffffff;} -.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;} -.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;} -.navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover{color:#ffffff;} -.navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;} -.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;} -.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;} -.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} -.navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;} -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;} -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;} -.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} -.navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);border-color:#040404 #040404 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#040404;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;} -.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;} -.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;} -.breadcrumb .divider{padding:0 5px;color:#ccc;} -.breadcrumb .active{color:#999999;} -.pagination{height:40px;margin:20px 0;} -.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} -.pagination ul>li{display:inline;} -.pagination ul>li>a,.pagination ul>li>span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;} -.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5;} -.pagination ul>.active>a,.pagination ul>.active>span{color:#999999;cursor:default;} -.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999999;background-color:transparent;cursor:default;} -.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} -.pagination-centered{text-align:center;} -.pagination-right{text-align:right;} -.pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;} -.pager:after{clear:both;} -.pager li{display:inline;} -.pager a,.pager span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} -.pager a:hover{text-decoration:none;background-color:#f5f5f5;} -.pager .next a,.pager .next span{float:right;} -.pager .previous a{float:left;} -.pager .disabled a,.pager .disabled a:hover,.pager .disabled span{color:#999999;background-color:#fff;cursor:default;} -.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;} -.thumbnails:after{clear:both;} -.row-fluid .thumbnails{margin-left:0;} -.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;} -.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;} -a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} -.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} -.thumbnail .caption{padding:9px;color:#555555;} -.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853;} -.alert h4{margin:0;} -.alert .close{position:relative;top:-2px;right:-21px;line-height:20px;} -.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;} -.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;} -.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;} -.alert-block{padding-top:14px;padding-bottom:14px;} -.alert-block>p,.alert-block>ul{margin-bottom:0;} -.alert-block p+p{margin-top:5px;} -@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(to bottom, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} -.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);} -.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} -.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} -.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);} -.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);} -.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);} -.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);} -.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.hero-unit{padding:60px;margin-bottom:30px;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;} -.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit;} -.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} -.tooltip.top{margin-top:-3px;} -.tooltip.right{margin-left:3px;} -.tooltip.bottom{margin-top:3px;} -.tooltip.left{margin-left:-3px;} -.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;} -.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;} -.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;} -.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;} -.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;} -.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);}.popover.top{margin-bottom:10px;} -.popover.right{margin-left:10px;} -.popover.bottom{margin-top:10px;} -.popover.left{margin-right:10px;} -.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;} -.popover-content{padding:9px 14px;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} -.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid;} -.popover .arrow:after{content:"";z-index:-1;} -.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#ffffff;}.popover.top .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0, 0, 0, 0.25);bottom:-1px;left:-11px;} -.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-width:10px 10px 10px 0;border-right-color:#ffffff;}.popover.right .arrow:after{border-width:11px 11px 11px 0;border-right-color:rgba(0, 0, 0, 0.25);bottom:-11px;left:-1px;} -.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-width:0 10px 10px;border-bottom-color:#ffffff;}.popover.bottom .arrow:after{border-width:0 11px 11px;border-bottom-color:rgba(0, 0, 0, 0.25);top:-1px;left:-11px;} -.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-width:10px 0 10px 10px;border-left-color:#ffffff;}.popover.left .arrow:after{border-width:11px 0 11px 11px;border-left-color:rgba(0, 0, 0, 0.25);bottom:-11px;right:-1px;} -.modal-open .modal .dropdown-menu{z-index:2050;} -.modal-open .modal .dropdown.open{*z-index:2050;} -.modal-open .modal .popover{z-index:2060;} -.modal-open .modal .tooltip{z-index:2080;} -.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} -.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} -.modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} -.modal.fade.in{top:50%;} -.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} -.modal-header h3{margin:0;line-height:30px;} -.modal-body{overflow-y:auto;max-height:400px;padding:15px;} -.modal-form{margin-bottom:0;} -.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;} -.modal-footer:after{clear:both;} -.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;} -.modal-footer .btn-group .btn+.btn{margin-left:-1px;} -.dropup,.dropdown{position:relative;} -.dropdown-toggle{*margin-bottom:-3px;} -.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} -.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";} -.dropdown .caret{margin-top:8px;margin-left:2px;} -.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;}.dropdown-menu.pull-right{right:0;left:auto;} -.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} -.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;} -.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{text-decoration:none;color:#ffffff;background-color:#0088cc;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);} -.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;outline:0;background-color:#0088cc;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);} -.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999999;} -.dropdown-menu .disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;} -.open{*z-index:1000;}.open >.dropdown-menu{display:block;} -.pull-right>.dropdown-menu{right:0;left:auto;} -.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"";} -.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;} -.dropdown-submenu{position:relative;} -.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;} -.dropdown-submenu:hover>.dropdown-menu{display:block;} -.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;} -.dropdown-submenu:hover>a:after{border-left-color:#ffffff;} -.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;} -.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.accordion{margin-bottom:20px;} -.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.accordion-heading{border-bottom:0;} -.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} -.accordion-toggle{cursor:pointer;} -.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} -.carousel{position:relative;margin-bottom:20px;line-height:1;} -.carousel-inner{overflow:hidden;width:100%;position:relative;} -.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} -.carousel .item>img{display:block;line-height:1;} -.carousel .active,.carousel .next,.carousel .prev{display:block;} -.carousel .active{left:0;} -.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} -.carousel .next{left:100%;} -.carousel .prev{left:-100%;} -.carousel .next.left,.carousel .prev.right{left:0;} -.carousel .active.left{left:-100%;} -.carousel .active.right{left:100%;} -.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} -.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} -.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);} -.carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;} -.carousel-caption h4{margin:0 0 5px;} -.carousel-caption p{margin-bottom:0;} -.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} -.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);} -button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;} -.pull-right{float:right;} -.pull-left{float:left;} -.hide{display:none;} -.show{display:block;} -.invisible{visibility:hidden;} -.affix{position:fixed;} -.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;} -.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;} -.hidden{display:none;visibility:hidden;} -.visible-phone{display:none !important;} -.visible-tablet{display:none !important;} -.hidden-desktop{display:none !important;} -.visible-desktop{display:inherit !important;} -@media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important ;} .visible-tablet{display:inherit !important;} .hidden-tablet{display:none !important;}}@media (max-width:767px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important;} .visible-phone{display:inherit !important;} .hidden-phone{display:none !important;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-left:-20px;margin-right:-20px;} .container-fluid{padding:0;} .dl-horizontal dt{float:none;clear:none;width:auto;text-align:left;} .dl-horizontal dd{margin-left:0;} .container{width:auto;} .row-fluid{width:100%;} .row,.thumbnails{margin-left:0;} .thumbnails>li{float:none;margin-left:0;} [class*="span"],.row-fluid [class*="span"]{float:none;display:block;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto;} .controls-row [class*="span"]+[class*="span"]{margin-left:0;} .modal{position:fixed;top:20px;left:20px;right:20px;width:auto;margin:0;}.modal.fade.in{top:auto;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:20px;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{top:10px;left:10px;right:10px;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:20px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%;} .row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%;} .row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%;} .row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%;} .row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%;} .row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%;} .row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%;} .row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%;} .row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%;} .row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%;} .row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%;} .row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%;} .row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%;} .row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%;} .row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%;} .row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%;} .row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%;} .row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%;} .row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%;} .row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%;} .row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%;} .row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%;} .row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%;} .row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%;} .row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%;} .row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%;} .row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%;} .row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%;} .row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%;} .row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%;} .row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%;} .row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%;} .row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%;} .row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%;} .row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:20px;} input.span12, textarea.span12, .uneditable-input.span12{width:710px;} input.span11, textarea.span11, .uneditable-input.span11{width:648px;} input.span10, textarea.span10, .uneditable-input.span10{width:586px;} input.span9, textarea.span9, .uneditable-input.span9{width:524px;} input.span8, textarea.span8, .uneditable-input.span8{width:462px;} input.span7, textarea.span7, .uneditable-input.span7{width:400px;} input.span6, textarea.span6, .uneditable-input.span6{width:338px;} input.span5, textarea.span5, .uneditable-input.span5{width:276px;} input.span4, textarea.span4, .uneditable-input.span4{width:214px;} input.span3, textarea.span3, .uneditable-input.span3{width:152px;} input.span2, textarea.span2, .uneditable-input.span2{width:90px;} input.span1, textarea.span1, .uneditable-input.span1{width:28px;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:30px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px;} .span12{width:1170px;} .span11{width:1070px;} .span10{width:970px;} .span9{width:870px;} .span8{width:770px;} .span7{width:670px;} .span6{width:570px;} .span5{width:470px;} .span4{width:370px;} .span3{width:270px;} .span2{width:170px;} .span1{width:70px;} .offset12{margin-left:1230px;} .offset11{margin-left:1130px;} .offset10{margin-left:1030px;} .offset9{margin-left:930px;} .offset8{margin-left:830px;} .offset7{margin-left:730px;} .offset6{margin-left:630px;} .offset5{margin-left:530px;} .offset4{margin-left:430px;} .offset3{margin-left:330px;} .offset2{margin-left:230px;} .offset1{margin-left:130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%;} .row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%;} .row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%;} .row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%;} .row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%;} .row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%;} .row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%;} .row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%;} .row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%;} .row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%;} .row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%;} .row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%;} .row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%;} .row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%;} .row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%;} .row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%;} .row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%;} .row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%;} .row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%;} .row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%;} .row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%;} .row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%;} .row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%;} .row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%;} .row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%;} .row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%;} .row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%;} .row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%;} .row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%;} .row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%;} .row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%;} .row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%;} .row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%;} .row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%;} .row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:30px;} input.span12, textarea.span12, .uneditable-input.span12{width:1156px;} input.span11, textarea.span11, .uneditable-input.span11{width:1056px;} input.span10, textarea.span10, .uneditable-input.span10{width:956px;} input.span9, textarea.span9, .uneditable-input.span9{width:856px;} input.span8, textarea.span8, .uneditable-input.span8{width:756px;} input.span7, textarea.span7, .uneditable-input.span7{width:656px;} input.span6, textarea.span6, .uneditable-input.span6{width:556px;} input.span5, textarea.span5, .uneditable-input.span5{width:456px;} input.span4, textarea.span4, .uneditable-input.span4{width:356px;} input.span3, textarea.span3, .uneditable-input.span3{width:256px;} input.span2, textarea.span2, .uneditable-input.span2{width:156px;} input.span1, textarea.span1, .uneditable-input.span1{width:56px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;} .row-fluid .thumbnails{margin-left:0;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top,.navbar-fixed-bottom{position:static;} .navbar-fixed-top{margin-bottom:20px;} .navbar-fixed-bottom{margin-top:20px;} .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .nav-collapse{clear:both;} .nav-collapse .nav{float:none;margin:0 0 10px;} .nav-collapse .nav>li{float:none;} .nav-collapse .nav>li>a{margin-bottom:2px;} .nav-collapse .nav>.divider-vertical{display:none;} .nav-collapse .nav .nav-header{color:#777777;text-shadow:none;} .nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .nav-collapse .dropdown-menu li+li a{margin-bottom:2px;} .nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2;} .navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111111;} .nav-collapse.in .btn-group{margin-top:5px;padding:0;} .nav-collapse .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none;} .nav-collapse .dropdown-menu .divider{display:none;} .nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none;} .nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);} .navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111111;border-bottom-color:#111111;} .navbar .nav-collapse .nav.pull-right{float:none;margin-left:0;} .nav-collapse,.nav-collapse.collapse{overflow:hidden;height:0;} .navbar .btn-navbar{display:block;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}} diff --git a/vendor-local/lib/python/rest_framework/static/rest_framework/css/default.css b/vendor-local/lib/python/rest_framework/static/rest_framework/css/default.css deleted file mode 100644 index 0261a3038bf..00000000000 --- a/vendor-local/lib/python/rest_framework/static/rest_framework/css/default.css +++ /dev/null @@ -1,71 +0,0 @@ - -/* The navbar is fixed at >= 980px wide, so add padding to the body to prevent -content running up underneath it. */ - -h1 { - font-weight: 500; -} - -h2, h3 { - font-weight: 300; -} - -.resource-description, .response-info { - margin-bottom: 2em; -} -.version:before { - content: "v"; - opacity: 0.6; - padding-right: 0.25em; -} - -.version { - font-size: 70%; -} - -.format-option { - font-family: Menlo, Consolas, "Andale Mono", "Lucida Console", monospace; -} - -.button-form { - float: right; - margin-right: 1em; -} - -ul.breadcrumb { - margin: 58px 0 0 0; -} - -form select, form input, form textarea { - width: 90%; -} - -form select[multiple] { - height: 150px; -} -/* To allow tooltips to work on disabled elements */ -.disabled-tooltip-shield { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -.errorlist { - margin-top: 0.5em; -} - -pre { - overflow: auto; - word-wrap: normal; - white-space: pre; - font-size: 12px; -} - -.page-header { - border-bottom: none; - padding-bottom: 0px; - margin-bottom: 20px; -} - diff --git a/vendor-local/lib/python/rest_framework/static/rest_framework/css/prettify.css b/vendor-local/lib/python/rest_framework/static/rest_framework/css/prettify.css deleted file mode 100644 index d437aff62bb..00000000000 --- a/vendor-local/lib/python/rest_framework/static/rest_framework/css/prettify.css +++ /dev/null @@ -1,30 +0,0 @@ -.com { color: #93a1a1; } -.lit { color: #195f91; } -.pun, .opn, .clo { color: #93a1a1; } -.fun { color: #dc322f; } -.str, .atv { color: #D14; } -.kwd, .prettyprint .tag { color: #1e347b; } -.typ, .atn, .dec, .var { color: teal; } -.pln { color: #48484c; } - -.prettyprint { - padding: 8px; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} -.prettyprint.linenums { - -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; - -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; - box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin: 0 0 0 33px; /* IE indents via margin-left */ -} -ol.linenums li { - padding-left: 12px; - color: #bebec5; - line-height: 20px; - text-shadow: 0 1px 0 #fff; -} \ No newline at end of file diff --git a/vendor-local/lib/python/rest_framework/static/rest_framework/img/glyphicons-halflings-white.png b/vendor-local/lib/python/rest_framework/static/rest_framework/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484a29d8da269f9bc874b25493a45fae3bae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8777 zcmZvC1yGz#v+m*$LXcp=A$ZWB0fL7wNbp_U*$~{_gL`my3oP#L!5tQYy99Ta`+g_q zKlj|KJ2f@c)ARJx{q*b<Rc{fZDE|-E3z8Qg5C}{9v!pTzga8NZOmrk*O`5892Z0dh z6y;PuJwHDK9$?(w-u|_L_3`o1($W%e0`}kWUyy&dCnqOQPfu4@SAgf?;o*P$z|s8t zJh1KR>bkhN_!|Wn*Vos8{TEhUT@5e;_WJsIMMcG5%>DiS&dv_N`4@J0cnAQ-#>RjZ z00W5t&tJ^l-QC*ST1-p~00u^9XJ=AUl7oW-;2a+x2k__T=grN{+1c4XK0ZL~^z^i$ zp&>vEhr@4fZWb380S18T&!0cQ3IKpHF)?v=b_NIm0Q>v<fKgXh*W25>wY7D0baZ)n z31Fa5sELUQARIVaU0nqf0XzT+fB_63aA;@<$l~wse|mcA;^G1TmX?-)e)jkGPfkuA z92@|!<>h5S_4f8QP-JRq>d&7)^Yin8l7K8gED$&_FaV?gY+wLjpoW%~7NDe=nHfMG z5DO3j{R9kv5GbssrUpO)<pElNvVjx;Inad7%}rnn)BtoiIXM{s0C>Oyv<s*i2m!7M zNCXUk1jq|?5|99_k&%%AIlu-a0ty3=KxY8j%*;&S3IIajE_Qc!f%*X_5DScgf&xH0 zumu>Vrlx>u0UKD0i;Dpm5S5dY16(DL5l{ixz|mhJU@&-OWCTb7_%}8-fE(P~+XIRO zJU|wp1|S>|J3KrLcz^+v1f&BDpd>&MAaibR4#5A_4(MucZwG9E1h4@u0P@C8;oo+g zIVj7kfJi{oV~E(NZ*h(@^<JQ`7oGGHtP>-(Q(C`Psb3KZ{N;^GB(a8NE*Vwc715!9 zr-H4Ao|T_c6+VT_JH9H+P3>iXSt!a$F`>s`jn`w9GZ_~B!{<w2b}Uz=xRP0Noee!5 zHGxHKH;uZjouChSB9)ldcOm@{14~ct04{b8>0soaiV|O_c^R2aWa%}O3jUE)WO=pa zs~_Wz08z|ieY5A%$@FcBF9^!1a}m5ks@7gjn;67N>}S~Hrm`4sM5Hh`q7&5-N{|31 z6x1{ol7Bn<k_m&K*9NkB7ANp6;_WSmra!UL^eY+pz_w5LlB(g$UY9|-AP@zsw4|7- zi|#>skoViZ<brlX21G1wL@^v%v2P&MSTZc8SKT&&Tq!~%Uw%k^(D<O<S;ewoH)@(b zb2Z<#wBV6y-?HHFVJFRg^me&@Reg!dys6F1>0GqbLa#kW`Z<Hy>)VCjt1MysKg|rT zi!?s#<KsBd5lg=VLu4^|xo0%enAx0mMXMSpk0KF_*gOS;jx!zP=@5TPN+S>#Ck>8c zpi|>$lGlw#@yMNi&V4`6OBGJ(H&7lqLlcTQ&1zWriG_fL>BnFcr~?;E93{M-xIozQ zO=EHQ#+?<}%@wbWWv23#!V70h9MOuUVaU>3kpTvYfc|LBw?&b*89~Gc9i&8tlT#kF ztpbZoAzkdB+UTy=tx%L3Z4)I{zY(Kb)eg{InobSJmNwPZt$14aS-uc4eKuY<?xyi! z`TeGpun(kP^7#~<fX0r^ExRQwveWDF;DOQbL}?LBzt>8h$dtfyxu^a%zA)<y|4;I# zFU8x7%0eT|Hd@3!T6Anh3IoHrN%@H8e6ge;3u)_$N2H&Rv2`ml6;kL~xS07C5Nzt< z>>fYI&)@ZXky?^{5>xSC?;w4r&td6vBdi%vHm4=XJH!3yL3?Ep+T5aU_>i;yr_XGq zxZfCzUU@GvnoIk+_Nd`aky>S&H!b*{A%L>?*XPAgWL(Vf(k7qUS}>Zn=U(ZfcOc{B z3*tOHH@t5Ub5D~#N7!Fxx}P2)sy{vE_l(R7$aW&CX>c|&HY+7};vUIietK%}!ph<X z*_6&Ee=)&D@nDa!y{$f<(Q`UdM+|H2ksGEhG7utFYl`Y6pD#+4LC8Hw@6|1H-x{D` zE$uaNS!i^Rx(%B(My5}1#H73>rCuh+;C@1usp;XLU<8Gq8P!rEI3<U)y>ieg#W$!= zQcZr{hp>8sF?k&Yl0?B84OneiQxef-4TEFrq3O~JAZR}yEJHA|Xkqd49tR&8oq{zP zY@>J^HBV*(gJvJZc_0VFN7Sx?H7#75E3#?N8<p*btH>Z!C+_f53YU}py<FUNWgSuj zi^M}p>ggxx1?wQi5Yb-_`I`_V*SMx5+*P^b=ec5RON-k1cIlsBLk}(HiaJyab0`CI zo0{<v3Q5P3@oM!6@v&t6RJy0OS}M??mGqk1x;(pa`FWA#n+2z37<uPHl{#HvB!^?r zm9?WOv;Tt(gt*?Pw;;%nF3|I0gDBXPM>=1_LO$~oE2%Tl_}KURuX<`+mQN_sTdM&* zkFf!Xtl^e^gTy6ON=&gTn6)$JHQq2)33R@_!#9?BLNq-Wi{U|rVX7Vny$l6#+S<va z%-r+y8D)Cm{5=IM8|<{prj)kZfIZ$NiW0)fE9{-SR)@-;NBJtHk@DI_v*mK(N0#s# z?S8~jyotdcJJAAUt_;Tr)fa|*cT)~*JZ!c_7yVpSb{r2MllfJDbfI~-7n_#K6lw4G z^Eyhsh^z8eZs2;adrfk9ip%h;IP|>Z@KvQt@VYb%<9JfapI^b9j=wa+Tqb4ei;8c5 z&1>Uz@lVFv6T4Z*YU$r4G`g=91lSeA<=GRZ!*KTWKDPR}NPUW%peCUj`Ix_LDq!8| zMH-V`Pv!a~QkTL||L@cqiTz)*G-0=ytr1KqTuFPan9y4gYD5>PleK`NZB$ev@W%t= zkp)_=lBUTLZJpAtZg;pjI;7r2y|26-N7&a(h<zryrg`J^oeC|8V|qszB+|*eQ-(Dy zbn*nJ1W|b4-1y?dTI6}3IPMw+-O0;Q@eMMtjjQ+G6QfN3ae61Yd9LfQx_UREWecK4 zMn7A~fOz)be1)Yg{2Ysl9G%s8-h-~@C;ALAL0r=<JP2uCe!T|wAywH1r;F|f_q8N( zYp^0FkyL9uj<8bK@fyTtgo+DT)14B^<SigcSJotgDV02O!M(CS6_B&^bILwyV?Ng4 zm7WQp?{l<Obhuy=22?5<oQDiM22&u4rZrRVG|L9ABfY{=95aTyd~@a$o~1P#ji`=w zBKmQqX}r3Nlk9Q|gR7)~#n6AzYk`#!R*d5x`A)hU(!1R1%^zXxNJ(kPCw4htU9^(O zP4cYV^F(I>X|`1YNM9N8{>8JAu<en5+94bD>v}hp1v`3JHT-=5lbXpbMq7X~2J5Kl zh7tyU`_AusMFZ{ej9D;Uyy;SQ!4nwgSnngsYBwdS&EO3NS*o04)*j<g2BLf;iAZ2( z7Key$cc6ey>uAYl;57c2Ly0(DEZ8IY?zSph-kyxu+D`tt@oU{32J#I{vmy=#0ySPK zA+i(A3yl)qmTz*$dZi#y9FS;$;h%bY+;StNx{_R56Otq+?pGe^T^{5d7Gs&?`_r`8 zD&dzOA|j8@3<oPyCd}SOX6AZj_;pT>A&FR5U3*eQNBf<4^4W_iS_()*8b4aaUzfk2 zzIcMWSEjm;EPZPk{j{1>oXd}pXAj!NaRm8{Sjz!D=~q3WJ@vmt6ND_?HI~|wUS1j5 z9!S1MKr7%nxoJ3k`GB^7yV~*{n~O~n6($~x5Bu{7s|JyXbAyKI4+tO(zZYMslK;Zc zzeHGVl{`iP@jfSKq>R;{+djJ9n%$%EL()Uw+sykjNQdflkJZSjqV_QDWivbZS~S{K zkE@T^Jcv)Dfm93!mf$XYnCT--_A$zo9MOkPB6&diM8MwOfV?+ApNv`moV@nqn>&lv zYbN1-M|jc~sG|yLN^1R2=`+1ih3jCshg`iP&mY$GMTcY^W^T`WOCX!{-KHmZ#GiRH zYl{|+KLn5!PCLtBy~9i}`#d^gCDDx$+GQb~uc;V#K3OgbbOG0j5{BRG-si%Bo{@lB zGIt+Ain8^C`!*S0d0OSWVO+Z8<kqm;qPrHIJ!qB8;9h5*>9}}O8aFTZ>p&k}2gGCV zh#<$gswePFxWGT$4DC^8@84_e*^KT74?7n8!$8cg=sL$OlKr&HMh@Rr5%*Wr!xoOl zo7jItnj-xYgVTX)H1=A2bD(tle<tL7^Z!nJ*fwgn&QUe>EH57#V{xAeW_ezISg5OC zg=k>hOLA^urTH_e6*vSYRqCm$J{xo}-x3@HH;bsHD1Z`Pzvsn}%cvfw%Q(}h`Dgtb z0_J^niUmoCM5$*f)6}}qi(u;cPgxfyeV<wtcQgsqG?QDyA@6XXM7siU#+0#mP~AnX z9f=bMes~9>aaVmOsG<)5`6tzU4wyhF;k|~|x>7-2hXpVBpc5k{L4M`Wbe6Q?tr^*B z`Y*>6*&R#~%JlBIitlZ^qGe3s21~h3U|&k%%jeMM;6!~UH|+0+<5V-_zDqZQN7<fD zM2vP&&BMr(%$M51tLpycNES^{gnGn-o~t&>9?n?!Aj!Nj`YMO9?j>uqI9-Tex+nJD z%e0#Yca6(zqGUR|KITa?9x-#C0!JKJHO(+fy@1!B$%ZwJwncQW7vGYv?~!^`#L~Um zOL++>4qmqW`0Chc0T23G8|vO)tK=Z2`gvS4*qpqhIJCEv9i&&$09VO8YOz|oZ+ubd zNXVdLc&p=KsSgtmIPLN69P7xYkYQ1vJ?u1g)T!6Ru`k2wkdj*wDC)VryGu2=yb0?F z>q~~e>KZ0d<sP$M^)hrN7IC)eGuv*?pAk#*4fxII<8rIx545@9E}-};{IJdo*}!V1 zkUgWQp<TD%7(QQhWkf*vd;SiT1P@}N?jaoKEV?lzqfa1pG1Y^}ikjNMM*Kb?m5(n& zOz8{+G2z7JatI<J95R%#%#ATAzlwPl$?6)w6WH~ku?(FhO)k1eRlF4I5UqR?T`Iy= z_bVtkxqs3lQGny-BS%nkzwrXhI_M|P4l_VNVoMjVRoZ*0(JkMQ#AdJLFBj%$oTBx9 z_5|g_ll0@cfLf<j;&lJ>_#7f3UgV%9MY1}vMgF{B8yfE{HL*pMyhYF)WDZ^^3vS8F zGlOhs%g_~pS3=WQ#494@jAXwOtr^Y|TnQ5zki>qRG)(oPY*f}U_=ip_{qB0!%w7~G zWE!P4p3khyW-JJnE>eECuYfI?^d366Shq!Wm#x&jA<tFBO~aWRutYg|6S!-V%dvXb zjpm3-7^fYCzbWmx*ts$8ECu=f{D#|=T{2_Q?C-SVQTSi8ey{G^D$8U&*bY{vQ$kGG zq$8)>o>=HdCllE$>DPO0N;y#4G)D2y#B@5=N=+F%Xo2n{gKcPcK2!hP*^WSXl+ut; zyLvVoY>VL{H%Kd9^i~lsb8j4>$EllrparEOJNT?Ym>vJa$(P^tOG)5aVb_5w^*&M0 zYOJ`I`}<NkH4X@iCc57jNSqY3D>9}UoSnYg#E(&yyK(tqr^@n}qU2H2DhkK-`2He% zgXr_4kpXoQHxAO9S`wEdmqGU4j=1JdG!OixdqB4PPP6<nq;ZS)73s_@N{54U_<mt# zR{@UUroZJ1=lVB~3y%RbLLE=9Mh=pj4wNruVxXLk8pKH)JVr{Hbx`P1XQ>RXA}>GM zumruUUH|ZG2$bBj)Qluj&uB=dRb)?^qomw?Z$X%#D+Q*O97eHrgVB2*mR$bFBU`*} zIem?dM)i}raTFDn@5^caxE^XFXVhBePmH9fqcTi`TLaXiueH=@06sl}>F%}h9H_e9 z>^O?LxM1EjX}NVppaO@NNQr=AtHcH-BU{yBT_vejJ#J)l^cl69Z7$sk`82Zyw7Wxt z=~J?hZm{f@W}|96FUJfy65Gk8?^{^yjhOahUMCNNpt5DJw}ZKH7b!bGiFY9y6OY&T z_N)?Jj(MuLTN36ZCJ6<obtKS{VOOSzs>I5Xy7uVlrb$o*Z%=-)kPo9s?<^Yqz~!Z* z_mP<Y8YDC3(vm~>8(unFq65XSi!$@YtieSQ!<7IEOaA9VkKI?lA`*(nURv<D`3vIl zzk?RMHDq|}aqs!Q7n{<V(L>fKL8cX}-+~uw9|_5)uC2`ZHca<BJSyCJ7L7R3^ezpJ zixdU%^Arizo-zh;Lga89_J>eX7L8aG6Ghleg@F9aG%X$#g6^yP5apnB>YTz&EfS{q z9UVfSyEIczebC)qlVu5cOoMzS_jrC|)rQlAzK7sfiW0`M8mVIohazPE9Jzn*qPt%6 zZL8RELY@L09B83@Be;x5V-IHnn$}{RAT#<2JA%ttlk#^(%u}CGze|1JY5MPhbfnYG zIw%$XfBmA-<_pKLpGKwbRF$#P;@_)ech#>vj25sv25VM$ouo)?BXdRcO{)*OwTw)G zv43W~T6ekBMtUD%5Bm>`<n0ehww;K9t*_z=^iZoM2Gjm6Wx6QTWDzOX28g|i7p-G( znPo(pGb2-Hja^(5g>^Ltv!w4~65N!Ut5twl!Agrzyq4O2Fi3pUMtCU~>9gt_=h-f% z;1&OuSu?A_sJvIvQ+dZNo3?m1%b1+s&UAx?8sUHEe_sB7zkm4R%6)<@oYB_i5>3Ip zIA+?jVdX|zL{)?TGpx+=Ta>G80}0}Ax+722$XFNJsC1gcH56{8B)*)eU#r~HrC&}` z|EWW92&;6y;3}!L5zXa385@?-D%>dSvyK;?jqU2t_R3wvBW;$!j45uQ7tyEIQv<v( zw)qBpyRhiKBMR9HV)v2ZJdk>a;Db}r&bR3kqNSh)Q_$MJ#Uj3Gj1F;)sO|%6z#@<+ zi{pbYsYS#u`X$Nf($OS+lhw>xgjos1OnF^$-I$u;qhJswhH~p|ab*nO>zBrtb0ndn zxV0uh!LN`&xckTP+JW}gznSpU492)u+`f{9Yr)js`NmfYH#Wdtradc0TnKNz@Su!e zu$9}G_=ku;%4xk}eXl>)KgpuT>_<`Ud(A^a++K&pm3LbN;gI}ku@YVrA%FJBZ5$;m zobR8}OLtW4-i+qPPLS-(7<>M{)rhiPoi@?&vDeVq5%fmZk=mDdRV>Pb-l7pP1y6|J z8I>sF+TypKV=_<SBxSgNFy@5`t70+_4F<*(g54PNEt&4u%OoVR^n+$TL)qKdP6c)n z-CoP*_kXZ4vBsj8M^2Y0nDq-^4r-wgu2Y-3fmi6ooPIXTI%UdJhw@7KgR=N+Vl3NO zcl8-&i~^e%3E1G+u&^#M&5!sI)la$uQ2y&KsaZjx^r8D68BTZd^NrAV{0u$=#SH#4 zLE2)q%<UADH&I$um|>^NwBU^>4JJq<*14GLfM2*XQzYdlqqjnE)gZsPW^E@mp&ww* zW9i>XL=uwLVZ9pO*8K>t>vdL~Ek_NUL$?LQi5sc#1Q-f6-ywKcIT8Kw?C<o*=Aa~- z*eA0Mgmu5-j8rTh^;={1$#X=Ck5Gk;@KK#haYa^sXr0^_^Q84%+WOl3?#Mc#{{d}B z>(_3pbR`e|)%9S-({if|E+hR2W!&qfQ&UiF^I!|M#xhdWsen<tq75@@WHX{+T3S~F znoMw2v{^ia4`fkd=3p<6XkL)!lsI%8iq@>v^wpKCBiuxXbnp85`{i|;BM?Ba`lqTA zyRm=UWJl&E{8JzYDHFu>*Z10-?#A8D|5jW9Ho0*CAs0fAy~MqbwYuOq9jjt9*nuHI zbDwKvh)5Ir$r!fS5|;?Dt>V+@F*v8=TJJF)TdnC#Mk>+tGDGCw;A~^PC`gUt*<(|i zB{{g{`uFehu`$fm4)&k7`u{xIV)yvA(%5SxX9MS80p2EKnL<HSdiWFiAy=3UmV-rj zc%^|o`X!t!vuYErrUzbG?ostY(qs7GE^=Z33k*P+F6r($h_?W-bHJ|GUK@Wlv9++M zG}?Z?8{_X${_c9aOXw4qfk0vTaVRH6FMOnFD?w|zo{zKKg$8wzW&yufWk&idB=+9! z^dTI@g=>t<HJ%Cd%{u~X`lRpMFg&X{m?Nw#T4cg*?z{+rC($M4z9RHV@8KoueD7_) z8T@i-6RG$5%_Y`lSjj|?wSvITK5c4g0!Uq49VAn-H<9~;vn7~hBdYuDOt2$gtNuBm zo8$Y{2lwMxZNbfb$Hm0T528Og7Jfl!35edSr>CZ>tlX>*Z6nd&6-<c}7z{sZ9V^Ux zMNgR3$iH97>Mv$5rHD*<Fmux@1NkgiA%VmyOAwal{&*L*?*@Cl?&!jtcf3KL{{|8z z_($$R;SoAei#gUO@=7)M7s~2aAxJ>db;&IBK3KH&M<+ArlGXDRdX1VVO4)&R$f4<g z`M~bg9+=(|cc^a3vB10?3GZiq$o|Zromh?lE2%m!alG4CIrvmRZHZVSM>NxXI>GBh zSv|h>5GDAI(4E`@F?En<q4iBUtn-fux#Jt=qU6#PBE4-GhP)}OK!CI;i(sJ6^VIJF zwJMEAeGKMb_^`VbA1hFYio)roSCrLG-NL5Yqhb{sh3_zt(Zg93UP*;!m?}k&V`1AB zNYPri&yVkXW8uO1geXM3Oj&$G%~#Jd%h;?JDKwrq;P+!t&4W1Z^1?Ikguvk#bK?Bx z$w5M*LxgRe=jz?UiDBbfC1I3!cjeMD*ueh4W0S*z6=TAf+ZYkG$}FGti`ipjpIK>W zS>#c&Gw6~_XL`qQG4bK`W*>hek4LX*efn6|_MY+rXkNyAuu?NxS%L7~9tD3cn7&p( zCtfqe6sjB&Q-Vs7BP5+%;#Gk};4xtwU!KY0XXbmkUy$kR9)!~?*v)qw00!+Yg^#H> zc#8*z6zZo>+(bud?K<*!QO<vKd$8TBt^HLIw%iB>4ehiTCK&PD4G&n)Tr9X_3r-we z?fI+}-G~Yn93gI6F{}Dw_SC*FLZ)5(85zp4%uubtD)J)UELLkvGk4#tw&Tuss<g@J zd3(n+h;=s-joD7pea}*kl|?T5<3W!rK}V)#HpvFL3uRc{oe_mV<z1l~^m1_TkJDu3 z;JtNs6#g&&@E09TG{#Z`zh|EKwRTiJr)s50$5?Nrhn68HAr=rV#m>a)mTD$R2&O~{ zCI3>fr-!-b@EGRI%g0L8UU%%u_<;e9439JNV;4KSxd|78v+I+8^rmM<g+mx0&Si$a zgf1uYC03KcCN)Lz!>f3f40Jb}wEszROD?xBZu>Ll3;sUIoNxDK3|j3*sam2tC@@e$ z^!;+AK>efeBJB%ALsQ{uFui)oD<x}JL&L^@dTz{b&_?*nsS;lNnoJ@(k9d5xVq$|w z<ejC>oq()2USi?n=6C3#eetz?wPswc={I<8x=(8lE4EIsUfyGNZ{|KYn1IR|=E==f z(;!A5(-2y^2xRFCSPqzHAZn5RCN_bp22T(KEtjA(rFZ%>a4@STrHZflxKoqe9Z4@^ zM*scx_y73<sFS1_?6+u!sT9fvjld*kU~edMy>?Q{<Kw(x)TAd1JfBpLz7(Nk)Jsdz zj7#eyM{0^=a(C#N_pwZ(&^&zZP@5Qw`oUBRW0i<S2ql<0tEs~>vt6?~WEl?2q*;@8 z3M*&@%l)SQmXkcUm)d@GT2#JdzhfSAP9|n#C;$E8X|pwD!r#X?0P>0ZisQ~TNqupW z*lUY~+ikD`vQb?@SAWX#r*Y+;=_|oacL$2CL$^(mV}aKO77pg}O+-=T1oLBT5sL2i z42Qth<Jh0Ysw=K%u7GarF`3bIM1>2+0@C`c+*D0*5!qy26sis<9a7>LN2{z%Qj49t z=L@x`4$ALHb*3COHoT?5S_c(Hs}g!V>W^=6Q0}zaubkDn)(lTax0+!+%B}9Vqw6{H zvL|BRM`O<@;eVi1DzM!tXtBrA20Ce@^Jz|>%X-t`vi-%WweXCh_LhI#bUg2*pcP~R z*RuTUzBKLXO~~uMd&o$v3@d0shHfUjC6c539PE6rF&;Ufa(Rw@K1*m7?f5)t`MjH0 z)_V(cajV5Am>f!kWcI@5rE8t6$S>5M=k=aRZROH6fA^jJp~2NlR4;Q2>L$7F#RT#9 z>4@1RhWG`Khy>P2j1Yx^BBL{S`niMaxlSWV-JBU0-T9zZ%>7mR3l$~QV$({o0;jTI ze5=cN^!Bc2bT|BcojXp~K#2cM>OTe*cM{Kg-j*CkiW)EGQot^}s;cy8_1_@JA0Whq zlrNr+R;Efa+`6N)s5rH*|E)nYZ3uqkk2C(E7@A|3YI`ozP~9Lexx#*1(r8luq+YPk z{J}c$<WQa$CfVIhsE>s`<i2`cEPYHzF!ZIy?L$}MhAPFqQe@_8Lh#cQAH~-zZ5p$u zZauEKr<oluR2T6z2A|B^#roi2jr3F<X4&!ZjiXo?9nIbJ4iAii=A_@&#n$TqH^#R& z{$qMQO7u^&7KEB6l{H~A;ylPsJw2kA4#E2@7dO%lsi+3{VJ4?~e4(Bz-tw&^YR9P1 zTlpCH(W_%+@#|?%RN0HM=U?pU5$E2f<RPK1fw%3KLs--hd|lj})1h|Y<6CA3NsuSI zl=<<g*vcJW=6yZY`aXe5QUB~awgg5fxlu%7u#A8=UXt61U-7wGtR{L&XvKbUf-}PL z<eXA6<<r^;=`XwtFN1~2J^$Y${#Q0Tyev?j!*Z4q^mjQ4ah)uW_s=JkrRS%l*Ut`> zPM35Fx(YWB3Z5IYnN+L_4|jaR(5iWJi2~l&xy}aU7kW?o-V*6Av2wyZTG!E2KSW2* zGRLQkQU;Oz##ie-Z4fI)WSRxn$(ZcD;TL+;^r=a4(G~H3ZhK$lSXZj?cvyY8%d9JM zzc3#pD^W_QnWy#rx#;<pgDoauRid_B6w$J6XKKeAcZHU9rH9=s!y`%~e@hGc<c#A7 zRRTR`&dt`*;~VYcVGk-~aNB!?q#4B&%52?dI@=%LQ>c&N@sqHhrnHRmj<I9Tx4aSD zVUQ}9lh=Kd&QIx0uCqYm3pFs_*L;b|$xyZks(AAwgYsH85PAL~ndH7DNUoZKBHCWu z_<;@&ed^tpoO=DG4Hem|2>#i;s%zLm6SE(n&BWpd&f7>XnjV}OlZntI70fq%8~9<7 zMYaw`E-rp49-oC1N_uZTo)Cu%RR2QWdHpzQIcNsoDp`3xfP+`gI?tVQZ4X={qU?(n zV>0ASES^Xuc;9JBji{)RnFL(Lez;8XbB1uWaMp@p?7xhXk6V#!6B@aP4Rz7-K%a>i z?fvf}va_DGUXlI#4--`A3qK7J?-HwnG7O~H2;zR~RLW)_^#La!=}+>KW#anZ{|^D3 B7G?kd diff --git a/vendor-local/lib/python/rest_framework/static/rest_framework/img/glyphicons-halflings.png b/vendor-local/lib/python/rest_framework/static/rest_framework/img/glyphicons-halflings.png deleted file mode 100644 index 36c3b1ed9e71dce20dca9e35c36c97fd8afd718c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12762 zcma*OWmFvTvn@*S;K3nSf_t!#;0f*-U~mb+2loL62q8f5;5xX@;O_1aATWbFAvl8s zx6A*WyY9Ll-g)nR=~Z8P)$aOLSJmFt9sWr}kr0m-4-E~CP+3V%3k~fV^2yG|#eBMA zVMg|#p$X(F%YD!RFC6+iIvC5h6zSE}nGUx!$gx12=)Bn<a>Ts?f5!~Ii*|f-ooX*( zJ^yb0Yb_C(#Hg(h%MSu3Qe1*BJdRF(a>fYrnWhq6P&LhxcEI19tT3uE8GL^0&Q33d zO<o2-f7aGnLEm_keXo7nQQUHq>6EQ~u3IcFpxUk&zIfrjhbTRh0y?)3p6dXU1S|%U zp$48aZT$xpE7#_1m-#)+vOF$x>3yW+O;Yv?Ed*5A4L8ZaU^P8FVqW(Fr$HfIsB7DP zfJXX5KFWE9`p#l!@JhKgK&>C`B}Km9;~MYtftwShcdTYRD5!c(PrmoX$IgwKxAJ;5 zNS?ktm(VtvZ)MPa1M~-CLGE%6gWCNn^kbPER5jcB*@ssC^ak_-?3j8Xd;QHI+qIXg z(Q~{s=Fun^W9{sRE*!*;gw&_2q$qad?)(guQE`qd|4?SM41n+V<j2IXVPe9)_pFZ6 zPS$x&9;#f_U6nO|9Y)`)49_ia=gO@dDHq=xcnTQAm6REpX6A4(m>3wymv>mp96-Am zHYT$w9Q4<Zd`-fDvmS-?B+pA?J(~$T*w&wk@P0}!IMn;<AN(NWaU2I(W>z~-H3*EC zysdLT&K_F&##lCR&Ew6C!`-2ElE_Ui9XAkZJ_G*!_*{SY%@xsWl9yKIoKTN@MJnQD zE<~=kE=h$q<-V>dtOw1_nic#JlLOavrmam_DxH$?P7kTrz`Trk662uv0w^&VG<Nly ztW{q{_jf~Mg2QEGS$Bulecus_{k@#7+q80JMgDGqsMxW-M6A0MtNxk*I<!NhCPv<u znD)BGJ2|3Q+-K_OJ<7N1{gozyl`0^4GbNyK-LrILI0cjIMzR_P>)Td-`5PQ(vF_tv zaluGu!10j3|8%OPNuGE;)fy~tQ|dBM_5=P=Me8HFmGODFo&MnoG_%ZPepB3lx6m!@ z0&RA)?8Wbz2)2$Osg_rPg}x5B2E*pMO1c_|s)_fKVUZ>gjFMsZjM1r8gN|C2W9lpS z3^6YQEn8_THGy=p_@yc@fp$6+{%$9Fv>hdS?4%Ug3(cOeCeD$(@4J+jjH3##4S)~K z$9JDLXFIaLZ||`!#T`zDOzezlZE1GFBImq)d>3~eF=$xeuvX2Q->c*g?$S(5+@?Pj zbQZh!mRFU3%CEa#vNoTwrDc?TD+$;pkUCOFb`ScSRIekFH%MB&DUVt|grd@3O5+h3 zjow^pcvxA1osKxR{>H$Pvf&?FENP(=>N@k}Fqe_SbSKwG*CXv+>GZ3)FM7$hZ96~p z9rfOxM2~~H{LppHHe0W5OJC{sg2s!F-8Wlx)l5OCxSqfeLVf!Q0H_rB@3CU?Z6?<2 zzB_|`;`vyqQ^38^o$Kjf(*y5g(PzRrO$tT~8k)GAVKK!bx_?9D`-#h<8)2&s^}(<0 zo6_zF1AlHFx@%q2SVaiJD!k}V0Z7Slz(AYI1h8EHb1uD2)-zgwPXO8TzStwx;Kre< zrNAorDig$i2e5TpEXAV;I&axvtkcf#Immc&nXzyM-P{&`n5(@OD^VG>;ALem%CXvx zek7oC4N5@bVM?Qe+FtYf*oKCb3CEPZ%QLj2q)k8R?72ov37kSyfRDu}&tqb#ybiOz z$6p%zW6R>UVDC;18X*3(N(}%giebFl3_2_QPCr)hMJG=zzcRIU1pVW>^xG5M|D;-b zph{Jbz<31fk27UFpaCzVaxiM%PT23eWVYL2f#?sI45!i$)om5-P;1gu;R$`3hj+5G zmc7#KpgE#ofq(sXOz}yS8oy6xB{J}Z7T(`w$0Ow>qP$njLci)phh6%n$osF|o0?hu zh1C(b6mG*9J@y+qgl;0<!+ADg`_e5})i&`CzYH!lXS$jsE~3W4Ffck2650}PPB|BI z4Fg)Ggusp!&TFRk!=9fBP%elECHN7@D@?y3{v3q$IIt<#uN7Bx#~lxxAty4hliQkK z{VlxDARS@wnI7^nD6GR>aA?WL&Lu<n(RH&`N)PFLPgsnpo7udsbA6|{xJv75!+eFu znjHCJLhcRoQjSm-ES1d2qsR^;Z7#3nB?mrmmZ#5TTtHCd=RD--N~3?Q{F$})oTzs# z)8F*N0sN~@Pi~@)o(QV>9+MKe`Y$G{J*q`ane*T;dVBcD3{iT>X3}K*O_=^>Qby9V ziaS5x^2{K0xW#oEwPMml;J*|7FkJhdvIhuRB*!C~EvGVY%$$?*(ZPjD=;yTq$;}bM z^AqsSL@xd~g|n2OL^MEHFPyT;14o2rtBqR4zxr0U6KD4tPyhT4yg1bNFVm>5dTH-~ zxKxKCA`NM}6PQy8xoWae5F7uK4>C90ZM`t1;1m^>Wd<G5c)RgT)@z?ToZl%j#(K_) z3;f(2^O|s!!U>f4&Dlxp4?BfRwC^A58sd9eE#}B=XLEy)K4HoGm9%h`x4M2H{QK&7 z)$$;zx==%mOXNBLnM{njZ)AILG!)B9e%2v?0_LiJ+zQCsI%ULT7%-<k><Sk9!@r)H zBBuJNm!+pkKb6B4Ql1TKF~F{aRR~%iU|+|ch*}Ip(Fj?Or9Sn=|H-J{vMC(mq7||} zP#_aoRwMaR7gva@5z{TmtYa-HyG!!<6-{y=3DKRQVkOXOFF!2I>RZ2{ZZAdYghZx* zqrG;)@D>I`zp&jz3Kw6xpT^xg{WNn-Pylw!E^6WHhSP_1FwbMkEUUG=STAJPAXQHH z5`>SJwO`hgx8Pv&wueIuZXXa;c&UD&zA-BzT_pV6L{GC(s^w~@GE%Q_h$=tDkTH?M zPVo+s3K&(qQ=zn~+g3F)ut3%~yEua6jjj1R24mi_wP^w#g?=&7L~dkW-17<1cr@>M z2(q{H>aM+8y<QJ-3D&RIu5ueRU{-krzdZpQH|+&71-~xf@%%C?qflN;dqb|eD%Rn- zWO{gQ=TizZVl<K9ll88QM1uxba_cb~M{{<fzO=!hc=nZUyt!1ETfs+s>Ur261yl=P z5$Yvzt^*_ADb8cNY96K+s~CzKql=hXpr-mPS-)RrMi+;-x1Q*JPSS}GPJ2n?xIPtd z>CO77-bJ7>9TLLL1_UDvu)-tW!TY&-+-ly5<sbYlL!<h)W-khu44(R`18dpG*hm<; zX*y1rVR^>*V-bBa=6rl0trIUuTPmPfoAIvVy#70A%zeFFOk~BC&%27v%#aWBpT1-g zEc{Mv<;NFq?ETM)-Lz9oW^1_imf!r?^G4n*ip^OL5-qv^r<lU2UE$Gm9d@q-1%;<C zlJ1;b!;RzLf9H*ZsRF5V{<v!c+YerP>JmFsB*}=k0V`^K7o|*ZawXeRG-?(vl44;; zH!f{$Qs~a-A)mTCHA4m$sPKN~$SB{E?cK<%z099wS4{W`5-EM@T*(EjkfJ#HV+!Yr zv&!&}B>f}x3qDdDHoFebAq7;0CW;XJ`d&G*9V)@H&739DpfWYzdQt+Kx_E1K#Cg1E zMtFa8eQRk_JuUdHD*2;WR~XFnl!L2A?48O;_iqCVr1oxEXvOIiN_9CUVTZs3C~P+1 z1}ebyTRLACiJuMIG#`xPKlC|E(S@QvN+%pBc6vPiQS8KgQAUh75C0+q{sheaBZ{sm zR1AUbM#G*HKPp$90z}3cmH~IQir#(Cxo9}VYrXSmtQ+5O&3-xt0%Ije3<?Gke>|Qv zc!k!qJ$%U>_vpD0@e_Qt&*NVj(S9&hlpLEV#);E74ieO~PaB6(kj1l;5X?lpQRZ_s z=ICQ}1_2mHDT_Axl95mNB=#Ei5z&!}R^X)%HXf0;?D<BP;<HVQI1JZt*v)6RAq&ga zgO^!F$spXEh)>N5z-5+1Dxj50yYkz4ox9p$HbZ|H?8ukAbLE^P$@h}L%i6QVcY>)i z!w=hkv2zvrduut%0h}-nJf}6JLhY1A4D!tyY}I6c85`fG2xM&yjUh=XA$IcaYLxjo zJ6PJ;r2T$n2GZZ+&blBqN@;fP%v^kz^?uH{Kpq(Ih{eCW5OnE5%HakzY6sMl!wfw! z(lBl{oyDuNM|bEKU#YtRTTK?n-{?&5Szx)y^~WKl(fG>F7c5?m?|t$-tp2rKMy>F* z=4;w*jW}^;8v`st&8)c;2Ct2{)?S(Z;@_mjAEjb8x=qAQvx=}S6l9?~H?PmP`-xu; zME*B8sm|!h@BX4>u(xg_IHmQzp4Tgf*J}Y=8STR5_s)GKcmgV!<zLBv<JCu*R*$7_ zb_L{9GvwPbpvkT@1&MS$ijYfuLM?Pa-BA2}iX9A(2K)AF@cP6QkvvCLyswdDf?LI~ ztZ|qKPtWR#^oamFBRcUks5b$Sc+=%VrL*7Ba(pp>$JKTg@LO402{{Wrg>#D4-L%vj zmtJ4r?p&$F!o-BOf7ej~6)BuK^^g1b#(E>$s`t3i13{6-mmSp7{;QkeG5v}GAN&lM z2lQT$@(aQCcFP(%UyZbF#$HLTqGT^@F#A29b0HqiJ<ZOKS1P#S0IU6Aksj|#v8#~@ z;BM&NsA_41G%!;y@}&UCcyK^lgr8ml{>)eOlj+RyB}{^hN4tQ$lLGVu2z+<9L;~B} zDf8lq5DYULK!ur6uHM=$?6*c#9Kjh(vtflZIAmHFG$IV9UIiB#4pNG<%_cWCArI%? z7j5oD*G~ApI-Z)65z_p`3Db-Bz5_KDQVS2*<Jr_-8kj|AS}kni|JrvxtYqjwfhp*q zpO>XvygHH;Cd)TFo1UKjmHAT3B?}sp<%IKBMD$Q2LX(X|95GgYvkZcYeeFwMlecnw z2*--B;Ih60IZ@#M*tGti`We>WoBV@1sTCD6VcY#rpF*DERQw@BoE@rYR-vz&yWpq> z4@nhK=JV(AR#5OPUU6j6PUbC?kLDHcO~R8EQs$-jj5G0Ze^m>L1PgThm`c#8R#{FG zw;hkje3y?ew`Xt#Q;GielFC`UZoBJYWuC;KCtW0pQN8BZ_8-;8vf(QAKxn;qI;?~B zQ%hnDn&o@dBiqEQuTI-_a@0n?mHjrlwmUo(fux1(vKTZicrLF@)n_<r^;896`h`+J zz_&iujf*PNV3G`%ch5)LXH1!YjwjE3ry%F%lSx6G*zC#f`LYft(qi&{a>K_<{??@0 zssH!`uPx+Tk<)ZHWusJk>#SrXGI8a1$#K7xHl>$V$}B~GyjqGc?6iGGg!MfTpv{z* zi*6jH7l(w;kEkLq*q3b6TsWzE>+n<>6Wvm6b5{woj-cvqMidD0#yPC%%?h+cPH^~# z`T2{{6;Xe<sn1}M=MVYSL=E8QbONt;Iv;9FthA4B@I^v?;+4;c>6~9!2X-7waz}`g z4+AKMi;JJUr6knX=*Z{g<`lc%t+kb*+y+)x3@Y5;-MmbqV+*xEJh;AXcr1r8yJ#aL zM4*`JYqdJCFL0RLQiPF)O|A%F%GiC7_7F|v(?=Pj6SQ~3C2_g}FmhO4L1h`+MUk+c zyAOj=`d|lMw)Yh9Yx{{{jczim;pjjVtGh=u@hb?`hnPf6u7q2f1{hd39?F)&&AxTn ziktI|4eqgps#oCIL75neDam_)$*>k$%9dv^Jr`ehjL%Y+{4=i$5bT<#%Fv7Tg~gif zNV=CkPi;EmD<)-`*vpBJzLw{`w+Z#9I?+`BvR!-fQBcXr=7{nyIAS5+s$So<w_H2I z`8%Hd=H>siM1QH*EeALoto!wI<56Vz=z&r6X;h=7yn#{OJagPa|NM_i>AsMj^#gR_ zOt*gO)v!_<B4f6*kd&(aQU>=mAin|4ce9^vB@(i~8m}{h)A_)Qs^!uI-kY}EP8Geq zYbh<iC4Dt?6e;Wd9o_yn#5Ru&OUY6sMor#e&4)BDhJAh@|H&h3JJ+;?EW1p(16tJg zmuX*Kd84Vd>gmyPV6t9KEy|Lt{*4tTuMDON4*GkW-z;R@dPAN-{Jpl|b`rc^{_m!- zZGtNr)?QoO2vBI7DxnRLIN5b9ZVX|JA#DksTn(nPkzNfSW9YptDQIFOHLWJ*l#B2W z^;-qTz-ChEA<+Qb@{9?j<bMD_(4uHO|Kol38=y+QQZi2Z0n9xEE+l;2vG|Z;bHDsY z`vnporHPm-0qy^p{Xxiw=(ctR8Qt$>7_8-YDgG+Bm+d`R-~OKPG-CVh+(~kllUEHG zR<h1RJBvR(Z;isa;Zj8YT{79n=}H<x<4-|rdWWG#^$hU~%{!=tMfzRf-HCcLr*U5; z{KcPql6q=>W|$~2%-T|v{cRn|OJfpS0TiAWx^g_Vb)vkoTWac{<j=r%fh+HeCF4^) z)ft8?T|=xsB@!~#yG)x0!|>o=xlk5t$AUlL#>n9*CRVJ>QNqAwn$IAAgpQ{UT~N>k zK*g|fhf7I{3$P5fS5wgGB<W&At@wl{0FmVVf#|usp`3BObwpn}D(pU#%%4GAKX-R3 zlw-YQ@6KjKa6eC7-xf9nH2C1xfg{J2IO7?PnEO0T%af#KOiXD$e?V&OX-B|ZX-Ysg zSs%sv-6U+sLPuz{D4bq|pd&|o5tNCmpT>(uIbRf?8c}d3IpOb3sn6>_dr*26R#ev< z_~vi)wleW$P<Wyn_7n0-l)LIgF0z;$xTz(0JgW0t|K0{|pl+d7{+{fAW)lB*QFe;y z1~qrplnmDSP!2>X|5yM6?p#~QMXl9?k4A;%DaRDDtND6wQiOyh__nd_64&F!GuEvp z<L%OGY6L7;-(R=<JyLzXJM!Wv^jD4`c~Ialm1x<-1E&F`_dMnu@fCr5Pr<dtPlfA< zZ*`%$WS?W!M7-X@Sw}lfu7sLkI`BK6gTBwv0nqdk^SqiGBO}U16-Ky}DlzfpVxxnE zAc|MG(;#A7b;H&MP*riEHr)r#)GhX2`P6U_@Ov18QJwI7yr|=6Y+TbD2PUEPfsh&V z{s?8AA2dT>ZM{{>$Q;{B%67U-%G1cf%IXEk=E5cj6b=*xkA`Zu*9Hhe(N~k`r6cTd z^aSjQ3-8*=WQG1qVk%E^(q4I%(lQnIf$EUaszraq!1wAM5BoQ8xC9}oy{IY$I1U=T z(ql4n%~D$k?qG@WqQu&-vq{xq_P$LJcRpquzCZ1e!N(o)%{9}VT)1>xcY@^6E6voS zMs4Z0<_v9kO?5sv!7F*g2sne+k}G8xgrP=Ui1%RC&HjPN?V0YH8W5ILKkX|XoM&aa z9;0Gb*HsAOlpa@7r+2K*w&XP<yV~D51b2)9VWXzI=5{u_>nF5_O$sSZLSJjWYIT5e zG`dX=@qnSdkm54ELW|`?8rFE=+7`?z#<f&9dkWgq!hhHS>>wd5WC=C<n+>3N)$^xL zs;&O&#W2!i7P8AU%QKXLt|&q2u_}96*lmOW>*zaLLk=(+B})4=7ji3~lqqxwhqu_+ z(x#dI0tIft^aDuLyQ;3%<D_kijHwmxgZ}ETBAClOOE|45*buH&eRNR}hwR=5m4OqF z$p6lKJ{BUEe6jIVeNN~C9UQ8;M^mg?837wF=ikxUywk-Gi{pNHuRe-;w$Gmr>%z&3 zMN4+x5fFBFf_@>-AjoCd_t2kTil$n0kGLPcoAr|Ka^RLRj*7QxqT|`(X|(uVu^~~+ z5!z#SuB2-Kb4w`%^x|t$h~}FwA1ar|NdZ_bk<1_<GPD*VPM}mdXY^&Lr~9aRyljwp zWMp7Hmxd00hR&n6>n^IHLnDA0u#DJsBw-tDt?^@LGA>Wv%<gE!kN<M`QB{Ss!};A7 zYvU{8)R3<%NiaZ4M#%(7tTc?jNK2oSMcW5Pxl$WQ@F%)>pG2!FL=I?UCU+aW(^@p3 zGGYAtevh;s23pmqD49vt28stXN;h0;hPT<Ky1U;~S+1WC<ohQOy&dP!A(Wu}g*3|& z9!4#Zei6AkM^Mf%<(q2Y!!E8gqFCPntUwBFq8`rM1xM;Wi_@ihpE+%yM#WDcrY6S* zFP9*&7F4%1_UXWMsY>_XEzc#z;+FeOHPjX~DTZo=KTtAXR%a>4)^fzoTB!wbWigl) zbp3aJLs9r5il^=9>TLZyrsi|J95Sodj~#rUKcZ;n!Y^{Q5iaA%#68Ob(nTnhv_%LZ z&52)!{N(B{{m&8P-YRvfOx0Hs4>g78m;!uYdCqLgz2Q_@DnMFYZ#~B1`(CweEA^(U z0F2m^Ss{<Sy!Hf=Sh||l52c%L|BWwnyNxY-4;PHQ&5W)=b{=*zO`bxH-zasdv8usn z^+opLElP3+wi9G>l$3gdF%2VIAR4+$quio;>hN9$zq|6H5(X-Zrx#-*WR0tBe6L`r z378IB61Dpe1X}oHwQt0a8_RPht}y~>ib@-gKZE+`afk1Y&c~pdrB(XBaF43QQ2$H> z?}npI=3Pvynz*@72c^2N$eKPR?kwsqWXK=-ZTwxwPe8Ae`^Y!MR>HvFKQ%tpyD9QE zJGk`2rW@FRc`1qV(r2CXU%rJZfZSsUc2-lg7Eq2he*82@?VU#r_P=5}NE2_6^=B9f zK7vvYd06}XeY%@Pqxg<a*Byla(EQBX(<RlA)3-n99&*E*=uLcJ!|lYdqOJ=X;Agbt z2FA8mCDvk&1pKP(TiolXud$0xITJIp1E=TXd)M#Tx@HHvNtNyv2lM^{!}r_DI9pbi z8y9>g2edFHpL{1z57A@ymWg3q5k;u*JB*Q!DBFi2h<bHpnw_?mDMYDI!lELZ+wb6p z=X3a~zg7NnJY)jF>Aok?0^U$g)4d$yY(#z*_J!|%Jz9yyH|&y9LF=)(=p8Q@ci7wi zcRlO>bfId&j0z3ZC82Y+Y%<h1>%6jw7%N9X06J4QM_2+hyj0O0OE<0%{<ZsWfJVLe z@-~#p#+63E*N?3hY5={_!3)giIewv}A0Stb@7ZnK4Ym1q=?{L8YUehn?n2+O)L0p- z2t_%^kvR}H8P@4@D-=!}(Pr_3dLOy90|fa&x<{wY@6J?Swz`>?FQRrBY7yZk7&I#W zD*Y&E&MwzttVI5yAT6SbEnj6hf4>k!j-^?Dp)RxWyAqT6%^KNSq2{Vl_>Fe>$Yo<y zSg8K=M^kJ<Pv2{+5Qd+|#k1Y5P?Hc8^xl%JV)f3FjIXLNh5vgF0<15OmuJoH^?P5l z)vT^4fj&|xg2iu#l|($ro_gCOR&*t3)v+zOKMrzwgA29vGtb3diKsWtM=*vAW>DrW z#K;$iiqMTj7XAL{W}?@4Qzltr)|~#kSNlU7S!<{@$JHBLCMJfEd1nUTtjHjhYal)k z<36LA@vOrmx~DI66z1tm-*)?Rv$dw_f@s!xBVCftz;5euJODym`~#1e^bL2Jq;3@Q zwEiOTGz6_gC1nnVU%Sj-gPpMwP27&~RiBwOzNGe*CErr(eXQ;^0-nDRqk`CDahbk* z-SE>`Z$90akgo)#uLIH#62TwWwr^LUiS#t4PZZb=W-8B0ab=IWaO@=Q%jZAA0dztW zfpbauT<{OW?Q$B1vlY^2CA3E5%u$4+(ZUa6?L?+@AV?1dr3h4wWJK}0Jcxi40zoS+ z@9Ayo`Kagj*2oi}@Faj>)bj~M)UmiK3=ti^uNy=UQ&zI!G`>tl68&1s5~<o_l#=ZY zWFGAGywHEPWSG0l@*<m=OJWF{h5=*sC){0Y*sEDU2ZSl5($wNe{X&YX7`{2c9G=Hf zv5PmnYot(Q+vh%8dM<KKhvWhQM%t3u(nELHX7AZP?fuwn-Hymmt9VMR6+q%TOn~bS zK>`nBs!SIzpv|tMh}HL>R!$nP>N3Ite3xEvB`E>48xkt*Fr3}~xm-?5LgJjvWa&0U z$h&`x$83{D7{2e=Rnbvx7{!O@VW%v5cm_cuXk2pPqm3<l`23}ssDo<yIvzgzToRyV zxO=dslDZB33t>rKP89cC=gxhCtzdUxvqojG_a(m@L~jP*B-u!$s0_S*CZ3SW4kL}l z`3~YKL(q5~A6cIa);>&NAEvo<TE&)?+^~?HueA*75-94>8JxI(G-T}43=?qK28m(b zrDl}4-Br`ayml(p0cy+IWM<O3;SYLQ6^9mlI9N=rrcUcgRoEew<whnmM;fUlH=XKO z-LreW=S2wNJeNCiESYXac;5f-yd!H!l^$Py)0)JT=sfy(`8;oGZ<ELt34U=5_Y5~U zpCn*QAZa`*rjKkjOB4~Fm9(y(?0O>__Gmww2}I%?zX@wJA(0b9T>bs_CyZ_aRBh=! z$xp?=owe|(Bv%ord-g{=W?SMq(O9sA-m|FH+@sEd7HNv>Yp|qM(--0>i{M5~iPoXF zJ+v`LZesI5Zi2+x`|T*x{wroJTo7_o_q8R*El8ri)KPN$BrMkSepw*MIE9)ysC)WX zbK-Nh)Ph*nVm}_it|s6QnA8vA<rqF(i#N|=MS^_im|=L%`!*pL8f*Epn%t$OfRTfQ za*}uy)3*weB#b=lvlsn5<71;K{k*KI#@BUIM@HIapYMGl;M^HEUoOj=&E7}s3qx0? zj$h{kOHaAOw#Q@4UE=*~l*^lTb{LG#)OkL_V)<4yJYJk+t_^y_u#{3T7coJJf7{AJ zaPG?F!wFhYnKz^%S!z?iNLRlSyphxAD7BAWs4s44O2iM*aHawlU;6#0jC%UwY3(q0 z+ars$!0aS5p0tK*M(Jk^^D9E^*@eE#K0Y-~vk9yf62OocTMeV;qMeF!58uu}u)rph zMT*5e{M<wVf4LI*vE;SMGjk&q%Er{P8#!dV(f>d0@wDmC#SXS|_fzAh7SdJ1Cp0nm z)binZtkkW0c6-rd&Op-5+MN){K*4x^!M$nYQqoZXM#qM@iPD{?N$UB)Fx)0>Z_I5n z@YaWj7=`Lc=%8;Ei0Iw3@mSVW)}s==Fh@B+1aRR8<-<%nrB6b<6pM)!0aSEoVGi1< zSE-EKMs6j&QuO<o8gtUxqZB=4@Ui_2?=W_%yc)NT$Yfy(&!t*jM7<mx7;UM1Q<L*n z;P4)ib8E#g*cNEeu6TU>aMWshsF~vwh7j6DmTQTbl2FXro3R^sdb%<{QC^pGW;~J& zmCms2$P#+NC(fL9vhN@@`=|+mRbb7JofFSl7(i=wi-OCbuaXvWxsTlq`R@)7R%Y?# z;`}Gp1+#LnKhOmm5IUwMR-pZGA+4|=W*(4W2e(dWtAdlWKW`Or=^61@LE>WHZZv*; zRN~xhD6j`54b8ixwaRq>IRssO!C@uucac-WTpq6GY5Y8UFYpLR=?#rKE1$oakh(vZ zE-9YLq@p+rj0y??Yj9el`hstJWn7UZVZVMqC;*Yr&J=GtYK}&#CUf!8NIJ5oh3gbV zCzQ$pf{yUU5zHC5B(1ly(=p-t`^wBXNe>H?hFH-LFP5-)$0VrCbaD|3inScFI&3I1 zhB$2U_z%!=X9K07@uB_IK=a*pqRz6#hX+lWPRT>~_ohC4M;}vj`#+szElnr#cYGZs zQ~jR*B9DC6DsbpbnCA<db8Pjz?l|_3#1K45^qX%PhR;7F?5~EaZ1+T?6wEUzH&%@C zaW}qsmtN`3{wuNqOL^r=Z0}1$?!y`oY<6ap9j>9i`veomiNhxNRyA5?eWJLfFCc78 z7PMTk_7pQ;g{=`MLp&->aA3;S5{+4(ZNinY0Of~*??*>FwAV?U*Y$;$EuO}W_q^e1 z#uJ&Q+j{||h)>P7ZoU5%;5U`Q);fC|V#KTJ!0Uc-N>_wby_H9#XS4eJghB7jhZj<z z)G=Sz;SZdA<UH3o;=@HKS@eZ3^xlggc^u9wgkIG~M?d2PVaR~OG+gGvT{t?=iahVF z>7RPQduL^T;UTcZZ32=H`B6GA`6IGt6~52>Bb_CVVoM2pfXxSf&yzG}{;EO?S7*n? zhTKx5<uSbQ@&^2|@!l#TCiV`!hEGitL#B`mm4!#~!QIl+!viB0i$QyTLl<bi7Kx(; zge1o*KL=AQHsGuVv*=XZ_3q!FlxLS^^t{}MQZSokUMnkHs`o@)nCYL(Sf4vz&i4SS zl;wWi1S;2bC`&^wSz|gc3t1N3=mPg*sh$^RHPiTIW{3Y9lSeFS^ffKL^j=9it8t~K zciojnVjS*n$U*1Y{mcDvoRj!JPv^sAb*k;2L(5Ji0QXvc#y$pvyMs6pC~}4F^iu$Z zioNaa$Zh6frKvQ~U2I-H>>fgIvNUt2i*brZ!D$FlS_Zl6U94}T<HtdEmDmFzh$H8? zZ?~tCmXP4pHV{)V^TxH#_9M{(YqsY4&~rW9oAp;Y8q5rX-eUqrc7bh59PP*2y6x9X zf8EP&Lb4Z(BoV_uB7#b(H$}5+x03`OafWI;LLPNYJ}@aF{>Ek;)Z7boB^5q_rk-uR zcF<~HPLkDq54fi@)@5GG$T`-)S(%On-HnC`)bk&?$2g$nX(dez<FlH&3nWy;I02EM z0pfy^E1q_+|6_=CN?oAd1w_SDb&lHmA*<Xa@$i0f`$?d1<T;ke{3c3CEHQ%}yZVUt zBMft>wepb!8iF*!>D7{8OZ=MWa*uN<-NcB(9%f%e@l;KwVTGe&jDLv}9iYarDMv(L zUzAw>2n{kfy#OQ#V;CPaZO~kq1)+*@XlA8`_=|nKH#J)bi{0c1-<L9?FjJ@ufN~~# zYpKu2!+UQE@?_jcwsuVByF0nrf#z!di?;-}!Rc;ez-o%+)opgs7O|EVcOb<6C8yHO zSDE5}>pxCxS2a3Z>9d#vcQPjGyWd5je9A}5*Ys-!C;F?IFB-_a@8|LA1YRW_Lc<5B zwAe*AwylReH)j)Gw${9fxbEm&cA+eIrT3$yH(8Hc!*SlF!8jk5lg=Av=PbuEftJ5{ zYI8H6GaAAQWkt31{=9M=In@1Xk~mhKndY|c%~dmExZ>Y=?UTVxrq+t5(ecN5+p`pe zwctMv_6Ylzl#mz9>7bpB^6+#$FIfOr-%jm1=4jyfsEz?)SUH+ba$kaNt^N1y+oZ<d z(ykCgJ-e)RP^=F>uX?-u!Y;^*m?TbqRy5(n-z*Y2f-u?&6n-&U^f&@LUiMbP4{&p@ zEmlv(tGp>94&P;cld)8M+WLK{zhjFn{l+xBO}qDdRMP3#6)9q3_o?j%?zMlhFVUV@ zv;9U}L)<cNTi-}R>+|t+2QGGCMy&6qIT)@NQjZ`~n6Wf$Y4X)M?7-B}N^s|n|G^Bu zzG7hV#u)GNwXqXxtWy7o^S#UUsx!+Y`bK?{@XmqxXNl<yyJFgEeiWDKg2$p?bmkmV zve-@jzIjh8p~VSG1h{4~w^VWHdn3r2U7@oOVH)urvHVP8I>4q_dPeiinhQ8<dNv?^ zmnl}(u8|j!l~}=@;oM-f_NfCn<sJ{&1|+m<v72n`p3(BEaVil)RXhLu%p!C&7)3hO z8&`J<`x}(*>rTtH<B!`8|GLsTE^XNpx5>jo@|NDRlY|JF&*uJBFCmaCx6Sv*VXXT< zOz{81xPP>7;u=a9KK!iqmnG=S{Bzi8<_vJ}pk`m#m<rR<BXf3!J?pVTDuhI7=sN_- zm%PMnz|9|~2;KHcA3qc9*Ob-sqIqDPK5Z8AdP&a%XScUA-<lYi8zLzGSEyIp86HKB zulaVhQvRQ$k{1>pi&~XKGg!GJ2xF%un(8HgXsSO}1d*x9&cfAi%xQ2`nz0ZaVu#@G zaD_<aHd7UL0rn%{w+=m<;`aLw2p`j!tA@&(N4q~s{+df?Mj|WK1KzHM!aVK-Dk`%x z%6yJK@(9y?GS(lzD3jTBaZf%5v|9$vR)&ug`EPPjK7cOExx$_Yqz!pubjRv!RoI7~ z=h7HkhpJANjd3+p7?@;qok8c#yx5gV=VwMs{<f@>?+0G&#+AOE(#KB6O>utQX3qw( zd1C)M7%p~tw4uhj+0nr=fjS>zoqk`4dKh@0NCYoEGv?~>)>WEL?u3wxJ@1!_dJsDm zktb2OVpqW=><k~JyB~&rK5FR0D1Ehm`k|;Yb*^`>f@v79Z+_b<pli@f95#0RLS%ck zdLp8f_BLv*X*Vg-(Twdu^Rjb*2Ci$j(7(JdLE--zz6*_RIj*wRdq1OJ{q|x~m74L> zKt7>j$m{)q@_gy$Gyd+XKA)45B`ecM3UBBk}YNwwRTWfrSsaH=x99^A1{)P+w% z+2$js|LyH0017}BMTawcs52DfLTx&#-airyAi#>=Dc?{d4D$h&;$~Ya+^a8ewbq{) zuEgCrBg4LU1BMk&UKHsf!Ag$^Kj4{rA-_mVjfT-F#_%h$I&<#t8sVQNzHs0DZi(Mj z9`LWbom%4!ZuBtQa7~~FN+zqTE{$Z(V;c-E5kH7HIcKeNjSMavd8Mp)HGYX1iSRRN z+9-e|5(GRq#EPb7Eb-&rd5ryW(?Qy_9~5T#<38h2LD$P}qF(4{nt^%rJo?mK>OZ(7 z!&|4Q@+(Vi@l4+AUv;M9Rg9i{FqkRf1LU|<^5)EJ$eX+B=5=Ju)ySG%;4+(V?wLaZ zbDj6M1iQoACuT>P{4Xq12zbS^c>h`j=O7?1Vp~(jBml>Q`sMhBmWpm|sk&09H;LF- zQ9|1RQbzg_>p^N?vv71*ddJJst)+(1L%W!Z<&X_GKtL*dfvl^99{y)$+0fq<>l(}H zmm0^v0h1nUE*M)D*A5^n-h5S=d}Q!=au50)k{Bg~;HpZAywr@&+mnulmECN|bw9d2 zN;hzwG}H?JQ1tON`eV=U@y9;p8vrADVj{VI;zCchQ<ijIwZ)!)`379vCNc}T{-Zt4 z^_en$VxoDxHWg5fz0`xbQ6x{(;Z2#CL7V9lkLQdZH>V0Wz+iOMx%vXT*(6(KnI|4U zn|NB*dBEK14K<E3RLAKS0Uga;QpMrRc?aRkTfj7#*2&n{Dgg1kzKNb@wl=&7H89nb zIJeFwK0kNozXi?Zo%-yNUP`H*R$>Bd4xO5e2kE{>Ia3X;QuZE~3smDp^aG1>LBqM; z%+GTwgdT0cG`{5BUlqt?;4_3-_!&^gs=H5grs~s+&yPgnvIZdgHA%Wv_f?<~e9Lh) zjkoP)K)lLdyjBo$Ss3k2-td*q8O|WU5bP57hJxYSK!8-}@tZ}))pJME#&bLw6_ndx z_L;?eqi`P4ugp2D4QbcFexgfbBn=R_tE?+67_t?sR*LzJj(>oAvSjajhXes-`%;*x z&iUdZVWG4~DTv;fbW+7FzX@Y$>g!Tqaq35|?$p|c7)kp_$GZ}O&If%IkCVT7=gPCv zGGu(SviWtc<$=p=<He@Ki36jbG3w^6*So|5t$NsANOntOdCgQ!8tI?rK<h$*W~^le z2r{-u{EyX{q_JGjDlI;bT%p*+kJvo7lT<L^r_M%7OgtCF8?8}EI<n&h4TbW+E# zV!#Vl(5;wUNGYgXVtPFbE|w1iX|hH=9OI!_bl$xJJswOidO0p`LD)45!Y5P0x_g>8 zvZ{TJz1)?(K0gj6l9h~<fTHVpb4@c?c)yODmgVdy62t;3bNv<_vkN;uM^EY8rZX>E zM9yTDZ#F@*Ax;~7t1yiimX%8eP5i-`zT4p!@N^ZRZs+>JNLz*n55wwi?DG8vXuzg{ z_cG++))7@6bgZG<kbg$-9ZKmt_8>Mvm)(`ZF+HBf1rY!u!9OKq4XS7Cx$c5*uRY*| z<J9W^QA#c~hPE`8<$x2ms%h|3rnxMAj;$ZxwY*MV1y(bEG-JR{p@Um=f>E(wwV+R5 zmofG?heyGj8=@KIMdWN~rGC;#-&ki9lw#-u!b$+Uqlpli$k)@zT=lq={DUDcE7@78 ze^ZXL44N!TG@C2TCI*T11Qp7XOWiS?W?gjq`=3k0g6*$xON+Sh;>FD80;OJ&>DO+L zzRG~<&6qC#qYd?*ihr5e;K05kA%5lMZKK>Z?NNZmV77=Qtzw&){W&<6SzgTA5-gdQ z{8rCXA~<wvisoVrZE-qs!&0#5g{2)$$1G*`=(i{fW?Q<RG7I6u)mt=d1c~%ZiMs7c z2BnsQwN?cK=ek>6mrjk7EF$sm%Z)0=FK)Y-E*ioo9%-e%f5zvC__6EJB;>a!wNVt& zy(#|0ghE>ss>8#;%fdemEZ{hsxZ(BMoh;s+d^znQAt{#2ljdCZ`S3GH{xN_O$<ukr z4L*r)zIUfFjV)1Kg-`v3-O+q9UD`cz`l>lofuSbiSgyS2?I6v|H&QdbICZJ=juD@- zSOM{@cP|8qPk#TAk5^1E<XP8H;_|D>@x3uD{tqL}UyzGtj;v$KeH@v@i5o1Cwoise zm6wG%0_}=rex}<r%(V3tr>A|+QnNy{=Z-tx#M1187T~h{Mx#5^Br&}td;S!L&+L+q zRg(cTg#&vx*m_eO6z4X8*ap}a>sT*QV2tnZj{1X8eO&1P_gr+G>bBSf^>1N_;t4&8 zEQtr~8uP;_x9Y#gk&+uqKbg{z$$@12YNIz-B8SKK)sHyx8IWf_PQvO>|7@Ts%WKG0 JeEj_Fe*q52p!xs+ diff --git a/vendor-local/lib/python/rest_framework/static/rest_framework/img/grid.png b/vendor-local/lib/python/rest_framework/static/rest_framework/img/grid.png deleted file mode 100644 index 878c3ed5c196539c4e2da35b7787ab08e98b9cca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1458 zcmeAS@N?(olHy`uVBq!ia0vp^Q49=>MjUKFR#nCEMj*vm;1OBOz`!jG!i)^F=12fl z<Yk6LltlRYSS9D@>LsS+C#C9D<Q4!`GcedxSOJ;2sU?XD6}dTi#a0!zN?;XMKsHEN zUr7P1q$Jx`DZ)2E!8yMuRl!8hM9)CUj!Qv7!KNrB%__*n4XPc;vsKC{DJihh*Do(G z*DE*H%P&gTH?*|0)Hg8FH!{)%s?aU2%qvN((9J7Wh8O}f$0fBmxhS)sBr`ux0c37s zQhsTPt&$SRA~=A!GbI^rPeEx>4%n8IWc}2f)ZEm(l45;BJwtuC;Xu7MDalsFrAb+- z$t7TS!;J%bz$r0ZA4%9oA5*oBKFCE#E`)d=EDH3$9hZ$hJS^?Fp4#&|GB7Z|@^o<w zshIQj?!hAIPyvUFa?Fj39{jf#F>^SSJTd6tq0S!DeK!2h*Tl*`P5Yzc8-3Bx*#7*P z_lIZyDoaaS`}OwX=Dx>2?#<D!t}0>BS1xgR(Q!d=p|X>EOCN`<pp_D;faS3^)x^U> zXA4VQu*xH8*v`wH|7Kg_&!-n1cjuav&3^o%1B-!38l2qsw5vX{)ww9+?vCFTf>ud~ zg*GO3KC`e=!r@T3xzf`*c)d-IUlfFk;PBjy4K6tmi!A&4@cAEP$Px9s?lqTci7~T+ z-}^{4afY_30{uixxSHt*N>9t^Tda&0H5mQ_1`yCs#p`NH*8Km)_~-KFoNo=!_8c#s zWAa>N-HQ`bo%5fbxey)esBZQ2{nIXNu`Os-bmok|{*PU&?;Wq;K7ViC-rR_~+KOL= zH4)jidxUns0>)Izao*FaI~PF{%uT~Dk@j=8|5Dta{K8wv>d|%Hcb{Lgz3+r2sU6kg zmTAw9&-`i8w14I8wx>P5N6NF;+MlVs*O$JfT6WJou)_P>@A@uXTleG5F;Ur%rwkr} z9Cy=jOL!Yh{`u60)j+55f37_IN$UUe9sghL7uuB@5hwlYz5Q2<eUaI<M$aqHK~nO& zd#*7TCu+Cfdu3gE{6aLV)#<*4`koNEdG7b0o4u@l1WB4e6WeE2zU<9?{$YA;>Eoi? z8|G~6tcc3~n|batFcfpX-rfHA^NYK3=QY>WxaPaUGs?d6cXxkJIsW|O^e4z^d}6ZQ z{XhH5lWzwfnEw0KbC6*c*P{6UH^(HL+Z_Lz)%(e&^e>X(pJ#64-W$DObB_40RoL^? hufEOi_HxMn<eq$PhVnkSKkA@T)zj6_Wt~$(69B@oPZ9tC diff --git a/vendor-local/lib/python/rest_framework/static/rest_framework/js/bootstrap.min.js b/vendor-local/lib/python/rest_framework/static/rest_framework/js/bootstrap.min.js deleted file mode 100644 index e0b220f40cb..00000000000 --- a/vendor-local/lib/python/rest_framework/static/rest_framework/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/** -* Bootstrap.js by @fat & @mdo -* plugins: bootstrap-transition.js, bootstrap-modal.js, bootstrap-dropdown.js, bootstrap-scrollspy.js, bootstrap-tab.js, bootstrap-tooltip.js, bootstrap-popover.js, bootstrap-affix.js, bootstrap-alert.js, bootstrap-button.js, bootstrap-collapse.js, bootstrap-carousel.js, bootstrap-typeahead.js -* Copyright 2012 Twitter, Inc. -* http://www.apache.org/licenses/LICENSE-2.0.txt -*/ -!function(a){a(function(){a.support.transition=function(){var a=function(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in b)if(a.style[c]!==undefined)return b[c]}();return a&&{end:a}}()})}(window.jQuery),!function(a){var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};b.prototype={constructor:b,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var b=this,c=a.Event("show");this.$element.trigger(c);if(this.isShown||c.isDefaultPrevented())return;a("body").addClass("modal-open"),this.isShown=!0,this.escape(),this.backdrop(function(){var c=a.support.transition&&b.$element.hasClass("fade");b.$element.parent().length||b.$element.appendTo(document.body),b.$element.show(),c&&b.$element[0].offsetWidth,b.$element.addClass("in").attr("aria-hidden",!1).focus(),b.enforceFocus(),c?b.$element.one(a.support.transition.end,function(){b.$element.trigger("shown")}):b.$element.trigger("shown")})},hide:function(b){b&&b.preventDefault();var c=this;b=a.Event("hide"),this.$element.trigger(b);if(!this.isShown||b.isDefaultPrevented())return;this.isShown=!1,a("body").removeClass("modal-open"),this.escape(),a(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),a.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var b=this;a(document).on("focusin.modal",function(a){b.$element[0]!==a.target&&!b.$element.has(a.target).length&&b.$element.focus()})},escape:function(){var a=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(b){b.which==27&&a.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),b.hideModal()},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),b.hideModal()})},hideModal:function(a){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(a.proxy(this.hide,this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),e?this.$backdrop.one(a.support.transition.end,b):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,a.proxy(this.removeBackdrop,this)):this.removeBackdrop()):b&&b()}},a.fn.modal=function(c){return this.each(function(){var d=a(this),e=d.data("modal"),f=a.extend({},a.fn.modal.defaults,d.data(),typeof c=="object"&&c);e||d.data("modal",e=new b(this,f)),typeof c=="string"?e[c]():f.show&&e.show()})},a.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},a.fn.modal.Constructor=b,a(function(){a("body").on("click.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f).one("hide",function(){c.focus()})})})}(window.jQuery),!function(a){function d(){e(a(b)).removeClass("open")}function e(b){var c=b.attr("data-target"),d;return c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,"")),d=a(c),d.length||(d=b.parent()),d}var b="[data-toggle=dropdown]",c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),f,g;if(c.is(".disabled, :disabled"))return;return f=e(c),g=f.hasClass("open"),d(),g||(f.toggleClass("open"),c.focus()),!1},keydown:function(b){var c,d,f,g,h,i;if(!/(38|40|27)/.test(b.keyCode))return;c=a(this),b.preventDefault(),b.stopPropagation();if(c.is(".disabled, :disabled"))return;g=e(c),h=g.hasClass("open");if(!h||h&&b.keyCode==27)return c.click();d=a("[role=menu] li:not(.divider) a",g);if(!d.length)return;i=d.index(d.filter(":focus")),b.keyCode==38&&i>0&&i--,b.keyCode==40&&i<d.length-1&&i++,~i||(i=0),d.eq(i).focus()}},a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a(function(){a("html").on("click.dropdown.data-api touchstart.dropdown.data-api",d),a("body").on("click.dropdown touchstart.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",b,c.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",b+", [role=menu]",c.prototype.keydown)})}(window.jQuery),!function(a){function b(b,c){var d=a.proxy(this.process,this),e=a(b).is("body")?a(window):a(b),f;this.options=a.extend({},a.fn.scrollspy.defaults,c),this.$scrollElement=e.on("scroll.scroll-spy.data-api",d),this.selector=(this.options.target||(f=a(b).attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=a("body"),this.refresh(),this.process()}b.prototype={constructor:b,refresh:function(){var b=this,c;this.offsets=a([]),this.targets=a([]),c=this.$body.find(this.selector).map(function(){var b=a(this),c=b.data("target")||b.attr("href"),d=/^#\w/.test(c)&&a(c);return d&&d.length&&[[d.position().top,c]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},process:function(){var a=this.$scrollElement.scrollTop()+this.options.offset,b=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,c=b-this.$scrollElement.height(),d=this.offsets,e=this.targets,f=this.activeTarget,g;if(a>=c)return f!=(g=e.last()[0])&&this.activate(g);for(g=d.length;g--;)f!=e[g]&&a>=d[g]&&(!d[g+1]||a<=d[g+1])&&this.activate(e[g])},activate:function(b){var c,d;this.activeTarget=b,a(this.selector).parent(".active").removeClass("active"),d=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',c=a(d).parent("li").addClass("active"),c.parent(".dropdown-menu").length&&(c=c.closest("li.dropdown").addClass("active")),c.trigger("activate")}},a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("scrollspy"),f=typeof c=="object"&&c;e||d.data("scrollspy",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.defaults={offset:10},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),!function(a){var b=function(b){this.element=a(b)};b.prototype={constructor:b,show:function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target"),e,f,g;d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,""));if(b.parent("li").hasClass("active"))return;e=c.find(".active a").last()[0],g=a.Event("show",{relatedTarget:e}),b.trigger(g);if(g.isDefaultPrevented())return;f=a(d),this.activate(b.parent("li"),c),this.activate(f,f.parent(),function(){b.trigger({type:"shown",relatedTarget:e})})},activate:function(b,c,d){function g(){e.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),f?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var e=c.find("> .active"),f=d&&a.support.transition&&e.hasClass("fade");f?e.one(a.support.transition.end,g):g(),e.removeClass("in")}},a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("tab");e||d.data("tab",e=new b(this)),typeof c=="string"&&e[c]()})},a.fn.tab.Constructor=b,a(function(){a("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})})}(window.jQuery),!function(a){var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this)):this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f+"."+this.type,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);if(!c.options.delay||!c.options.delay.show)return c.show();clearTimeout(this.timeout),c.hoverState="in",this.timeout=setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show)},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!c.options.delay||!c.options.delay.hide)return c.hide();c.hoverState="out",this.timeout=setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide)},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.remove().css({top:0,left:0,display:"block"}).appendTo(b?this.$element:document.body),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.css(g).addClass(f).addClass("in")}},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).remove()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.remove()})}var b=this,c=this.tip();return c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.remove(),this},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0,html:!0}}(window.jQuery),!function(a){var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content > *")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(a){var b=function(b,c){this.options=a.extend({},a.fn.affix.defaults,c),this.$window=a(window).on("scroll.affix.data-api",a.proxy(this.checkPosition,this)),this.$element=a(b),this.checkPosition()};b.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var b=a(document).height(),c=this.$window.scrollTop(),d=this.$element.offset(),e=this.options.offset,f=e.bottom,g=e.top,h="affix affix-top affix-bottom",i;typeof e!="object"&&(f=g=e),typeof g=="function"&&(g=e.top()),typeof f=="function"&&(f=e.bottom()),i=this.unpin!=null&&c+this.unpin<=d.top?!1:f!=null&&d.top+this.$element.height()>=b-f?"bottom":g!=null&&c<=g?"top":!1;if(this.affixed===i)return;this.affixed=i,this.unpin=i=="bottom"?d.top-c:null,this.$element.removeClass(h).addClass("affix"+(i?"-"+i:""))},a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("affix"),f=typeof c=="object"&&c;e||d.data("affix",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.defaults={offset:0},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery),!function(a){var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function f(){e.trigger("closed").remove()}var c=a(this),d=c.attr("data-target"),e;d||(d=c.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),e=a(d),b&&b.preventDefault(),e.length||(e=c.hasClass("alert")?c:c.parent()),e.trigger(b=a.Event("close"));if(b.isDefaultPrevented())return;e.removeClass("in"),a.support.transition&&e.hasClass("fade")?e.on(a.support.transition.end,f):f()},a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.alert.Constructor=c,a(function(){a("body").on("click.alert.data-api",b,c.prototype.close)})}(window.jQuery),!function(a){var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")},a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a(function(){a("body").on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})})}(window.jQuery),!function(a){var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b,c,d,e;if(this.transitioning)return;b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find("> .accordion-group > .in");if(d&&d.length){e=d.data("collapse");if(e&&e.transitioning)return;d.collapse("hide"),e||d.data("collapse",null)}this.$element[b](0),this.transition("addClass",a.Event("show"),"shown"),a.support.transition&&this.$element[b](this.$element[0][c])},hide:function(){var b;if(this.transitioning)return;b=this.dimension(),this.reset(this.$element[b]()),this.transition("removeClass",a.Event("hide"),"hidden"),this.$element[b](0)},reset:function(a){var b=this.dimension();return this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element[a!==null?"addClass":"removeClass"]("collapse"),this},transition:function(b,c,d){var e=this,f=function(){c.type=="show"&&e.reset(),e.transitioning=0,e.$element.trigger(d)};this.$element.trigger(c);if(c.isDefaultPrevented())return;this.transitioning=1,this.$element[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a(function(){a("body").on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();c[a(e).hasClass("in")?"addClass":"removeClass"]("collapsed"),a(e).collapse(f)})})}(window.jQuery),!function(a){var b=function(b,c){this.$element=a(b),this.options=c,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.prototype={cycle:function(b){return b||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},to:function(b){var c=this.$element.find(".item.active"),d=c.parent().children(),e=d.index(c),f=this;if(b>d.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this,j=a.Event("slide",{relatedTarget:e[0]});this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h]();if(e.hasClass("active"))return;if(a.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(j);if(j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})}else{this.$element.trigger(j);if(j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}},a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=a.extend({},a.fn.carousel.defaults,typeof c=="object"&&c),g=typeof c=="string"?c:f.slide;e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):g?e[g]():f.interval&&e.cycle()})},a.fn.carousel.defaults={interval:5e3,pause:"hover"},a.fn.carousel.Constructor=b,a(function(){a("body").on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=!e.data("modal")&&a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})})}(window.jQuery),!function(a){var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.typeahead.defaults,c),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=a(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};b.prototype={constructor:b,select:function(){var a=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(a)).change(),this.hide()},updater:function(a){return a},show:function(){var b=a.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:b.top+b.height,left:b.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(b){var c;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(c=a.isFunction(this.source)?this.source(this.query,a.proxy(this.process,this)):this.source,c?this.process(c):this)},process:function(b){var c=this;return b=a.grep(b,function(a){return c.matcher(a)}),b=this.sorter(b),b.length?this.render(b.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(a){return~a.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(a){var b=[],c=[],d=[],e;while(e=a.shift())e.toLowerCase().indexOf(this.query.toLowerCase())?~e.indexOf(this.query)?c.push(e):d.push(e):b.push(e);return b.concat(c,d)},highlighter:function(a){var b=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return a.replace(new RegExp("("+b+")","ig"),function(a,b){return"<strong>"+b+"</strong>"})},render:function(b){var c=this;return b=a(b).map(function(b,d){return b=a(c.options.item).attr("data-value",d),b.find("a").html(c.highlighter(d)),b[0]}),b.first().addClass("active"),this.$menu.html(b),this},next:function(b){var c=this.$menu.find(".active").removeClass("active"),d=c.next();d.length||(d=a(this.$menu.find("li")[0])),d.addClass("active")},prev:function(a){var b=this.$menu.find(".active").removeClass("active"),c=b.prev();c.length||(c=this.$menu.find("li").last()),c.addClass("active")},listen:function(){this.$element.on("blur",a.proxy(this.blur,this)).on("keypress",a.proxy(this.keypress,this)).on("keyup",a.proxy(this.keyup,this)),(a.browser.chrome||a.browser.webkit||a.browser.msie)&&this.$element.on("keydown",a.proxy(this.keydown,this)),this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this))},move:function(a){if(!this.shown)return;switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:a.preventDefault(),this.prev();break;case 40:a.preventDefault(),this.next()}a.stopPropagation()},keydown:function(b){this.suppressKeyPressRepeat=!~a.inArray(b.keyCode,[40,38,9,13,27]),this.move(b)},keypress:function(a){if(this.suppressKeyPressRepeat)return;this.move(a)},keyup:function(a){switch(a.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}a.stopPropagation(),a.preventDefault()},blur:function(a){var b=this;setTimeout(function(){b.hide()},150)},click:function(a){a.stopPropagation(),a.preventDefault(),this.select()},mouseenter:function(b){this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")}},a.fn.typeahead=function(c){return this.each(function(){var d=a(this),e=d.data("typeahead"),f=typeof c=="object"&&c;e||d.data("typeahead",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},a.fn.typeahead.Constructor=b,a(function(){a("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(b){var c=a(this);if(c.data("typeahead"))return;b.preventDefault(),c.typeahead(c.data())})})}(window.jQuery) \ No newline at end of file diff --git a/vendor-local/lib/python/rest_framework/static/rest_framework/js/default.js b/vendor-local/lib/python/rest_framework/static/rest_framework/js/default.js deleted file mode 100644 index c74829d7d51..00000000000 --- a/vendor-local/lib/python/rest_framework/static/rest_framework/js/default.js +++ /dev/null @@ -1,13 +0,0 @@ -prettyPrint(); - -$('.js-tooltip').tooltip({ - delay: 1000 -}); - -$('a[data-toggle="tab"]:first').on('shown', function (e) { - $(e.target).parents('.tabbable').addClass('first-tab-active'); -}); -$('a[data-toggle="tab"]:not(:first)').on('shown', function (e) { - $(e.target).parents('.tabbable').removeClass('first-tab-active'); -}); -$('.form-switcher a:first').tab('show'); diff --git a/vendor-local/lib/python/rest_framework/status.py b/vendor-local/lib/python/rest_framework/status.py deleted file mode 100644 index b9f249f9fcd..00000000000 --- a/vendor-local/lib/python/rest_framework/status.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -Descriptive HTTP status codes, for code readability. - -See RFC 2616 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html -And RFC 6585 - http://tools.ietf.org/html/rfc6585 -""" -from __future__ import unicode_literals - -HTTP_100_CONTINUE = 100 -HTTP_101_SWITCHING_PROTOCOLS = 101 -HTTP_200_OK = 200 -HTTP_201_CREATED = 201 -HTTP_202_ACCEPTED = 202 -HTTP_203_NON_AUTHORITATIVE_INFORMATION = 203 -HTTP_204_NO_CONTENT = 204 -HTTP_205_RESET_CONTENT = 205 -HTTP_206_PARTIAL_CONTENT = 206 -HTTP_300_MULTIPLE_CHOICES = 300 -HTTP_301_MOVED_PERMANENTLY = 301 -HTTP_302_FOUND = 302 -HTTP_303_SEE_OTHER = 303 -HTTP_304_NOT_MODIFIED = 304 -HTTP_305_USE_PROXY = 305 -HTTP_306_RESERVED = 306 -HTTP_307_TEMPORARY_REDIRECT = 307 -HTTP_400_BAD_REQUEST = 400 -HTTP_401_UNAUTHORIZED = 401 -HTTP_402_PAYMENT_REQUIRED = 402 -HTTP_403_FORBIDDEN = 403 -HTTP_404_NOT_FOUND = 404 -HTTP_405_METHOD_NOT_ALLOWED = 405 -HTTP_406_NOT_ACCEPTABLE = 406 -HTTP_407_PROXY_AUTHENTICATION_REQUIRED = 407 -HTTP_408_REQUEST_TIMEOUT = 408 -HTTP_409_CONFLICT = 409 -HTTP_410_GONE = 410 -HTTP_411_LENGTH_REQUIRED = 411 -HTTP_412_PRECONDITION_FAILED = 412 -HTTP_413_REQUEST_ENTITY_TOO_LARGE = 413 -HTTP_414_REQUEST_URI_TOO_LONG = 414 -HTTP_415_UNSUPPORTED_MEDIA_TYPE = 415 -HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE = 416 -HTTP_417_EXPECTATION_FAILED = 417 -HTTP_428_PRECONDITION_REQUIRED = 428 -HTTP_429_TOO_MANY_REQUESTS = 429 -HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE = 431 -HTTP_500_INTERNAL_SERVER_ERROR = 500 -HTTP_501_NOT_IMPLEMENTED = 501 -HTTP_502_BAD_GATEWAY = 502 -HTTP_503_SERVICE_UNAVAILABLE = 503 -HTTP_504_GATEWAY_TIMEOUT = 504 -HTTP_505_HTTP_VERSION_NOT_SUPPORTED = 505 -HTTP_511_NETWORK_AUTHENTICATION_REQUIRED = 511 diff --git a/vendor-local/lib/python/rest_framework/templates/rest_framework/api.html b/vendor-local/lib/python/rest_framework/templates/rest_framework/api.html deleted file mode 100644 index 81d277e9672..00000000000 --- a/vendor-local/lib/python/rest_framework/templates/rest_framework/api.html +++ /dev/null @@ -1,3 +0,0 @@ -{% extends "rest_framework/base.html" %} - -{# Override this template in your own templates directory to customize #} diff --git a/vendor-local/lib/python/rest_framework/templates/rest_framework/base.html b/vendor-local/lib/python/rest_framework/templates/rest_framework/base.html deleted file mode 100644 index 51f9c2916b9..00000000000 --- a/vendor-local/lib/python/rest_framework/templates/rest_framework/base.html +++ /dev/null @@ -1,236 +0,0 @@ -{% load url from future %} -{% load rest_framework %} -<!DOCTYPE html> -<html> - <head> - {% block head %} - - {% block meta %} - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="robots" content="NONE,NOARCHIVE" /> - {% endblock %} - - <title>{% block title %}Django REST framework{% endblock %} - - {% block style %} - {% block bootstrap_theme %} - - - {% endblock %} - - - {% endblock %} - - {% endblock %} - - - - -
- - {% block navbar %} - - {% endblock %} - - {% block breadcrumbs %} - - {% endblock %} - - -
- - {% if 'GET' in allowed_methods %} -
-
-
- GET - - - -
- -
-
- {% endif %} - - {% if options_form %} -
- {% csrf_token %} - - -
- {% endif %} - - {% if delete_form %} -
- {% csrf_token %} - - -
- {% endif %} - -
- - {{ description }} -
-
{{ request.method }} {{ request.get_full_path }}
-
-
-
HTTP {{ response.status_code }} {{ response.status_text }}{% autoescape off %} -{% for key, val in response.items %}{{ key }}: {{ val|break_long_headers|urlize_quoted_links }} -{% endfor %} -
{{ content|urlize_quoted_links }}
{% endautoescape %} -
-
- - {% if response.status_code != 403 %} - - {% if post_form or raw_data_post_form %} -
- {% if post_form %} - - {% endif %} -
- {% if post_form %} -
- {% with form=post_form %} -
-
- {% include "rest_framework/form.html" %} -
- -
-
-
- {% endwith %} -
- {% endif %} -
- {% with form=raw_data_post_form %} -
-
- {% include "rest_framework/form.html" %} -
- -
-
-
- {% endwith %} -
-
-
- {% endif %} - - {% if put_form or raw_data_put_form or raw_data_patch_form %} -
- {% if put_form %} - - {% endif %} -
- {% if put_form %} -
- {% with form=put_form %} -
-
- {% include "rest_framework/form.html" %} -
- -
-
-
- {% endwith %} -
- {% endif %} -
- {% with form=raw_data_put_or_patch_form %} -
-
- {% include "rest_framework/form.html" %} -
- {% if raw_data_put_form %} - - {% endif %} - {% if raw_data_patch_form %} - - {% endif %} -
-
-
- {% endwith %} -
-
-
- {% endif %} - {% endif %} - -
- - -
- - -
- - - - - - {% block footer %} - - {% endblock %} - - {% block script %} - - - - - {% endblock %} - - diff --git a/vendor-local/lib/python/rest_framework/templates/rest_framework/form.html b/vendor-local/lib/python/rest_framework/templates/rest_framework/form.html deleted file mode 100644 index b27f652e98d..00000000000 --- a/vendor-local/lib/python/rest_framework/templates/rest_framework/form.html +++ /dev/null @@ -1,13 +0,0 @@ -{% load rest_framework %} -{% csrf_token %} -{{ form.non_field_errors }} -{% for field in form %} -
- {{ field.label_tag|add_class:"control-label" }} -
- {{ field }} - {{ field.help_text }} - -
-
-{% endfor %} diff --git a/vendor-local/lib/python/rest_framework/templates/rest_framework/login.html b/vendor-local/lib/python/rest_framework/templates/rest_framework/login.html deleted file mode 100644 index b76293279a5..00000000000 --- a/vendor-local/lib/python/rest_framework/templates/rest_framework/login.html +++ /dev/null @@ -1,3 +0,0 @@ -{% extends "rest_framework/login_base.html" %} - -{# Override this template in your own templates directory to customize #} diff --git a/vendor-local/lib/python/rest_framework/templates/rest_framework/login_base.html b/vendor-local/lib/python/rest_framework/templates/rest_framework/login_base.html deleted file mode 100644 index be9a0072a84..00000000000 --- a/vendor-local/lib/python/rest_framework/templates/rest_framework/login_base.html +++ /dev/null @@ -1,53 +0,0 @@ -{% load url from future %} -{% load rest_framework %} - - - - {% block style %} - {% block bootstrap_theme %} - - - {% endblock %} - - {% endblock %} - - - - -
-
-
-
-
- {% block branding %}

Django REST framework

{% endblock %} -
-
- -
-
-
- {% csrf_token %} -
-
- - -
-
-
-
- - -
-
- -
- -
-
-
-
-
-
-
- - diff --git a/vendor-local/lib/python/rest_framework/templatetags/__init__.py b/vendor-local/lib/python/rest_framework/templatetags/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/rest_framework/templatetags/rest_framework.py b/vendor-local/lib/python/rest_framework/templatetags/rest_framework.py deleted file mode 100644 index e9c1cdd545b..00000000000 --- a/vendor-local/lib/python/rest_framework/templatetags/rest_framework.py +++ /dev/null @@ -1,273 +0,0 @@ -from __future__ import unicode_literals, absolute_import -from django import template -from django.core.urlresolvers import reverse, NoReverseMatch -from django.http import QueryDict -from django.utils.html import escape -from django.utils.safestring import SafeData, mark_safe -from rest_framework.compat import urlparse, force_text, six, smart_urlquote -import re, string - -register = template.Library() - - -# Note we don't use 'load staticfiles', because we need a 1.3 compatible -# version, so instead we include the `static` template tag ourselves. - -# When 1.3 becomes unsupported by REST framework, we can instead start to -# use the {% load staticfiles %} tag, remove the following code, -# and add a dependency that `django.contrib.staticfiles` must be installed. - -# Note: We can't put this into the `compat` module because the compat import -# from rest_framework.compat import ... -# conflicts with this rest_framework template tag module. - -try: # Django 1.5+ - from django.contrib.staticfiles.templatetags.staticfiles import StaticFilesNode - - @register.tag('static') - def do_static(parser, token): - return StaticFilesNode.handle_token(parser, token) - -except ImportError: - try: # Django 1.4 - from django.contrib.staticfiles.storage import staticfiles_storage - - @register.simple_tag - def static(path): - """ - A template tag that returns the URL to a file - using staticfiles' storage backend - """ - return staticfiles_storage.url(path) - - except ImportError: # Django 1.3 - from urlparse import urljoin - from django import template - from django.templatetags.static import PrefixNode - - class StaticNode(template.Node): - def __init__(self, varname=None, path=None): - if path is None: - raise template.TemplateSyntaxError( - "Static template nodes must be given a path to return.") - self.path = path - self.varname = varname - - def url(self, context): - path = self.path.resolve(context) - return self.handle_simple(path) - - def render(self, context): - url = self.url(context) - if self.varname is None: - return url - context[self.varname] = url - return '' - - @classmethod - def handle_simple(cls, path): - return urljoin(PrefixNode.handle_simple("STATIC_URL"), path) - - @classmethod - def handle_token(cls, parser, token): - """ - Class method to parse prefix node and return a Node. - """ - bits = token.split_contents() - - if len(bits) < 2: - raise template.TemplateSyntaxError( - "'%s' takes at least one argument (path to file)" % bits[0]) - - path = parser.compile_filter(bits[1]) - - if len(bits) >= 2 and bits[-2] == 'as': - varname = bits[3] - else: - varname = None - - return cls(varname, path) - - @register.tag('static') - def do_static_13(parser, token): - return StaticNode.handle_token(parser, token) - - -def replace_query_param(url, key, val): - """ - Given a URL and a key/val pair, set or replace an item in the query - parameters of the URL, and return the new URL. - """ - (scheme, netloc, path, query, fragment) = urlparse.urlsplit(url) - query_dict = QueryDict(query).copy() - query_dict[key] = val - query = query_dict.urlencode() - return urlparse.urlunsplit((scheme, netloc, path, query, fragment)) - - -# Regex for adding classes to html snippets -class_re = re.compile(r'(?<=class=["\'])(.*)(?=["\'])') - - -# And the template tags themselves... - -@register.simple_tag -def optional_login(request): - """ - Include a login snippet if REST framework's login view is in the URLconf. - """ - try: - login_url = reverse('rest_framework:login') - except NoReverseMatch: - return '' - - snippet = "Log in" % (login_url, request.path) - return snippet - - -@register.simple_tag -def optional_logout(request): - """ - Include a logout snippet if REST framework's logout view is in the URLconf. - """ - try: - logout_url = reverse('rest_framework:logout') - except NoReverseMatch: - return '' - - snippet = "Log out" % (logout_url, request.path) - return snippet - - -@register.simple_tag -def add_query_param(request, key, val): - """ - Add a query parameter to the current request url, and return the new url. - """ - return replace_query_param(request.get_full_path(), key, val) - - -@register.filter -def add_class(value, css_class): - """ - http://stackoverflow.com/questions/4124220/django-adding-css-classes-when-rendering-form-fields-in-a-template - - Inserts classes into template variables that contain HTML tags, - useful for modifying forms without needing to change the Form objects. - - Usage: - - {{ field.label_tag|add_class:"control-label" }} - - In the case of REST Framework, the filter is used to add Bootstrap-specific - classes to the forms. - """ - html = six.text_type(value) - match = class_re.search(html) - if match: - m = re.search(r'^%s$|^%s\s|\s%s\s|\s%s$' % (css_class, css_class, - css_class, css_class), - match.group(1)) - if not m: - return mark_safe(class_re.sub(match.group(1) + " " + css_class, - html)) - else: - return mark_safe(html.replace('>', ' class="%s">' % css_class, 1)) - return value - - -# Bunch of stuff cloned from urlize -TRAILING_PUNCTUATION = ['.', ',', ':', ';', '.)', '"', "'"] -WRAPPING_PUNCTUATION = [('(', ')'), ('<', '>'), ('[', ']'), ('<', '>'), - ('"', '"'), ("'", "'")] -word_split_re = re.compile(r'(\s+)') -simple_url_re = re.compile(r'^https?://\[?\w', re.IGNORECASE) -simple_url_2_re = re.compile(r'^www\.|^(?!http)\w[^@]+\.(com|edu|gov|int|mil|net|org)$', re.IGNORECASE) -simple_email_re = re.compile(r'^\S+@\S+\.\S+$') - - -@register.filter -def urlize_quoted_links(text, trim_url_limit=None, nofollow=True, autoescape=True): - """ - Converts any URLs in text into clickable links. - - Works on http://, https://, www. links, and also on links ending in one of - the original seven gTLDs (.com, .edu, .gov, .int, .mil, .net, and .org). - Links can have trailing punctuation (periods, commas, close-parens) and - leading punctuation (opening parens) and it'll still do the right thing. - - If trim_url_limit is not None, the URLs in link text longer than this limit - will truncated to trim_url_limit-3 characters and appended with an elipsis. - - If nofollow is True, the URLs in link text will get a rel="nofollow" - attribute. - - If autoescape is True, the link text and URLs will get autoescaped. - """ - trim_url = lambda x, limit=trim_url_limit: limit is not None and (len(x) > limit and ('%s...' % x[:max(0, limit - 3)])) or x - safe_input = isinstance(text, SafeData) - words = word_split_re.split(force_text(text)) - for i, word in enumerate(words): - match = None - if '.' in word or '@' in word or ':' in word: - # Deal with punctuation. - lead, middle, trail = '', word, '' - for punctuation in TRAILING_PUNCTUATION: - if middle.endswith(punctuation): - middle = middle[:-len(punctuation)] - trail = punctuation + trail - for opening, closing in WRAPPING_PUNCTUATION: - if middle.startswith(opening): - middle = middle[len(opening):] - lead = lead + opening - # Keep parentheses at the end only if they're balanced. - if (middle.endswith(closing) - and middle.count(closing) == middle.count(opening) + 1): - middle = middle[:-len(closing)] - trail = closing + trail - - # Make URL we want to point to. - url = None - nofollow_attr = ' rel="nofollow"' if nofollow else '' - if simple_url_re.match(middle): - url = smart_urlquote(middle) - elif simple_url_2_re.match(middle): - url = smart_urlquote('http://%s' % middle) - elif not ':' in middle and simple_email_re.match(middle): - local, domain = middle.rsplit('@', 1) - try: - domain = domain.encode('idna').decode('ascii') - except UnicodeError: - continue - url = 'mailto:%s@%s' % (local, domain) - nofollow_attr = '' - - # Make link. - if url: - trimmed = trim_url(middle) - if autoescape and not safe_input: - lead, trail = escape(lead), escape(trail) - url, trimmed = escape(url), escape(trimmed) - middle = '%s' % (url, nofollow_attr, trimmed) - words[i] = mark_safe('%s%s%s' % (lead, middle, trail)) - else: - if safe_input: - words[i] = mark_safe(word) - elif autoescape: - words[i] = escape(word) - elif safe_input: - words[i] = mark_safe(word) - elif autoescape: - words[i] = escape(word) - return ''.join(words) - - -@register.filter -def break_long_headers(header): - """ - Breaks headers longer than 160 characters (~page length) - when possible (are comma separated) - """ - if len(header) > 160 and ',' in header: - header = mark_safe('
' + ',
'.join(header.split(','))) - return header diff --git a/vendor-local/lib/python/rest_framework/test.py b/vendor-local/lib/python/rest_framework/test.py deleted file mode 100644 index a18f5a29386..00000000000 --- a/vendor-local/lib/python/rest_framework/test.py +++ /dev/null @@ -1,157 +0,0 @@ -# -- coding: utf-8 -- - -# Note that we import as `DjangoRequestFactory` and `DjangoClient` in order -# to make it harder for the user to import the wrong thing without realizing. -from __future__ import unicode_literals -import django -from django.conf import settings -from django.test.client import Client as DjangoClient -from django.test.client import ClientHandler -from django.test import testcases -from rest_framework.settings import api_settings -from rest_framework.compat import RequestFactory as DjangoRequestFactory -from rest_framework.compat import force_bytes_or_smart_bytes, six - - -def force_authenticate(request, user=None, token=None): - request._force_auth_user = user - request._force_auth_token = token - - -class APIRequestFactory(DjangoRequestFactory): - renderer_classes_list = api_settings.TEST_REQUEST_RENDERER_CLASSES - default_format = api_settings.TEST_REQUEST_DEFAULT_FORMAT - - def __init__(self, enforce_csrf_checks=False, **defaults): - self.enforce_csrf_checks = enforce_csrf_checks - self.renderer_classes = {} - for cls in self.renderer_classes_list: - self.renderer_classes[cls.format] = cls - super(APIRequestFactory, self).__init__(**defaults) - - def _encode_data(self, data, format=None, content_type=None): - """ - Encode the data returning a two tuple of (bytes, content_type) - """ - - if not data: - return ('', None) - - assert format is None or content_type is None, ( - 'You may not set both `format` and `content_type`.' - ) - - if content_type: - # Content type specified explicitly, treat data as a raw bytestring - ret = force_bytes_or_smart_bytes(data, settings.DEFAULT_CHARSET) - - else: - format = format or self.default_format - - assert format in self.renderer_classes, ("Invalid format '{0}'. " - "Available formats are {1}. Set TEST_REQUEST_RENDERER_CLASSES " - "to enable extra request formats.".format( - format, - ', '.join(["'" + fmt + "'" for fmt in self.renderer_classes.keys()]) - ) - ) - - # Use format and render the data into a bytestring - renderer = self.renderer_classes[format]() - ret = renderer.render(data) - - # Determine the content-type header from the renderer - content_type = "{0}; charset={1}".format( - renderer.media_type, renderer.charset - ) - - # Coerce text to bytes if required. - if isinstance(ret, six.text_type): - ret = bytes(ret.encode(renderer.charset)) - - return ret, content_type - - def post(self, path, data=None, format=None, content_type=None, **extra): - data, content_type = self._encode_data(data, format, content_type) - return self.generic('POST', path, data, content_type, **extra) - - def put(self, path, data=None, format=None, content_type=None, **extra): - data, content_type = self._encode_data(data, format, content_type) - return self.generic('PUT', path, data, content_type, **extra) - - def patch(self, path, data=None, format=None, content_type=None, **extra): - data, content_type = self._encode_data(data, format, content_type) - return self.generic('PATCH', path, data, content_type, **extra) - - def delete(self, path, data=None, format=None, content_type=None, **extra): - data, content_type = self._encode_data(data, format, content_type) - return self.generic('DELETE', path, data, content_type, **extra) - - def options(self, path, data=None, format=None, content_type=None, **extra): - data, content_type = self._encode_data(data, format, content_type) - return self.generic('OPTIONS', path, data, content_type, **extra) - - def request(self, **kwargs): - request = super(APIRequestFactory, self).request(**kwargs) - request._dont_enforce_csrf_checks = not self.enforce_csrf_checks - return request - - -class ForceAuthClientHandler(ClientHandler): - """ - A patched version of ClientHandler that can enforce authentication - on the outgoing requests. - """ - - def __init__(self, *args, **kwargs): - self._force_user = None - self._force_token = None - super(ForceAuthClientHandler, self).__init__(*args, **kwargs) - - def get_response(self, request): - # This is the simplest place we can hook into to patch the - # request object. - force_authenticate(request, self._force_user, self._force_token) - return super(ForceAuthClientHandler, self).get_response(request) - - -class APIClient(APIRequestFactory, DjangoClient): - def __init__(self, enforce_csrf_checks=False, **defaults): - super(APIClient, self).__init__(**defaults) - self.handler = ForceAuthClientHandler(enforce_csrf_checks) - self._credentials = {} - - def credentials(self, **kwargs): - """ - Sets headers that will be used on every outgoing request. - """ - self._credentials = kwargs - - def force_authenticate(self, user=None, token=None): - """ - Forcibly authenticates outgoing requests with the given - user and/or token. - """ - self.handler._force_user = user - self.handler._force_token = token - - def request(self, **kwargs): - # Ensure that any credentials set get added to every request. - kwargs.update(self._credentials) - return super(APIClient, self).request(**kwargs) - - -class APITransactionTestCase(testcases.TransactionTestCase): - client_class = APIClient - - -class APITestCase(testcases.TestCase): - client_class = APIClient - - -if django.VERSION >= (1, 4): - class APISimpleTestCase(testcases.SimpleTestCase): - client_class = APIClient - - class APILiveServerTestCase(testcases.LiveServerTestCase): - client_class = APIClient diff --git a/vendor-local/lib/python/rest_framework/tests/__init__.py b/vendor-local/lib/python/rest_framework/tests/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/rest_framework/tests/description.py b/vendor-local/lib/python/rest_framework/tests/description.py deleted file mode 100644 index b46d7f54d8a..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/description.py +++ /dev/null @@ -1,26 +0,0 @@ -# -- coding: utf-8 -- - -# Apparently there is a python 2.6 issue where docstrings of imported view classes -# do not retain their encoding information even if a module has a proper -# encoding declaration at the top of its source file. Therefore for tests -# to catch unicode related errors, a mock view has to be declared in a separate -# module. - -from rest_framework.views import APIView - - -# test strings snatched from http://www.columbia.edu/~fdc/utf8/, -# http://winrus.com/utf8-jap.htm and memory -UTF8_TEST_DOCSTRING = ( - 'zażółć gęślą jaźń' - 'Sîne klâwen durh die wolken sint geslagen' - 'Τη γλώσσα μου έδωσαν ελληνική' - 'யாமறிந்த மொழிகளிலே தமிழ்மொழி' - 'На берегу пустынных волн' - 'てすと' - 'アイウエオカキクケコサシスセソタチツテ' -) - - -class ViewWithNonASCIICharactersInDocstring(APIView): - __doc__ = UTF8_TEST_DOCSTRING diff --git a/vendor-local/lib/python/rest_framework/tests/extras/__init__.py b/vendor-local/lib/python/rest_framework/tests/extras/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/rest_framework/tests/extras/bad_import.py b/vendor-local/lib/python/rest_framework/tests/extras/bad_import.py deleted file mode 100644 index 68263d9474e..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/extras/bad_import.py +++ /dev/null @@ -1 +0,0 @@ -raise ValueError diff --git a/vendor-local/lib/python/rest_framework/tests/models.py b/vendor-local/lib/python/rest_framework/tests/models.py deleted file mode 100644 index 1598ecd94ac..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/models.py +++ /dev/null @@ -1,169 +0,0 @@ -from __future__ import unicode_literals -from django.db import models -from django.utils.translation import ugettext_lazy as _ -from rest_framework import serializers - - -def foobar(): - return 'foobar' - - -class CustomField(models.CharField): - - def __init__(self, *args, **kwargs): - kwargs['max_length'] = 12 - super(CustomField, self).__init__(*args, **kwargs) - - -class RESTFrameworkModel(models.Model): - """ - Base for test models that sets app_label, so they play nicely. - """ - class Meta: - app_label = 'tests' - abstract = True - - -class HasPositiveIntegerAsChoice(RESTFrameworkModel): - some_choices = ((1, 'A'), (2, 'B'), (3, 'C')) - some_integer = models.PositiveIntegerField(choices=some_choices) - - -class Anchor(RESTFrameworkModel): - text = models.CharField(max_length=100, default='anchor') - - -class BasicModel(RESTFrameworkModel): - text = models.CharField(max_length=100, verbose_name=_("Text comes here"), help_text=_("Text description.")) - - -class SlugBasedModel(RESTFrameworkModel): - text = models.CharField(max_length=100) - slug = models.SlugField(max_length=32) - - -class DefaultValueModel(RESTFrameworkModel): - text = models.CharField(default='foobar', max_length=100) - extra = models.CharField(blank=True, null=True, max_length=100) - - -class CallableDefaultValueModel(RESTFrameworkModel): - text = models.CharField(default=foobar, max_length=100) - - -class ManyToManyModel(RESTFrameworkModel): - rel = models.ManyToManyField(Anchor, help_text='Some help text.') - - -class ReadOnlyManyToManyModel(RESTFrameworkModel): - text = models.CharField(max_length=100, default='anchor') - rel = models.ManyToManyField(Anchor) - - -# Model for regression test for #285 - -class Comment(RESTFrameworkModel): - email = models.EmailField() - content = models.CharField(max_length=200) - created = models.DateTimeField(auto_now_add=True) - - -class ActionItem(RESTFrameworkModel): - title = models.CharField(max_length=200) - done = models.BooleanField(default=False) - info = CustomField(default='---', max_length=12) - - -# Models for reverse relations -class Person(RESTFrameworkModel): - name = models.CharField(max_length=10) - age = models.IntegerField(null=True, blank=True) - - @property - def info(self): - return { - 'name': self.name, - 'age': self.age, - } - - -class BlogPost(RESTFrameworkModel): - title = models.CharField(max_length=100) - writer = models.ForeignKey(Person, null=True, blank=True) - - def get_first_comment(self): - return self.blogpostcomment_set.all()[0] - - -class BlogPostComment(RESTFrameworkModel): - text = models.TextField() - blog_post = models.ForeignKey(BlogPost) - - -class Album(RESTFrameworkModel): - title = models.CharField(max_length=100, unique=True) - - -class Photo(RESTFrameworkModel): - description = models.TextField() - album = models.ForeignKey(Album) - - -# Model for issue #324 -class BlankFieldModel(RESTFrameworkModel): - title = models.CharField(max_length=100, blank=True, null=False) - - -# Model for issue #380 -class OptionalRelationModel(RESTFrameworkModel): - other = models.ForeignKey('OptionalRelationModel', blank=True, null=True) - - -# Model for RegexField -class Book(RESTFrameworkModel): - isbn = models.CharField(max_length=13) - - -# Models for relations tests -# ManyToMany -class ManyToManyTarget(RESTFrameworkModel): - name = models.CharField(max_length=100) - - -class ManyToManySource(RESTFrameworkModel): - name = models.CharField(max_length=100) - targets = models.ManyToManyField(ManyToManyTarget, related_name='sources') - - -# ForeignKey -class ForeignKeyTarget(RESTFrameworkModel): - name = models.CharField(max_length=100) - - -class ForeignKeySource(RESTFrameworkModel): - name = models.CharField(max_length=100) - target = models.ForeignKey(ForeignKeyTarget, related_name='sources') - - -# Nullable ForeignKey -class NullableForeignKeySource(RESTFrameworkModel): - name = models.CharField(max_length=100) - target = models.ForeignKey(ForeignKeyTarget, null=True, blank=True, - related_name='nullable_sources') - - -# OneToOne -class OneToOneTarget(RESTFrameworkModel): - name = models.CharField(max_length=100) - - -class NullableOneToOneSource(RESTFrameworkModel): - name = models.CharField(max_length=100) - target = models.OneToOneField(OneToOneTarget, null=True, blank=True, - related_name='nullable_source') - - -# Serializer used to test BasicModel -class BasicModelSerializer(serializers.ModelSerializer): - class Meta: - model = BasicModel diff --git a/vendor-local/lib/python/rest_framework/tests/test_authentication.py b/vendor-local/lib/python/rest_framework/tests/test_authentication.py deleted file mode 100644 index a44813b6910..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_authentication.py +++ /dev/null @@ -1,635 +0,0 @@ -from __future__ import unicode_literals -from django.contrib.auth.models import User -from django.http import HttpResponse -from django.test import TestCase -from django.utils import unittest -from rest_framework import HTTP_HEADER_ENCODING -from rest_framework import exceptions -from rest_framework import permissions -from rest_framework import renderers -from rest_framework.response import Response -from rest_framework import status -from rest_framework.authentication import ( - BaseAuthentication, - TokenAuthentication, - BasicAuthentication, - SessionAuthentication, - OAuthAuthentication, - OAuth2Authentication -) -from rest_framework.authtoken.models import Token -from rest_framework.compat import patterns, url, include -from rest_framework.compat import oauth2_provider, oauth2_provider_models, oauth2_provider_scope -from rest_framework.compat import oauth, oauth_provider -from rest_framework.test import APIRequestFactory, APIClient -from rest_framework.views import APIView -import base64 -import time -import datetime - -factory = APIRequestFactory() - - -class MockView(APIView): - permission_classes = (permissions.IsAuthenticated,) - - def get(self, request): - return HttpResponse({'a': 1, 'b': 2, 'c': 3}) - - def post(self, request): - return HttpResponse({'a': 1, 'b': 2, 'c': 3}) - - def put(self, request): - return HttpResponse({'a': 1, 'b': 2, 'c': 3}) - - -urlpatterns = patterns('', - (r'^session/$', MockView.as_view(authentication_classes=[SessionAuthentication])), - (r'^basic/$', MockView.as_view(authentication_classes=[BasicAuthentication])), - (r'^token/$', MockView.as_view(authentication_classes=[TokenAuthentication])), - (r'^auth-token/$', 'rest_framework.authtoken.views.obtain_auth_token'), - (r'^oauth/$', MockView.as_view(authentication_classes=[OAuthAuthentication])), - (r'^oauth-with-scope/$', MockView.as_view(authentication_classes=[OAuthAuthentication], - permission_classes=[permissions.TokenHasReadWriteScope])) -) - -if oauth2_provider is not None: - urlpatterns += patterns('', - url(r'^oauth2/', include('provider.oauth2.urls', namespace='oauth2')), - url(r'^oauth2-test/$', MockView.as_view(authentication_classes=[OAuth2Authentication])), - url(r'^oauth2-with-scope-test/$', MockView.as_view(authentication_classes=[OAuth2Authentication], - permission_classes=[permissions.TokenHasReadWriteScope])), - ) - - -class BasicAuthTests(TestCase): - """Basic authentication""" - urls = 'rest_framework.tests.test_authentication' - - def setUp(self): - self.csrf_client = APIClient(enforce_csrf_checks=True) - self.username = 'john' - self.email = 'lennon@thebeatles.com' - self.password = 'password' - self.user = User.objects.create_user(self.username, self.email, self.password) - - def test_post_form_passing_basic_auth(self): - """Ensure POSTing json over basic auth with correct credentials passes and does not require CSRF""" - credentials = ('%s:%s' % (self.username, self.password)) - base64_credentials = base64.b64encode(credentials.encode(HTTP_HEADER_ENCODING)).decode(HTTP_HEADER_ENCODING) - auth = 'Basic %s' % base64_credentials - response = self.csrf_client.post('/basic/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_post_json_passing_basic_auth(self): - """Ensure POSTing form over basic auth with correct credentials passes and does not require CSRF""" - credentials = ('%s:%s' % (self.username, self.password)) - base64_credentials = base64.b64encode(credentials.encode(HTTP_HEADER_ENCODING)).decode(HTTP_HEADER_ENCODING) - auth = 'Basic %s' % base64_credentials - response = self.csrf_client.post('/basic/', {'example': 'example'}, format='json', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_post_form_failing_basic_auth(self): - """Ensure POSTing form over basic auth without correct credentials fails""" - response = self.csrf_client.post('/basic/', {'example': 'example'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_post_json_failing_basic_auth(self): - """Ensure POSTing json over basic auth without correct credentials fails""" - response = self.csrf_client.post('/basic/', {'example': 'example'}, format='json') - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - self.assertEqual(response['WWW-Authenticate'], 'Basic realm="api"') - - -class SessionAuthTests(TestCase): - """User session authentication""" - urls = 'rest_framework.tests.test_authentication' - - def setUp(self): - self.csrf_client = APIClient(enforce_csrf_checks=True) - self.non_csrf_client = APIClient(enforce_csrf_checks=False) - self.username = 'john' - self.email = 'lennon@thebeatles.com' - self.password = 'password' - self.user = User.objects.create_user(self.username, self.email, self.password) - - def tearDown(self): - self.csrf_client.logout() - - def test_post_form_session_auth_failing_csrf(self): - """ - Ensure POSTing form over session authentication without CSRF token fails. - """ - self.csrf_client.login(username=self.username, password=self.password) - response = self.csrf_client.post('/session/', {'example': 'example'}) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - def test_post_form_session_auth_passing(self): - """ - Ensure POSTing form over session authentication with logged in user and CSRF token passes. - """ - self.non_csrf_client.login(username=self.username, password=self.password) - response = self.non_csrf_client.post('/session/', {'example': 'example'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_put_form_session_auth_passing(self): - """ - Ensure PUTting form over session authentication with logged in user and CSRF token passes. - """ - self.non_csrf_client.login(username=self.username, password=self.password) - response = self.non_csrf_client.put('/session/', {'example': 'example'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_post_form_session_auth_failing(self): - """ - Ensure POSTing form over session authentication without logged in user fails. - """ - response = self.csrf_client.post('/session/', {'example': 'example'}) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - -class TokenAuthTests(TestCase): - """Token authentication""" - urls = 'rest_framework.tests.test_authentication' - - def setUp(self): - self.csrf_client = APIClient(enforce_csrf_checks=True) - self.username = 'john' - self.email = 'lennon@thebeatles.com' - self.password = 'password' - self.user = User.objects.create_user(self.username, self.email, self.password) - - self.key = 'abcd1234' - self.token = Token.objects.create(key=self.key, user=self.user) - - def test_post_form_passing_token_auth(self): - """Ensure POSTing json over token auth with correct credentials passes and does not require CSRF""" - auth = 'Token ' + self.key - response = self.csrf_client.post('/token/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_post_json_passing_token_auth(self): - """Ensure POSTing form over token auth with correct credentials passes and does not require CSRF""" - auth = "Token " + self.key - response = self.csrf_client.post('/token/', {'example': 'example'}, format='json', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_post_form_failing_token_auth(self): - """Ensure POSTing form over token auth without correct credentials fails""" - response = self.csrf_client.post('/token/', {'example': 'example'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_post_json_failing_token_auth(self): - """Ensure POSTing json over token auth without correct credentials fails""" - response = self.csrf_client.post('/token/', {'example': 'example'}, format='json') - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_token_has_auto_assigned_key_if_none_provided(self): - """Ensure creating a token with no key will auto-assign a key""" - self.token.delete() - token = Token.objects.create(user=self.user) - self.assertTrue(bool(token.key)) - - def test_token_login_json(self): - """Ensure token login view using JSON POST works.""" - client = APIClient(enforce_csrf_checks=True) - response = client.post('/auth-token/', - {'username': self.username, 'password': self.password}, format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['token'], self.key) - - def test_token_login_json_bad_creds(self): - """Ensure token login view using JSON POST fails if bad credentials are used.""" - client = APIClient(enforce_csrf_checks=True) - response = client.post('/auth-token/', - {'username': self.username, 'password': "badpass"}, format='json') - self.assertEqual(response.status_code, 400) - - def test_token_login_json_missing_fields(self): - """Ensure token login view using JSON POST fails if missing fields.""" - client = APIClient(enforce_csrf_checks=True) - response = client.post('/auth-token/', - {'username': self.username}, format='json') - self.assertEqual(response.status_code, 400) - - def test_token_login_form(self): - """Ensure token login view using form POST works.""" - client = APIClient(enforce_csrf_checks=True) - response = client.post('/auth-token/', - {'username': self.username, 'password': self.password}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['token'], self.key) - - -class IncorrectCredentialsTests(TestCase): - def test_incorrect_credentials(self): - """ - If a request contains bad authentication credentials, then - authentication should run and error, even if no permissions - are set on the view. - """ - class IncorrectCredentialsAuth(BaseAuthentication): - def authenticate(self, request): - raise exceptions.AuthenticationFailed('Bad credentials') - - request = factory.get('/') - view = MockView.as_view( - authentication_classes=(IncorrectCredentialsAuth,), - permission_classes=() - ) - response = view(request) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - self.assertEqual(response.data, {'detail': 'Bad credentials'}) - - -class OAuthTests(TestCase): - """OAuth 1.0a authentication""" - urls = 'rest_framework.tests.test_authentication' - - def setUp(self): - # these imports are here because oauth is optional and hiding them in try..except block or compat - # could obscure problems if something breaks - from oauth_provider.models import Consumer, Resource - from oauth_provider.models import Token as OAuthToken - from oauth_provider import consts - - self.consts = consts - - self.csrf_client = APIClient(enforce_csrf_checks=True) - self.username = 'john' - self.email = 'lennon@thebeatles.com' - self.password = 'password' - self.user = User.objects.create_user(self.username, self.email, self.password) - - self.CONSUMER_KEY = 'consumer_key' - self.CONSUMER_SECRET = 'consumer_secret' - self.TOKEN_KEY = "token_key" - self.TOKEN_SECRET = "token_secret" - - self.consumer = Consumer.objects.create(key=self.CONSUMER_KEY, secret=self.CONSUMER_SECRET, - name='example', user=self.user, status=self.consts.ACCEPTED) - - self.resource = Resource.objects.create(name="resource name", url="api/") - self.token = OAuthToken.objects.create(user=self.user, consumer=self.consumer, resource=self.resource, - token_type=OAuthToken.ACCESS, key=self.TOKEN_KEY, secret=self.TOKEN_SECRET, is_approved=True - ) - - def _create_authorization_header(self): - params = { - 'oauth_version': "1.0", - 'oauth_nonce': oauth.generate_nonce(), - 'oauth_timestamp': int(time.time()), - 'oauth_token': self.token.key, - 'oauth_consumer_key': self.consumer.key - } - - req = oauth.Request(method="GET", url="http://example.com", parameters=params) - - signature_method = oauth.SignatureMethod_PLAINTEXT() - req.sign_request(signature_method, self.consumer, self.token) - - return req.to_header()["Authorization"] - - def _create_authorization_url_parameters(self): - params = { - 'oauth_version': "1.0", - 'oauth_nonce': oauth.generate_nonce(), - 'oauth_timestamp': int(time.time()), - 'oauth_token': self.token.key, - 'oauth_consumer_key': self.consumer.key - } - - req = oauth.Request(method="GET", url="http://example.com", parameters=params) - - signature_method = oauth.SignatureMethod_PLAINTEXT() - req.sign_request(signature_method, self.consumer, self.token) - return dict(req) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_post_form_passing_oauth(self): - """Ensure POSTing form over OAuth with correct credentials passes and does not require CSRF""" - auth = self._create_authorization_header() - response = self.csrf_client.post('/oauth/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 200) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_post_form_repeated_nonce_failing_oauth(self): - """Ensure POSTing form over OAuth with repeated auth (same nonces and timestamp) credentials fails""" - auth = self._create_authorization_header() - response = self.csrf_client.post('/oauth/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 200) - - # simulate reply attack auth header containes already used (nonce, timestamp) pair - response = self.csrf_client.post('/oauth/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) - self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_post_form_token_removed_failing_oauth(self): - """Ensure POSTing when there is no OAuth access token in db fails""" - self.token.delete() - auth = self._create_authorization_header() - response = self.csrf_client.post('/oauth/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) - self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_post_form_consumer_status_not_accepted_failing_oauth(self): - """Ensure POSTing when consumer status is anything other than ACCEPTED fails""" - for consumer_status in (self.consts.CANCELED, self.consts.PENDING, self.consts.REJECTED): - self.consumer.status = consumer_status - self.consumer.save() - - auth = self._create_authorization_header() - response = self.csrf_client.post('/oauth/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) - self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_post_form_with_request_token_failing_oauth(self): - """Ensure POSTing with unauthorized request token instead of access token fails""" - self.token.token_type = self.token.REQUEST - self.token.save() - - auth = self._create_authorization_header() - response = self.csrf_client.post('/oauth/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) - self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_post_form_with_urlencoded_parameters(self): - """Ensure POSTing with x-www-form-urlencoded auth parameters passes""" - params = self._create_authorization_url_parameters() - response = self.csrf_client.post('/oauth/', params) - self.assertEqual(response.status_code, 200) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_get_form_with_url_parameters(self): - """Ensure GETing with auth in url parameters passes""" - params = self._create_authorization_url_parameters() - response = self.csrf_client.get('/oauth/', params) - self.assertEqual(response.status_code, 200) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_post_hmac_sha1_signature_passes(self): - """Ensure POSTing using HMAC_SHA1 signature method passes""" - params = { - 'oauth_version': "1.0", - 'oauth_nonce': oauth.generate_nonce(), - 'oauth_timestamp': int(time.time()), - 'oauth_token': self.token.key, - 'oauth_consumer_key': self.consumer.key - } - - req = oauth.Request(method="POST", url="http://testserver/oauth/", parameters=params) - - signature_method = oauth.SignatureMethod_HMAC_SHA1() - req.sign_request(signature_method, self.consumer, self.token) - auth = req.to_header()["Authorization"] - - response = self.csrf_client.post('/oauth/', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 200) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_get_form_with_readonly_resource_passing_auth(self): - """Ensure POSTing with a readonly resource instead of a write scope fails""" - read_only_access_token = self.token - read_only_access_token.resource.is_readonly = True - read_only_access_token.resource.save() - params = self._create_authorization_url_parameters() - response = self.csrf_client.get('/oauth-with-scope/', params) - self.assertEqual(response.status_code, 200) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_post_form_with_readonly_resource_failing_auth(self): - """Ensure POSTing with a readonly resource instead of a write scope fails""" - read_only_access_token = self.token - read_only_access_token.resource.is_readonly = True - read_only_access_token.resource.save() - params = self._create_authorization_url_parameters() - response = self.csrf_client.post('/oauth-with-scope/', params) - self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_post_form_with_write_resource_passing_auth(self): - """Ensure POSTing with a write resource succeed""" - read_write_access_token = self.token - read_write_access_token.resource.is_readonly = False - read_write_access_token.resource.save() - params = self._create_authorization_url_parameters() - response = self.csrf_client.post('/oauth-with-scope/', params) - self.assertEqual(response.status_code, 200) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_bad_consumer_key(self): - """Ensure POSTing using HMAC_SHA1 signature method passes""" - params = { - 'oauth_version': "1.0", - 'oauth_nonce': oauth.generate_nonce(), - 'oauth_timestamp': int(time.time()), - 'oauth_token': self.token.key, - 'oauth_consumer_key': 'badconsumerkey' - } - - req = oauth.Request(method="POST", url="http://testserver/oauth/", parameters=params) - - signature_method = oauth.SignatureMethod_HMAC_SHA1() - req.sign_request(signature_method, self.consumer, self.token) - auth = req.to_header()["Authorization"] - - response = self.csrf_client.post('/oauth/', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 401) - - @unittest.skipUnless(oauth_provider, 'django-oauth-plus not installed') - @unittest.skipUnless(oauth, 'oauth2 not installed') - def test_bad_token_key(self): - """Ensure POSTing using HMAC_SHA1 signature method passes""" - params = { - 'oauth_version': "1.0", - 'oauth_nonce': oauth.generate_nonce(), - 'oauth_timestamp': int(time.time()), - 'oauth_token': 'badtokenkey', - 'oauth_consumer_key': self.consumer.key - } - - req = oauth.Request(method="POST", url="http://testserver/oauth/", parameters=params) - - signature_method = oauth.SignatureMethod_HMAC_SHA1() - req.sign_request(signature_method, self.consumer, self.token) - auth = req.to_header()["Authorization"] - - response = self.csrf_client.post('/oauth/', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 401) - - -class OAuth2Tests(TestCase): - """OAuth 2.0 authentication""" - urls = 'rest_framework.tests.test_authentication' - - def setUp(self): - self.csrf_client = APIClient(enforce_csrf_checks=True) - self.username = 'john' - self.email = 'lennon@thebeatles.com' - self.password = 'password' - self.user = User.objects.create_user(self.username, self.email, self.password) - - self.CLIENT_ID = 'client_key' - self.CLIENT_SECRET = 'client_secret' - self.ACCESS_TOKEN = "access_token" - self.REFRESH_TOKEN = "refresh_token" - - self.oauth2_client = oauth2_provider_models.Client.objects.create( - client_id=self.CLIENT_ID, - client_secret=self.CLIENT_SECRET, - redirect_uri='', - client_type=0, - name='example', - user=None, - ) - - self.access_token = oauth2_provider_models.AccessToken.objects.create( - token=self.ACCESS_TOKEN, - client=self.oauth2_client, - user=self.user, - ) - self.refresh_token = oauth2_provider_models.RefreshToken.objects.create( - user=self.user, - access_token=self.access_token, - client=self.oauth2_client - ) - - def _create_authorization_header(self, token=None): - return "Bearer {0}".format(token or self.access_token.token) - - @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') - def test_get_form_with_wrong_authorization_header_token_type_failing(self): - """Ensure that a wrong token type lead to the correct HTTP error status code""" - auth = "Wrong token-type-obsviously" - response = self.csrf_client.get('/oauth2-test/', {}, HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 401) - response = self.csrf_client.get('/oauth2-test/', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 401) - - @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') - def test_get_form_with_wrong_authorization_header_token_format_failing(self): - """Ensure that a wrong token format lead to the correct HTTP error status code""" - auth = "Bearer wrong token format" - response = self.csrf_client.get('/oauth2-test/', {}, HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 401) - response = self.csrf_client.get('/oauth2-test/', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 401) - - @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') - def test_get_form_with_wrong_authorization_header_token_failing(self): - """Ensure that a wrong token lead to the correct HTTP error status code""" - auth = "Bearer wrong-token" - response = self.csrf_client.get('/oauth2-test/', {}, HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 401) - response = self.csrf_client.get('/oauth2-test/', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 401) - - @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') - def test_get_form_passing_auth(self): - """Ensure GETing form over OAuth with correct client credentials succeed""" - auth = self._create_authorization_header() - response = self.csrf_client.get('/oauth2-test/', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 200) - - @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') - def test_post_form_passing_auth(self): - """Ensure POSTing form over OAuth with correct credentials passes and does not require CSRF""" - auth = self._create_authorization_header() - response = self.csrf_client.post('/oauth2-test/', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 200) - - @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') - def test_post_form_token_removed_failing_auth(self): - """Ensure POSTing when there is no OAuth access token in db fails""" - self.access_token.delete() - auth = self._create_authorization_header() - response = self.csrf_client.post('/oauth2-test/', HTTP_AUTHORIZATION=auth) - self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) - - @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') - def test_post_form_with_refresh_token_failing_auth(self): - """Ensure POSTing with refresh token instead of access token fails""" - auth = self._create_authorization_header(token=self.refresh_token.token) - response = self.csrf_client.post('/oauth2-test/', HTTP_AUTHORIZATION=auth) - self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) - - @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') - def test_post_form_with_expired_access_token_failing_auth(self): - """Ensure POSTing with expired access token fails with an 'Invalid token' error""" - self.access_token.expires = datetime.datetime.now() - datetime.timedelta(seconds=10) # 10 seconds late - self.access_token.save() - auth = self._create_authorization_header() - response = self.csrf_client.post('/oauth2-test/', HTTP_AUTHORIZATION=auth) - self.assertIn(response.status_code, (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)) - self.assertIn('Invalid token', response.content) - - @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') - def test_post_form_with_invalid_scope_failing_auth(self): - """Ensure POSTing with a readonly scope instead of a write scope fails""" - read_only_access_token = self.access_token - read_only_access_token.scope = oauth2_provider_scope.SCOPE_NAME_DICT['read'] - read_only_access_token.save() - auth = self._create_authorization_header(token=read_only_access_token.token) - response = self.csrf_client.get('/oauth2-with-scope-test/', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 200) - response = self.csrf_client.post('/oauth2-with-scope-test/', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') - def test_post_form_with_valid_scope_passing_auth(self): - """Ensure POSTing with a write scope succeed""" - read_write_access_token = self.access_token - read_write_access_token.scope = oauth2_provider_scope.SCOPE_NAME_DICT['write'] - read_write_access_token.save() - auth = self._create_authorization_header(token=read_write_access_token.token) - response = self.csrf_client.post('/oauth2-with-scope-test/', HTTP_AUTHORIZATION=auth) - self.assertEqual(response.status_code, 200) - - -class FailingAuthAccessedInRenderer(TestCase): - def setUp(self): - class AuthAccessingRenderer(renderers.BaseRenderer): - media_type = 'text/plain' - format = 'txt' - - def render(self, data, media_type=None, renderer_context=None): - request = renderer_context['request'] - if request.user.is_authenticated(): - return b'authenticated' - return b'not authenticated' - - class FailingAuth(BaseAuthentication): - def authenticate(self, request): - raise exceptions.AuthenticationFailed('authentication failed') - - class ExampleView(APIView): - authentication_classes = (FailingAuth,) - renderer_classes = (AuthAccessingRenderer,) - - def get(self, request): - return Response({'foo': 'bar'}) - - self.view = ExampleView.as_view() - - def test_failing_auth_accessed_in_renderer(self): - """ - When authentication fails the renderer should still be able to access - `request.user` without raising an exception. Particularly relevant - to HTML responses that might reasonably access `request.user`. - """ - request = factory.get('/') - response = self.view(request) - content = response.render().content - self.assertEqual(content, b'not authenticated') diff --git a/vendor-local/lib/python/rest_framework/tests/test_breadcrumbs.py b/vendor-local/lib/python/rest_framework/tests/test_breadcrumbs.py deleted file mode 100644 index 41ddf2ceac6..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_breadcrumbs.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import unicode_literals -from django.test import TestCase -from rest_framework.compat import patterns, url -from rest_framework.utils.breadcrumbs import get_breadcrumbs -from rest_framework.views import APIView - - -class Root(APIView): - pass - - -class ResourceRoot(APIView): - pass - - -class ResourceInstance(APIView): - pass - - -class NestedResourceRoot(APIView): - pass - - -class NestedResourceInstance(APIView): - pass - -urlpatterns = patterns('', - url(r'^$', Root.as_view()), - url(r'^resource/$', ResourceRoot.as_view()), - url(r'^resource/(?P[0-9]+)$', ResourceInstance.as_view()), - url(r'^resource/(?P[0-9]+)/$', NestedResourceRoot.as_view()), - url(r'^resource/(?P[0-9]+)/(?P[A-Za-z]+)$', NestedResourceInstance.as_view()), -) - - -class BreadcrumbTests(TestCase): - """Tests the breadcrumb functionality used by the HTML renderer.""" - - urls = 'rest_framework.tests.test_breadcrumbs' - - def test_root_breadcrumbs(self): - url = '/' - self.assertEqual(get_breadcrumbs(url), [('Root', '/')]) - - def test_resource_root_breadcrumbs(self): - url = '/resource/' - self.assertEqual(get_breadcrumbs(url), [('Root', '/'), - ('Resource Root', '/resource/')]) - - def test_resource_instance_breadcrumbs(self): - url = '/resource/123' - self.assertEqual(get_breadcrumbs(url), [('Root', '/'), - ('Resource Root', '/resource/'), - ('Resource Instance', '/resource/123')]) - - def test_nested_resource_breadcrumbs(self): - url = '/resource/123/' - self.assertEqual(get_breadcrumbs(url), [('Root', '/'), - ('Resource Root', '/resource/'), - ('Resource Instance', '/resource/123'), - ('Nested Resource Root', '/resource/123/')]) - - def test_nested_resource_instance_breadcrumbs(self): - url = '/resource/123/abc' - self.assertEqual(get_breadcrumbs(url), [('Root', '/'), - ('Resource Root', '/resource/'), - ('Resource Instance', '/resource/123'), - ('Nested Resource Root', '/resource/123/'), - ('Nested Resource Instance', '/resource/123/abc')]) - - def test_broken_url_breadcrumbs_handled_gracefully(self): - url = '/foobar' - self.assertEqual(get_breadcrumbs(url), [('Root', '/')]) diff --git a/vendor-local/lib/python/rest_framework/tests/test_decorators.py b/vendor-local/lib/python/rest_framework/tests/test_decorators.py deleted file mode 100644 index 195f0ba3e46..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_decorators.py +++ /dev/null @@ -1,157 +0,0 @@ -from __future__ import unicode_literals -from django.test import TestCase -from rest_framework import status -from rest_framework.authentication import BasicAuthentication -from rest_framework.parsers import JSONParser -from rest_framework.permissions import IsAuthenticated -from rest_framework.response import Response -from rest_framework.renderers import JSONRenderer -from rest_framework.test import APIRequestFactory -from rest_framework.throttling import UserRateThrottle -from rest_framework.views import APIView -from rest_framework.decorators import ( - api_view, - renderer_classes, - parser_classes, - authentication_classes, - throttle_classes, - permission_classes, -) - - -class DecoratorTestCase(TestCase): - - def setUp(self): - self.factory = APIRequestFactory() - - def _finalize_response(self, request, response, *args, **kwargs): - response.request = request - return APIView.finalize_response(self, request, response, *args, **kwargs) - - def test_api_view_incorrect(self): - """ - If @api_view is not applied correct, we should raise an assertion. - """ - - @api_view - def view(request): - return Response() - - request = self.factory.get('/') - self.assertRaises(AssertionError, view, request) - - def test_api_view_incorrect_arguments(self): - """ - If @api_view is missing arguments, we should raise an assertion. - """ - - with self.assertRaises(AssertionError): - @api_view('GET') - def view(request): - return Response() - - def test_calling_method(self): - - @api_view(['GET']) - def view(request): - return Response({}) - - request = self.factory.get('/') - response = view(request) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - request = self.factory.post('/') - response = view(request) - self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) - - def test_calling_put_method(self): - - @api_view(['GET', 'PUT']) - def view(request): - return Response({}) - - request = self.factory.put('/') - response = view(request) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - request = self.factory.post('/') - response = view(request) - self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) - - def test_calling_patch_method(self): - - @api_view(['GET', 'PATCH']) - def view(request): - return Response({}) - - request = self.factory.patch('/') - response = view(request) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - request = self.factory.post('/') - response = view(request) - self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) - - def test_renderer_classes(self): - - @api_view(['GET']) - @renderer_classes([JSONRenderer]) - def view(request): - return Response({}) - - request = self.factory.get('/') - response = view(request) - self.assertTrue(isinstance(response.accepted_renderer, JSONRenderer)) - - def test_parser_classes(self): - - @api_view(['GET']) - @parser_classes([JSONParser]) - def view(request): - self.assertEqual(len(request.parsers), 1) - self.assertTrue(isinstance(request.parsers[0], - JSONParser)) - return Response({}) - - request = self.factory.get('/') - view(request) - - def test_authentication_classes(self): - - @api_view(['GET']) - @authentication_classes([BasicAuthentication]) - def view(request): - self.assertEqual(len(request.authenticators), 1) - self.assertTrue(isinstance(request.authenticators[0], - BasicAuthentication)) - return Response({}) - - request = self.factory.get('/') - view(request) - - def test_permission_classes(self): - - @api_view(['GET']) - @permission_classes([IsAuthenticated]) - def view(request): - return Response({}) - - request = self.factory.get('/') - response = view(request) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - def test_throttle_classes(self): - class OncePerDayUserThrottle(UserRateThrottle): - rate = '1/day' - - @api_view(['GET']) - @throttle_classes([OncePerDayUserThrottle]) - def view(request): - return Response({}) - - request = self.factory.get('/') - response = view(request) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - response = view(request) - self.assertEqual(response.status_code, status.HTTP_429_TOO_MANY_REQUESTS) diff --git a/vendor-local/lib/python/rest_framework/tests/test_description.py b/vendor-local/lib/python/rest_framework/tests/test_description.py deleted file mode 100644 index 8019f5ecafd..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_description.py +++ /dev/null @@ -1,109 +0,0 @@ -# -- coding: utf-8 -- - -from __future__ import unicode_literals -from django.test import TestCase -from rest_framework.compat import apply_markdown, smart_text -from rest_framework.views import APIView -from rest_framework.tests.description import ViewWithNonASCIICharactersInDocstring -from rest_framework.tests.description import UTF8_TEST_DOCSTRING -from rest_framework.utils.formatting import get_view_name, get_view_description - -# We check that docstrings get nicely un-indented. -DESCRIPTION = """an example docstring -==================== - -* list -* list - -another header --------------- - - code block - -indented - -# hash style header #""" - -# If markdown is installed we also test it's working -# (and that our wrapped forces '=' to h2 and '-' to h3) - -# We support markdown < 2.1 and markdown >= 2.1 -MARKED_DOWN_lt_21 = """

an example docstring

-
    -
  • list
  • -
  • list
  • -
-

another header

-
code block
-
-

indented

-

hash style header

""" - -MARKED_DOWN_gte_21 = """

an example docstring

-
    -
  • list
  • -
  • list
  • -
-

another header

-
code block
-
-

indented

-

hash style header

""" - - -class TestViewNamesAndDescriptions(TestCase): - def test_view_name_uses_class_name(self): - """ - Ensure view names are based on the class name. - """ - class MockView(APIView): - pass - self.assertEqual(get_view_name(MockView), 'Mock') - - def test_view_description_uses_docstring(self): - """Ensure view descriptions are based on the docstring.""" - class MockView(APIView): - """an example docstring - ==================== - - * list - * list - - another header - -------------- - - code block - - indented - - # hash style header #""" - - self.assertEqual(get_view_description(MockView), DESCRIPTION) - - def test_view_description_supports_unicode(self): - """ - Unicode in docstrings should be respected. - """ - - self.assertEqual( - get_view_description(ViewWithNonASCIICharactersInDocstring), - smart_text(UTF8_TEST_DOCSTRING) - ) - - def test_view_description_can_be_empty(self): - """ - Ensure that if a view has no docstring, - then it's description is the empty string. - """ - class MockView(APIView): - pass - self.assertEqual(get_view_description(MockView), '') - - def test_markdown(self): - """ - Ensure markdown to HTML works as expected. - """ - if apply_markdown: - gte_21_match = apply_markdown(DESCRIPTION) == MARKED_DOWN_gte_21 - lt_21_match = apply_markdown(DESCRIPTION) == MARKED_DOWN_lt_21 - self.assertTrue(gte_21_match or lt_21_match) diff --git a/vendor-local/lib/python/rest_framework/tests/test_fields.py b/vendor-local/lib/python/rest_framework/tests/test_fields.py deleted file mode 100644 index 6836ec86f6b..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_fields.py +++ /dev/null @@ -1,898 +0,0 @@ -""" -General serializer field tests. -""" -from __future__ import unicode_literals - -import datetime -from decimal import Decimal -from uuid import uuid4 -from django.core import validators -from django.db import models -from django.test import TestCase -from django.utils.datastructures import SortedDict -from rest_framework import serializers -from rest_framework.tests.models import RESTFrameworkModel - - -class TimestampedModel(models.Model): - added = models.DateTimeField(auto_now_add=True) - updated = models.DateTimeField(auto_now=True) - - -class CharPrimaryKeyModel(models.Model): - id = models.CharField(max_length=20, primary_key=True) - - -class TimestampedModelSerializer(serializers.ModelSerializer): - class Meta: - model = TimestampedModel - - -class CharPrimaryKeyModelSerializer(serializers.ModelSerializer): - class Meta: - model = CharPrimaryKeyModel - - -class TimeFieldModel(models.Model): - clock = models.TimeField() - - -class TimeFieldModelSerializer(serializers.ModelSerializer): - class Meta: - model = TimeFieldModel - - -class BasicFieldTests(TestCase): - def test_auto_now_fields_read_only(self): - """ - auto_now and auto_now_add fields should be read_only by default. - """ - serializer = TimestampedModelSerializer() - self.assertEqual(serializer.fields['added'].read_only, True) - - def test_auto_pk_fields_read_only(self): - """ - AutoField fields should be read_only by default. - """ - serializer = TimestampedModelSerializer() - self.assertEqual(serializer.fields['id'].read_only, True) - - def test_non_auto_pk_fields_not_read_only(self): - """ - PK fields other than AutoField fields should not be read_only by default. - """ - serializer = CharPrimaryKeyModelSerializer() - self.assertEqual(serializer.fields['id'].read_only, False) - - def test_dict_field_ordering(self): - """ - Field should preserve dictionary ordering, if it exists. - See: https://github.com/tomchristie/django-rest-framework/issues/832 - """ - ret = SortedDict() - ret['c'] = 1 - ret['b'] = 1 - ret['a'] = 1 - ret['z'] = 1 - field = serializers.Field() - keys = list(field.to_native(ret).keys()) - self.assertEqual(keys, ['c', 'b', 'a', 'z']) - - -class DateFieldTest(TestCase): - """ - Tests for the DateFieldTest from_native() and to_native() behavior - """ - - def test_from_native_string(self): - """ - Make sure from_native() accepts default iso input formats. - """ - f = serializers.DateField() - result_1 = f.from_native('1984-07-31') - - self.assertEqual(datetime.date(1984, 7, 31), result_1) - - def test_from_native_datetime_date(self): - """ - Make sure from_native() accepts a datetime.date instance. - """ - f = serializers.DateField() - result_1 = f.from_native(datetime.date(1984, 7, 31)) - - self.assertEqual(result_1, datetime.date(1984, 7, 31)) - - def test_from_native_custom_format(self): - """ - Make sure from_native() accepts custom input formats. - """ - f = serializers.DateField(input_formats=['%Y -- %d']) - result = f.from_native('1984 -- 31') - - self.assertEqual(datetime.date(1984, 1, 31), result) - - def test_from_native_invalid_default_on_custom_format(self): - """ - Make sure from_native() don't accept default formats if custom format is preset - """ - f = serializers.DateField(input_formats=['%Y -- %d']) - - try: - f.from_native('1984-07-31') - except validators.ValidationError as e: - self.assertEqual(e.messages, ["Date has wrong format. Use one of these formats instead: YYYY -- DD"]) - else: - self.fail("ValidationError was not properly raised") - - def test_from_native_empty(self): - """ - Make sure from_native() returns None on empty param. - """ - f = serializers.DateField() - result = f.from_native('') - - self.assertEqual(result, None) - - def test_from_native_none(self): - """ - Make sure from_native() returns None on None param. - """ - f = serializers.DateField() - result = f.from_native(None) - - self.assertEqual(result, None) - - def test_from_native_invalid_date(self): - """ - Make sure from_native() raises a ValidationError on passing an invalid date. - """ - f = serializers.DateField() - - try: - f.from_native('1984-13-31') - except validators.ValidationError as e: - self.assertEqual(e.messages, ["Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]]"]) - else: - self.fail("ValidationError was not properly raised") - - def test_from_native_invalid_format(self): - """ - Make sure from_native() raises a ValidationError on passing an invalid format. - """ - f = serializers.DateField() - - try: - f.from_native('1984 -- 31') - except validators.ValidationError as e: - self.assertEqual(e.messages, ["Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]]"]) - else: - self.fail("ValidationError was not properly raised") - - def test_to_native(self): - """ - Make sure to_native() returns datetime as default. - """ - f = serializers.DateField() - - result_1 = f.to_native(datetime.date(1984, 7, 31)) - - self.assertEqual(datetime.date(1984, 7, 31), result_1) - - def test_to_native_iso(self): - """ - Make sure to_native() with 'iso-8601' returns iso formated date. - """ - f = serializers.DateField(format='iso-8601') - - result_1 = f.to_native(datetime.date(1984, 7, 31)) - - self.assertEqual('1984-07-31', result_1) - - def test_to_native_custom_format(self): - """ - Make sure to_native() returns correct custom format. - """ - f = serializers.DateField(format="%Y - %m.%d") - - result_1 = f.to_native(datetime.date(1984, 7, 31)) - - self.assertEqual('1984 - 07.31', result_1) - - def test_to_native_none(self): - """ - Make sure from_native() returns None on None param. - """ - f = serializers.DateField(required=False) - self.assertEqual(None, f.to_native(None)) - - -class DateTimeFieldTest(TestCase): - """ - Tests for the DateTimeField from_native() and to_native() behavior - """ - - def test_from_native_string(self): - """ - Make sure from_native() accepts default iso input formats. - """ - f = serializers.DateTimeField() - result_1 = f.from_native('1984-07-31 04:31') - result_2 = f.from_native('1984-07-31 04:31:59') - result_3 = f.from_native('1984-07-31 04:31:59.000200') - - self.assertEqual(datetime.datetime(1984, 7, 31, 4, 31), result_1) - self.assertEqual(datetime.datetime(1984, 7, 31, 4, 31, 59), result_2) - self.assertEqual(datetime.datetime(1984, 7, 31, 4, 31, 59, 200), result_3) - - def test_from_native_datetime_datetime(self): - """ - Make sure from_native() accepts a datetime.datetime instance. - """ - f = serializers.DateTimeField() - result_1 = f.from_native(datetime.datetime(1984, 7, 31, 4, 31)) - result_2 = f.from_native(datetime.datetime(1984, 7, 31, 4, 31, 59)) - result_3 = f.from_native(datetime.datetime(1984, 7, 31, 4, 31, 59, 200)) - - self.assertEqual(result_1, datetime.datetime(1984, 7, 31, 4, 31)) - self.assertEqual(result_2, datetime.datetime(1984, 7, 31, 4, 31, 59)) - self.assertEqual(result_3, datetime.datetime(1984, 7, 31, 4, 31, 59, 200)) - - def test_from_native_custom_format(self): - """ - Make sure from_native() accepts custom input formats. - """ - f = serializers.DateTimeField(input_formats=['%Y -- %H:%M']) - result = f.from_native('1984 -- 04:59') - - self.assertEqual(datetime.datetime(1984, 1, 1, 4, 59), result) - - def test_from_native_invalid_default_on_custom_format(self): - """ - Make sure from_native() don't accept default formats if custom format is preset - """ - f = serializers.DateTimeField(input_formats=['%Y -- %H:%M']) - - try: - f.from_native('1984-07-31 04:31:59') - except validators.ValidationError as e: - self.assertEqual(e.messages, ["Datetime has wrong format. Use one of these formats instead: YYYY -- hh:mm"]) - else: - self.fail("ValidationError was not properly raised") - - def test_from_native_empty(self): - """ - Make sure from_native() returns None on empty param. - """ - f = serializers.DateTimeField() - result = f.from_native('') - - self.assertEqual(result, None) - - def test_from_native_none(self): - """ - Make sure from_native() returns None on None param. - """ - f = serializers.DateTimeField() - result = f.from_native(None) - - self.assertEqual(result, None) - - def test_from_native_invalid_datetime(self): - """ - Make sure from_native() raises a ValidationError on passing an invalid datetime. - """ - f = serializers.DateTimeField() - - try: - f.from_native('04:61:59') - except validators.ValidationError as e: - self.assertEqual(e.messages, ["Datetime has wrong format. Use one of these formats instead: " - "YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HHMM|-HHMM|Z]"]) - else: - self.fail("ValidationError was not properly raised") - - def test_from_native_invalid_format(self): - """ - Make sure from_native() raises a ValidationError on passing an invalid format. - """ - f = serializers.DateTimeField() - - try: - f.from_native('04 -- 31') - except validators.ValidationError as e: - self.assertEqual(e.messages, ["Datetime has wrong format. Use one of these formats instead: " - "YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HHMM|-HHMM|Z]"]) - else: - self.fail("ValidationError was not properly raised") - - def test_to_native(self): - """ - Make sure to_native() returns isoformat as default. - """ - f = serializers.DateTimeField() - - result_1 = f.to_native(datetime.datetime(1984, 7, 31)) - result_2 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31)) - result_3 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31, 59)) - result_4 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31, 59, 200)) - - self.assertEqual(datetime.datetime(1984, 7, 31), result_1) - self.assertEqual(datetime.datetime(1984, 7, 31, 4, 31), result_2) - self.assertEqual(datetime.datetime(1984, 7, 31, 4, 31, 59), result_3) - self.assertEqual(datetime.datetime(1984, 7, 31, 4, 31, 59, 200), result_4) - - def test_to_native_iso(self): - """ - Make sure to_native() with format=iso-8601 returns iso formatted datetime. - """ - f = serializers.DateTimeField(format='iso-8601') - - result_1 = f.to_native(datetime.datetime(1984, 7, 31)) - result_2 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31)) - result_3 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31, 59)) - result_4 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31, 59, 200)) - - self.assertEqual('1984-07-31T00:00:00', result_1) - self.assertEqual('1984-07-31T04:31:00', result_2) - self.assertEqual('1984-07-31T04:31:59', result_3) - self.assertEqual('1984-07-31T04:31:59.000200', result_4) - - def test_to_native_custom_format(self): - """ - Make sure to_native() returns correct custom format. - """ - f = serializers.DateTimeField(format="%Y - %H:%M") - - result_1 = f.to_native(datetime.datetime(1984, 7, 31)) - result_2 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31)) - result_3 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31, 59)) - result_4 = f.to_native(datetime.datetime(1984, 7, 31, 4, 31, 59, 200)) - - self.assertEqual('1984 - 00:00', result_1) - self.assertEqual('1984 - 04:31', result_2) - self.assertEqual('1984 - 04:31', result_3) - self.assertEqual('1984 - 04:31', result_4) - - def test_to_native_none(self): - """ - Make sure from_native() returns None on None param. - """ - f = serializers.DateTimeField(required=False) - self.assertEqual(None, f.to_native(None)) - - -class TimeFieldTest(TestCase): - """ - Tests for the TimeField from_native() and to_native() behavior - """ - - def test_from_native_string(self): - """ - Make sure from_native() accepts default iso input formats. - """ - f = serializers.TimeField() - result_1 = f.from_native('04:31') - result_2 = f.from_native('04:31:59') - result_3 = f.from_native('04:31:59.000200') - - self.assertEqual(datetime.time(4, 31), result_1) - self.assertEqual(datetime.time(4, 31, 59), result_2) - self.assertEqual(datetime.time(4, 31, 59, 200), result_3) - - def test_from_native_datetime_time(self): - """ - Make sure from_native() accepts a datetime.time instance. - """ - f = serializers.TimeField() - result_1 = f.from_native(datetime.time(4, 31)) - result_2 = f.from_native(datetime.time(4, 31, 59)) - result_3 = f.from_native(datetime.time(4, 31, 59, 200)) - - self.assertEqual(result_1, datetime.time(4, 31)) - self.assertEqual(result_2, datetime.time(4, 31, 59)) - self.assertEqual(result_3, datetime.time(4, 31, 59, 200)) - - def test_from_native_custom_format(self): - """ - Make sure from_native() accepts custom input formats. - """ - f = serializers.TimeField(input_formats=['%H -- %M']) - result = f.from_native('04 -- 31') - - self.assertEqual(datetime.time(4, 31), result) - - def test_from_native_invalid_default_on_custom_format(self): - """ - Make sure from_native() don't accept default formats if custom format is preset - """ - f = serializers.TimeField(input_formats=['%H -- %M']) - - try: - f.from_native('04:31:59') - except validators.ValidationError as e: - self.assertEqual(e.messages, ["Time has wrong format. Use one of these formats instead: hh -- mm"]) - else: - self.fail("ValidationError was not properly raised") - - def test_from_native_empty(self): - """ - Make sure from_native() returns None on empty param. - """ - f = serializers.TimeField() - result = f.from_native('') - - self.assertEqual(result, None) - - def test_from_native_none(self): - """ - Make sure from_native() returns None on None param. - """ - f = serializers.TimeField() - result = f.from_native(None) - - self.assertEqual(result, None) - - def test_from_native_invalid_time(self): - """ - Make sure from_native() raises a ValidationError on passing an invalid time. - """ - f = serializers.TimeField() - - try: - f.from_native('04:61:59') - except validators.ValidationError as e: - self.assertEqual(e.messages, ["Time has wrong format. Use one of these formats instead: " - "hh:mm[:ss[.uuuuuu]]"]) - else: - self.fail("ValidationError was not properly raised") - - def test_from_native_invalid_format(self): - """ - Make sure from_native() raises a ValidationError on passing an invalid format. - """ - f = serializers.TimeField() - - try: - f.from_native('04 -- 31') - except validators.ValidationError as e: - self.assertEqual(e.messages, ["Time has wrong format. Use one of these formats instead: " - "hh:mm[:ss[.uuuuuu]]"]) - else: - self.fail("ValidationError was not properly raised") - - def test_to_native(self): - """ - Make sure to_native() returns time object as default. - """ - f = serializers.TimeField() - result_1 = f.to_native(datetime.time(4, 31)) - result_2 = f.to_native(datetime.time(4, 31, 59)) - result_3 = f.to_native(datetime.time(4, 31, 59, 200)) - - self.assertEqual(datetime.time(4, 31), result_1) - self.assertEqual(datetime.time(4, 31, 59), result_2) - self.assertEqual(datetime.time(4, 31, 59, 200), result_3) - - def test_to_native_iso(self): - """ - Make sure to_native() with format='iso-8601' returns iso formatted time. - """ - f = serializers.TimeField(format='iso-8601') - result_1 = f.to_native(datetime.time(4, 31)) - result_2 = f.to_native(datetime.time(4, 31, 59)) - result_3 = f.to_native(datetime.time(4, 31, 59, 200)) - - self.assertEqual('04:31:00', result_1) - self.assertEqual('04:31:59', result_2) - self.assertEqual('04:31:59.000200', result_3) - - def test_to_native_custom_format(self): - """ - Make sure to_native() returns correct custom format. - """ - f = serializers.TimeField(format="%H - %S [%f]") - result_1 = f.to_native(datetime.time(4, 31)) - result_2 = f.to_native(datetime.time(4, 31, 59)) - result_3 = f.to_native(datetime.time(4, 31, 59, 200)) - - self.assertEqual('04 - 00 [000000]', result_1) - self.assertEqual('04 - 59 [000000]', result_2) - self.assertEqual('04 - 59 [000200]', result_3) - - -class DecimalFieldTest(TestCase): - """ - Tests for the DecimalField from_native() and to_native() behavior - """ - - def test_from_native_string(self): - """ - Make sure from_native() accepts string values - """ - f = serializers.DecimalField() - result_1 = f.from_native('9000') - result_2 = f.from_native('1.00000001') - - self.assertEqual(Decimal('9000'), result_1) - self.assertEqual(Decimal('1.00000001'), result_2) - - def test_from_native_invalid_string(self): - """ - Make sure from_native() raises ValidationError on passing invalid string - """ - f = serializers.DecimalField() - - try: - f.from_native('123.45.6') - except validators.ValidationError as e: - self.assertEqual(e.messages, ["Enter a number."]) - else: - self.fail("ValidationError was not properly raised") - - def test_from_native_integer(self): - """ - Make sure from_native() accepts integer values - """ - f = serializers.DecimalField() - result = f.from_native(9000) - - self.assertEqual(Decimal('9000'), result) - - def test_from_native_float(self): - """ - Make sure from_native() accepts float values - """ - f = serializers.DecimalField() - result = f.from_native(1.00000001) - - self.assertEqual(Decimal('1.00000001'), result) - - def test_from_native_empty(self): - """ - Make sure from_native() returns None on empty param. - """ - f = serializers.DecimalField() - result = f.from_native('') - - self.assertEqual(result, None) - - def test_from_native_none(self): - """ - Make sure from_native() returns None on None param. - """ - f = serializers.DecimalField() - result = f.from_native(None) - - self.assertEqual(result, None) - - def test_to_native(self): - """ - Make sure to_native() returns Decimal as string. - """ - f = serializers.DecimalField() - - result_1 = f.to_native(Decimal('9000')) - result_2 = f.to_native(Decimal('1.00000001')) - - self.assertEqual(Decimal('9000'), result_1) - self.assertEqual(Decimal('1.00000001'), result_2) - - def test_to_native_none(self): - """ - Make sure from_native() returns None on None param. - """ - f = serializers.DecimalField(required=False) - self.assertEqual(None, f.to_native(None)) - - def test_valid_serialization(self): - """ - Make sure the serializer works correctly - """ - class DecimalSerializer(serializers.Serializer): - decimal_field = serializers.DecimalField(max_value=9010, - min_value=9000, - max_digits=6, - decimal_places=2) - - self.assertTrue(DecimalSerializer(data={'decimal_field': '9001'}).is_valid()) - self.assertTrue(DecimalSerializer(data={'decimal_field': '9001.2'}).is_valid()) - self.assertTrue(DecimalSerializer(data={'decimal_field': '9001.23'}).is_valid()) - - self.assertFalse(DecimalSerializer(data={'decimal_field': '8000'}).is_valid()) - self.assertFalse(DecimalSerializer(data={'decimal_field': '9900'}).is_valid()) - self.assertFalse(DecimalSerializer(data={'decimal_field': '9001.234'}).is_valid()) - - def test_raise_max_value(self): - """ - Make sure max_value violations raises ValidationError - """ - class DecimalSerializer(serializers.Serializer): - decimal_field = serializers.DecimalField(max_value=100) - - s = DecimalSerializer(data={'decimal_field': '123'}) - - self.assertFalse(s.is_valid()) - self.assertEqual(s.errors, {'decimal_field': ['Ensure this value is less than or equal to 100.']}) - - def test_raise_min_value(self): - """ - Make sure min_value violations raises ValidationError - """ - class DecimalSerializer(serializers.Serializer): - decimal_field = serializers.DecimalField(min_value=100) - - s = DecimalSerializer(data={'decimal_field': '99'}) - - self.assertFalse(s.is_valid()) - self.assertEqual(s.errors, {'decimal_field': ['Ensure this value is greater than or equal to 100.']}) - - def test_raise_max_digits(self): - """ - Make sure max_digits violations raises ValidationError - """ - class DecimalSerializer(serializers.Serializer): - decimal_field = serializers.DecimalField(max_digits=5) - - s = DecimalSerializer(data={'decimal_field': '123.456'}) - - self.assertFalse(s.is_valid()) - self.assertEqual(s.errors, {'decimal_field': ['Ensure that there are no more than 5 digits in total.']}) - - def test_raise_max_decimal_places(self): - """ - Make sure max_decimal_places violations raises ValidationError - """ - class DecimalSerializer(serializers.Serializer): - decimal_field = serializers.DecimalField(decimal_places=3) - - s = DecimalSerializer(data={'decimal_field': '123.4567'}) - - self.assertFalse(s.is_valid()) - self.assertEqual(s.errors, {'decimal_field': ['Ensure that there are no more than 3 decimal places.']}) - - def test_raise_max_whole_digits(self): - """ - Make sure max_whole_digits violations raises ValidationError - """ - class DecimalSerializer(serializers.Serializer): - decimal_field = serializers.DecimalField(max_digits=4, decimal_places=3) - - s = DecimalSerializer(data={'decimal_field': '12345.6'}) - - self.assertFalse(s.is_valid()) - self.assertEqual(s.errors, {'decimal_field': ['Ensure that there are no more than 4 digits in total.']}) - - -class ChoiceFieldTests(TestCase): - """ - Tests for the ChoiceField options generator - """ - - SAMPLE_CHOICES = [ - ('red', 'Red'), - ('green', 'Green'), - ('blue', 'Blue'), - ] - - def test_choices_required(self): - """ - Make sure proper choices are rendered if field is required - """ - f = serializers.ChoiceField(required=True, choices=self.SAMPLE_CHOICES) - self.assertEqual(f.choices, self.SAMPLE_CHOICES) - - def test_choices_not_required(self): - """ - Make sure proper choices (plus blank) are rendered if the field isn't required - """ - f = serializers.ChoiceField(required=False, choices=self.SAMPLE_CHOICES) - self.assertEqual(f.choices, models.fields.BLANK_CHOICE_DASH + self.SAMPLE_CHOICES) - - -class EmailFieldTests(TestCase): - """ - Tests for EmailField attribute values - """ - - class EmailFieldModel(RESTFrameworkModel): - email_field = models.EmailField(blank=True) - - class EmailFieldWithGivenMaxLengthModel(RESTFrameworkModel): - email_field = models.EmailField(max_length=150, blank=True) - - def test_default_model_value(self): - class EmailFieldSerializer(serializers.ModelSerializer): - class Meta: - model = self.EmailFieldModel - - serializer = EmailFieldSerializer(data={}) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(getattr(serializer.fields['email_field'], 'max_length'), 75) - - def test_given_model_value(self): - class EmailFieldSerializer(serializers.ModelSerializer): - class Meta: - model = self.EmailFieldWithGivenMaxLengthModel - - serializer = EmailFieldSerializer(data={}) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(getattr(serializer.fields['email_field'], 'max_length'), 150) - - def test_given_serializer_value(self): - class EmailFieldSerializer(serializers.ModelSerializer): - email_field = serializers.EmailField(source='email_field', max_length=20, required=False) - - class Meta: - model = self.EmailFieldModel - - serializer = EmailFieldSerializer(data={}) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(getattr(serializer.fields['email_field'], 'max_length'), 20) - - -class SlugFieldTests(TestCase): - """ - Tests for SlugField attribute values - """ - - class SlugFieldModel(RESTFrameworkModel): - slug_field = models.SlugField(blank=True) - - class SlugFieldWithGivenMaxLengthModel(RESTFrameworkModel): - slug_field = models.SlugField(max_length=84, blank=True) - - def test_default_model_value(self): - class SlugFieldSerializer(serializers.ModelSerializer): - class Meta: - model = self.SlugFieldModel - - serializer = SlugFieldSerializer(data={}) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(getattr(serializer.fields['slug_field'], 'max_length'), 50) - - def test_given_model_value(self): - class SlugFieldSerializer(serializers.ModelSerializer): - class Meta: - model = self.SlugFieldWithGivenMaxLengthModel - - serializer = SlugFieldSerializer(data={}) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(getattr(serializer.fields['slug_field'], 'max_length'), 84) - - def test_given_serializer_value(self): - class SlugFieldSerializer(serializers.ModelSerializer): - slug_field = serializers.SlugField(source='slug_field', - max_length=20, required=False) - - class Meta: - model = self.SlugFieldModel - - serializer = SlugFieldSerializer(data={}) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(getattr(serializer.fields['slug_field'], - 'max_length'), 20) - - def test_invalid_slug(self): - """ - Make sure an invalid slug raises ValidationError - """ - class SlugFieldSerializer(serializers.ModelSerializer): - slug_field = serializers.SlugField(source='slug_field', max_length=20, required=True) - - class Meta: - model = self.SlugFieldModel - - s = SlugFieldSerializer(data={'slug_field': 'a b'}) - - self.assertEqual(s.is_valid(), False) - self.assertEqual(s.errors, {'slug_field': ["Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."]}) - - -class URLFieldTests(TestCase): - """ - Tests for URLField attribute values - """ - - class URLFieldModel(RESTFrameworkModel): - url_field = models.URLField(blank=True) - - class URLFieldWithGivenMaxLengthModel(RESTFrameworkModel): - url_field = models.URLField(max_length=128, blank=True) - - def test_default_model_value(self): - class URLFieldSerializer(serializers.ModelSerializer): - class Meta: - model = self.URLFieldModel - - serializer = URLFieldSerializer(data={}) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(getattr(serializer.fields['url_field'], - 'max_length'), 200) - - def test_given_model_value(self): - class URLFieldSerializer(serializers.ModelSerializer): - class Meta: - model = self.URLFieldWithGivenMaxLengthModel - - serializer = URLFieldSerializer(data={}) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(getattr(serializer.fields['url_field'], - 'max_length'), 128) - - def test_given_serializer_value(self): - class URLFieldSerializer(serializers.ModelSerializer): - url_field = serializers.URLField(source='url_field', - max_length=20, required=False) - - class Meta: - model = self.URLFieldWithGivenMaxLengthModel - - serializer = URLFieldSerializer(data={}) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(getattr(serializer.fields['url_field'], - 'max_length'), 20) - - -class FieldMetadata(TestCase): - def setUp(self): - self.required_field = serializers.Field() - self.required_field.label = uuid4().hex - self.required_field.required = True - - self.optional_field = serializers.Field() - self.optional_field.label = uuid4().hex - self.optional_field.required = False - - def test_required(self): - self.assertEqual(self.required_field.metadata()['required'], True) - - def test_optional(self): - self.assertEqual(self.optional_field.metadata()['required'], False) - - def test_label(self): - for field in (self.required_field, self.optional_field): - self.assertEqual(field.metadata()['label'], field.label) - - -class FieldCallableDefault(TestCase): - def setUp(self): - self.simple_callable = lambda: 'foo bar' - - def test_default_can_be_simple_callable(self): - """ - Ensure that the 'default' argument can also be a simple callable. - """ - field = serializers.WritableField(default=self.simple_callable) - into = {} - field.field_from_native({}, {}, 'field', into) - self.assertEqual(into, {'field': 'foo bar'}) - - -class CustomIntegerField(TestCase): - """ - Test that custom fields apply min_value and max_value constraints - """ - def test_custom_fields_can_be_validated_for_value(self): - - class MoneyField(models.PositiveIntegerField): - pass - - class EntryModel(models.Model): - bank = MoneyField(validators=[validators.MaxValueValidator(100)]) - - class EntrySerializer(serializers.ModelSerializer): - class Meta: - model = EntryModel - - entry = EntryModel(bank=1) - - serializer = EntrySerializer(entry, data={"bank": 11}) - self.assertTrue(serializer.is_valid()) - - serializer = EntrySerializer(entry, data={"bank": -1}) - self.assertFalse(serializer.is_valid()) - - serializer = EntrySerializer(entry, data={"bank": 101}) - self.assertFalse(serializer.is_valid()) - - diff --git a/vendor-local/lib/python/rest_framework/tests/test_files.py b/vendor-local/lib/python/rest_framework/tests/test_files.py deleted file mode 100644 index 487046aca49..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_files.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import unicode_literals -from django.test import TestCase -from rest_framework import serializers -from rest_framework.compat import BytesIO -from rest_framework.compat import six -import datetime - - -class UploadedFile(object): - def __init__(self, file, created=None): - self.file = file - self.created = created or datetime.datetime.now() - - -class UploadedFileSerializer(serializers.Serializer): - file = serializers.FileField() - created = serializers.DateTimeField() - - def restore_object(self, attrs, instance=None): - if instance: - instance.file = attrs['file'] - instance.created = attrs['created'] - return instance - return UploadedFile(**attrs) - - -class FileSerializerTests(TestCase): - def test_create(self): - now = datetime.datetime.now() - file = BytesIO(six.b('stuff')) - file.name = 'stuff.txt' - file.size = len(file.getvalue()) - serializer = UploadedFileSerializer(data={'created': now}, files={'file': file}) - uploaded_file = UploadedFile(file=file, created=now) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.object.created, uploaded_file.created) - self.assertEqual(serializer.object.file, uploaded_file.file) - self.assertFalse(serializer.object is uploaded_file) - - def test_creation_failure(self): - """ - Passing files=None should result in an ValidationError - - Regression test for: - https://github.com/tomchristie/django-rest-framework/issues/542 - """ - now = datetime.datetime.now() - - serializer = UploadedFileSerializer(data={'created': now}) - self.assertFalse(serializer.is_valid()) - self.assertIn('file', serializer.errors) diff --git a/vendor-local/lib/python/rest_framework/tests/test_filters.py b/vendor-local/lib/python/rest_framework/tests/test_filters.py deleted file mode 100644 index c9d9e7ffaa6..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_filters.py +++ /dev/null @@ -1,474 +0,0 @@ -from __future__ import unicode_literals -import datetime -from decimal import Decimal -from django.db import models -from django.core.urlresolvers import reverse -from django.test import TestCase -from django.utils import unittest -from rest_framework import generics, serializers, status, filters -from rest_framework.compat import django_filters, patterns, url -from rest_framework.test import APIRequestFactory -from rest_framework.tests.models import BasicModel - -factory = APIRequestFactory() - - -class FilterableItem(models.Model): - text = models.CharField(max_length=100) - decimal = models.DecimalField(max_digits=4, decimal_places=2) - date = models.DateField() - - -if django_filters: - # Basic filter on a list view. - class FilterFieldsRootView(generics.ListCreateAPIView): - model = FilterableItem - filter_fields = ['decimal', 'date'] - filter_backends = (filters.DjangoFilterBackend,) - - # These class are used to test a filter class. - class SeveralFieldsFilter(django_filters.FilterSet): - text = django_filters.CharFilter(lookup_type='icontains') - decimal = django_filters.NumberFilter(lookup_type='lt') - date = django_filters.DateFilter(lookup_type='gt') - - class Meta: - model = FilterableItem - fields = ['text', 'decimal', 'date'] - - class FilterClassRootView(generics.ListCreateAPIView): - model = FilterableItem - filter_class = SeveralFieldsFilter - filter_backends = (filters.DjangoFilterBackend,) - - # These classes are used to test a misconfigured filter class. - class MisconfiguredFilter(django_filters.FilterSet): - text = django_filters.CharFilter(lookup_type='icontains') - - class Meta: - model = BasicModel - fields = ['text'] - - class IncorrectlyConfiguredRootView(generics.ListCreateAPIView): - model = FilterableItem - filter_class = MisconfiguredFilter - filter_backends = (filters.DjangoFilterBackend,) - - class FilterClassDetailView(generics.RetrieveAPIView): - model = FilterableItem - filter_class = SeveralFieldsFilter - filter_backends = (filters.DjangoFilterBackend,) - - # Regression test for #814 - class FilterableItemSerializer(serializers.ModelSerializer): - class Meta: - model = FilterableItem - - class FilterFieldsQuerysetView(generics.ListCreateAPIView): - queryset = FilterableItem.objects.all() - serializer_class = FilterableItemSerializer - filter_fields = ['decimal', 'date'] - filter_backends = (filters.DjangoFilterBackend,) - - class GetQuerysetView(generics.ListCreateAPIView): - serializer_class = FilterableItemSerializer - filter_class = SeveralFieldsFilter - filter_backends = (filters.DjangoFilterBackend,) - - def get_queryset(self): - return FilterableItem.objects.all() - - urlpatterns = patterns('', - url(r'^(?P\d+)/$', FilterClassDetailView.as_view(), name='detail-view'), - url(r'^$', FilterClassRootView.as_view(), name='root-view'), - url(r'^get-queryset/$', GetQuerysetView.as_view(), - name='get-queryset-view'), - ) - - -class CommonFilteringTestCase(TestCase): - def _serialize_object(self, obj): - return {'id': obj.id, 'text': obj.text, 'decimal': obj.decimal, 'date': obj.date} - - def setUp(self): - """ - Create 10 FilterableItem instances. - """ - base_data = ('a', Decimal('0.25'), datetime.date(2012, 10, 8)) - for i in range(10): - text = chr(i + ord(base_data[0])) * 3 # Produces string 'aaa', 'bbb', etc. - decimal = base_data[1] + i - date = base_data[2] - datetime.timedelta(days=i * 2) - FilterableItem(text=text, decimal=decimal, date=date).save() - - self.objects = FilterableItem.objects - self.data = [ - self._serialize_object(obj) - for obj in self.objects.all() - ] - - -class IntegrationTestFiltering(CommonFilteringTestCase): - """ - Integration tests for filtered list views. - """ - - @unittest.skipUnless(django_filters, 'django-filters not installed') - def test_get_filtered_fields_root_view(self): - """ - GET requests to paginated ListCreateAPIView should return paginated results. - """ - view = FilterFieldsRootView.as_view() - - # Basic test with no filter. - request = factory.get('/') - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, self.data) - - # Tests that the decimal filter works. - search_decimal = Decimal('2.25') - request = factory.get('/?decimal=%s' % search_decimal) - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - expected_data = [f for f in self.data if f['decimal'] == search_decimal] - self.assertEqual(response.data, expected_data) - - # Tests that the date filter works. - search_date = datetime.date(2012, 9, 22) - request = factory.get('/?date=%s' % search_date) # search_date str: '2012-09-22' - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - expected_data = [f for f in self.data if f['date'] == search_date] - self.assertEqual(response.data, expected_data) - - @unittest.skipUnless(django_filters, 'django-filters not installed') - def test_filter_with_queryset(self): - """ - Regression test for #814. - """ - view = FilterFieldsQuerysetView.as_view() - - # Tests that the decimal filter works. - search_decimal = Decimal('2.25') - request = factory.get('/?decimal=%s' % search_decimal) - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - expected_data = [f for f in self.data if f['decimal'] == search_decimal] - self.assertEqual(response.data, expected_data) - - @unittest.skipUnless(django_filters, 'django-filters not installed') - def test_filter_with_get_queryset_only(self): - """ - Regression test for #834. - """ - view = GetQuerysetView.as_view() - request = factory.get('/get-queryset/') - view(request).render() - # Used to raise "issubclass() arg 2 must be a class or tuple of classes" - # here when neither `model' nor `queryset' was specified. - - @unittest.skipUnless(django_filters, 'django-filters not installed') - def test_get_filtered_class_root_view(self): - """ - GET requests to filtered ListCreateAPIView that have a filter_class set - should return filtered results. - """ - view = FilterClassRootView.as_view() - - # Basic test with no filter. - request = factory.get('/') - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, self.data) - - # Tests that the decimal filter set with 'lt' in the filter class works. - search_decimal = Decimal('4.25') - request = factory.get('/?decimal=%s' % search_decimal) - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - expected_data = [f for f in self.data if f['decimal'] < search_decimal] - self.assertEqual(response.data, expected_data) - - # Tests that the date filter set with 'gt' in the filter class works. - search_date = datetime.date(2012, 10, 2) - request = factory.get('/?date=%s' % search_date) # search_date str: '2012-10-02' - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - expected_data = [f for f in self.data if f['date'] > search_date] - self.assertEqual(response.data, expected_data) - - # Tests that the text filter set with 'icontains' in the filter class works. - search_text = 'ff' - request = factory.get('/?text=%s' % search_text) - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - expected_data = [f for f in self.data if search_text in f['text'].lower()] - self.assertEqual(response.data, expected_data) - - # Tests that multiple filters works. - search_decimal = Decimal('5.25') - search_date = datetime.date(2012, 10, 2) - request = factory.get('/?decimal=%s&date=%s' % (search_decimal, search_date)) - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - expected_data = [f for f in self.data if f['date'] > search_date and - f['decimal'] < search_decimal] - self.assertEqual(response.data, expected_data) - - @unittest.skipUnless(django_filters, 'django-filters not installed') - def test_incorrectly_configured_filter(self): - """ - An error should be displayed when the filter class is misconfigured. - """ - view = IncorrectlyConfiguredRootView.as_view() - - request = factory.get('/') - self.assertRaises(AssertionError, view, request) - - @unittest.skipUnless(django_filters, 'django-filters not installed') - def test_unknown_filter(self): - """ - GET requests with filters that aren't configured should return 200. - """ - view = FilterFieldsRootView.as_view() - - search_integer = 10 - request = factory.get('/?integer=%s' % search_integer) - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - - -class IntegrationTestDetailFiltering(CommonFilteringTestCase): - """ - Integration tests for filtered detail views. - """ - urls = 'rest_framework.tests.test_filters' - - def _get_url(self, item): - return reverse('detail-view', kwargs=dict(pk=item.pk)) - - @unittest.skipUnless(django_filters, 'django-filters not installed') - def test_get_filtered_detail_view(self): - """ - GET requests to filtered RetrieveAPIView that have a filter_class set - should return filtered results. - """ - item = self.objects.all()[0] - data = self._serialize_object(item) - - # Basic test with no filter. - response = self.client.get(self._get_url(item)) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, data) - - # Tests that the decimal filter set that should fail. - search_decimal = Decimal('4.25') - high_item = self.objects.filter(decimal__gt=search_decimal)[0] - response = self.client.get('{url}?decimal={param}'.format(url=self._get_url(high_item), param=search_decimal)) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - # Tests that the decimal filter set that should succeed. - search_decimal = Decimal('4.25') - low_item = self.objects.filter(decimal__lt=search_decimal)[0] - low_item_data = self._serialize_object(low_item) - response = self.client.get('{url}?decimal={param}'.format(url=self._get_url(low_item), param=search_decimal)) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, low_item_data) - - # Tests that multiple filters works. - search_decimal = Decimal('5.25') - search_date = datetime.date(2012, 10, 2) - valid_item = self.objects.filter(decimal__lt=search_decimal, date__gt=search_date)[0] - valid_item_data = self._serialize_object(valid_item) - response = self.client.get('{url}?decimal={decimal}&date={date}'.format(url=self._get_url(valid_item), decimal=search_decimal, date=search_date)) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, valid_item_data) - - -class SearchFilterModel(models.Model): - title = models.CharField(max_length=20) - text = models.CharField(max_length=100) - - -class SearchFilterTests(TestCase): - def setUp(self): - # Sequence of title/text is: - # - # z abc - # zz bcd - # zzz cde - # ... - for idx in range(10): - title = 'z' * (idx + 1) - text = ( - chr(idx + ord('a')) + - chr(idx + ord('b')) + - chr(idx + ord('c')) - ) - SearchFilterModel(title=title, text=text).save() - - def test_search(self): - class SearchListView(generics.ListAPIView): - model = SearchFilterModel - filter_backends = (filters.SearchFilter,) - search_fields = ('title', 'text') - - view = SearchListView.as_view() - request = factory.get('?search=b') - response = view(request) - self.assertEqual( - response.data, - [ - {'id': 1, 'title': 'z', 'text': 'abc'}, - {'id': 2, 'title': 'zz', 'text': 'bcd'} - ] - ) - - def test_exact_search(self): - class SearchListView(generics.ListAPIView): - model = SearchFilterModel - filter_backends = (filters.SearchFilter,) - search_fields = ('=title', 'text') - - view = SearchListView.as_view() - request = factory.get('?search=zzz') - response = view(request) - self.assertEqual( - response.data, - [ - {'id': 3, 'title': 'zzz', 'text': 'cde'} - ] - ) - - def test_startswith_search(self): - class SearchListView(generics.ListAPIView): - model = SearchFilterModel - filter_backends = (filters.SearchFilter,) - search_fields = ('title', '^text') - - view = SearchListView.as_view() - request = factory.get('?search=b') - response = view(request) - self.assertEqual( - response.data, - [ - {'id': 2, 'title': 'zz', 'text': 'bcd'} - ] - ) - - -class OrdringFilterModel(models.Model): - title = models.CharField(max_length=20) - text = models.CharField(max_length=100) - - -class OrderingFilterTests(TestCase): - def setUp(self): - # Sequence of title/text is: - # - # zyx abc - # yxw bcd - # xwv cde - for idx in range(3): - title = ( - chr(ord('z') - idx) + - chr(ord('y') - idx) + - chr(ord('x') - idx) - ) - text = ( - chr(idx + ord('a')) + - chr(idx + ord('b')) + - chr(idx + ord('c')) - ) - OrdringFilterModel(title=title, text=text).save() - - def test_ordering(self): - class OrderingListView(generics.ListAPIView): - model = OrdringFilterModel - filter_backends = (filters.OrderingFilter,) - ordering = ('title',) - - view = OrderingListView.as_view() - request = factory.get('?ordering=text') - response = view(request) - self.assertEqual( - response.data, - [ - {'id': 1, 'title': 'zyx', 'text': 'abc'}, - {'id': 2, 'title': 'yxw', 'text': 'bcd'}, - {'id': 3, 'title': 'xwv', 'text': 'cde'}, - ] - ) - - def test_reverse_ordering(self): - class OrderingListView(generics.ListAPIView): - model = OrdringFilterModel - filter_backends = (filters.OrderingFilter,) - ordering = ('title',) - - view = OrderingListView.as_view() - request = factory.get('?ordering=-text') - response = view(request) - self.assertEqual( - response.data, - [ - {'id': 3, 'title': 'xwv', 'text': 'cde'}, - {'id': 2, 'title': 'yxw', 'text': 'bcd'}, - {'id': 1, 'title': 'zyx', 'text': 'abc'}, - ] - ) - - def test_incorrectfield_ordering(self): - class OrderingListView(generics.ListAPIView): - model = OrdringFilterModel - filter_backends = (filters.OrderingFilter,) - ordering = ('title',) - - view = OrderingListView.as_view() - request = factory.get('?ordering=foobar') - response = view(request) - self.assertEqual( - response.data, - [ - {'id': 3, 'title': 'xwv', 'text': 'cde'}, - {'id': 2, 'title': 'yxw', 'text': 'bcd'}, - {'id': 1, 'title': 'zyx', 'text': 'abc'}, - ] - ) - - def test_default_ordering(self): - class OrderingListView(generics.ListAPIView): - model = OrdringFilterModel - filter_backends = (filters.OrderingFilter,) - ordering = ('title',) - - view = OrderingListView.as_view() - request = factory.get('') - response = view(request) - self.assertEqual( - response.data, - [ - {'id': 3, 'title': 'xwv', 'text': 'cde'}, - {'id': 2, 'title': 'yxw', 'text': 'bcd'}, - {'id': 1, 'title': 'zyx', 'text': 'abc'}, - ] - ) - - def test_default_ordering_using_string(self): - class OrderingListView(generics.ListAPIView): - model = OrdringFilterModel - filter_backends = (filters.OrderingFilter,) - ordering = 'title' - - view = OrderingListView.as_view() - request = factory.get('') - response = view(request) - self.assertEqual( - response.data, - [ - {'id': 3, 'title': 'xwv', 'text': 'cde'}, - {'id': 2, 'title': 'yxw', 'text': 'bcd'}, - {'id': 1, 'title': 'zyx', 'text': 'abc'}, - ] - ) diff --git a/vendor-local/lib/python/rest_framework/tests/test_genericrelations.py b/vendor-local/lib/python/rest_framework/tests/test_genericrelations.py deleted file mode 100644 index c38bfb9f367..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_genericrelations.py +++ /dev/null @@ -1,100 +0,0 @@ -from __future__ import unicode_literals -from django.contrib.contenttypes.models import ContentType -from django.contrib.contenttypes.generic import GenericRelation, GenericForeignKey -from django.db import models -from django.test import TestCase -from rest_framework import serializers - - -class Tag(models.Model): - """ - Tags have a descriptive slug, and are attached to an arbitrary object. - """ - tag = models.SlugField() - content_type = models.ForeignKey(ContentType) - object_id = models.PositiveIntegerField() - tagged_item = GenericForeignKey('content_type', 'object_id') - - def __unicode__(self): - return self.tag - - -class Bookmark(models.Model): - """ - A URL bookmark that may have multiple tags attached. - """ - url = models.URLField() - tags = GenericRelation(Tag) - - def __unicode__(self): - return 'Bookmark: %s' % self.url - - -class Note(models.Model): - """ - A textual note that may have multiple tags attached. - """ - text = models.TextField() - tags = GenericRelation(Tag) - - def __unicode__(self): - return 'Note: %s' % self.text - - -class TestGenericRelations(TestCase): - def setUp(self): - self.bookmark = Bookmark.objects.create(url='https://www.djangoproject.com/') - Tag.objects.create(tagged_item=self.bookmark, tag='django') - Tag.objects.create(tagged_item=self.bookmark, tag='python') - self.note = Note.objects.create(text='Remember the milk') - Tag.objects.create(tagged_item=self.note, tag='reminder') - - def test_generic_relation(self): - """ - Test a relationship that spans a GenericRelation field. - IE. A reverse generic relationship. - """ - - class BookmarkSerializer(serializers.ModelSerializer): - tags = serializers.RelatedField(many=True) - - class Meta: - model = Bookmark - exclude = ('id',) - - serializer = BookmarkSerializer(self.bookmark) - expected = { - 'tags': ['django', 'python'], - 'url': 'https://www.djangoproject.com/' - } - self.assertEqual(serializer.data, expected) - - def test_generic_fk(self): - """ - Test a relationship that spans a GenericForeignKey field. - IE. A forward generic relationship. - """ - - class TagSerializer(serializers.ModelSerializer): - tagged_item = serializers.RelatedField() - - class Meta: - model = Tag - exclude = ('id', 'content_type', 'object_id') - - serializer = TagSerializer(Tag.objects.all(), many=True) - expected = [ - { - 'tag': 'django', - 'tagged_item': 'Bookmark: https://www.djangoproject.com/' - }, - { - 'tag': 'python', - 'tagged_item': 'Bookmark: https://www.djangoproject.com/' - }, - { - 'tag': 'reminder', - 'tagged_item': 'Note: Remember the milk' - } - ] - self.assertEqual(serializer.data, expected) diff --git a/vendor-local/lib/python/rest_framework/tests/test_generics.py b/vendor-local/lib/python/rest_framework/tests/test_generics.py deleted file mode 100644 index 1550880b56b..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_generics.py +++ /dev/null @@ -1,544 +0,0 @@ -from __future__ import unicode_literals -from django.db import models -from django.shortcuts import get_object_or_404 -from django.test import TestCase -from rest_framework import generics, renderers, serializers, status -from rest_framework.test import APIRequestFactory -from rest_framework.tests.models import BasicModel, Comment, SlugBasedModel -from rest_framework.compat import six - -factory = APIRequestFactory() - - -class RootView(generics.ListCreateAPIView): - """ - Example description for OPTIONS. - """ - model = BasicModel - - -class InstanceView(generics.RetrieveUpdateDestroyAPIView): - """ - Example description for OPTIONS. - """ - model = BasicModel - - -class SlugSerializer(serializers.ModelSerializer): - slug = serializers.Field() # read only - - class Meta: - model = SlugBasedModel - exclude = ('id',) - - -class SlugBasedInstanceView(InstanceView): - """ - A model with a slug-field. - """ - model = SlugBasedModel - serializer_class = SlugSerializer - lookup_field = 'slug' - - -class TestRootView(TestCase): - def setUp(self): - """ - Create 3 BasicModel instances. - """ - items = ['foo', 'bar', 'baz'] - for item in items: - BasicModel(text=item).save() - self.objects = BasicModel.objects - self.data = [ - {'id': obj.id, 'text': obj.text} - for obj in self.objects.all() - ] - self.view = RootView.as_view() - - def test_get_root_view(self): - """ - GET requests to ListCreateAPIView should return list of objects. - """ - request = factory.get('/') - with self.assertNumQueries(1): - response = self.view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, self.data) - - def test_post_root_view(self): - """ - POST requests to ListCreateAPIView should create a new object. - """ - data = {'text': 'foobar'} - request = factory.post('/', data, format='json') - with self.assertNumQueries(1): - response = self.view(request).render() - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(response.data, {'id': 4, 'text': 'foobar'}) - created = self.objects.get(id=4) - self.assertEqual(created.text, 'foobar') - - def test_put_root_view(self): - """ - PUT requests to ListCreateAPIView should not be allowed - """ - data = {'text': 'foobar'} - request = factory.put('/', data, format='json') - with self.assertNumQueries(0): - response = self.view(request).render() - self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) - self.assertEqual(response.data, {"detail": "Method 'PUT' not allowed."}) - - def test_delete_root_view(self): - """ - DELETE requests to ListCreateAPIView should not be allowed - """ - request = factory.delete('/') - with self.assertNumQueries(0): - response = self.view(request).render() - self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) - self.assertEqual(response.data, {"detail": "Method 'DELETE' not allowed."}) - - def test_options_root_view(self): - """ - OPTIONS requests to ListCreateAPIView should return metadata - """ - request = factory.options('/') - with self.assertNumQueries(0): - response = self.view(request).render() - expected = { - 'parses': [ - 'application/json', - 'application/x-www-form-urlencoded', - 'multipart/form-data' - ], - 'renders': [ - 'application/json', - 'text/html' - ], - 'name': 'Root', - 'description': 'Example description for OPTIONS.', - 'actions': { - 'POST': { - 'text': { - 'max_length': 100, - 'read_only': False, - 'required': True, - 'type': 'string', - "label": "Text comes here", - "help_text": "Text description." - }, - 'id': { - 'read_only': True, - 'required': False, - 'type': 'integer', - 'label': 'ID', - }, - } - } - } - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, expected) - - def test_post_cannot_set_id(self): - """ - POST requests to create a new object should not be able to set the id. - """ - data = {'id': 999, 'text': 'foobar'} - request = factory.post('/', data, format='json') - with self.assertNumQueries(1): - response = self.view(request).render() - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(response.data, {'id': 4, 'text': 'foobar'}) - created = self.objects.get(id=4) - self.assertEqual(created.text, 'foobar') - - -class TestInstanceView(TestCase): - def setUp(self): - """ - Create 3 BasicModel intances. - """ - items = ['foo', 'bar', 'baz'] - for item in items: - BasicModel(text=item).save() - self.objects = BasicModel.objects - self.data = [ - {'id': obj.id, 'text': obj.text} - for obj in self.objects.all() - ] - self.view = InstanceView.as_view() - self.slug_based_view = SlugBasedInstanceView.as_view() - - def test_get_instance_view(self): - """ - GET requests to RetrieveUpdateDestroyAPIView should return a single object. - """ - request = factory.get('/1') - with self.assertNumQueries(1): - response = self.view(request, pk=1).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, self.data[0]) - - def test_post_instance_view(self): - """ - POST requests to RetrieveUpdateDestroyAPIView should not be allowed - """ - data = {'text': 'foobar'} - request = factory.post('/', data, format='json') - with self.assertNumQueries(0): - response = self.view(request).render() - self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) - self.assertEqual(response.data, {"detail": "Method 'POST' not allowed."}) - - def test_put_instance_view(self): - """ - PUT requests to RetrieveUpdateDestroyAPIView should update an object. - """ - data = {'text': 'foobar'} - request = factory.put('/1', data, format='json') - with self.assertNumQueries(2): - response = self.view(request, pk='1').render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, {'id': 1, 'text': 'foobar'}) - updated = self.objects.get(id=1) - self.assertEqual(updated.text, 'foobar') - - def test_patch_instance_view(self): - """ - PATCH requests to RetrieveUpdateDestroyAPIView should update an object. - """ - data = {'text': 'foobar'} - request = factory.patch('/1', data, format='json') - - with self.assertNumQueries(2): - response = self.view(request, pk=1).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, {'id': 1, 'text': 'foobar'}) - updated = self.objects.get(id=1) - self.assertEqual(updated.text, 'foobar') - - def test_delete_instance_view(self): - """ - DELETE requests to RetrieveUpdateDestroyAPIView should delete an object. - """ - request = factory.delete('/1') - with self.assertNumQueries(2): - response = self.view(request, pk=1).render() - self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - self.assertEqual(response.content, six.b('')) - ids = [obj.id for obj in self.objects.all()] - self.assertEqual(ids, [2, 3]) - - def test_options_instance_view(self): - """ - OPTIONS requests to RetrieveUpdateDestroyAPIView should return metadata - """ - request = factory.options('/1') - with self.assertNumQueries(1): - response = self.view(request, pk=1).render() - expected = { - 'parses': [ - 'application/json', - 'application/x-www-form-urlencoded', - 'multipart/form-data' - ], - 'renders': [ - 'application/json', - 'text/html' - ], - 'name': 'Instance', - 'description': 'Example description for OPTIONS.', - 'actions': { - 'PUT': { - 'text': { - 'max_length': 100, - 'read_only': False, - 'required': True, - 'type': 'string', - 'label': 'Text comes here', - 'help_text': 'Text description.' - }, - 'id': { - 'read_only': True, - 'required': False, - 'type': 'integer', - 'label': 'ID', - }, - } - } - } - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, expected) - - def test_get_instance_view_incorrect_arg(self): - """ - GET requests with an incorrect pk type, should raise 404, not 500. - Regression test for #890. - """ - request = factory.get('/a') - with self.assertNumQueries(0): - response = self.view(request, pk='a').render() - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_put_cannot_set_id(self): - """ - PUT requests to create a new object should not be able to set the id. - """ - data = {'id': 999, 'text': 'foobar'} - request = factory.put('/1', data, format='json') - with self.assertNumQueries(2): - response = self.view(request, pk=1).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, {'id': 1, 'text': 'foobar'}) - updated = self.objects.get(id=1) - self.assertEqual(updated.text, 'foobar') - - def test_put_to_deleted_instance(self): - """ - PUT requests to RetrieveUpdateDestroyAPIView should create an object - if it does not currently exist. - """ - self.objects.get(id=1).delete() - data = {'text': 'foobar'} - request = factory.put('/1', data, format='json') - with self.assertNumQueries(3): - response = self.view(request, pk=1).render() - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(response.data, {'id': 1, 'text': 'foobar'}) - updated = self.objects.get(id=1) - self.assertEqual(updated.text, 'foobar') - - def test_put_as_create_on_id_based_url(self): - """ - PUT requests to RetrieveUpdateDestroyAPIView should create an object - at the requested url if it doesn't exist. - """ - data = {'text': 'foobar'} - # pk fields can not be created on demand, only the database can set the pk for a new object - request = factory.put('/5', data, format='json') - with self.assertNumQueries(3): - response = self.view(request, pk=5).render() - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - new_obj = self.objects.get(pk=5) - self.assertEqual(new_obj.text, 'foobar') - - def test_put_as_create_on_slug_based_url(self): - """ - PUT requests to RetrieveUpdateDestroyAPIView should create an object - at the requested url if possible, else return HTTP_403_FORBIDDEN error-response. - """ - data = {'text': 'foobar'} - request = factory.put('/test_slug', data, format='json') - with self.assertNumQueries(2): - response = self.slug_based_view(request, slug='test_slug').render() - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(response.data, {'slug': 'test_slug', 'text': 'foobar'}) - new_obj = SlugBasedModel.objects.get(slug='test_slug') - self.assertEqual(new_obj.text, 'foobar') - - -class TestOverriddenGetObject(TestCase): - """ - Test cases for a RetrieveUpdateDestroyAPIView that does NOT use the - queryset/model mechanism but instead overrides get_object() - """ - def setUp(self): - """ - Create 3 BasicModel intances. - """ - items = ['foo', 'bar', 'baz'] - for item in items: - BasicModel(text=item).save() - self.objects = BasicModel.objects - self.data = [ - {'id': obj.id, 'text': obj.text} - for obj in self.objects.all() - ] - - class OverriddenGetObjectView(generics.RetrieveUpdateDestroyAPIView): - """ - Example detail view for override of get_object(). - """ - model = BasicModel - - def get_object(self): - pk = int(self.kwargs['pk']) - return get_object_or_404(BasicModel.objects.all(), id=pk) - - self.view = OverriddenGetObjectView.as_view() - - def test_overridden_get_object_view(self): - """ - GET requests to RetrieveUpdateDestroyAPIView should return a single object. - """ - request = factory.get('/1') - with self.assertNumQueries(1): - response = self.view(request, pk=1).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, self.data[0]) - - -# Regression test for #285 - -class CommentSerializer(serializers.ModelSerializer): - class Meta: - model = Comment - exclude = ('created',) - - -class CommentView(generics.ListCreateAPIView): - serializer_class = CommentSerializer - model = Comment - - -class TestCreateModelWithAutoNowAddField(TestCase): - def setUp(self): - self.objects = Comment.objects - self.view = CommentView.as_view() - - def test_create_model_with_auto_now_add_field(self): - """ - Regression test for #285 - - https://github.com/tomchristie/django-rest-framework/issues/285 - """ - data = {'email': 'foobar@example.com', 'content': 'foobar'} - request = factory.post('/', data, format='json') - response = self.view(request).render() - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - created = self.objects.get(id=1) - self.assertEqual(created.content, 'foobar') - - -# Test for particularly ugly regression with m2m in browsable API -class ClassB(models.Model): - name = models.CharField(max_length=255) - - -class ClassA(models.Model): - name = models.CharField(max_length=255) - childs = models.ManyToManyField(ClassB, blank=True, null=True) - - -class ClassASerializer(serializers.ModelSerializer): - childs = serializers.PrimaryKeyRelatedField(many=True, source='childs') - - class Meta: - model = ClassA - - -class ExampleView(generics.ListCreateAPIView): - serializer_class = ClassASerializer - model = ClassA - - -class TestM2MBrowseableAPI(TestCase): - def test_m2m_in_browseable_api(self): - """ - Test for particularly ugly regression with m2m in browsable API - """ - request = factory.get('/', HTTP_ACCEPT='text/html') - view = ExampleView().as_view() - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - - -class InclusiveFilterBackend(object): - def filter_queryset(self, request, queryset, view): - return queryset.filter(text='foo') - - -class ExclusiveFilterBackend(object): - def filter_queryset(self, request, queryset, view): - return queryset.filter(text='other') - - -class TestFilterBackendAppliedToViews(TestCase): - - def setUp(self): - """ - Create 3 BasicModel instances to filter on. - """ - items = ['foo', 'bar', 'baz'] - for item in items: - BasicModel(text=item).save() - self.objects = BasicModel.objects - self.data = [ - {'id': obj.id, 'text': obj.text} - for obj in self.objects.all() - ] - - def test_get_root_view_filters_by_name_with_filter_backend(self): - """ - GET requests to ListCreateAPIView should return filtered list. - """ - root_view = RootView.as_view(filter_backends=(InclusiveFilterBackend,)) - request = factory.get('/') - response = root_view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(len(response.data), 1) - self.assertEqual(response.data, [{'id': 1, 'text': 'foo'}]) - - def test_get_root_view_filters_out_all_models_with_exclusive_filter_backend(self): - """ - GET requests to ListCreateAPIView should return empty list when all models are filtered out. - """ - root_view = RootView.as_view(filter_backends=(ExclusiveFilterBackend,)) - request = factory.get('/') - response = root_view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, []) - - def test_get_instance_view_filters_out_name_with_filter_backend(self): - """ - GET requests to RetrieveUpdateDestroyAPIView should raise 404 when model filtered out. - """ - instance_view = InstanceView.as_view(filter_backends=(ExclusiveFilterBackend,)) - request = factory.get('/1') - response = instance_view(request, pk=1).render() - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual(response.data, {'detail': 'Not found'}) - - def test_get_instance_view_will_return_single_object_when_filter_does_not_exclude_it(self): - """ - GET requests to RetrieveUpdateDestroyAPIView should return a single object when not excluded - """ - instance_view = InstanceView.as_view(filter_backends=(InclusiveFilterBackend,)) - request = factory.get('/1') - response = instance_view(request, pk=1).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, {'id': 1, 'text': 'foo'}) - - -class TwoFieldModel(models.Model): - field_a = models.CharField(max_length=100) - field_b = models.CharField(max_length=100) - - -class DynamicSerializerView(generics.ListCreateAPIView): - model = TwoFieldModel - renderer_classes = (renderers.BrowsableAPIRenderer, renderers.JSONRenderer) - - def get_serializer_class(self): - if self.request.method == 'POST': - class DynamicSerializer(serializers.ModelSerializer): - class Meta: - model = TwoFieldModel - fields = ('field_b',) - return DynamicSerializer - return super(DynamicSerializerView, self).get_serializer_class() - - -class TestFilterBackendAppliedToViews(TestCase): - - def test_dynamic_serializer_form_in_browsable_api(self): - """ - GET requests to ListCreateAPIView should return filtered list. - """ - view = DynamicSerializerView.as_view() - request = factory.get('/') - response = view(request).render() - self.assertContains(response, 'field_b') - self.assertNotContains(response, 'field_a') diff --git a/vendor-local/lib/python/rest_framework/tests/test_htmlrenderer.py b/vendor-local/lib/python/rest_framework/tests/test_htmlrenderer.py deleted file mode 100644 index 8957a43c72f..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_htmlrenderer.py +++ /dev/null @@ -1,118 +0,0 @@ -from __future__ import unicode_literals -from django.core.exceptions import PermissionDenied -from django.http import Http404 -from django.test import TestCase -from django.template import TemplateDoesNotExist, Template -import django.template.loader -from rest_framework import status -from rest_framework.compat import patterns, url -from rest_framework.decorators import api_view, renderer_classes -from rest_framework.renderers import TemplateHTMLRenderer -from rest_framework.response import Response -from rest_framework.compat import six - - -@api_view(('GET',)) -@renderer_classes((TemplateHTMLRenderer,)) -def example(request): - """ - A view that can returns an HTML representation. - """ - data = {'object': 'foobar'} - return Response(data, template_name='example.html') - - -@api_view(('GET',)) -@renderer_classes((TemplateHTMLRenderer,)) -def permission_denied(request): - raise PermissionDenied() - - -@api_view(('GET',)) -@renderer_classes((TemplateHTMLRenderer,)) -def not_found(request): - raise Http404() - - -urlpatterns = patterns('', - url(r'^$', example), - url(r'^permission_denied$', permission_denied), - url(r'^not_found$', not_found), -) - - -class TemplateHTMLRendererTests(TestCase): - urls = 'rest_framework.tests.test_htmlrenderer' - - def setUp(self): - """ - Monkeypatch get_template - """ - self.get_template = django.template.loader.get_template - - def get_template(template_name): - if template_name == 'example.html': - return Template("example: {{ object }}") - raise TemplateDoesNotExist(template_name) - - django.template.loader.get_template = get_template - - def tearDown(self): - """ - Revert monkeypatching - """ - django.template.loader.get_template = self.get_template - - def test_simple_html_view(self): - response = self.client.get('/') - self.assertContains(response, "example: foobar") - self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') - - def test_not_found_html_view(self): - response = self.client.get('/not_found') - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual(response.content, six.b("404 Not Found")) - self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') - - def test_permission_denied_html_view(self): - response = self.client.get('/permission_denied') - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - self.assertEqual(response.content, six.b("403 Forbidden")) - self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') - - -class TemplateHTMLRendererExceptionTests(TestCase): - urls = 'rest_framework.tests.test_htmlrenderer' - - def setUp(self): - """ - Monkeypatch get_template - """ - self.get_template = django.template.loader.get_template - - def get_template(template_name): - if template_name == '404.html': - return Template("404: {{ detail }}") - if template_name == '403.html': - return Template("403: {{ detail }}") - raise TemplateDoesNotExist(template_name) - - django.template.loader.get_template = get_template - - def tearDown(self): - """ - Revert monkeypatching - """ - django.template.loader.get_template = self.get_template - - def test_not_found_html_view_with_template(self): - response = self.client.get('/not_found') - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual(response.content, six.b("404: Not found")) - self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') - - def test_permission_denied_html_view_with_template(self): - response = self.client.get('/permission_denied') - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - self.assertEqual(response.content, six.b("403: Permission denied")) - self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') diff --git a/vendor-local/lib/python/rest_framework/tests/test_hyperlinkedserializers.py b/vendor-local/lib/python/rest_framework/tests/test_hyperlinkedserializers.py deleted file mode 100644 index 61e613d75ef..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_hyperlinkedserializers.py +++ /dev/null @@ -1,333 +0,0 @@ -from __future__ import unicode_literals -import json -from django.test import TestCase -from rest_framework import generics, status, serializers -from rest_framework.compat import patterns, url -from rest_framework.test import APIRequestFactory -from rest_framework.tests.models import ( - Anchor, BasicModel, ManyToManyModel, BlogPost, BlogPostComment, - Album, Photo, OptionalRelationModel -) - -factory = APIRequestFactory() - - -class BlogPostCommentSerializer(serializers.ModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='blogpostcomment-detail') - text = serializers.CharField() - blog_post_url = serializers.HyperlinkedRelatedField(source='blog_post', view_name='blogpost-detail') - - class Meta: - model = BlogPostComment - fields = ('text', 'blog_post_url', 'url') - - -class PhotoSerializer(serializers.Serializer): - description = serializers.CharField() - album_url = serializers.HyperlinkedRelatedField(source='album', view_name='album-detail', queryset=Album.objects.all(), lookup_field='title', slug_url_kwarg='title') - - def restore_object(self, attrs, instance=None): - return Photo(**attrs) - - -class AlbumSerializer(serializers.ModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='album-detail', lookup_field='title') - - class Meta: - model = Album - fields = ('title', 'url') - - -class BasicList(generics.ListCreateAPIView): - model = BasicModel - model_serializer_class = serializers.HyperlinkedModelSerializer - - -class BasicDetail(generics.RetrieveUpdateDestroyAPIView): - model = BasicModel - model_serializer_class = serializers.HyperlinkedModelSerializer - - -class AnchorDetail(generics.RetrieveAPIView): - model = Anchor - model_serializer_class = serializers.HyperlinkedModelSerializer - - -class ManyToManyList(generics.ListAPIView): - model = ManyToManyModel - model_serializer_class = serializers.HyperlinkedModelSerializer - - -class ManyToManyDetail(generics.RetrieveAPIView): - model = ManyToManyModel - model_serializer_class = serializers.HyperlinkedModelSerializer - - -class BlogPostCommentListCreate(generics.ListCreateAPIView): - model = BlogPostComment - serializer_class = BlogPostCommentSerializer - - -class BlogPostCommentDetail(generics.RetrieveAPIView): - model = BlogPostComment - serializer_class = BlogPostCommentSerializer - - -class BlogPostDetail(generics.RetrieveAPIView): - model = BlogPost - - -class PhotoListCreate(generics.ListCreateAPIView): - model = Photo - model_serializer_class = PhotoSerializer - - -class AlbumDetail(generics.RetrieveAPIView): - model = Album - serializer_class = AlbumSerializer - lookup_field = 'title' - - -class OptionalRelationDetail(generics.RetrieveUpdateDestroyAPIView): - model = OptionalRelationModel - model_serializer_class = serializers.HyperlinkedModelSerializer - - -urlpatterns = patterns('', - url(r'^basic/$', BasicList.as_view(), name='basicmodel-list'), - url(r'^basic/(?P\d+)/$', BasicDetail.as_view(), name='basicmodel-detail'), - url(r'^anchor/(?P\d+)/$', AnchorDetail.as_view(), name='anchor-detail'), - url(r'^manytomany/$', ManyToManyList.as_view(), name='manytomanymodel-list'), - url(r'^manytomany/(?P\d+)/$', ManyToManyDetail.as_view(), name='manytomanymodel-detail'), - url(r'^posts/(?P\d+)/$', BlogPostDetail.as_view(), name='blogpost-detail'), - url(r'^comments/$', BlogPostCommentListCreate.as_view(), name='blogpostcomment-list'), - url(r'^comments/(?P\d+)/$', BlogPostCommentDetail.as_view(), name='blogpostcomment-detail'), - url(r'^albums/(?P\w[\w-]*)/$', AlbumDetail.as_view(), name='album-detail'), - url(r'^photos/$', PhotoListCreate.as_view(), name='photo-list'), - url(r'^optionalrelation/(?P<pk>\d+)/$', OptionalRelationDetail.as_view(), name='optionalrelationmodel-detail'), -) - - -class TestBasicHyperlinkedView(TestCase): - urls = 'rest_framework.tests.test_hyperlinkedserializers' - - def setUp(self): - """ - Create 3 BasicModel instances. - """ - items = ['foo', 'bar', 'baz'] - for item in items: - BasicModel(text=item).save() - self.objects = BasicModel.objects - self.data = [ - {'url': 'http://testserver/basic/%d/' % obj.id, 'text': obj.text} - for obj in self.objects.all() - ] - self.list_view = BasicList.as_view() - self.detail_view = BasicDetail.as_view() - - def test_get_list_view(self): - """ - GET requests to ListCreateAPIView should return list of objects. - """ - request = factory.get('/basic/') - response = self.list_view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, self.data) - - def test_get_detail_view(self): - """ - GET requests to ListCreateAPIView should return list of objects. - """ - request = factory.get('/basic/1') - response = self.detail_view(request, pk=1).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, self.data[0]) - - -class TestManyToManyHyperlinkedView(TestCase): - urls = 'rest_framework.tests.test_hyperlinkedserializers' - - def setUp(self): - """ - Create 3 BasicModel instances. - """ - items = ['foo', 'bar', 'baz'] - anchors = [] - for item in items: - anchor = Anchor(text=item) - anchor.save() - anchors.append(anchor) - - manytomany = ManyToManyModel() - manytomany.save() - manytomany.rel.add(*anchors) - - self.data = [{ - 'url': 'http://testserver/manytomany/1/', - 'rel': [ - 'http://testserver/anchor/1/', - 'http://testserver/anchor/2/', - 'http://testserver/anchor/3/', - ] - }] - self.list_view = ManyToManyList.as_view() - self.detail_view = ManyToManyDetail.as_view() - - def test_get_list_view(self): - """ - GET requests to ListCreateAPIView should return list of objects. - """ - request = factory.get('/manytomany/') - response = self.list_view(request) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, self.data) - - def test_get_detail_view(self): - """ - GET requests to ListCreateAPIView should return list of objects. - """ - request = factory.get('/manytomany/1/') - response = self.detail_view(request, pk=1) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, self.data[0]) - - -class TestHyperlinkedIdentityFieldLookup(TestCase): - urls = 'rest_framework.tests.test_hyperlinkedserializers' - - def setUp(self): - """ - Create 3 Album instances. - """ - titles = ['foo', 'bar', 'baz'] - for title in titles: - album = Album(title=title) - album.save() - self.detail_view = AlbumDetail.as_view() - self.data = { - 'foo': {'title': 'foo', 'url': 'http://testserver/albums/foo/'}, - 'bar': {'title': 'bar', 'url': 'http://testserver/albums/bar/'}, - 'baz': {'title': 'baz', 'url': 'http://testserver/albums/baz/'} - } - - def test_lookup_field(self): - """ - GET requests to AlbumDetail view should return serialized Albums - with a url field keyed by `title`. - """ - for album in Album.objects.all(): - request = factory.get('/albums/{0}/'.format(album.title)) - response = self.detail_view(request, title=album.title) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, self.data[album.title]) - - -class TestCreateWithForeignKeys(TestCase): - urls = 'rest_framework.tests.test_hyperlinkedserializers' - - def setUp(self): - """ - Create a blog post - """ - self.post = BlogPost.objects.create(title="Test post") - self.create_view = BlogPostCommentListCreate.as_view() - - def test_create_comment(self): - - data = { - 'text': 'A test comment', - 'blog_post_url': 'http://testserver/posts/1/' - } - - request = factory.post('/comments/', data=data) - response = self.create_view(request) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(response['Location'], 'http://testserver/comments/1/') - self.assertEqual(self.post.blogpostcomment_set.count(), 1) - self.assertEqual(self.post.blogpostcomment_set.all()[0].text, 'A test comment') - - -class TestCreateWithForeignKeysAndCustomSlug(TestCase): - urls = 'rest_framework.tests.test_hyperlinkedserializers' - - def setUp(self): - """ - Create an Album - """ - self.post = Album.objects.create(title='test-album') - self.list_create_view = PhotoListCreate.as_view() - - def test_create_photo(self): - - data = { - 'description': 'A test photo', - 'album_url': 'http://testserver/albums/test-album/' - } - - request = factory.post('/photos/', data=data) - response = self.list_create_view(request) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertNotIn('Location', response, msg='Location should only be included if there is a "url" field on the serializer') - self.assertEqual(self.post.photo_set.count(), 1) - self.assertEqual(self.post.photo_set.all()[0].description, 'A test photo') - - -class TestOptionalRelationHyperlinkedView(TestCase): - urls = 'rest_framework.tests.test_hyperlinkedserializers' - - def setUp(self): - """ - Create 1 OptionalRelationModel instances. - """ - OptionalRelationModel().save() - self.objects = OptionalRelationModel.objects - self.detail_view = OptionalRelationDetail.as_view() - self.data = {"url": "http://testserver/optionalrelation/1/", "other": None} - - def test_get_detail_view(self): - """ - GET requests to RetrieveAPIView with optional relations should return None - for non existing relations. - """ - request = factory.get('/optionalrelationmodel-detail/1') - response = self.detail_view(request, pk=1) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, self.data) - - def test_put_detail_view(self): - """ - PUT requests to RetrieveUpdateDestroyAPIView with optional relations - should accept None for non existing relations. - """ - response = self.client.put('/optionalrelation/1/', - data=json.dumps(self.data), - content_type='application/json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - - -class TestOverriddenURLField(TestCase): - def setUp(self): - class OverriddenURLSerializer(serializers.HyperlinkedModelSerializer): - url = serializers.SerializerMethodField('get_url') - - class Meta: - model = BlogPost - fields = ('title', 'url') - - def get_url(self, obj): - return 'foo bar' - - self.Serializer = OverriddenURLSerializer - self.obj = BlogPost.objects.create(title='New blog post') - - def test_overridden_url_field(self): - """ - The 'url' field should respect overriding. - Regression test for #936. - """ - serializer = self.Serializer(self.obj) - self.assertEqual( - serializer.data, - {'title': 'New blog post', 'url': 'foo bar'} - ) diff --git a/vendor-local/lib/python/rest_framework/tests/test_multitable_inheritance.py b/vendor-local/lib/python/rest_framework/tests/test_multitable_inheritance.py deleted file mode 100644 index 00c15327608..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_multitable_inheritance.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import unicode_literals -from django.db import models -from django.test import TestCase -from rest_framework import serializers -from rest_framework.tests.models import RESTFrameworkModel - - -# Models -class ParentModel(RESTFrameworkModel): - name1 = models.CharField(max_length=100) - - -class ChildModel(ParentModel): - name2 = models.CharField(max_length=100) - - -class AssociatedModel(RESTFrameworkModel): - ref = models.OneToOneField(ParentModel, primary_key=True) - name = models.CharField(max_length=100) - - -# Serializers -class DerivedModelSerializer(serializers.ModelSerializer): - class Meta: - model = ChildModel - - -class AssociatedModelSerializer(serializers.ModelSerializer): - class Meta: - model = AssociatedModel - - -# Tests -class IneritedModelSerializationTests(TestCase): - - def test_multitable_inherited_model_fields_as_expected(self): - """ - Assert that the parent pointer field is not included in the fields - serialized fields - """ - child = ChildModel(name1='parent name', name2='child name') - serializer = DerivedModelSerializer(child) - self.assertEqual(set(serializer.data.keys()), - set(['name1', 'name2', 'id'])) - - def test_onetoone_primary_key_model_fields_as_expected(self): - """ - Assert that a model with a onetoone field that is the primary key is - not treated like a derived model - """ - parent = ParentModel(name1='parent name') - associate = AssociatedModel(name='hello', ref=parent) - serializer = AssociatedModelSerializer(associate) - self.assertEqual(set(serializer.data.keys()), - set(['name', 'ref'])) - - def test_data_is_valid_without_parent_ptr(self): - """ - Assert that the pointer to the parent table is not a required field - for input data - """ - data = { - 'name1': 'parent name', - 'name2': 'child name', - } - serializer = DerivedModelSerializer(data=data) - self.assertEqual(serializer.is_valid(), True) diff --git a/vendor-local/lib/python/rest_framework/tests/test_negotiation.py b/vendor-local/lib/python/rest_framework/tests/test_negotiation.py deleted file mode 100644 index 04b89eb6000..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_negotiation.py +++ /dev/null @@ -1,45 +0,0 @@ -from __future__ import unicode_literals -from django.test import TestCase -from rest_framework.negotiation import DefaultContentNegotiation -from rest_framework.request import Request -from rest_framework.renderers import BaseRenderer -from rest_framework.test import APIRequestFactory - - -factory = APIRequestFactory() - - -class MockJSONRenderer(BaseRenderer): - media_type = 'application/json' - - -class MockHTMLRenderer(BaseRenderer): - media_type = 'text/html' - - -class NoCharsetSpecifiedRenderer(BaseRenderer): - media_type = 'my/media' - - -class TestAcceptedMediaType(TestCase): - def setUp(self): - self.renderers = [MockJSONRenderer(), MockHTMLRenderer()] - self.negotiator = DefaultContentNegotiation() - - def select_renderer(self, request): - return self.negotiator.select_renderer(request, self.renderers) - - def test_client_without_accept_use_renderer(self): - request = Request(factory.get('/')) - accepted_renderer, accepted_media_type = self.select_renderer(request) - self.assertEqual(accepted_media_type, 'application/json') - - def test_client_underspecifies_accept_use_renderer(self): - request = Request(factory.get('/', HTTP_ACCEPT='*/*')) - accepted_renderer, accepted_media_type = self.select_renderer(request) - self.assertEqual(accepted_media_type, 'application/json') - - def test_client_overspecifies_accept_use_client(self): - request = Request(factory.get('/', HTTP_ACCEPT='application/json; indent=8')) - accepted_renderer, accepted_media_type = self.select_renderer(request) - self.assertEqual(accepted_media_type, 'application/json; indent=8') diff --git a/vendor-local/lib/python/rest_framework/tests/test_pagination.py b/vendor-local/lib/python/rest_framework/tests/test_pagination.py deleted file mode 100644 index 85d4640ead7..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_pagination.py +++ /dev/null @@ -1,385 +0,0 @@ -from __future__ import unicode_literals -import datetime -from decimal import Decimal -from django.db import models -from django.core.paginator import Paginator -from django.test import TestCase -from django.utils import unittest -from rest_framework import generics, status, pagination, filters, serializers -from rest_framework.compat import django_filters -from rest_framework.test import APIRequestFactory -from rest_framework.tests.models import BasicModel - -factory = APIRequestFactory() - - -class FilterableItem(models.Model): - text = models.CharField(max_length=100) - decimal = models.DecimalField(max_digits=4, decimal_places=2) - date = models.DateField() - - -class RootView(generics.ListCreateAPIView): - """ - Example description for OPTIONS. - """ - model = BasicModel - paginate_by = 10 - - -class DefaultPageSizeKwargView(generics.ListAPIView): - """ - View for testing default paginate_by_param usage - """ - model = BasicModel - - -class PaginateByParamView(generics.ListAPIView): - """ - View for testing custom paginate_by_param usage - """ - model = BasicModel - paginate_by_param = 'page_size' - - -class IntegrationTestPagination(TestCase): - """ - Integration tests for paginated list views. - """ - - def setUp(self): - """ - Create 26 BasicModel instances. - """ - for char in 'abcdefghijklmnopqrstuvwxyz': - BasicModel(text=char * 3).save() - self.objects = BasicModel.objects - self.data = [ - {'id': obj.id, 'text': obj.text} - for obj in self.objects.all() - ] - self.view = RootView.as_view() - - def test_get_paginated_root_view(self): - """ - GET requests to paginated ListCreateAPIView should return paginated results. - """ - request = factory.get('/') - # Note: Database queries are a `SELECT COUNT`, and `SELECT <fields>` - with self.assertNumQueries(2): - response = self.view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['count'], 26) - self.assertEqual(response.data['results'], self.data[:10]) - self.assertNotEqual(response.data['next'], None) - self.assertEqual(response.data['previous'], None) - - request = factory.get(response.data['next']) - with self.assertNumQueries(2): - response = self.view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['count'], 26) - self.assertEqual(response.data['results'], self.data[10:20]) - self.assertNotEqual(response.data['next'], None) - self.assertNotEqual(response.data['previous'], None) - - request = factory.get(response.data['next']) - with self.assertNumQueries(2): - response = self.view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['count'], 26) - self.assertEqual(response.data['results'], self.data[20:]) - self.assertEqual(response.data['next'], None) - self.assertNotEqual(response.data['previous'], None) - - -class IntegrationTestPaginationAndFiltering(TestCase): - - def setUp(self): - """ - Create 50 FilterableItem instances. - """ - base_data = ('a', Decimal('0.25'), datetime.date(2012, 10, 8)) - for i in range(26): - text = chr(i + ord(base_data[0])) * 3 # Produces string 'aaa', 'bbb', etc. - decimal = base_data[1] + i - date = base_data[2] - datetime.timedelta(days=i * 2) - FilterableItem(text=text, decimal=decimal, date=date).save() - - self.objects = FilterableItem.objects - self.data = [ - {'id': obj.id, 'text': obj.text, 'decimal': obj.decimal, 'date': obj.date} - for obj in self.objects.all() - ] - - @unittest.skipUnless(django_filters, 'django-filters not installed') - def test_get_django_filter_paginated_filtered_root_view(self): - """ - GET requests to paginated filtered ListCreateAPIView should return - paginated results. The next and previous links should preserve the - filtered parameters. - """ - class DecimalFilter(django_filters.FilterSet): - decimal = django_filters.NumberFilter(lookup_type='lt') - - class Meta: - model = FilterableItem - fields = ['text', 'decimal', 'date'] - - class FilterFieldsRootView(generics.ListCreateAPIView): - model = FilterableItem - paginate_by = 10 - filter_class = DecimalFilter - filter_backends = (filters.DjangoFilterBackend,) - - view = FilterFieldsRootView.as_view() - - EXPECTED_NUM_QUERIES = 2 - - request = factory.get('/?decimal=15.20') - with self.assertNumQueries(EXPECTED_NUM_QUERIES): - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['count'], 15) - self.assertEqual(response.data['results'], self.data[:10]) - self.assertNotEqual(response.data['next'], None) - self.assertEqual(response.data['previous'], None) - - request = factory.get(response.data['next']) - with self.assertNumQueries(EXPECTED_NUM_QUERIES): - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['count'], 15) - self.assertEqual(response.data['results'], self.data[10:15]) - self.assertEqual(response.data['next'], None) - self.assertNotEqual(response.data['previous'], None) - - request = factory.get(response.data['previous']) - with self.assertNumQueries(EXPECTED_NUM_QUERIES): - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['count'], 15) - self.assertEqual(response.data['results'], self.data[:10]) - self.assertNotEqual(response.data['next'], None) - self.assertEqual(response.data['previous'], None) - - def test_get_basic_paginated_filtered_root_view(self): - """ - Same as `test_get_django_filter_paginated_filtered_root_view`, - except using a custom filter backend instead of the django-filter - backend, - """ - - class DecimalFilterBackend(filters.BaseFilterBackend): - def filter_queryset(self, request, queryset, view): - return queryset.filter(decimal__lt=Decimal(request.GET['decimal'])) - - class BasicFilterFieldsRootView(generics.ListCreateAPIView): - model = FilterableItem - paginate_by = 10 - filter_backends = (DecimalFilterBackend,) - - view = BasicFilterFieldsRootView.as_view() - - request = factory.get('/?decimal=15.20') - with self.assertNumQueries(2): - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['count'], 15) - self.assertEqual(response.data['results'], self.data[:10]) - self.assertNotEqual(response.data['next'], None) - self.assertEqual(response.data['previous'], None) - - request = factory.get(response.data['next']) - with self.assertNumQueries(2): - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['count'], 15) - self.assertEqual(response.data['results'], self.data[10:15]) - self.assertEqual(response.data['next'], None) - self.assertNotEqual(response.data['previous'], None) - - request = factory.get(response.data['previous']) - with self.assertNumQueries(2): - response = view(request).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['count'], 15) - self.assertEqual(response.data['results'], self.data[:10]) - self.assertNotEqual(response.data['next'], None) - self.assertEqual(response.data['previous'], None) - - -class PassOnContextPaginationSerializer(pagination.PaginationSerializer): - class Meta: - object_serializer_class = serializers.Serializer - - -class UnitTestPagination(TestCase): - """ - Unit tests for pagination of primitive objects. - """ - - def setUp(self): - self.objects = [char * 3 for char in 'abcdefghijklmnopqrstuvwxyz'] - paginator = Paginator(self.objects, 10) - self.first_page = paginator.page(1) - self.last_page = paginator.page(3) - - def test_native_pagination(self): - serializer = pagination.PaginationSerializer(self.first_page) - self.assertEqual(serializer.data['count'], 26) - self.assertEqual(serializer.data['next'], '?page=2') - self.assertEqual(serializer.data['previous'], None) - self.assertEqual(serializer.data['results'], self.objects[:10]) - - serializer = pagination.PaginationSerializer(self.last_page) - self.assertEqual(serializer.data['count'], 26) - self.assertEqual(serializer.data['next'], None) - self.assertEqual(serializer.data['previous'], '?page=2') - self.assertEqual(serializer.data['results'], self.objects[20:]) - - def test_context_available_in_result(self): - """ - Ensure context gets passed through to the object serializer. - """ - serializer = PassOnContextPaginationSerializer(self.first_page, context={'foo': 'bar'}) - serializer.data - results = serializer.fields[serializer.results_field] - self.assertEqual(serializer.context, results.context) - - -class TestUnpaginated(TestCase): - """ - Tests for list views without pagination. - """ - - def setUp(self): - """ - Create 13 BasicModel instances. - """ - for i in range(13): - BasicModel(text=i).save() - self.objects = BasicModel.objects - self.data = [ - {'id': obj.id, 'text': obj.text} - for obj in self.objects.all() - ] - self.view = DefaultPageSizeKwargView.as_view() - - def test_unpaginated(self): - """ - Tests the default page size for this view. - no page size --> no limit --> no meta data - """ - request = factory.get('/') - response = self.view(request) - self.assertEqual(response.data, self.data) - - -class TestCustomPaginateByParam(TestCase): - """ - Tests for list views with default page size kwarg - """ - - def setUp(self): - """ - Create 13 BasicModel instances. - """ - for i in range(13): - BasicModel(text=i).save() - self.objects = BasicModel.objects - self.data = [ - {'id': obj.id, 'text': obj.text} - for obj in self.objects.all() - ] - self.view = PaginateByParamView.as_view() - - def test_default_page_size(self): - """ - Tests the default page size for this view. - no page size --> no limit --> no meta data - """ - request = factory.get('/') - response = self.view(request).render() - self.assertEqual(response.data, self.data) - - def test_paginate_by_param(self): - """ - If paginate_by_param is set, the new kwarg should limit per view requests. - """ - request = factory.get('/?page_size=5') - response = self.view(request).render() - self.assertEqual(response.data['count'], 13) - self.assertEqual(response.data['results'], self.data[:5]) - - -### Tests for context in pagination serializers - -class CustomField(serializers.Field): - def to_native(self, value): - if not 'view' in self.context: - raise RuntimeError("context isn't getting passed into custom field") - return "value" - - -class BasicModelSerializer(serializers.Serializer): - text = CustomField() - - def __init__(self, *args, **kwargs): - super(BasicModelSerializer, self).__init__(*args, **kwargs) - if not 'view' in self.context: - raise RuntimeError("context isn't getting passed into serializer init") - - -class TestContextPassedToCustomField(TestCase): - def setUp(self): - BasicModel.objects.create(text='ala ma kota') - - def test_with_pagination(self): - class ListView(generics.ListCreateAPIView): - model = BasicModel - serializer_class = BasicModelSerializer - paginate_by = 1 - - self.view = ListView.as_view() - request = factory.get('/') - response = self.view(request).render() - - self.assertEqual(response.status_code, status.HTTP_200_OK) - - -### Tests for custom pagination serializers - -class LinksSerializer(serializers.Serializer): - next = pagination.NextPageField(source='*') - prev = pagination.PreviousPageField(source='*') - - -class CustomPaginationSerializer(pagination.BasePaginationSerializer): - links = LinksSerializer(source='*') # Takes the page object as the source - total_results = serializers.Field(source='paginator.count') - - results_field = 'objects' - - -class TestCustomPaginationSerializer(TestCase): - def setUp(self): - objects = ['john', 'paul', 'george', 'ringo'] - paginator = Paginator(objects, 2) - self.page = paginator.page(1) - - def test_custom_pagination_serializer(self): - request = APIRequestFactory().get('/foobar') - serializer = CustomPaginationSerializer( - instance=self.page, - context={'request': request} - ) - expected = { - 'links': { - 'next': 'http://testserver/foobar?page=2', - 'prev': None - }, - 'total_results': 4, - 'objects': ['john', 'paul'] - } - self.assertEqual(serializer.data, expected) diff --git a/vendor-local/lib/python/rest_framework/tests/test_parsers.py b/vendor-local/lib/python/rest_framework/tests/test_parsers.py deleted file mode 100644 index 7699e10c91b..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_parsers.py +++ /dev/null @@ -1,115 +0,0 @@ -from __future__ import unicode_literals -from rest_framework.compat import StringIO -from django import forms -from django.core.files.uploadhandler import MemoryFileUploadHandler -from django.test import TestCase -from django.utils import unittest -from rest_framework.compat import etree -from rest_framework.parsers import FormParser, FileUploadParser -from rest_framework.parsers import XMLParser -import datetime - - -class Form(forms.Form): - field1 = forms.CharField(max_length=3) - field2 = forms.CharField() - - -class TestFormParser(TestCase): - def setUp(self): - self.string = "field1=abc&field2=defghijk" - - def test_parse(self): - """ Make sure the `QueryDict` works OK """ - parser = FormParser() - - stream = StringIO(self.string) - data = parser.parse(stream) - - self.assertEqual(Form(data).is_valid(), True) - - -class TestXMLParser(TestCase): - def setUp(self): - self._input = StringIO( - '<?xml version="1.0" encoding="utf-8"?>' - '<root>' - '<field_a>121.0</field_a>' - '<field_b>dasd</field_b>' - '<field_c></field_c>' - '<field_d>2011-12-25 12:45:00</field_d>' - '</root>' - ) - self._data = { - 'field_a': 121, - 'field_b': 'dasd', - 'field_c': None, - 'field_d': datetime.datetime(2011, 12, 25, 12, 45, 00) - } - self._complex_data_input = StringIO( - '<?xml version="1.0" encoding="utf-8"?>' - '<root>' - '<creation_date>2011-12-25 12:45:00</creation_date>' - '<sub_data_list>' - '<list-item><sub_id>1</sub_id><sub_name>first</sub_name></list-item>' - '<list-item><sub_id>2</sub_id><sub_name>second</sub_name></list-item>' - '</sub_data_list>' - '<name>name</name>' - '</root>' - ) - self._complex_data = { - "creation_date": datetime.datetime(2011, 12, 25, 12, 45, 00), - "name": "name", - "sub_data_list": [ - { - "sub_id": 1, - "sub_name": "first" - }, - { - "sub_id": 2, - "sub_name": "second" - } - ] - } - - @unittest.skipUnless(etree, 'defusedxml not installed') - def test_parse(self): - parser = XMLParser() - data = parser.parse(self._input) - self.assertEqual(data, self._data) - - @unittest.skipUnless(etree, 'defusedxml not installed') - def test_complex_data_parse(self): - parser = XMLParser() - data = parser.parse(self._complex_data_input) - self.assertEqual(data, self._complex_data) - - -class TestFileUploadParser(TestCase): - def setUp(self): - class MockRequest(object): - pass - from io import BytesIO - self.stream = BytesIO( - "Test text file".encode('utf-8') - ) - request = MockRequest() - request.upload_handlers = (MemoryFileUploadHandler(),) - request.META = { - 'HTTP_CONTENT_DISPOSITION': 'Content-Disposition: inline; filename=file.txt'.encode('utf-8'), - 'HTTP_CONTENT_LENGTH': 14, - } - self.parser_context = {'request': request, 'kwargs': {}} - - def test_parse(self): - """ Make sure the `QueryDict` works OK """ - parser = FileUploadParser() - self.stream.seek(0) - data_and_files = parser.parse(self.stream, None, self.parser_context) - file_obj = data_and_files.files['file'] - self.assertEqual(file_obj._size, 14) - - def test_get_filename(self): - parser = FileUploadParser() - filename = parser.get_filename(self.stream, None, self.parser_context) - self.assertEqual(filename, 'file.txt'.encode('utf-8')) diff --git a/vendor-local/lib/python/rest_framework/tests/test_permissions.py b/vendor-local/lib/python/rest_framework/tests/test_permissions.py deleted file mode 100644 index e2cca3808ca..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_permissions.py +++ /dev/null @@ -1,188 +0,0 @@ -from __future__ import unicode_literals -from django.contrib.auth.models import User, Permission -from django.db import models -from django.test import TestCase -from rest_framework import generics, status, permissions, authentication, HTTP_HEADER_ENCODING -from rest_framework.test import APIRequestFactory -import base64 - -factory = APIRequestFactory() - - -class BasicModel(models.Model): - text = models.CharField(max_length=100) - - -class RootView(generics.ListCreateAPIView): - model = BasicModel - authentication_classes = [authentication.BasicAuthentication] - permission_classes = [permissions.DjangoModelPermissions] - - -class InstanceView(generics.RetrieveUpdateDestroyAPIView): - model = BasicModel - authentication_classes = [authentication.BasicAuthentication] - permission_classes = [permissions.DjangoModelPermissions] - -root_view = RootView.as_view() -instance_view = InstanceView.as_view() - - -def basic_auth_header(username, password): - credentials = ('%s:%s' % (username, password)) - base64_credentials = base64.b64encode(credentials.encode(HTTP_HEADER_ENCODING)).decode(HTTP_HEADER_ENCODING) - return 'Basic %s' % base64_credentials - - -class ModelPermissionsIntegrationTests(TestCase): - def setUp(self): - User.objects.create_user('disallowed', 'disallowed@example.com', 'password') - user = User.objects.create_user('permitted', 'permitted@example.com', 'password') - user.user_permissions = [ - Permission.objects.get(codename='add_basicmodel'), - Permission.objects.get(codename='change_basicmodel'), - Permission.objects.get(codename='delete_basicmodel') - ] - user = User.objects.create_user('updateonly', 'updateonly@example.com', 'password') - user.user_permissions = [ - Permission.objects.get(codename='change_basicmodel'), - ] - - self.permitted_credentials = basic_auth_header('permitted', 'password') - self.disallowed_credentials = basic_auth_header('disallowed', 'password') - self.updateonly_credentials = basic_auth_header('updateonly', 'password') - - BasicModel(text='foo').save() - - def test_has_create_permissions(self): - request = factory.post('/', {'text': 'foobar'}, format='json', - HTTP_AUTHORIZATION=self.permitted_credentials) - response = root_view(request, pk=1) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - - def test_has_put_permissions(self): - request = factory.put('/1', {'text': 'foobar'}, format='json', - HTTP_AUTHORIZATION=self.permitted_credentials) - response = instance_view(request, pk='1') - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_has_delete_permissions(self): - request = factory.delete('/1', HTTP_AUTHORIZATION=self.permitted_credentials) - response = instance_view(request, pk=1) - self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - - def test_does_not_have_create_permissions(self): - request = factory.post('/', {'text': 'foobar'}, format='json', - HTTP_AUTHORIZATION=self.disallowed_credentials) - response = root_view(request, pk=1) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - def test_does_not_have_put_permissions(self): - request = factory.put('/1', {'text': 'foobar'}, format='json', - HTTP_AUTHORIZATION=self.disallowed_credentials) - response = instance_view(request, pk='1') - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - def test_does_not_have_delete_permissions(self): - request = factory.delete('/1', HTTP_AUTHORIZATION=self.disallowed_credentials) - response = instance_view(request, pk=1) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - def test_has_put_as_create_permissions(self): - # User only has update permissions - should be able to update an entity. - request = factory.put('/1', {'text': 'foobar'}, format='json', - HTTP_AUTHORIZATION=self.updateonly_credentials) - response = instance_view(request, pk='1') - self.assertEqual(response.status_code, status.HTTP_200_OK) - - # But if PUTing to a new entity, permission should be denied. - request = factory.put('/2', {'text': 'foobar'}, format='json', - HTTP_AUTHORIZATION=self.updateonly_credentials) - response = instance_view(request, pk='2') - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - def test_options_permitted(self): - request = factory.options('/', - HTTP_AUTHORIZATION=self.permitted_credentials) - response = root_view(request, pk='1') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertIn('actions', response.data) - self.assertEqual(list(response.data['actions'].keys()), ['POST']) - - request = factory.options('/1', - HTTP_AUTHORIZATION=self.permitted_credentials) - response = instance_view(request, pk='1') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertIn('actions', response.data) - self.assertEqual(list(response.data['actions'].keys()), ['PUT']) - - def test_options_disallowed(self): - request = factory.options('/', - HTTP_AUTHORIZATION=self.disallowed_credentials) - response = root_view(request, pk='1') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertNotIn('actions', response.data) - - request = factory.options('/1', - HTTP_AUTHORIZATION=self.disallowed_credentials) - response = instance_view(request, pk='1') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertNotIn('actions', response.data) - - def test_options_updateonly(self): - request = factory.options('/', - HTTP_AUTHORIZATION=self.updateonly_credentials) - response = root_view(request, pk='1') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertNotIn('actions', response.data) - - request = factory.options('/1', - HTTP_AUTHORIZATION=self.updateonly_credentials) - response = instance_view(request, pk='1') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertIn('actions', response.data) - self.assertEqual(list(response.data['actions'].keys()), ['PUT']) - - -class OwnerModel(models.Model): - text = models.CharField(max_length=100) - owner = models.ForeignKey(User) - - -class IsOwnerPermission(permissions.BasePermission): - def has_object_permission(self, request, view, obj): - return request.user == obj.owner - - -class OwnerInstanceView(generics.RetrieveUpdateDestroyAPIView): - model = OwnerModel - authentication_classes = [authentication.BasicAuthentication] - permission_classes = [IsOwnerPermission] - - -owner_instance_view = OwnerInstanceView.as_view() - - -class ObjectPermissionsIntegrationTests(TestCase): - """ - Integration tests for the object level permissions API. - """ - - def setUp(self): - User.objects.create_user('not_owner', 'not_owner@example.com', 'password') - user = User.objects.create_user('owner', 'owner@example.com', 'password') - - self.not_owner_credentials = basic_auth_header('not_owner', 'password') - self.owner_credentials = basic_auth_header('owner', 'password') - - OwnerModel(text='foo', owner=user).save() - - def test_owner_has_delete_permissions(self): - request = factory.delete('/1', HTTP_AUTHORIZATION=self.owner_credentials) - response = owner_instance_view(request, pk='1') - self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - - def test_non_owner_does_not_have_delete_permissions(self): - request = factory.delete('/1', HTTP_AUTHORIZATION=self.not_owner_credentials) - response = owner_instance_view(request, pk='1') - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) diff --git a/vendor-local/lib/python/rest_framework/tests/test_relations.py b/vendor-local/lib/python/rest_framework/tests/test_relations.py deleted file mode 100644 index d19219c908e..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_relations.py +++ /dev/null @@ -1,100 +0,0 @@ -""" -General tests for relational fields. -""" -from __future__ import unicode_literals -from django.db import models -from django.test import TestCase -from rest_framework import serializers -from rest_framework.tests.models import BlogPost - - -class NullModel(models.Model): - pass - - -class FieldTests(TestCase): - def test_pk_related_field_with_empty_string(self): - """ - Regression test for #446 - - https://github.com/tomchristie/django-rest-framework/issues/446 - """ - field = serializers.PrimaryKeyRelatedField(queryset=NullModel.objects.all()) - self.assertRaises(serializers.ValidationError, field.from_native, '') - self.assertRaises(serializers.ValidationError, field.from_native, []) - - def test_hyperlinked_related_field_with_empty_string(self): - field = serializers.HyperlinkedRelatedField(queryset=NullModel.objects.all(), view_name='') - self.assertRaises(serializers.ValidationError, field.from_native, '') - self.assertRaises(serializers.ValidationError, field.from_native, []) - - def test_slug_related_field_with_empty_string(self): - field = serializers.SlugRelatedField(queryset=NullModel.objects.all(), slug_field='pk') - self.assertRaises(serializers.ValidationError, field.from_native, '') - self.assertRaises(serializers.ValidationError, field.from_native, []) - - -class TestManyRelatedMixin(TestCase): - def test_missing_many_to_many_related_field(self): - ''' - Regression test for #632 - - https://github.com/tomchristie/django-rest-framework/pull/632 - ''' - field = serializers.RelatedField(many=True, read_only=False) - - into = {} - field.field_from_native({}, None, 'field_name', into) - self.assertEqual(into['field_name'], []) - - -# Regression tests for #694 (`source` attribute on related fields) - -class RelatedFieldSourceTests(TestCase): - def test_related_manager_source(self): - """ - Relational fields should be able to use manager-returning methods as their source. - """ - BlogPost.objects.create(title='blah') - field = serializers.RelatedField(many=True, source='get_blogposts_manager') - - class ClassWithManagerMethod(object): - def get_blogposts_manager(self): - return BlogPost.objects - - obj = ClassWithManagerMethod() - value = field.field_to_native(obj, 'field_name') - self.assertEqual(value, ['BlogPost object']) - - def test_related_queryset_source(self): - """ - Relational fields should be able to use queryset-returning methods as their source. - """ - BlogPost.objects.create(title='blah') - field = serializers.RelatedField(many=True, source='get_blogposts_queryset') - - class ClassWithQuerysetMethod(object): - def get_blogposts_queryset(self): - return BlogPost.objects.all() - - obj = ClassWithQuerysetMethod() - value = field.field_to_native(obj, 'field_name') - self.assertEqual(value, ['BlogPost object']) - - def test_dotted_source(self): - """ - Source argument should support dotted.source notation. - """ - BlogPost.objects.create(title='blah') - field = serializers.RelatedField(many=True, source='a.b.c') - - class ClassWithQuerysetMethod(object): - a = { - 'b': { - 'c': BlogPost.objects.all() - } - } - - obj = ClassWithQuerysetMethod() - value = field.field_to_native(obj, 'field_name') - self.assertEqual(value, ['BlogPost object']) diff --git a/vendor-local/lib/python/rest_framework/tests/test_relations_hyperlink.py b/vendor-local/lib/python/rest_framework/tests/test_relations_hyperlink.py deleted file mode 100644 index 3c4d39af634..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_relations_hyperlink.py +++ /dev/null @@ -1,524 +0,0 @@ -from __future__ import unicode_literals -from django.test import TestCase -from rest_framework import serializers -from rest_framework.compat import patterns, url -from rest_framework.test import APIRequestFactory -from rest_framework.tests.models import ( - BlogPost, - ManyToManyTarget, ManyToManySource, ForeignKeyTarget, ForeignKeySource, - NullableForeignKeySource, OneToOneTarget, NullableOneToOneSource -) - -factory = APIRequestFactory() -request = factory.get('/') # Just to ensure we have a request in the serializer context - - -def dummy_view(request, pk): - pass - -urlpatterns = patterns('', - url(r'^dummyurl/(?P<pk>[0-9]+)/$', dummy_view, name='dummy-url'), - url(r'^manytomanysource/(?P<pk>[0-9]+)/$', dummy_view, name='manytomanysource-detail'), - url(r'^manytomanytarget/(?P<pk>[0-9]+)/$', dummy_view, name='manytomanytarget-detail'), - url(r'^foreignkeysource/(?P<pk>[0-9]+)/$', dummy_view, name='foreignkeysource-detail'), - url(r'^foreignkeytarget/(?P<pk>[0-9]+)/$', dummy_view, name='foreignkeytarget-detail'), - url(r'^nullableforeignkeysource/(?P<pk>[0-9]+)/$', dummy_view, name='nullableforeignkeysource-detail'), - url(r'^onetoonetarget/(?P<pk>[0-9]+)/$', dummy_view, name='onetoonetarget-detail'), - url(r'^nullableonetoonesource/(?P<pk>[0-9]+)/$', dummy_view, name='nullableonetoonesource-detail'), -) - - -# ManyToMany -class ManyToManyTargetSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = ManyToManyTarget - fields = ('url', 'name', 'sources') - - -class ManyToManySourceSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = ManyToManySource - fields = ('url', 'name', 'targets') - - -# ForeignKey -class ForeignKeyTargetSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = ForeignKeyTarget - fields = ('url', 'name', 'sources') - - -class ForeignKeySourceSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = ForeignKeySource - fields = ('url', 'name', 'target') - - -# Nullable ForeignKey -class NullableForeignKeySourceSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = NullableForeignKeySource - fields = ('url', 'name', 'target') - - -# Nullable OneToOne -class NullableOneToOneTargetSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = OneToOneTarget - fields = ('url', 'name', 'nullable_source') - - -# TODO: Add test that .data cannot be accessed prior to .is_valid - -class HyperlinkedManyToManyTests(TestCase): - urls = 'rest_framework.tests.test_relations_hyperlink' - - def setUp(self): - for idx in range(1, 4): - target = ManyToManyTarget(name='target-%d' % idx) - target.save() - source = ManyToManySource(name='source-%d' % idx) - source.save() - for target in ManyToManyTarget.objects.all(): - source.targets.add(target) - - def test_many_to_many_retrieve(self): - queryset = ManyToManySource.objects.all() - serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/']}, - {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, - {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_many_to_many_retrieve(self): - queryset = ManyToManyTarget.objects.all() - serializer = ManyToManyTargetSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, - {'url': 'http://testserver/manytomanytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, - {'url': 'http://testserver/manytomanytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/manytomanysource/3/']} - ] - self.assertEqual(serializer.data, expected) - - def test_many_to_many_update(self): - data = {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} - instance = ManyToManySource.objects.get(pk=1) - serializer = ManyToManySourceSerializer(instance, data=data, context={'request': request}) - self.assertTrue(serializer.is_valid()) - serializer.save() - self.assertEqual(serializer.data, data) - - # Ensure source 1 is updated, and everything else is as expected - queryset = ManyToManySource.objects.all() - serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']}, - {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, - {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_many_to_many_update(self): - data = {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/']} - instance = ManyToManyTarget.objects.get(pk=1) - serializer = ManyToManyTargetSerializer(instance, data=data, context={'request': request}) - self.assertTrue(serializer.is_valid()) - serializer.save() - self.assertEqual(serializer.data, data) - - # Ensure target 1 is updated, and everything else is as expected - queryset = ManyToManyTarget.objects.all() - serializer = ManyToManyTargetSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/']}, - {'url': 'http://testserver/manytomanytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, - {'url': 'http://testserver/manytomanytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/manytomanysource/3/']} - - ] - self.assertEqual(serializer.data, expected) - - def test_many_to_many_create(self): - data = {'url': 'http://testserver/manytomanysource/4/', 'name': 'source-4', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/3/']} - serializer = ManyToManySourceSerializer(data=data, context={'request': request}) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'source-4') - - # Ensure source 4 is added, and everything else is as expected - queryset = ManyToManySource.objects.all() - serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/']}, - {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, - {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']}, - {'url': 'http://testserver/manytomanysource/4/', 'name': 'source-4', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/3/']} - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_many_to_many_create(self): - data = {'url': 'http://testserver/manytomanytarget/4/', 'name': 'target-4', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/3/']} - serializer = ManyToManyTargetSerializer(data=data, context={'request': request}) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'target-4') - - # Ensure target 4 is added, and everything else is as expected - queryset = ManyToManyTarget.objects.all() - serializer = ManyToManyTargetSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, - {'url': 'http://testserver/manytomanytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, - {'url': 'http://testserver/manytomanytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/manytomanysource/3/']}, - {'url': 'http://testserver/manytomanytarget/4/', 'name': 'target-4', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/3/']} - ] - self.assertEqual(serializer.data, expected) - - -class HyperlinkedForeignKeyTests(TestCase): - urls = 'rest_framework.tests.test_relations_hyperlink' - - def setUp(self): - target = ForeignKeyTarget(name='target-1') - target.save() - new_target = ForeignKeyTarget(name='target-2') - new_target.save() - for idx in range(1, 4): - source = ForeignKeySource(name='source-%d' % idx, target=target) - source.save() - - def test_foreign_key_retrieve(self): - queryset = ForeignKeySource.objects.all() - serializer = ForeignKeySourceSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/foreignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/foreignkeysource/3/', 'name': 'source-3', 'target': 'http://testserver/foreignkeytarget/1/'} - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_foreign_key_retrieve(self): - queryset = ForeignKeyTarget.objects.all() - serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/2/', 'http://testserver/foreignkeysource/3/']}, - {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': []}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update(self): - data = {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/2/'} - instance = ForeignKeySource.objects.get(pk=1) - serializer = ForeignKeySourceSerializer(instance, data=data, context={'request': request}) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.data, data) - serializer.save() - - # Ensure source 1 is updated, and everything else is as expected - queryset = ForeignKeySource.objects.all() - serializer = ForeignKeySourceSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/2/'}, - {'url': 'http://testserver/foreignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/foreignkeysource/3/', 'name': 'source-3', 'target': 'http://testserver/foreignkeytarget/1/'} - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update_incorrect_type(self): - data = {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 2} - instance = ForeignKeySource.objects.get(pk=1) - serializer = ForeignKeySourceSerializer(instance, data=data, context={'request': request}) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'target': ['Incorrect type. Expected url string, received int.']}) - - def test_reverse_foreign_key_update(self): - data = {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']} - instance = ForeignKeyTarget.objects.get(pk=2) - serializer = ForeignKeyTargetSerializer(instance, data=data, context={'request': request}) - self.assertTrue(serializer.is_valid()) - # We shouldn't have saved anything to the db yet since save - # hasn't been called. - queryset = ForeignKeyTarget.objects.all() - new_serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/2/', 'http://testserver/foreignkeysource/3/']}, - {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': []}, - ] - self.assertEqual(new_serializer.data, expected) - - serializer.save() - self.assertEqual(serializer.data, data) - - # Ensure target 2 is update, and everything else is as expected - queryset = ForeignKeyTarget.objects.all() - serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/2/']}, - {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_create(self): - data = {'url': 'http://testserver/foreignkeysource/4/', 'name': 'source-4', 'target': 'http://testserver/foreignkeytarget/2/'} - serializer = ForeignKeySourceSerializer(data=data, context={'request': request}) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'source-4') - - # Ensure source 1 is updated, and everything else is as expected - queryset = ForeignKeySource.objects.all() - serializer = ForeignKeySourceSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/foreignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/foreignkeysource/3/', 'name': 'source-3', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/foreignkeysource/4/', 'name': 'source-4', 'target': 'http://testserver/foreignkeytarget/2/'}, - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_foreign_key_create(self): - data = {'url': 'http://testserver/foreignkeytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']} - serializer = ForeignKeyTargetSerializer(data=data, context={'request': request}) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'target-3') - - # Ensure target 4 is added, and everything else is as expected - queryset = ForeignKeyTarget.objects.all() - serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/2/']}, - {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': []}, - {'url': 'http://testserver/foreignkeytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update_with_invalid_null(self): - data = {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': None} - instance = ForeignKeySource.objects.get(pk=1) - serializer = ForeignKeySourceSerializer(instance, data=data, context={'request': request}) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'target': ['This field is required.']}) - - -class HyperlinkedNullableForeignKeyTests(TestCase): - urls = 'rest_framework.tests.test_relations_hyperlink' - - def setUp(self): - target = ForeignKeyTarget(name='target-1') - target.save() - for idx in range(1, 4): - if idx == 3: - target = None - source = NullableForeignKeySource(name='source-%d' % idx, target=target) - source.save() - - def test_foreign_key_retrieve_with_null(self): - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_create_with_valid_null(self): - data = {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} - serializer = NullableForeignKeySourceSerializer(data=data, context={'request': request}) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'source-4') - - # Ensure source 4 is created, and everything else is as expected - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, - {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_create_with_valid_emptystring(self): - """ - The emptystring should be interpreted as null in the context - of relationships. - """ - data = {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': ''} - expected_data = {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} - serializer = NullableForeignKeySourceSerializer(data=data, context={'request': request}) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, expected_data) - self.assertEqual(obj.name, 'source-4') - - # Ensure source 4 is created, and everything else is as expected - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, - {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update_with_valid_null(self): - data = {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None} - instance = NullableForeignKeySource.objects.get(pk=1) - serializer = NullableForeignKeySourceSerializer(instance, data=data, context={'request': request}) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.data, data) - serializer.save() - - # Ensure source 1 is updated, and everything else is as expected - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None}, - {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update_with_valid_emptystring(self): - """ - The emptystring should be interpreted as null in the context - of relationships. - """ - data = {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': ''} - expected_data = {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None} - instance = NullableForeignKeySource.objects.get(pk=1) - serializer = NullableForeignKeySourceSerializer(instance, data=data, context={'request': request}) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.data, expected_data) - serializer.save() - - # Ensure source 1 is updated, and everything else is as expected - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None}, - {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, - {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, - ] - self.assertEqual(serializer.data, expected) - - # reverse foreign keys MUST be read_only - # In the general case they do not provide .remove() or .clear() - # and cannot be arbitrarily set. - - # def test_reverse_foreign_key_update(self): - # data = {'id': 1, 'name': 'target-1', 'sources': [1]} - # instance = ForeignKeyTarget.objects.get(pk=1) - # serializer = ForeignKeyTargetSerializer(instance, data=data) - # self.assertTrue(serializer.is_valid()) - # self.assertEqual(serializer.data, data) - # serializer.save() - - # # Ensure target 1 is updated, and everything else is as expected - # queryset = ForeignKeyTarget.objects.all() - # serializer = ForeignKeyTargetSerializer(queryset, many=True) - # expected = [ - # {'id': 1, 'name': 'target-1', 'sources': [1]}, - # {'id': 2, 'name': 'target-2', 'sources': []}, - # ] - # self.assertEqual(serializer.data, expected) - - -class HyperlinkedNullableOneToOneTests(TestCase): - urls = 'rest_framework.tests.test_relations_hyperlink' - - def setUp(self): - target = OneToOneTarget(name='target-1') - target.save() - new_target = OneToOneTarget(name='target-2') - new_target.save() - source = NullableOneToOneSource(name='source-1', target=target) - source.save() - - def test_reverse_foreign_key_retrieve_with_null(self): - queryset = OneToOneTarget.objects.all() - serializer = NullableOneToOneTargetSerializer(queryset, many=True, context={'request': request}) - expected = [ - {'url': 'http://testserver/onetoonetarget/1/', 'name': 'target-1', 'nullable_source': 'http://testserver/nullableonetoonesource/1/'}, - {'url': 'http://testserver/onetoonetarget/2/', 'name': 'target-2', 'nullable_source': None}, - ] - self.assertEqual(serializer.data, expected) - - -# Regression tests for #694 (`source` attribute on related fields) - -class HyperlinkedRelatedFieldSourceTests(TestCase): - urls = 'rest_framework.tests.test_relations_hyperlink' - - def test_related_manager_source(self): - """ - Relational fields should be able to use manager-returning methods as their source. - """ - BlogPost.objects.create(title='blah') - field = serializers.HyperlinkedRelatedField( - many=True, - source='get_blogposts_manager', - view_name='dummy-url', - ) - field.context = {'request': request} - - class ClassWithManagerMethod(object): - def get_blogposts_manager(self): - return BlogPost.objects - - obj = ClassWithManagerMethod() - value = field.field_to_native(obj, 'field_name') - self.assertEqual(value, ['http://testserver/dummyurl/1/']) - - def test_related_queryset_source(self): - """ - Relational fields should be able to use queryset-returning methods as their source. - """ - BlogPost.objects.create(title='blah') - field = serializers.HyperlinkedRelatedField( - many=True, - source='get_blogposts_queryset', - view_name='dummy-url', - ) - field.context = {'request': request} - - class ClassWithQuerysetMethod(object): - def get_blogposts_queryset(self): - return BlogPost.objects.all() - - obj = ClassWithQuerysetMethod() - value = field.field_to_native(obj, 'field_name') - self.assertEqual(value, ['http://testserver/dummyurl/1/']) - - def test_dotted_source(self): - """ - Source argument should support dotted.source notation. - """ - BlogPost.objects.create(title='blah') - field = serializers.HyperlinkedRelatedField( - many=True, - source='a.b.c', - view_name='dummy-url', - ) - field.context = {'request': request} - - class ClassWithQuerysetMethod(object): - a = { - 'b': { - 'c': BlogPost.objects.all() - } - } - - obj = ClassWithQuerysetMethod() - value = field.field_to_native(obj, 'field_name') - self.assertEqual(value, ['http://testserver/dummyurl/1/']) diff --git a/vendor-local/lib/python/rest_framework/tests/test_relations_nested.py b/vendor-local/lib/python/rest_framework/tests/test_relations_nested.py deleted file mode 100644 index f6d006b39bc..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_relations_nested.py +++ /dev/null @@ -1,107 +0,0 @@ -from __future__ import unicode_literals -from django.test import TestCase -from rest_framework import serializers -from rest_framework.tests.models import ForeignKeyTarget, ForeignKeySource, NullableForeignKeySource, OneToOneTarget, NullableOneToOneSource - - -class ForeignKeySourceSerializer(serializers.ModelSerializer): - class Meta: - model = ForeignKeySource - fields = ('id', 'name', 'target') - depth = 1 - - -class ForeignKeyTargetSerializer(serializers.ModelSerializer): - class Meta: - model = ForeignKeyTarget - fields = ('id', 'name', 'sources') - depth = 1 - - -class NullableForeignKeySourceSerializer(serializers.ModelSerializer): - class Meta: - model = NullableForeignKeySource - fields = ('id', 'name', 'target') - depth = 1 - - -class NullableOneToOneTargetSerializer(serializers.ModelSerializer): - class Meta: - model = OneToOneTarget - fields = ('id', 'name', 'nullable_source') - depth = 1 - - -class ReverseForeignKeyTests(TestCase): - def setUp(self): - target = ForeignKeyTarget(name='target-1') - target.save() - new_target = ForeignKeyTarget(name='target-2') - new_target.save() - for idx in range(1, 4): - source = ForeignKeySource(name='source-%d' % idx, target=target) - source.save() - - def test_foreign_key_retrieve(self): - queryset = ForeignKeySource.objects.all() - serializer = ForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': {'id': 1, 'name': 'target-1'}}, - {'id': 2, 'name': 'source-2', 'target': {'id': 1, 'name': 'target-1'}}, - {'id': 3, 'name': 'source-3', 'target': {'id': 1, 'name': 'target-1'}}, - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_foreign_key_retrieve(self): - queryset = ForeignKeyTarget.objects.all() - serializer = ForeignKeyTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'sources': [ - {'id': 1, 'name': 'source-1', 'target': 1}, - {'id': 2, 'name': 'source-2', 'target': 1}, - {'id': 3, 'name': 'source-3', 'target': 1}, - ]}, - {'id': 2, 'name': 'target-2', 'sources': [ - ]} - ] - self.assertEqual(serializer.data, expected) - - -class NestedNullableForeignKeyTests(TestCase): - def setUp(self): - target = ForeignKeyTarget(name='target-1') - target.save() - for idx in range(1, 4): - if idx == 3: - target = None - source = NullableForeignKeySource(name='source-%d' % idx, target=target) - source.save() - - def test_foreign_key_retrieve_with_null(self): - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': {'id': 1, 'name': 'target-1'}}, - {'id': 2, 'name': 'source-2', 'target': {'id': 1, 'name': 'target-1'}}, - {'id': 3, 'name': 'source-3', 'target': None}, - ] - self.assertEqual(serializer.data, expected) - - -class NestedNullableOneToOneTests(TestCase): - def setUp(self): - target = OneToOneTarget(name='target-1') - target.save() - new_target = OneToOneTarget(name='target-2') - new_target.save() - source = NullableOneToOneSource(name='source-1', target=target) - source.save() - - def test_reverse_foreign_key_retrieve_with_null(self): - queryset = OneToOneTarget.objects.all() - serializer = NullableOneToOneTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'nullable_source': {'id': 1, 'name': 'source-1', 'target': 1}}, - {'id': 2, 'name': 'target-2', 'nullable_source': None}, - ] - self.assertEqual(serializer.data, expected) diff --git a/vendor-local/lib/python/rest_framework/tests/test_relations_pk.py b/vendor-local/lib/python/rest_framework/tests/test_relations_pk.py deleted file mode 100644 index e2a1b815205..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_relations_pk.py +++ /dev/null @@ -1,542 +0,0 @@ -from __future__ import unicode_literals -from django.db import models -from django.test import TestCase -from rest_framework import serializers -from rest_framework.tests.models import ( - BlogPost, ManyToManyTarget, ManyToManySource, ForeignKeyTarget, ForeignKeySource, - NullableForeignKeySource, OneToOneTarget, NullableOneToOneSource, -) -from rest_framework.compat import six - - -# ManyToMany -class ManyToManyTargetSerializer(serializers.ModelSerializer): - class Meta: - model = ManyToManyTarget - fields = ('id', 'name', 'sources') - - -class ManyToManySourceSerializer(serializers.ModelSerializer): - class Meta: - model = ManyToManySource - fields = ('id', 'name', 'targets') - - -# ForeignKey -class ForeignKeyTargetSerializer(serializers.ModelSerializer): - class Meta: - model = ForeignKeyTarget - fields = ('id', 'name', 'sources') - - -class ForeignKeySourceSerializer(serializers.ModelSerializer): - class Meta: - model = ForeignKeySource - fields = ('id', 'name', 'target') - - -# Nullable ForeignKey -class NullableForeignKeySourceSerializer(serializers.ModelSerializer): - class Meta: - model = NullableForeignKeySource - fields = ('id', 'name', 'target') - - -# Nullable OneToOne -class NullableOneToOneTargetSerializer(serializers.ModelSerializer): - class Meta: - model = OneToOneTarget - fields = ('id', 'name', 'nullable_source') - - -# TODO: Add test that .data cannot be accessed prior to .is_valid - -class PKManyToManyTests(TestCase): - def setUp(self): - for idx in range(1, 4): - target = ManyToManyTarget(name='target-%d' % idx) - target.save() - source = ManyToManySource(name='source-%d' % idx) - source.save() - for target in ManyToManyTarget.objects.all(): - source.targets.add(target) - - def test_many_to_many_retrieve(self): - queryset = ManyToManySource.objects.all() - serializer = ManyToManySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'targets': [1]}, - {'id': 2, 'name': 'source-2', 'targets': [1, 2]}, - {'id': 3, 'name': 'source-3', 'targets': [1, 2, 3]} - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_many_to_many_retrieve(self): - queryset = ManyToManyTarget.objects.all() - serializer = ManyToManyTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'sources': [1, 2, 3]}, - {'id': 2, 'name': 'target-2', 'sources': [2, 3]}, - {'id': 3, 'name': 'target-3', 'sources': [3]} - ] - self.assertEqual(serializer.data, expected) - - def test_many_to_many_update(self): - data = {'id': 1, 'name': 'source-1', 'targets': [1, 2, 3]} - instance = ManyToManySource.objects.get(pk=1) - serializer = ManyToManySourceSerializer(instance, data=data) - self.assertTrue(serializer.is_valid()) - serializer.save() - self.assertEqual(serializer.data, data) - - # Ensure source 1 is updated, and everything else is as expected - queryset = ManyToManySource.objects.all() - serializer = ManyToManySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'targets': [1, 2, 3]}, - {'id': 2, 'name': 'source-2', 'targets': [1, 2]}, - {'id': 3, 'name': 'source-3', 'targets': [1, 2, 3]} - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_many_to_many_update(self): - data = {'id': 1, 'name': 'target-1', 'sources': [1]} - instance = ManyToManyTarget.objects.get(pk=1) - serializer = ManyToManyTargetSerializer(instance, data=data) - self.assertTrue(serializer.is_valid()) - serializer.save() - self.assertEqual(serializer.data, data) - - # Ensure target 1 is updated, and everything else is as expected - queryset = ManyToManyTarget.objects.all() - serializer = ManyToManyTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'sources': [1]}, - {'id': 2, 'name': 'target-2', 'sources': [2, 3]}, - {'id': 3, 'name': 'target-3', 'sources': [3]} - ] - self.assertEqual(serializer.data, expected) - - def test_many_to_many_create(self): - data = {'id': 4, 'name': 'source-4', 'targets': [1, 3]} - serializer = ManyToManySourceSerializer(data=data) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'source-4') - - # Ensure source 4 is added, and everything else is as expected - queryset = ManyToManySource.objects.all() - serializer = ManyToManySourceSerializer(queryset, many=True) - self.assertFalse(serializer.fields['targets'].read_only) - expected = [ - {'id': 1, 'name': 'source-1', 'targets': [1]}, - {'id': 2, 'name': 'source-2', 'targets': [1, 2]}, - {'id': 3, 'name': 'source-3', 'targets': [1, 2, 3]}, - {'id': 4, 'name': 'source-4', 'targets': [1, 3]}, - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_many_to_many_create(self): - data = {'id': 4, 'name': 'target-4', 'sources': [1, 3]} - serializer = ManyToManyTargetSerializer(data=data) - self.assertFalse(serializer.fields['sources'].read_only) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'target-4') - - # Ensure target 4 is added, and everything else is as expected - queryset = ManyToManyTarget.objects.all() - serializer = ManyToManyTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'sources': [1, 2, 3]}, - {'id': 2, 'name': 'target-2', 'sources': [2, 3]}, - {'id': 3, 'name': 'target-3', 'sources': [3]}, - {'id': 4, 'name': 'target-4', 'sources': [1, 3]} - ] - self.assertEqual(serializer.data, expected) - - -class PKForeignKeyTests(TestCase): - def setUp(self): - target = ForeignKeyTarget(name='target-1') - target.save() - new_target = ForeignKeyTarget(name='target-2') - new_target.save() - for idx in range(1, 4): - source = ForeignKeySource(name='source-%d' % idx, target=target) - source.save() - - def test_foreign_key_retrieve(self): - queryset = ForeignKeySource.objects.all() - serializer = ForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': 1}, - {'id': 2, 'name': 'source-2', 'target': 1}, - {'id': 3, 'name': 'source-3', 'target': 1} - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_foreign_key_retrieve(self): - queryset = ForeignKeyTarget.objects.all() - serializer = ForeignKeyTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'sources': [1, 2, 3]}, - {'id': 2, 'name': 'target-2', 'sources': []}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update(self): - data = {'id': 1, 'name': 'source-1', 'target': 2} - instance = ForeignKeySource.objects.get(pk=1) - serializer = ForeignKeySourceSerializer(instance, data=data) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.data, data) - serializer.save() - - # Ensure source 1 is updated, and everything else is as expected - queryset = ForeignKeySource.objects.all() - serializer = ForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': 2}, - {'id': 2, 'name': 'source-2', 'target': 1}, - {'id': 3, 'name': 'source-3', 'target': 1} - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update_incorrect_type(self): - data = {'id': 1, 'name': 'source-1', 'target': 'foo'} - instance = ForeignKeySource.objects.get(pk=1) - serializer = ForeignKeySourceSerializer(instance, data=data) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'target': ['Incorrect type. Expected pk value, received %s.' % six.text_type.__name__]}) - - def test_reverse_foreign_key_update(self): - data = {'id': 2, 'name': 'target-2', 'sources': [1, 3]} - instance = ForeignKeyTarget.objects.get(pk=2) - serializer = ForeignKeyTargetSerializer(instance, data=data) - self.assertTrue(serializer.is_valid()) - # We shouldn't have saved anything to the db yet since save - # hasn't been called. - queryset = ForeignKeyTarget.objects.all() - new_serializer = ForeignKeyTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'sources': [1, 2, 3]}, - {'id': 2, 'name': 'target-2', 'sources': []}, - ] - self.assertEqual(new_serializer.data, expected) - - serializer.save() - self.assertEqual(serializer.data, data) - - # Ensure target 2 is update, and everything else is as expected - queryset = ForeignKeyTarget.objects.all() - serializer = ForeignKeyTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'sources': [2]}, - {'id': 2, 'name': 'target-2', 'sources': [1, 3]}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_create(self): - data = {'id': 4, 'name': 'source-4', 'target': 2} - serializer = ForeignKeySourceSerializer(data=data) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'source-4') - - # Ensure source 4 is added, and everything else is as expected - queryset = ForeignKeySource.objects.all() - serializer = ForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': 1}, - {'id': 2, 'name': 'source-2', 'target': 1}, - {'id': 3, 'name': 'source-3', 'target': 1}, - {'id': 4, 'name': 'source-4', 'target': 2}, - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_foreign_key_create(self): - data = {'id': 3, 'name': 'target-3', 'sources': [1, 3]} - serializer = ForeignKeyTargetSerializer(data=data) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'target-3') - - # Ensure target 3 is added, and everything else is as expected - queryset = ForeignKeyTarget.objects.all() - serializer = ForeignKeyTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'sources': [2]}, - {'id': 2, 'name': 'target-2', 'sources': []}, - {'id': 3, 'name': 'target-3', 'sources': [1, 3]}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update_with_invalid_null(self): - data = {'id': 1, 'name': 'source-1', 'target': None} - instance = ForeignKeySource.objects.get(pk=1) - serializer = ForeignKeySourceSerializer(instance, data=data) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'target': ['This field is required.']}) - - -class PKNullableForeignKeyTests(TestCase): - def setUp(self): - target = ForeignKeyTarget(name='target-1') - target.save() - for idx in range(1, 4): - if idx == 3: - target = None - source = NullableForeignKeySource(name='source-%d' % idx, target=target) - source.save() - - def test_foreign_key_retrieve_with_null(self): - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': 1}, - {'id': 2, 'name': 'source-2', 'target': 1}, - {'id': 3, 'name': 'source-3', 'target': None}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_create_with_valid_null(self): - data = {'id': 4, 'name': 'source-4', 'target': None} - serializer = NullableForeignKeySourceSerializer(data=data) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'source-4') - - # Ensure source 4 is created, and everything else is as expected - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': 1}, - {'id': 2, 'name': 'source-2', 'target': 1}, - {'id': 3, 'name': 'source-3', 'target': None}, - {'id': 4, 'name': 'source-4', 'target': None} - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_create_with_valid_emptystring(self): - """ - The emptystring should be interpreted as null in the context - of relationships. - """ - data = {'id': 4, 'name': 'source-4', 'target': ''} - expected_data = {'id': 4, 'name': 'source-4', 'target': None} - serializer = NullableForeignKeySourceSerializer(data=data) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, expected_data) - self.assertEqual(obj.name, 'source-4') - - # Ensure source 4 is created, and everything else is as expected - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': 1}, - {'id': 2, 'name': 'source-2', 'target': 1}, - {'id': 3, 'name': 'source-3', 'target': None}, - {'id': 4, 'name': 'source-4', 'target': None} - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update_with_valid_null(self): - data = {'id': 1, 'name': 'source-1', 'target': None} - instance = NullableForeignKeySource.objects.get(pk=1) - serializer = NullableForeignKeySourceSerializer(instance, data=data) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.data, data) - serializer.save() - - # Ensure source 1 is updated, and everything else is as expected - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': None}, - {'id': 2, 'name': 'source-2', 'target': 1}, - {'id': 3, 'name': 'source-3', 'target': None} - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update_with_valid_emptystring(self): - """ - The emptystring should be interpreted as null in the context - of relationships. - """ - data = {'id': 1, 'name': 'source-1', 'target': ''} - expected_data = {'id': 1, 'name': 'source-1', 'target': None} - instance = NullableForeignKeySource.objects.get(pk=1) - serializer = NullableForeignKeySourceSerializer(instance, data=data) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.data, expected_data) - serializer.save() - - # Ensure source 1 is updated, and everything else is as expected - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': None}, - {'id': 2, 'name': 'source-2', 'target': 1}, - {'id': 3, 'name': 'source-3', 'target': None} - ] - self.assertEqual(serializer.data, expected) - - # reverse foreign keys MUST be read_only - # In the general case they do not provide .remove() or .clear() - # and cannot be arbitrarily set. - - # def test_reverse_foreign_key_update(self): - # data = {'id': 1, 'name': 'target-1', 'sources': [1]} - # instance = ForeignKeyTarget.objects.get(pk=1) - # serializer = ForeignKeyTargetSerializer(instance, data=data) - # self.assertTrue(serializer.is_valid()) - # self.assertEqual(serializer.data, data) - # serializer.save() - - # # Ensure target 1 is updated, and everything else is as expected - # queryset = ForeignKeyTarget.objects.all() - # serializer = ForeignKeyTargetSerializer(queryset, many=True) - # expected = [ - # {'id': 1, 'name': 'target-1', 'sources': [1]}, - # {'id': 2, 'name': 'target-2', 'sources': []}, - # ] - # self.assertEqual(serializer.data, expected) - - -class PKNullableOneToOneTests(TestCase): - def setUp(self): - target = OneToOneTarget(name='target-1') - target.save() - new_target = OneToOneTarget(name='target-2') - new_target.save() - source = NullableOneToOneSource(name='source-1', target=new_target) - source.save() - - def test_reverse_foreign_key_retrieve_with_null(self): - queryset = OneToOneTarget.objects.all() - serializer = NullableOneToOneTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'nullable_source': None}, - {'id': 2, 'name': 'target-2', 'nullable_source': 1}, - ] - self.assertEqual(serializer.data, expected) - - -# The below models and tests ensure that serializer fields corresponding -# to a ManyToManyField field with a user-specified ``through`` model are -# set to read only - - -class ManyToManyThroughTarget(models.Model): - name = models.CharField(max_length=100) - - -class ManyToManyThrough(models.Model): - source = models.ForeignKey('ManyToManyThroughSource') - target = models.ForeignKey(ManyToManyThroughTarget) - - -class ManyToManyThroughSource(models.Model): - name = models.CharField(max_length=100) - targets = models.ManyToManyField(ManyToManyThroughTarget, - related_name='sources', - through='ManyToManyThrough') - - -class ManyToManyThroughTargetSerializer(serializers.ModelSerializer): - class Meta: - model = ManyToManyThroughTarget - fields = ('id', 'name', 'sources') - - -class ManyToManyThroughSourceSerializer(serializers.ModelSerializer): - class Meta: - model = ManyToManyThroughSource - fields = ('id', 'name', 'targets') - - -class PKManyToManyThroughTests(TestCase): - def setUp(self): - self.source = ManyToManyThroughSource.objects.create( - name='through-source-1') - self.target = ManyToManyThroughTarget.objects.create( - name='through-target-1') - - def test_many_to_many_create(self): - data = {'id': 2, 'name': 'source-2', 'targets': [self.target.pk]} - serializer = ManyToManyThroughSourceSerializer(data=data) - self.assertTrue(serializer.fields['targets'].read_only) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(obj.name, 'source-2') - self.assertEqual(obj.targets.count(), 0) - - def test_many_to_many_reverse_create(self): - data = {'id': 2, 'name': 'target-2', 'sources': [self.source.pk]} - serializer = ManyToManyThroughTargetSerializer(data=data) - self.assertTrue(serializer.fields['sources'].read_only) - self.assertTrue(serializer.is_valid()) - serializer.save() - obj = serializer.save() - self.assertEqual(obj.name, 'target-2') - self.assertEqual(obj.sources.count(), 0) - - -# Regression tests for #694 (`source` attribute on related fields) - - -class PrimaryKeyRelatedFieldSourceTests(TestCase): - def test_related_manager_source(self): - """ - Relational fields should be able to use manager-returning methods as their source. - """ - BlogPost.objects.create(title='blah') - field = serializers.PrimaryKeyRelatedField(many=True, source='get_blogposts_manager') - - class ClassWithManagerMethod(object): - def get_blogposts_manager(self): - return BlogPost.objects - - obj = ClassWithManagerMethod() - value = field.field_to_native(obj, 'field_name') - self.assertEqual(value, [1]) - - def test_related_queryset_source(self): - """ - Relational fields should be able to use queryset-returning methods as their source. - """ - BlogPost.objects.create(title='blah') - field = serializers.PrimaryKeyRelatedField(many=True, source='get_blogposts_queryset') - - class ClassWithQuerysetMethod(object): - def get_blogposts_queryset(self): - return BlogPost.objects.all() - - obj = ClassWithQuerysetMethod() - value = field.field_to_native(obj, 'field_name') - self.assertEqual(value, [1]) - - def test_dotted_source(self): - """ - Source argument should support dotted.source notation. - """ - BlogPost.objects.create(title='blah') - field = serializers.PrimaryKeyRelatedField(many=True, source='a.b.c') - - class ClassWithQuerysetMethod(object): - a = { - 'b': { - 'c': BlogPost.objects.all() - } - } - - obj = ClassWithQuerysetMethod() - value = field.field_to_native(obj, 'field_name') - self.assertEqual(value, [1]) diff --git a/vendor-local/lib/python/rest_framework/tests/test_relations_slug.py b/vendor-local/lib/python/rest_framework/tests/test_relations_slug.py deleted file mode 100644 index 435c821cfa7..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_relations_slug.py +++ /dev/null @@ -1,257 +0,0 @@ -from django.test import TestCase -from rest_framework import serializers -from rest_framework.tests.models import NullableForeignKeySource, ForeignKeySource, ForeignKeyTarget - - -class ForeignKeyTargetSerializer(serializers.ModelSerializer): - sources = serializers.SlugRelatedField(many=True, slug_field='name') - - class Meta: - model = ForeignKeyTarget - - -class ForeignKeySourceSerializer(serializers.ModelSerializer): - target = serializers.SlugRelatedField(slug_field='name') - - class Meta: - model = ForeignKeySource - - -class NullableForeignKeySourceSerializer(serializers.ModelSerializer): - target = serializers.SlugRelatedField(slug_field='name', required=False) - - class Meta: - model = NullableForeignKeySource - - -# TODO: M2M Tests, FKTests (Non-nullable), One2One -class SlugForeignKeyTests(TestCase): - def setUp(self): - target = ForeignKeyTarget(name='target-1') - target.save() - new_target = ForeignKeyTarget(name='target-2') - new_target.save() - for idx in range(1, 4): - source = ForeignKeySource(name='source-%d' % idx, target=target) - source.save() - - def test_foreign_key_retrieve(self): - queryset = ForeignKeySource.objects.all() - serializer = ForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': 'target-1'}, - {'id': 2, 'name': 'source-2', 'target': 'target-1'}, - {'id': 3, 'name': 'source-3', 'target': 'target-1'} - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_foreign_key_retrieve(self): - queryset = ForeignKeyTarget.objects.all() - serializer = ForeignKeyTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'sources': ['source-1', 'source-2', 'source-3']}, - {'id': 2, 'name': 'target-2', 'sources': []}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update(self): - data = {'id': 1, 'name': 'source-1', 'target': 'target-2'} - instance = ForeignKeySource.objects.get(pk=1) - serializer = ForeignKeySourceSerializer(instance, data=data) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.data, data) - serializer.save() - - # Ensure source 1 is updated, and everything else is as expected - queryset = ForeignKeySource.objects.all() - serializer = ForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': 'target-2'}, - {'id': 2, 'name': 'source-2', 'target': 'target-1'}, - {'id': 3, 'name': 'source-3', 'target': 'target-1'} - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update_incorrect_type(self): - data = {'id': 1, 'name': 'source-1', 'target': 123} - instance = ForeignKeySource.objects.get(pk=1) - serializer = ForeignKeySourceSerializer(instance, data=data) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'target': ['Object with name=123 does not exist.']}) - - def test_reverse_foreign_key_update(self): - data = {'id': 2, 'name': 'target-2', 'sources': ['source-1', 'source-3']} - instance = ForeignKeyTarget.objects.get(pk=2) - serializer = ForeignKeyTargetSerializer(instance, data=data) - self.assertTrue(serializer.is_valid()) - # We shouldn't have saved anything to the db yet since save - # hasn't been called. - queryset = ForeignKeyTarget.objects.all() - new_serializer = ForeignKeyTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'sources': ['source-1', 'source-2', 'source-3']}, - {'id': 2, 'name': 'target-2', 'sources': []}, - ] - self.assertEqual(new_serializer.data, expected) - - serializer.save() - self.assertEqual(serializer.data, data) - - # Ensure target 2 is update, and everything else is as expected - queryset = ForeignKeyTarget.objects.all() - serializer = ForeignKeyTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'sources': ['source-2']}, - {'id': 2, 'name': 'target-2', 'sources': ['source-1', 'source-3']}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_create(self): - data = {'id': 4, 'name': 'source-4', 'target': 'target-2'} - serializer = ForeignKeySourceSerializer(data=data) - serializer.is_valid() - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'source-4') - - # Ensure source 4 is added, and everything else is as expected - queryset = ForeignKeySource.objects.all() - serializer = ForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': 'target-1'}, - {'id': 2, 'name': 'source-2', 'target': 'target-1'}, - {'id': 3, 'name': 'source-3', 'target': 'target-1'}, - {'id': 4, 'name': 'source-4', 'target': 'target-2'}, - ] - self.assertEqual(serializer.data, expected) - - def test_reverse_foreign_key_create(self): - data = {'id': 3, 'name': 'target-3', 'sources': ['source-1', 'source-3']} - serializer = ForeignKeyTargetSerializer(data=data) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'target-3') - - # Ensure target 3 is added, and everything else is as expected - queryset = ForeignKeyTarget.objects.all() - serializer = ForeignKeyTargetSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'target-1', 'sources': ['source-2']}, - {'id': 2, 'name': 'target-2', 'sources': []}, - {'id': 3, 'name': 'target-3', 'sources': ['source-1', 'source-3']}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update_with_invalid_null(self): - data = {'id': 1, 'name': 'source-1', 'target': None} - instance = ForeignKeySource.objects.get(pk=1) - serializer = ForeignKeySourceSerializer(instance, data=data) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'target': ['This field is required.']}) - - -class SlugNullableForeignKeyTests(TestCase): - def setUp(self): - target = ForeignKeyTarget(name='target-1') - target.save() - for idx in range(1, 4): - if idx == 3: - target = None - source = NullableForeignKeySource(name='source-%d' % idx, target=target) - source.save() - - def test_foreign_key_retrieve_with_null(self): - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': 'target-1'}, - {'id': 2, 'name': 'source-2', 'target': 'target-1'}, - {'id': 3, 'name': 'source-3', 'target': None}, - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_create_with_valid_null(self): - data = {'id': 4, 'name': 'source-4', 'target': None} - serializer = NullableForeignKeySourceSerializer(data=data) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, data) - self.assertEqual(obj.name, 'source-4') - - # Ensure source 4 is created, and everything else is as expected - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': 'target-1'}, - {'id': 2, 'name': 'source-2', 'target': 'target-1'}, - {'id': 3, 'name': 'source-3', 'target': None}, - {'id': 4, 'name': 'source-4', 'target': None} - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_create_with_valid_emptystring(self): - """ - The emptystring should be interpreted as null in the context - of relationships. - """ - data = {'id': 4, 'name': 'source-4', 'target': ''} - expected_data = {'id': 4, 'name': 'source-4', 'target': None} - serializer = NullableForeignKeySourceSerializer(data=data) - self.assertTrue(serializer.is_valid()) - obj = serializer.save() - self.assertEqual(serializer.data, expected_data) - self.assertEqual(obj.name, 'source-4') - - # Ensure source 4 is created, and everything else is as expected - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': 'target-1'}, - {'id': 2, 'name': 'source-2', 'target': 'target-1'}, - {'id': 3, 'name': 'source-3', 'target': None}, - {'id': 4, 'name': 'source-4', 'target': None} - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update_with_valid_null(self): - data = {'id': 1, 'name': 'source-1', 'target': None} - instance = NullableForeignKeySource.objects.get(pk=1) - serializer = NullableForeignKeySourceSerializer(instance, data=data) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.data, data) - serializer.save() - - # Ensure source 1 is updated, and everything else is as expected - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': None}, - {'id': 2, 'name': 'source-2', 'target': 'target-1'}, - {'id': 3, 'name': 'source-3', 'target': None} - ] - self.assertEqual(serializer.data, expected) - - def test_foreign_key_update_with_valid_emptystring(self): - """ - The emptystring should be interpreted as null in the context - of relationships. - """ - data = {'id': 1, 'name': 'source-1', 'target': ''} - expected_data = {'id': 1, 'name': 'source-1', 'target': None} - instance = NullableForeignKeySource.objects.get(pk=1) - serializer = NullableForeignKeySourceSerializer(instance, data=data) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.data, expected_data) - serializer.save() - - # Ensure source 1 is updated, and everything else is as expected - queryset = NullableForeignKeySource.objects.all() - serializer = NullableForeignKeySourceSerializer(queryset, many=True) - expected = [ - {'id': 1, 'name': 'source-1', 'target': None}, - {'id': 2, 'name': 'source-2', 'target': 'target-1'}, - {'id': 3, 'name': 'source-3', 'target': None} - ] - self.assertEqual(serializer.data, expected) diff --git a/vendor-local/lib/python/rest_framework/tests/test_renderers.py b/vendor-local/lib/python/rest_framework/tests/test_renderers.py deleted file mode 100644 index df6f4aa63fa..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_renderers.py +++ /dev/null @@ -1,539 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from decimal import Decimal -from django.core.cache import cache -from django.test import TestCase -from django.utils import unittest -from django.utils.translation import ugettext_lazy as _ -from rest_framework import status, permissions -from rest_framework.compat import yaml, etree, patterns, url, include, six, StringIO -from rest_framework.response import Response -from rest_framework.views import APIView -from rest_framework.renderers import BaseRenderer, JSONRenderer, YAMLRenderer, \ - XMLRenderer, JSONPRenderer, BrowsableAPIRenderer, UnicodeJSONRenderer -from rest_framework.parsers import YAMLParser, XMLParser -from rest_framework.settings import api_settings -from rest_framework.test import APIRequestFactory -import datetime -import pickle -import re - - -DUMMYSTATUS = status.HTTP_200_OK -DUMMYCONTENT = 'dummycontent' - -RENDERER_A_SERIALIZER = lambda x: ('Renderer A: %s' % x).encode('ascii') -RENDERER_B_SERIALIZER = lambda x: ('Renderer B: %s' % x).encode('ascii') - - -expected_results = [ - ((elem for elem in [1, 2, 3]), JSONRenderer, b'[1, 2, 3]') # Generator -] - - -class BasicRendererTests(TestCase): - def test_expected_results(self): - for value, renderer_cls, expected in expected_results: - output = renderer_cls().render(value) - self.assertEqual(output, expected) - - -class RendererA(BaseRenderer): - media_type = 'mock/renderera' - format = "formata" - - def render(self, data, media_type=None, renderer_context=None): - return RENDERER_A_SERIALIZER(data) - - -class RendererB(BaseRenderer): - media_type = 'mock/rendererb' - format = "formatb" - - def render(self, data, media_type=None, renderer_context=None): - return RENDERER_B_SERIALIZER(data) - - -class MockView(APIView): - renderer_classes = (RendererA, RendererB) - - def get(self, request, **kwargs): - response = Response(DUMMYCONTENT, status=DUMMYSTATUS) - return response - - -class MockGETView(APIView): - - def get(self, request, **kwargs): - return Response({'foo': ['bar', 'baz']}) - - -class HTMLView(APIView): - renderer_classes = (BrowsableAPIRenderer, ) - - def get(self, request, **kwargs): - return Response('text') - - -class HTMLView1(APIView): - renderer_classes = (BrowsableAPIRenderer, JSONRenderer) - - def get(self, request, **kwargs): - return Response('text') - -urlpatterns = patterns('', - url(r'^.*\.(?P<format>.+)$', MockView.as_view(renderer_classes=[RendererA, RendererB])), - url(r'^$', MockView.as_view(renderer_classes=[RendererA, RendererB])), - url(r'^cache$', MockGETView.as_view()), - url(r'^jsonp/jsonrenderer$', MockGETView.as_view(renderer_classes=[JSONRenderer, JSONPRenderer])), - url(r'^jsonp/nojsonrenderer$', MockGETView.as_view(renderer_classes=[JSONPRenderer])), - url(r'^html$', HTMLView.as_view()), - url(r'^html1$', HTMLView1.as_view()), - url(r'^api', include('rest_framework.urls', namespace='rest_framework')) -) - - -class POSTDeniedPermission(permissions.BasePermission): - def has_permission(self, request, view): - return request.method != 'POST' - - -class POSTDeniedView(APIView): - renderer_classes = (BrowsableAPIRenderer,) - permission_classes = (POSTDeniedPermission,) - - def get(self, request): - return Response() - - def post(self, request): - return Response() - - def put(self, request): - return Response() - - def patch(self, request): - return Response() - - -class DocumentingRendererTests(TestCase): - def test_only_permitted_forms_are_displayed(self): - view = POSTDeniedView.as_view() - request = APIRequestFactory().get('/') - response = view(request).render() - self.assertNotContains(response, '>POST<') - self.assertContains(response, '>PUT<') - self.assertContains(response, '>PATCH<') - - -class RendererEndToEndTests(TestCase): - """ - End-to-end testing of renderers using an RendererMixin on a generic view. - """ - - urls = 'rest_framework.tests.test_renderers' - - def test_default_renderer_serializes_content(self): - """If the Accept header is not set the default renderer should serialize the response.""" - resp = self.client.get('/') - self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_head_method_serializes_no_content(self): - """No response must be included in HEAD requests.""" - resp = self.client.head('/') - self.assertEqual(resp.status_code, DUMMYSTATUS) - self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') - self.assertEqual(resp.content, six.b('')) - - def test_default_renderer_serializes_content_on_accept_any(self): - """If the Accept header is set to */* the default renderer should serialize the response.""" - resp = self.client.get('/', HTTP_ACCEPT='*/*') - self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_specified_renderer_serializes_content_default_case(self): - """If the Accept header is set the specified renderer should serialize the response. - (In this case we check that works for the default renderer)""" - resp = self.client.get('/', HTTP_ACCEPT=RendererA.media_type) - self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_specified_renderer_serializes_content_non_default_case(self): - """If the Accept header is set the specified renderer should serialize the response. - (In this case we check that works for a non-default renderer)""" - resp = self.client.get('/', HTTP_ACCEPT=RendererB.media_type) - self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_specified_renderer_serializes_content_on_accept_query(self): - """The '_accept' query string should behave in the same way as the Accept header.""" - param = '?%s=%s' % ( - api_settings.URL_ACCEPT_OVERRIDE, - RendererB.media_type - ) - resp = self.client.get('/' + param) - self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_unsatisfiable_accept_header_on_request_returns_406_status(self): - """If the Accept header is unsatisfiable we should return a 406 Not Acceptable response.""" - resp = self.client.get('/', HTTP_ACCEPT='foo/bar') - self.assertEqual(resp.status_code, status.HTTP_406_NOT_ACCEPTABLE) - - def test_specified_renderer_serializes_content_on_format_query(self): - """If a 'format' query is specified, the renderer with the matching - format attribute should serialize the response.""" - param = '?%s=%s' % ( - api_settings.URL_FORMAT_OVERRIDE, - RendererB.format - ) - resp = self.client.get('/' + param) - self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_specified_renderer_serializes_content_on_format_kwargs(self): - """If a 'format' keyword arg is specified, the renderer with the matching - format attribute should serialize the response.""" - resp = self.client.get('/something.formatb') - self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_specified_renderer_is_used_on_format_query_with_matching_accept(self): - """If both a 'format' query and a matching Accept header specified, - the renderer with the matching format attribute should serialize the response.""" - param = '?%s=%s' % ( - api_settings.URL_FORMAT_OVERRIDE, - RendererB.format - ) - resp = self.client.get('/' + param, - HTTP_ACCEPT=RendererB.media_type) - self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - -_flat_repr = '{"foo": ["bar", "baz"]}' -_indented_repr = '{\n "foo": [\n "bar",\n "baz"\n ]\n}' - - -def strip_trailing_whitespace(content): - """ - Seems to be some inconsistencies re. trailing whitespace with - different versions of the json lib. - """ - return re.sub(' +\n', '\n', content) - - -class JSONRendererTests(TestCase): - """ - Tests specific to the JSON Renderer - """ - - def test_render_lazy_strings(self): - """ - JSONRenderer should deal with lazy translated strings. - """ - ret = JSONRenderer().render(_('test')) - self.assertEqual(ret, b'"test"') - - def test_without_content_type_args(self): - """ - Test basic JSON rendering. - """ - obj = {'foo': ['bar', 'baz']} - renderer = JSONRenderer() - content = renderer.render(obj, 'application/json') - # Fix failing test case which depends on version of JSON library. - self.assertEqual(content.decode('utf-8'), _flat_repr) - - def test_with_content_type_args(self): - """ - Test JSON rendering with additional content type arguments supplied. - """ - obj = {'foo': ['bar', 'baz']} - renderer = JSONRenderer() - content = renderer.render(obj, 'application/json; indent=2') - self.assertEqual(strip_trailing_whitespace(content.decode('utf-8')), _indented_repr) - - def test_check_ascii(self): - obj = {'countries': ['United Kingdom', 'France', 'España']} - renderer = JSONRenderer() - content = renderer.render(obj, 'application/json') - self.assertEqual(content, '{"countries": ["United Kingdom", "France", "Espa\\u00f1a"]}'.encode('utf-8')) - - -class UnicodeJSONRendererTests(TestCase): - """ - Tests specific for the Unicode JSON Renderer - """ - def test_proper_encoding(self): - obj = {'countries': ['United Kingdom', 'France', 'España']} - renderer = UnicodeJSONRenderer() - content = renderer.render(obj, 'application/json') - self.assertEqual(content, '{"countries": ["United Kingdom", "France", "España"]}'.encode('utf-8')) - - -class JSONPRendererTests(TestCase): - """ - Tests specific to the JSONP Renderer - """ - - urls = 'rest_framework.tests.test_renderers' - - def test_without_callback_with_json_renderer(self): - """ - Test JSONP rendering with View JSON Renderer. - """ - resp = self.client.get('/jsonp/jsonrenderer', - HTTP_ACCEPT='application/javascript') - self.assertEqual(resp.status_code, status.HTTP_200_OK) - self.assertEqual(resp['Content-Type'], 'application/javascript; charset=utf-8') - self.assertEqual(resp.content, - ('callback(%s);' % _flat_repr).encode('ascii')) - - def test_without_callback_without_json_renderer(self): - """ - Test JSONP rendering without View JSON Renderer. - """ - resp = self.client.get('/jsonp/nojsonrenderer', - HTTP_ACCEPT='application/javascript') - self.assertEqual(resp.status_code, status.HTTP_200_OK) - self.assertEqual(resp['Content-Type'], 'application/javascript; charset=utf-8') - self.assertEqual(resp.content, - ('callback(%s);' % _flat_repr).encode('ascii')) - - def test_with_callback(self): - """ - Test JSONP rendering with callback function name. - """ - callback_func = 'myjsonpcallback' - resp = self.client.get('/jsonp/nojsonrenderer?callback=' + callback_func, - HTTP_ACCEPT='application/javascript') - self.assertEqual(resp.status_code, status.HTTP_200_OK) - self.assertEqual(resp['Content-Type'], 'application/javascript; charset=utf-8') - self.assertEqual(resp.content, - ('%s(%s);' % (callback_func, _flat_repr)).encode('ascii')) - - -if yaml: - _yaml_repr = 'foo: [bar, baz]\n' - - class YAMLRendererTests(TestCase): - """ - Tests specific to the JSON Renderer - """ - - def test_render(self): - """ - Test basic YAML rendering. - """ - obj = {'foo': ['bar', 'baz']} - renderer = YAMLRenderer() - content = renderer.render(obj, 'application/yaml') - self.assertEqual(content, _yaml_repr) - - def test_render_and_parse(self): - """ - Test rendering and then parsing returns the original object. - IE obj -> render -> parse -> obj. - """ - obj = {'foo': ['bar', 'baz']} - - renderer = YAMLRenderer() - parser = YAMLParser() - - content = renderer.render(obj, 'application/yaml') - data = parser.parse(StringIO(content)) - self.assertEqual(obj, data) - - -class XMLRendererTestCase(TestCase): - """ - Tests specific to the XML Renderer - """ - - _complex_data = { - "creation_date": datetime.datetime(2011, 12, 25, 12, 45, 00), - "name": "name", - "sub_data_list": [ - { - "sub_id": 1, - "sub_name": "first" - }, - { - "sub_id": 2, - "sub_name": "second" - } - ] - } - - def test_render_string(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer() - content = renderer.render({'field': 'astring'}, 'application/xml') - self.assertXMLContains(content, '<field>astring</field>') - - def test_render_integer(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer() - content = renderer.render({'field': 111}, 'application/xml') - self.assertXMLContains(content, '<field>111</field>') - - def test_render_datetime(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer() - content = renderer.render({ - 'field': datetime.datetime(2011, 12, 25, 12, 45, 00) - }, 'application/xml') - self.assertXMLContains(content, '<field>2011-12-25 12:45:00</field>') - - def test_render_float(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer() - content = renderer.render({'field': 123.4}, 'application/xml') - self.assertXMLContains(content, '<field>123.4</field>') - - def test_render_decimal(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer() - content = renderer.render({'field': Decimal('111.2')}, 'application/xml') - self.assertXMLContains(content, '<field>111.2</field>') - - def test_render_none(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer() - content = renderer.render({'field': None}, 'application/xml') - self.assertXMLContains(content, '<field></field>') - - def test_render_complex_data(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer() - content = renderer.render(self._complex_data, 'application/xml') - self.assertXMLContains(content, '<sub_name>first</sub_name>') - self.assertXMLContains(content, '<sub_name>second</sub_name>') - - @unittest.skipUnless(etree, 'defusedxml not installed') - def test_render_and_parse_complex_data(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer() - content = StringIO(renderer.render(self._complex_data, 'application/xml')) - - parser = XMLParser() - complex_data_out = parser.parse(content) - error_msg = "complex data differs!IN:\n %s \n\n OUT:\n %s" % (repr(self._complex_data), repr(complex_data_out)) - self.assertEqual(self._complex_data, complex_data_out, error_msg) - - def assertXMLContains(self, xml, string): - self.assertTrue(xml.startswith('<?xml version="1.0" encoding="utf-8"?>\n<root>')) - self.assertTrue(xml.endswith('</root>')) - self.assertTrue(string in xml, '%r not in %r' % (string, xml)) - - -# Tests for caching issue, #346 -class CacheRenderTest(TestCase): - """ - Tests specific to caching responses - """ - - urls = 'rest_framework.tests.test_renderers' - - cache_key = 'just_a_cache_key' - - @classmethod - def _get_pickling_errors(cls, obj, seen=None): - """ Return any errors that would be raised if `obj' is pickled - Courtesy of koffie @ http://stackoverflow.com/a/7218986/109897 - """ - if seen == None: - seen = [] - try: - state = obj.__getstate__() - except AttributeError: - return - if state == None: - return - if isinstance(state, tuple): - if not isinstance(state[0], dict): - state = state[1] - else: - state = state[0].update(state[1]) - result = {} - for i in state: - try: - pickle.dumps(state[i], protocol=2) - except pickle.PicklingError: - if not state[i] in seen: - seen.append(state[i]) - result[i] = cls._get_pickling_errors(state[i], seen) - return result - - def http_resp(self, http_method, url): - """ - Simple wrapper for Client http requests - Removes the `client' and `request' attributes from as they are - added by django.test.client.Client and not part of caching - responses outside of tests. - """ - method = getattr(self.client, http_method) - resp = method(url) - del resp.client, resp.request - return resp - - def test_obj_pickling(self): - """ - Test that responses are properly pickled - """ - resp = self.http_resp('get', '/cache') - - # Make sure that no pickling errors occurred - self.assertEqual(self._get_pickling_errors(resp), {}) - - # Unfortunately LocMem backend doesn't raise PickleErrors but returns - # None instead. - cache.set(self.cache_key, resp) - self.assertTrue(cache.get(self.cache_key) is not None) - - def test_head_caching(self): - """ - Test caching of HEAD requests - """ - resp = self.http_resp('head', '/cache') - cache.set(self.cache_key, resp) - - cached_resp = cache.get(self.cache_key) - self.assertIsInstance(cached_resp, Response) - - def test_get_caching(self): - """ - Test caching of GET requests - """ - resp = self.http_resp('get', '/cache') - cache.set(self.cache_key, resp) - - cached_resp = cache.get(self.cache_key) - self.assertIsInstance(cached_resp, Response) - self.assertEqual(cached_resp.content, resp.content) diff --git a/vendor-local/lib/python/rest_framework/tests/test_request.py b/vendor-local/lib/python/rest_framework/tests/test_request.py deleted file mode 100644 index 969d8024a9c..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_request.py +++ /dev/null @@ -1,314 +0,0 @@ -""" -Tests for content parsing, and form-overloaded content parsing. -""" -from __future__ import unicode_literals -from django.contrib.auth.models import User -from django.contrib.auth import authenticate, login, logout -from django.contrib.sessions.middleware import SessionMiddleware -from django.test import TestCase -from rest_framework import status -from rest_framework.authentication import SessionAuthentication -from rest_framework.compat import patterns -from rest_framework.parsers import ( - BaseParser, - FormParser, - MultiPartParser, - JSONParser -) -from rest_framework.request import Request -from rest_framework.response import Response -from rest_framework.settings import api_settings -from rest_framework.test import APIRequestFactory, APIClient -from rest_framework.views import APIView -from rest_framework.compat import six -import json - - -factory = APIRequestFactory() - - -class PlainTextParser(BaseParser): - media_type = 'text/plain' - - def parse(self, stream, media_type=None, parser_context=None): - """ - Returns a 2-tuple of `(data, files)`. - - `data` will simply be a string representing the body of the request. - `files` will always be `None`. - """ - return stream.read() - - -class TestMethodOverloading(TestCase): - def test_method(self): - """ - Request methods should be same as underlying request. - """ - request = Request(factory.get('/')) - self.assertEqual(request.method, 'GET') - request = Request(factory.post('/')) - self.assertEqual(request.method, 'POST') - - def test_overloaded_method(self): - """ - POST requests can be overloaded to another method by setting a - reserved form field - """ - request = Request(factory.post('/', {api_settings.FORM_METHOD_OVERRIDE: 'DELETE'})) - self.assertEqual(request.method, 'DELETE') - - def test_x_http_method_override_header(self): - """ - POST requests can also be overloaded to another method by setting - the X-HTTP-Method-Override header. - """ - request = Request(factory.post('/', {'foo': 'bar'}, HTTP_X_HTTP_METHOD_OVERRIDE='DELETE')) - self.assertEqual(request.method, 'DELETE') - - -class TestContentParsing(TestCase): - def test_standard_behaviour_determines_no_content_GET(self): - """ - Ensure request.DATA returns empty QueryDict for GET request. - """ - request = Request(factory.get('/')) - self.assertEqual(request.DATA, {}) - - def test_standard_behaviour_determines_no_content_HEAD(self): - """ - Ensure request.DATA returns empty QueryDict for HEAD request. - """ - request = Request(factory.head('/')) - self.assertEqual(request.DATA, {}) - - def test_request_DATA_with_form_content(self): - """ - Ensure request.DATA returns content for POST request with form content. - """ - data = {'qwerty': 'uiop'} - request = Request(factory.post('/', data)) - request.parsers = (FormParser(), MultiPartParser()) - self.assertEqual(list(request.DATA.items()), list(data.items())) - - def test_request_DATA_with_text_content(self): - """ - Ensure request.DATA returns content for POST request with - non-form content. - """ - content = six.b('qwerty') - content_type = 'text/plain' - request = Request(factory.post('/', content, content_type=content_type)) - request.parsers = (PlainTextParser(),) - self.assertEqual(request.DATA, content) - - def test_request_POST_with_form_content(self): - """ - Ensure request.POST returns content for POST request with form content. - """ - data = {'qwerty': 'uiop'} - request = Request(factory.post('/', data)) - request.parsers = (FormParser(), MultiPartParser()) - self.assertEqual(list(request.POST.items()), list(data.items())) - - def test_standard_behaviour_determines_form_content_PUT(self): - """ - Ensure request.DATA returns content for PUT request with form content. - """ - data = {'qwerty': 'uiop'} - request = Request(factory.put('/', data)) - request.parsers = (FormParser(), MultiPartParser()) - self.assertEqual(list(request.DATA.items()), list(data.items())) - - def test_standard_behaviour_determines_non_form_content_PUT(self): - """ - Ensure request.DATA returns content for PUT request with - non-form content. - """ - content = six.b('qwerty') - content_type = 'text/plain' - request = Request(factory.put('/', content, content_type=content_type)) - request.parsers = (PlainTextParser(), ) - self.assertEqual(request.DATA, content) - - def test_overloaded_behaviour_allows_content_tunnelling(self): - """ - Ensure request.DATA returns content for overloaded POST request. - """ - json_data = {'foobar': 'qwerty'} - content = json.dumps(json_data) - content_type = 'application/json' - form_data = { - api_settings.FORM_CONTENT_OVERRIDE: content, - api_settings.FORM_CONTENTTYPE_OVERRIDE: content_type - } - request = Request(factory.post('/', form_data)) - request.parsers = (JSONParser(), ) - self.assertEqual(request.DATA, json_data) - - # def test_accessing_post_after_data_form(self): - # """ - # Ensures request.POST can be accessed after request.DATA in - # form request. - # """ - # data = {'qwerty': 'uiop'} - # request = factory.post('/', data=data) - # self.assertEqual(request.DATA.items(), data.items()) - # self.assertEqual(request.POST.items(), data.items()) - - # def test_accessing_post_after_data_for_json(self): - # """ - # Ensures request.POST can be accessed after request.DATA in - # json request. - # """ - # data = {'qwerty': 'uiop'} - # content = json.dumps(data) - # content_type = 'application/json' - # parsers = (JSONParser, ) - - # request = factory.post('/', content, content_type=content_type, - # parsers=parsers) - # self.assertEqual(request.DATA.items(), data.items()) - # self.assertEqual(request.POST.items(), []) - - # def test_accessing_post_after_data_for_overloaded_json(self): - # """ - # Ensures request.POST can be accessed after request.DATA in overloaded - # json request. - # """ - # data = {'qwerty': 'uiop'} - # content = json.dumps(data) - # content_type = 'application/json' - # parsers = (JSONParser, ) - # form_data = {Request._CONTENT_PARAM: content, - # Request._CONTENTTYPE_PARAM: content_type} - - # request = factory.post('/', form_data, parsers=parsers) - # self.assertEqual(request.DATA.items(), data.items()) - # self.assertEqual(request.POST.items(), form_data.items()) - - # def test_accessing_data_after_post_form(self): - # """ - # Ensures request.DATA can be accessed after request.POST in - # form request. - # """ - # data = {'qwerty': 'uiop'} - # parsers = (FormParser, MultiPartParser) - # request = factory.post('/', data, parsers=parsers) - - # self.assertEqual(request.POST.items(), data.items()) - # self.assertEqual(request.DATA.items(), data.items()) - - # def test_accessing_data_after_post_for_json(self): - # """ - # Ensures request.DATA can be accessed after request.POST in - # json request. - # """ - # data = {'qwerty': 'uiop'} - # content = json.dumps(data) - # content_type = 'application/json' - # parsers = (JSONParser, ) - # request = factory.post('/', content, content_type=content_type, - # parsers=parsers) - # self.assertEqual(request.POST.items(), []) - # self.assertEqual(request.DATA.items(), data.items()) - - # def test_accessing_data_after_post_for_overloaded_json(self): - # """ - # Ensures request.DATA can be accessed after request.POST in overloaded - # json request - # """ - # data = {'qwerty': 'uiop'} - # content = json.dumps(data) - # content_type = 'application/json' - # parsers = (JSONParser, ) - # form_data = {Request._CONTENT_PARAM: content, - # Request._CONTENTTYPE_PARAM: content_type} - - # request = factory.post('/', form_data, parsers=parsers) - # self.assertEqual(request.POST.items(), form_data.items()) - # self.assertEqual(request.DATA.items(), data.items()) - - -class MockView(APIView): - authentication_classes = (SessionAuthentication,) - - def post(self, request): - if request.POST.get('example') is not None: - return Response(status=status.HTTP_200_OK) - - return Response(status=status.INTERNAL_SERVER_ERROR) - -urlpatterns = patterns('', - (r'^$', MockView.as_view()), -) - - -class TestContentParsingWithAuthentication(TestCase): - urls = 'rest_framework.tests.test_request' - - def setUp(self): - self.csrf_client = APIClient(enforce_csrf_checks=True) - self.username = 'john' - self.email = 'lennon@thebeatles.com' - self.password = 'password' - self.user = User.objects.create_user(self.username, self.email, self.password) - - def test_user_logged_in_authentication_has_POST_when_not_logged_in(self): - """ - Ensures request.POST exists after SessionAuthentication when user - doesn't log in. - """ - content = {'example': 'example'} - - response = self.client.post('/', content) - self.assertEqual(status.HTTP_200_OK, response.status_code) - - response = self.csrf_client.post('/', content) - self.assertEqual(status.HTTP_200_OK, response.status_code) - - # def test_user_logged_in_authentication_has_post_when_logged_in(self): - # """Ensures request.POST exists after UserLoggedInAuthentication when user does log in""" - # self.client.login(username='john', password='password') - # self.csrf_client.login(username='john', password='password') - # content = {'example': 'example'} - - # response = self.client.post('/', content) - # self.assertEqual(status.OK, response.status_code, "POST data is malformed") - - # response = self.csrf_client.post('/', content) - # self.assertEqual(status.OK, response.status_code, "POST data is malformed") - - -class TestUserSetter(TestCase): - - def setUp(self): - # Pass request object through session middleware so session is - # available to login and logout functions - self.request = Request(factory.get('/')) - SessionMiddleware().process_request(self.request) - - User.objects.create_user('ringo', 'starr@thebeatles.com', 'yellow') - self.user = authenticate(username='ringo', password='yellow') - - def test_user_can_be_set(self): - self.request.user = self.user - self.assertEqual(self.request.user, self.user) - - def test_user_can_login(self): - login(self.request, self.user) - self.assertEqual(self.request.user, self.user) - - def test_user_can_logout(self): - self.request.user = self.user - self.assertFalse(self.request.user.is_anonymous()) - logout(self.request) - self.assertTrue(self.request.user.is_anonymous()) - - -class TestAuthSetter(TestCase): - - def test_auth_can_be_set(self): - request = Request(factory.get('/')) - request.auth = 'DUMMY' - self.assertEqual(request.auth, 'DUMMY') diff --git a/vendor-local/lib/python/rest_framework/tests/test_response.py b/vendor-local/lib/python/rest_framework/tests/test_response.py deleted file mode 100644 index eea3c6418a5..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_response.py +++ /dev/null @@ -1,278 +0,0 @@ -from __future__ import unicode_literals -from django.test import TestCase -from rest_framework.tests.models import BasicModel, BasicModelSerializer -from rest_framework.compat import patterns, url, include -from rest_framework.response import Response -from rest_framework.views import APIView -from rest_framework import generics -from rest_framework import routers -from rest_framework import status -from rest_framework.renderers import ( - BaseRenderer, - JSONRenderer, - BrowsableAPIRenderer -) -from rest_framework import viewsets -from rest_framework.settings import api_settings -from rest_framework.compat import six - - -class MockPickleRenderer(BaseRenderer): - media_type = 'application/pickle' - - -class MockJsonRenderer(BaseRenderer): - media_type = 'application/json' - - -class MockTextMediaRenderer(BaseRenderer): - media_type = 'text/html' - -DUMMYSTATUS = status.HTTP_200_OK -DUMMYCONTENT = 'dummycontent' - -RENDERER_A_SERIALIZER = lambda x: ('Renderer A: %s' % x).encode('ascii') -RENDERER_B_SERIALIZER = lambda x: ('Renderer B: %s' % x).encode('ascii') - - -class RendererA(BaseRenderer): - media_type = 'mock/renderera' - format = "formata" - - def render(self, data, media_type=None, renderer_context=None): - return RENDERER_A_SERIALIZER(data) - - -class RendererB(BaseRenderer): - media_type = 'mock/rendererb' - format = "formatb" - - def render(self, data, media_type=None, renderer_context=None): - return RENDERER_B_SERIALIZER(data) - - -class RendererC(RendererB): - media_type = 'mock/rendererc' - format = 'formatc' - charset = "rendererc" - - -class MockView(APIView): - renderer_classes = (RendererA, RendererB, RendererC) - - def get(self, request, **kwargs): - return Response(DUMMYCONTENT, status=DUMMYSTATUS) - - -class MockViewSettingContentType(APIView): - renderer_classes = (RendererA, RendererB, RendererC) - - def get(self, request, **kwargs): - return Response(DUMMYCONTENT, status=DUMMYSTATUS, content_type='setbyview') - - -class HTMLView(APIView): - renderer_classes = (BrowsableAPIRenderer, ) - - def get(self, request, **kwargs): - return Response('text') - - -class HTMLView1(APIView): - renderer_classes = (BrowsableAPIRenderer, JSONRenderer) - - def get(self, request, **kwargs): - return Response('text') - - -class HTMLNewModelViewSet(viewsets.ModelViewSet): - model = BasicModel - - -class HTMLNewModelView(generics.ListCreateAPIView): - renderer_classes = (BrowsableAPIRenderer,) - permission_classes = [] - serializer_class = BasicModelSerializer - model = BasicModel - - -new_model_viewset_router = routers.DefaultRouter() -new_model_viewset_router.register(r'', HTMLNewModelViewSet) - - -urlpatterns = patterns('', - url(r'^setbyview$', MockViewSettingContentType.as_view(renderer_classes=[RendererA, RendererB, RendererC])), - url(r'^.*\.(?P<format>.+)$', MockView.as_view(renderer_classes=[RendererA, RendererB, RendererC])), - url(r'^$', MockView.as_view(renderer_classes=[RendererA, RendererB, RendererC])), - url(r'^html$', HTMLView.as_view()), - url(r'^html1$', HTMLView1.as_view()), - url(r'^html_new_model$', HTMLNewModelView.as_view()), - url(r'^html_new_model_viewset', include(new_model_viewset_router.urls)), - url(r'^restframework', include('rest_framework.urls', namespace='rest_framework')) -) - - -# TODO: Clean tests bellow - remove duplicates with above, better unit testing, ... -class RendererIntegrationTests(TestCase): - """ - End-to-end testing of renderers using an ResponseMixin on a generic view. - """ - - urls = 'rest_framework.tests.test_response' - - def test_default_renderer_serializes_content(self): - """If the Accept header is not set the default renderer should serialize the response.""" - resp = self.client.get('/') - self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_head_method_serializes_no_content(self): - """No response must be included in HEAD requests.""" - resp = self.client.head('/') - self.assertEqual(resp.status_code, DUMMYSTATUS) - self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') - self.assertEqual(resp.content, six.b('')) - - def test_default_renderer_serializes_content_on_accept_any(self): - """If the Accept header is set to */* the default renderer should serialize the response.""" - resp = self.client.get('/', HTTP_ACCEPT='*/*') - self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_specified_renderer_serializes_content_default_case(self): - """If the Accept header is set the specified renderer should serialize the response. - (In this case we check that works for the default renderer)""" - resp = self.client.get('/', HTTP_ACCEPT=RendererA.media_type) - self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_specified_renderer_serializes_content_non_default_case(self): - """If the Accept header is set the specified renderer should serialize the response. - (In this case we check that works for a non-default renderer)""" - resp = self.client.get('/', HTTP_ACCEPT=RendererB.media_type) - self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_specified_renderer_serializes_content_on_accept_query(self): - """The '_accept' query string should behave in the same way as the Accept header.""" - param = '?%s=%s' % ( - api_settings.URL_ACCEPT_OVERRIDE, - RendererB.media_type - ) - resp = self.client.get('/' + param) - self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_specified_renderer_serializes_content_on_format_query(self): - """If a 'format' query is specified, the renderer with the matching - format attribute should serialize the response.""" - resp = self.client.get('/?format=%s' % RendererB.format) - self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_specified_renderer_serializes_content_on_format_kwargs(self): - """If a 'format' keyword arg is specified, the renderer with the matching - format attribute should serialize the response.""" - resp = self.client.get('/something.formatb') - self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - def test_specified_renderer_is_used_on_format_query_with_matching_accept(self): - """If both a 'format' query and a matching Accept header specified, - the renderer with the matching format attribute should serialize the response.""" - resp = self.client.get('/?format=%s' % RendererB.format, - HTTP_ACCEPT=RendererB.media_type) - self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') - self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) - self.assertEqual(resp.status_code, DUMMYSTATUS) - - -class Issue122Tests(TestCase): - """ - Tests that covers #122. - """ - urls = 'rest_framework.tests.test_response' - - def test_only_html_renderer(self): - """ - Test if no infinite recursion occurs. - """ - self.client.get('/html') - - def test_html_renderer_is_first(self): - """ - Test if no infinite recursion occurs. - """ - self.client.get('/html1') - - -class Issue467Tests(TestCase): - """ - Tests for #467 - """ - - urls = 'rest_framework.tests.test_response' - - def test_form_has_label_and_help_text(self): - resp = self.client.get('/html_new_model') - self.assertEqual(resp['Content-Type'], 'text/html; charset=utf-8') - self.assertContains(resp, 'Text comes here') - self.assertContains(resp, 'Text description.') - - -class Issue807Tests(TestCase): - """ - Covers #807 - """ - - urls = 'rest_framework.tests.test_response' - - def test_does_not_append_charset_by_default(self): - """ - Renderers don't include a charset unless set explicitly. - """ - headers = {"HTTP_ACCEPT": RendererA.media_type} - resp = self.client.get('/', **headers) - expected = "{0}; charset={1}".format(RendererA.media_type, 'utf-8') - self.assertEqual(expected, resp['Content-Type']) - - def test_if_there_is_charset_specified_on_renderer_it_gets_appended(self): - """ - If renderer class has charset attribute declared, it gets appended - to Response's Content-Type - """ - headers = {"HTTP_ACCEPT": RendererC.media_type} - resp = self.client.get('/', **headers) - expected = "{0}; charset={1}".format(RendererC.media_type, RendererC.charset) - self.assertEqual(expected, resp['Content-Type']) - - def test_content_type_set_explictly_on_response(self): - """ - The content type may be set explictly on the response. - """ - headers = {"HTTP_ACCEPT": RendererC.media_type} - resp = self.client.get('/setbyview', **headers) - self.assertEqual('setbyview', resp['Content-Type']) - - def test_viewset_label_help_text(self): - param = '?%s=%s' % ( - api_settings.URL_ACCEPT_OVERRIDE, - 'text/html' - ) - resp = self.client.get('/html_new_model_viewset/' + param) - self.assertEqual(resp['Content-Type'], 'text/html; charset=utf-8') - self.assertContains(resp, 'Text comes here') - self.assertContains(resp, 'Text description.') - - def test_form_has_label_and_help_text(self): - resp = self.client.get('/html_new_model') - self.assertEqual(resp['Content-Type'], 'text/html; charset=utf-8') - self.assertContains(resp, 'Text comes here') - self.assertContains(resp, 'Text description.') diff --git a/vendor-local/lib/python/rest_framework/tests/test_reverse.py b/vendor-local/lib/python/rest_framework/tests/test_reverse.py deleted file mode 100644 index 690a30b119d..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_reverse.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import unicode_literals -from django.test import TestCase -from rest_framework.compat import patterns, url -from rest_framework.reverse import reverse -from rest_framework.test import APIRequestFactory - -factory = APIRequestFactory() - - -def null_view(request): - pass - -urlpatterns = patterns('', - url(r'^view$', null_view, name='view'), -) - - -class ReverseTests(TestCase): - """ - Tests for fully qualified URLs when using `reverse`. - """ - urls = 'rest_framework.tests.test_reverse' - - def test_reversed_urls_are_fully_qualified(self): - request = factory.get('/view') - url = reverse('view', request=request) - self.assertEqual(url, 'http://testserver/view') diff --git a/vendor-local/lib/python/rest_framework/tests/test_routers.py b/vendor-local/lib/python/rest_framework/tests/test_routers.py deleted file mode 100644 index 5fcccb74140..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_routers.py +++ /dev/null @@ -1,216 +0,0 @@ -from __future__ import unicode_literals -from django.db import models -from django.test import TestCase -from django.core.exceptions import ImproperlyConfigured -from rest_framework import serializers, viewsets, permissions -from rest_framework.compat import include, patterns, url -from rest_framework.decorators import link, action -from rest_framework.response import Response -from rest_framework.routers import SimpleRouter, DefaultRouter -from rest_framework.test import APIRequestFactory - -factory = APIRequestFactory() - -urlpatterns = patterns('',) - - -class BasicViewSet(viewsets.ViewSet): - def list(self, request, *args, **kwargs): - return Response({'method': 'list'}) - - @action() - def action1(self, request, *args, **kwargs): - return Response({'method': 'action1'}) - - @action() - def action2(self, request, *args, **kwargs): - return Response({'method': 'action2'}) - - @action(methods=['post', 'delete']) - def action3(self, request, *args, **kwargs): - return Response({'method': 'action2'}) - - @link() - def link1(self, request, *args, **kwargs): - return Response({'method': 'link1'}) - - @link() - def link2(self, request, *args, **kwargs): - return Response({'method': 'link2'}) - - -class TestSimpleRouter(TestCase): - def setUp(self): - self.router = SimpleRouter() - - def test_link_and_action_decorator(self): - routes = self.router.get_routes(BasicViewSet) - decorator_routes = routes[2:] - # Make sure all these endpoints exist and none have been clobbered - for i, endpoint in enumerate(['action1', 'action2', 'action3', 'link1', 'link2']): - route = decorator_routes[i] - # check url listing - self.assertEqual(route.url, - '^{{prefix}}/{{lookup}}/{0}{{trailing_slash}}$'.format(endpoint)) - # check method to function mapping - if endpoint == 'action3': - methods_map = ['post', 'delete'] - elif endpoint.startswith('action'): - methods_map = ['post'] - else: - methods_map = ['get'] - for method in methods_map: - self.assertEqual(route.mapping[method], endpoint) - - -class RouterTestModel(models.Model): - uuid = models.CharField(max_length=20) - text = models.CharField(max_length=200) - - -class TestCustomLookupFields(TestCase): - """ - Ensure that custom lookup fields are correctly routed. - """ - urls = 'rest_framework.tests.test_routers' - - def setUp(self): - class NoteSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = RouterTestModel - lookup_field = 'uuid' - fields = ('url', 'uuid', 'text') - - class NoteViewSet(viewsets.ModelViewSet): - queryset = RouterTestModel.objects.all() - serializer_class = NoteSerializer - lookup_field = 'uuid' - - RouterTestModel.objects.create(uuid='123', text='foo bar') - - self.router = SimpleRouter() - self.router.register(r'notes', NoteViewSet) - - from rest_framework.tests import test_routers - urls = getattr(test_routers, 'urlpatterns') - urls += patterns('', - url(r'^', include(self.router.urls)), - ) - - def test_custom_lookup_field_route(self): - detail_route = self.router.urls[-1] - detail_url_pattern = detail_route.regex.pattern - self.assertIn('<uuid>', detail_url_pattern) - - def test_retrieve_lookup_field_list_view(self): - response = self.client.get('/notes/') - self.assertEqual(response.data, - [{ - "url": "http://testserver/notes/123/", - "uuid": "123", "text": "foo bar" - }] - ) - - def test_retrieve_lookup_field_detail_view(self): - response = self.client.get('/notes/123/') - self.assertEqual(response.data, - { - "url": "http://testserver/notes/123/", - "uuid": "123", "text": "foo bar" - } - ) - - -class TestTrailingSlashIncluded(TestCase): - def setUp(self): - class NoteViewSet(viewsets.ModelViewSet): - model = RouterTestModel - - self.router = SimpleRouter() - self.router.register(r'notes', NoteViewSet) - self.urls = self.router.urls - - def test_urls_have_trailing_slash_by_default(self): - expected = ['^notes/$', '^notes/(?P<pk>[^/]+)/$'] - for idx in range(len(expected)): - self.assertEqual(expected[idx], self.urls[idx].regex.pattern) - - -class TestTrailingSlashRemoved(TestCase): - def setUp(self): - class NoteViewSet(viewsets.ModelViewSet): - model = RouterTestModel - - self.router = SimpleRouter(trailing_slash=False) - self.router.register(r'notes', NoteViewSet) - self.urls = self.router.urls - - def test_urls_can_have_trailing_slash_removed(self): - expected = ['^notes$', '^notes/(?P<pk>[^/]+)$'] - for idx in range(len(expected)): - self.assertEqual(expected[idx], self.urls[idx].regex.pattern) - - -class TestNameableRoot(TestCase): - def setUp(self): - class NoteViewSet(viewsets.ModelViewSet): - model = RouterTestModel - self.router = DefaultRouter() - self.router.root_view_name = 'nameable-root' - self.router.register(r'notes', NoteViewSet) - self.urls = self.router.urls - - def test_router_has_custom_name(self): - expected = 'nameable-root' - self.assertEqual(expected, self.urls[0].name) - - -class TestActionKeywordArgs(TestCase): - """ - Ensure keyword arguments passed in the `@action` decorator - are properly handled. Refs #940. - """ - - def setUp(self): - class TestViewSet(viewsets.ModelViewSet): - permission_classes = [] - - @action(permission_classes=[permissions.AllowAny]) - def custom(self, request, *args, **kwargs): - return Response({ - 'permission_classes': self.permission_classes - }) - - self.router = SimpleRouter() - self.router.register(r'test', TestViewSet, base_name='test') - self.view = self.router.urls[-1].callback - - def test_action_kwargs(self): - request = factory.post('/test/0/custom/') - response = self.view(request) - self.assertEqual( - response.data, - {'permission_classes': [permissions.AllowAny]} - ) - - -class TestActionAppliedToExistingRoute(TestCase): - """ - Ensure `@action` decorator raises an except when applied - to an existing route - """ - - def test_exception_raised_when_action_applied_to_existing_route(self): - class TestViewSet(viewsets.ModelViewSet): - - @action() - def retrieve(self, request, *args, **kwargs): - return Response({ - 'hello': 'world' - }) - - self.router = SimpleRouter() - self.router.register(r'test', TestViewSet, base_name='test') - - with self.assertRaises(ImproperlyConfigured): - self.router.urls diff --git a/vendor-local/lib/python/rest_framework/tests/test_serializer.py b/vendor-local/lib/python/rest_framework/tests/test_serializer.py deleted file mode 100644 index c24976603e7..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_serializer.py +++ /dev/null @@ -1,1645 +0,0 @@ -from __future__ import unicode_literals -from django.db import models -from django.db.models.fields import BLANK_CHOICE_DASH -from django.test import TestCase -from django.utils.datastructures import MultiValueDict -from django.utils.translation import ugettext_lazy as _ -from rest_framework import serializers, fields, relations -from rest_framework.tests.models import (HasPositiveIntegerAsChoice, Album, ActionItem, Anchor, BasicModel, - BlankFieldModel, BlogPost, BlogPostComment, Book, CallableDefaultValueModel, DefaultValueModel, - ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo, RESTFrameworkModel) -from rest_framework.tests.models import BasicModelSerializer -import datetime -import pickle - - -class SubComment(object): - def __init__(self, sub_comment): - self.sub_comment = sub_comment - - -class Comment(object): - def __init__(self, email, content, created): - self.email = email - self.content = content - self.created = created or datetime.datetime.now() - - def __eq__(self, other): - return all([getattr(self, attr) == getattr(other, attr) - for attr in ('email', 'content', 'created')]) - - def get_sub_comment(self): - sub_comment = SubComment('And Merry Christmas!') - return sub_comment - - -class CommentSerializer(serializers.Serializer): - email = serializers.EmailField() - content = serializers.CharField(max_length=1000) - created = serializers.DateTimeField() - sub_comment = serializers.Field(source='get_sub_comment.sub_comment') - - def restore_object(self, data, instance=None): - if instance is None: - return Comment(**data) - for key, val in data.items(): - setattr(instance, key, val) - return instance - - -class NamesSerializer(serializers.Serializer): - first = serializers.CharField() - last = serializers.CharField(required=False, default='') - initials = serializers.CharField(required=False, default='') - - -class PersonIdentifierSerializer(serializers.Serializer): - ssn = serializers.CharField() - names = NamesSerializer(source='names', required=False) - - -class BookSerializer(serializers.ModelSerializer): - isbn = serializers.RegexField(regex=r'^[0-9]{13}$', error_messages={'invalid': 'isbn has to be exact 13 numbers'}) - - class Meta: - model = Book - - -class ActionItemSerializer(serializers.ModelSerializer): - - class Meta: - model = ActionItem - - -class ActionItemSerializerCustomRestore(serializers.ModelSerializer): - - class Meta: - model = ActionItem - - def restore_object(self, data, instance=None): - if instance is None: - return ActionItem(**data) - for key, val in data.items(): - setattr(instance, key, val) - return instance - - -class PersonSerializer(serializers.ModelSerializer): - info = serializers.Field(source='info') - - class Meta: - model = Person - fields = ('name', 'age', 'info') - read_only_fields = ('age',) - - -class NestedSerializer(serializers.Serializer): - info = serializers.Field() - - -class ModelSerializerWithNestedSerializer(serializers.ModelSerializer): - nested = NestedSerializer(source='*') - - class Meta: - model = Person - - -class PersonSerializerInvalidReadOnly(serializers.ModelSerializer): - """ - Testing for #652. - """ - info = serializers.Field(source='info') - - class Meta: - model = Person - fields = ('name', 'age', 'info') - read_only_fields = ('age', 'info') - - -class AlbumsSerializer(serializers.ModelSerializer): - - class Meta: - model = Album - fields = ['title'] # lists are also valid options - - -class PositiveIntegerAsChoiceSerializer(serializers.ModelSerializer): - class Meta: - model = HasPositiveIntegerAsChoice - fields = ['some_integer'] - - -class BasicTests(TestCase): - def setUp(self): - self.comment = Comment( - 'tom@example.com', - 'Happy new year!', - datetime.datetime(2012, 1, 1) - ) - self.data = { - 'email': 'tom@example.com', - 'content': 'Happy new year!', - 'created': datetime.datetime(2012, 1, 1), - 'sub_comment': 'This wont change' - } - self.expected = { - 'email': 'tom@example.com', - 'content': 'Happy new year!', - 'created': datetime.datetime(2012, 1, 1), - 'sub_comment': 'And Merry Christmas!' - } - self.person_data = {'name': 'dwight', 'age': 35} - self.person = Person(**self.person_data) - self.person.save() - - def test_empty(self): - serializer = CommentSerializer() - expected = { - 'email': '', - 'content': '', - 'created': None, - 'sub_comment': '' - } - self.assertEqual(serializer.data, expected) - - def test_retrieve(self): - serializer = CommentSerializer(self.comment) - self.assertEqual(serializer.data, self.expected) - - def test_create(self): - serializer = CommentSerializer(data=self.data) - expected = self.comment - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.object, expected) - self.assertFalse(serializer.object is expected) - self.assertEqual(serializer.data['sub_comment'], 'And Merry Christmas!') - - def test_create_nested(self): - """Test a serializer with nested data.""" - names = {'first': 'John', 'last': 'Doe', 'initials': 'jd'} - data = {'ssn': '1234567890', 'names': names} - serializer = PersonIdentifierSerializer(data=data) - - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.object, data) - self.assertFalse(serializer.object is data) - self.assertEqual(serializer.data['names'], names) - - def test_create_partial_nested(self): - """Test a serializer with nested data which has missing fields.""" - names = {'first': 'John'} - data = {'ssn': '1234567890', 'names': names} - serializer = PersonIdentifierSerializer(data=data) - - expected_names = {'first': 'John', 'last': '', 'initials': ''} - data['names'] = expected_names - - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.object, data) - self.assertFalse(serializer.object is expected_names) - self.assertEqual(serializer.data['names'], expected_names) - - def test_null_nested(self): - """Test a serializer with a nonexistent nested field""" - data = {'ssn': '1234567890'} - serializer = PersonIdentifierSerializer(data=data) - - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.object, data) - self.assertFalse(serializer.object is data) - expected = {'ssn': '1234567890', 'names': None} - self.assertEqual(serializer.data, expected) - - def test_update(self): - serializer = CommentSerializer(self.comment, data=self.data) - expected = self.comment - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.object, expected) - self.assertTrue(serializer.object is expected) - self.assertEqual(serializer.data['sub_comment'], 'And Merry Christmas!') - - def test_partial_update(self): - msg = 'Merry New Year!' - partial_data = {'content': msg} - serializer = CommentSerializer(self.comment, data=partial_data) - self.assertEqual(serializer.is_valid(), False) - serializer = CommentSerializer(self.comment, data=partial_data, partial=True) - expected = self.comment - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.object, expected) - self.assertTrue(serializer.object is expected) - self.assertEqual(serializer.data['content'], msg) - - def test_model_fields_as_expected(self): - """ - Make sure that the fields returned are the same as defined - in the Meta data - """ - serializer = PersonSerializer(self.person) - self.assertEqual(set(serializer.data.keys()), - set(['name', 'age', 'info'])) - - def test_field_with_dictionary(self): - """ - Make sure that dictionaries from fields are left intact - """ - serializer = PersonSerializer(self.person) - expected = self.person_data - self.assertEqual(serializer.data['info'], expected) - - def test_read_only_fields(self): - """ - Attempting to update fields set as read_only should have no effect. - """ - serializer = PersonSerializer(self.person, data={'name': 'dwight', 'age': 99}) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEqual(serializer.errors, {}) - # Assert age is unchanged (35) - self.assertEqual(instance.age, self.person_data['age']) - - def test_invalid_read_only_fields(self): - """ - Regression test for #652. - """ - self.assertRaises(AssertionError, PersonSerializerInvalidReadOnly, []) - - -class DictStyleSerializer(serializers.Serializer): - """ - Note that we don't have any `restore_object` method, so the default - case of simply returning a dict will apply. - """ - email = serializers.EmailField() - - -class DictStyleSerializerTests(TestCase): - def test_dict_style_deserialize(self): - """ - Ensure serializers can deserialize into a dict. - """ - data = {'email': 'foo@example.com'} - serializer = DictStyleSerializer(data=data) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.data, data) - - def test_dict_style_serialize(self): - """ - Ensure serializers can serialize dict objects. - """ - data = {'email': 'foo@example.com'} - serializer = DictStyleSerializer(data) - self.assertEqual(serializer.data, data) - - -class ValidationTests(TestCase): - def setUp(self): - self.comment = Comment( - 'tom@example.com', - 'Happy new year!', - datetime.datetime(2012, 1, 1) - ) - self.data = { - 'email': 'tom@example.com', - 'content': 'x' * 1001, - 'created': datetime.datetime(2012, 1, 1) - } - self.actionitem = ActionItem(title='Some to do item',) - - def test_create(self): - serializer = CommentSerializer(data=self.data) - self.assertEqual(serializer.is_valid(), False) - self.assertEqual(serializer.errors, {'content': ['Ensure this value has at most 1000 characters (it has 1001).']}) - - def test_update(self): - serializer = CommentSerializer(self.comment, data=self.data) - self.assertEqual(serializer.is_valid(), False) - self.assertEqual(serializer.errors, {'content': ['Ensure this value has at most 1000 characters (it has 1001).']}) - - def test_update_missing_field(self): - data = { - 'content': 'xxx', - 'created': datetime.datetime(2012, 1, 1) - } - serializer = CommentSerializer(self.comment, data=data) - self.assertEqual(serializer.is_valid(), False) - self.assertEqual(serializer.errors, {'email': ['This field is required.']}) - - def test_missing_bool_with_default(self): - """Make sure that a boolean value with a 'False' value is not - mistaken for not having a default.""" - data = { - 'title': 'Some action item', - #No 'done' value. - } - serializer = ActionItemSerializer(self.actionitem, data=data) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.errors, {}) - - def test_cross_field_validation(self): - - class CommentSerializerWithCrossFieldValidator(CommentSerializer): - - def validate(self, attrs): - if attrs["email"] not in attrs["content"]: - raise serializers.ValidationError("Email address not in content") - return attrs - - data = { - 'email': 'tom@example.com', - 'content': 'A comment from tom@example.com', - 'created': datetime.datetime(2012, 1, 1) - } - - serializer = CommentSerializerWithCrossFieldValidator(data=data) - self.assertTrue(serializer.is_valid()) - - data['content'] = 'A comment from foo@bar.com' - - serializer = CommentSerializerWithCrossFieldValidator(data=data) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'non_field_errors': ['Email address not in content']}) - - def test_null_is_true_fields(self): - """ - Omitting a value for null-field should validate. - """ - serializer = PersonSerializer(data={'name': 'marko'}) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.errors, {}) - - def test_modelserializer_max_length_exceeded(self): - data = { - 'title': 'x' * 201, - } - serializer = ActionItemSerializer(data=data) - self.assertEqual(serializer.is_valid(), False) - self.assertEqual(serializer.errors, {'title': ['Ensure this value has at most 200 characters (it has 201).']}) - - def test_modelserializer_max_length_exceeded_with_custom_restore(self): - """ - When overriding ModelSerializer.restore_object, validation tests should still apply. - Regression test for #623. - - https://github.com/tomchristie/django-rest-framework/pull/623 - """ - data = { - 'title': 'x' * 201, - } - serializer = ActionItemSerializerCustomRestore(data=data) - self.assertEqual(serializer.is_valid(), False) - self.assertEqual(serializer.errors, {'title': ['Ensure this value has at most 200 characters (it has 201).']}) - - def test_default_modelfield_max_length_exceeded(self): - data = { - 'title': 'Testing "info" field...', - 'info': 'x' * 13, - } - serializer = ActionItemSerializer(data=data) - self.assertEqual(serializer.is_valid(), False) - self.assertEqual(serializer.errors, {'info': ['Ensure this value has at most 12 characters (it has 13).']}) - - def test_datetime_validation_failure(self): - """ - Test DateTimeField validation errors on non-str values. - Regression test for #669. - - https://github.com/tomchristie/django-rest-framework/issues/669 - """ - data = self.data - data['created'] = 0 - - serializer = CommentSerializer(data=data) - self.assertEqual(serializer.is_valid(), False) - - self.assertIn('created', serializer.errors) - - def test_missing_model_field_exception_msg(self): - """ - Assert that a meaningful exception message is outputted when the model - field is missing (e.g. when mistyping ``model``). - """ - class BrokenModelSerializer(serializers.ModelSerializer): - class Meta: - fields = ['some_field'] - - try: - BrokenModelSerializer() - except AssertionError as e: - self.assertEqual(e.args[0], "Serializer class 'BrokenModelSerializer' is missing 'model' Meta option") - except: - self.fail('Wrong exception type thrown.') - - def test_writable_star_source_on_nested_serializer(self): - """ - Assert that a nested serializer instantiated with source='*' correctly - expands the data into the outer serializer. - """ - serializer = ModelSerializerWithNestedSerializer(data={ - 'name': 'marko', - 'nested': {'info': 'hi'}}, - ) - self.assertEqual(serializer.is_valid(), True) - - -class CustomValidationTests(TestCase): - class CommentSerializerWithFieldValidator(CommentSerializer): - - def validate_email(self, attrs, source): - attrs[source] - return attrs - - def validate_content(self, attrs, source): - value = attrs[source] - if "test" not in value: - raise serializers.ValidationError("Test not in value") - return attrs - - def test_field_validation(self): - data = { - 'email': 'tom@example.com', - 'content': 'A test comment', - 'created': datetime.datetime(2012, 1, 1) - } - - serializer = self.CommentSerializerWithFieldValidator(data=data) - self.assertTrue(serializer.is_valid()) - - data['content'] = 'This should not validate' - - serializer = self.CommentSerializerWithFieldValidator(data=data) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'content': ['Test not in value']}) - - def test_missing_data(self): - """ - Make sure that validate_content isn't called if the field is missing - """ - incomplete_data = { - 'email': 'tom@example.com', - 'created': datetime.datetime(2012, 1, 1) - } - serializer = self.CommentSerializerWithFieldValidator(data=incomplete_data) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'content': ['This field is required.']}) - - def test_wrong_data(self): - """ - Make sure that validate_content isn't called if the field input is wrong - """ - wrong_data = { - 'email': 'not an email', - 'content': 'A test comment', - 'created': datetime.datetime(2012, 1, 1) - } - serializer = self.CommentSerializerWithFieldValidator(data=wrong_data) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'email': ['Enter a valid email address.']}) - - -class PositiveIntegerAsChoiceTests(TestCase): - def test_positive_integer_in_json_is_correctly_parsed(self): - data = {'some_integer': 1} - serializer = PositiveIntegerAsChoiceSerializer(data=data) - self.assertEqual(serializer.is_valid(), True) - - -class ModelValidationTests(TestCase): - def test_validate_unique(self): - """ - Just check if serializers.ModelSerializer handles unique checks via .full_clean() - """ - serializer = AlbumsSerializer(data={'title': 'a'}) - serializer.is_valid() - serializer.save() - second_serializer = AlbumsSerializer(data={'title': 'a'}) - self.assertFalse(second_serializer.is_valid()) - self.assertEqual(second_serializer.errors, {'title': ['Album with this Title already exists.']}) - - def test_foreign_key_with_partial(self): - """ - Test ModelSerializer validation with partial=True - - Specifically test foreign key validation. - """ - - album = Album(title='test') - album.save() - - class PhotoSerializer(serializers.ModelSerializer): - class Meta: - model = Photo - - photo_serializer = PhotoSerializer(data={'description': 'test', 'album': album.pk}) - self.assertTrue(photo_serializer.is_valid()) - photo = photo_serializer.save() - - # Updating only the album (foreign key) - photo_serializer = PhotoSerializer(instance=photo, data={'album': album.pk}, partial=True) - self.assertTrue(photo_serializer.is_valid()) - self.assertTrue(photo_serializer.save()) - - # Updating only the description - photo_serializer = PhotoSerializer(instance=photo, - data={'description': 'new'}, - partial=True) - - self.assertTrue(photo_serializer.is_valid()) - self.assertTrue(photo_serializer.save()) - - -class RegexValidationTest(TestCase): - def test_create_failed(self): - serializer = BookSerializer(data={'isbn': '1234567890'}) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'isbn': ['isbn has to be exact 13 numbers']}) - - serializer = BookSerializer(data={'isbn': '12345678901234'}) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'isbn': ['isbn has to be exact 13 numbers']}) - - serializer = BookSerializer(data={'isbn': 'abcdefghijklm'}) - self.assertFalse(serializer.is_valid()) - self.assertEqual(serializer.errors, {'isbn': ['isbn has to be exact 13 numbers']}) - - def test_create_success(self): - serializer = BookSerializer(data={'isbn': '1234567890123'}) - self.assertTrue(serializer.is_valid()) - - -class MetadataTests(TestCase): - def test_empty(self): - serializer = CommentSerializer() - expected = { - 'email': serializers.CharField, - 'content': serializers.CharField, - 'created': serializers.DateTimeField - } - for field_name, field in expected.items(): - self.assertTrue(isinstance(serializer.data.fields[field_name], field)) - - -class ManyToManyTests(TestCase): - def setUp(self): - class ManyToManySerializer(serializers.ModelSerializer): - class Meta: - model = ManyToManyModel - - self.serializer_class = ManyToManySerializer - - # An anchor instance to use for the relationship - self.anchor = Anchor() - self.anchor.save() - - # A model instance with a many to many relationship to the anchor - self.instance = ManyToManyModel() - self.instance.save() - self.instance.rel.add(self.anchor) - - # A serialized representation of the model instance - self.data = {'id': 1, 'rel': [self.anchor.id]} - - def test_retrieve(self): - """ - Serialize an instance of a model with a ManyToMany relationship. - """ - serializer = self.serializer_class(instance=self.instance) - expected = self.data - self.assertEqual(serializer.data, expected) - - def test_create(self): - """ - Create an instance of a model with a ManyToMany relationship. - """ - data = {'rel': [self.anchor.id]} - serializer = self.serializer_class(data=data) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEqual(len(ManyToManyModel.objects.all()), 2) - self.assertEqual(instance.pk, 2) - self.assertEqual(list(instance.rel.all()), [self.anchor]) - - def test_update(self): - """ - Update an instance of a model with a ManyToMany relationship. - """ - new_anchor = Anchor() - new_anchor.save() - data = {'rel': [self.anchor.id, new_anchor.id]} - serializer = self.serializer_class(self.instance, data=data) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEqual(len(ManyToManyModel.objects.all()), 1) - self.assertEqual(instance.pk, 1) - self.assertEqual(list(instance.rel.all()), [self.anchor, new_anchor]) - - def test_create_empty_relationship(self): - """ - Create an instance of a model with a ManyToMany relationship, - containing no items. - """ - data = {'rel': []} - serializer = self.serializer_class(data=data) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEqual(len(ManyToManyModel.objects.all()), 2) - self.assertEqual(instance.pk, 2) - self.assertEqual(list(instance.rel.all()), []) - - def test_update_empty_relationship(self): - """ - Update an instance of a model with a ManyToMany relationship, - containing no items. - """ - new_anchor = Anchor() - new_anchor.save() - data = {'rel': []} - serializer = self.serializer_class(self.instance, data=data) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEqual(len(ManyToManyModel.objects.all()), 1) - self.assertEqual(instance.pk, 1) - self.assertEqual(list(instance.rel.all()), []) - - def test_create_empty_relationship_flat_data(self): - """ - Create an instance of a model with a ManyToMany relationship, - containing no items, using a representation that does not support - lists (eg form data). - """ - data = MultiValueDict() - data.setlist('rel', ['']) - serializer = self.serializer_class(data=data) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEqual(len(ManyToManyModel.objects.all()), 2) - self.assertEqual(instance.pk, 2) - self.assertEqual(list(instance.rel.all()), []) - - -class ReadOnlyManyToManyTests(TestCase): - def setUp(self): - class ReadOnlyManyToManySerializer(serializers.ModelSerializer): - rel = serializers.RelatedField(many=True, read_only=True) - - class Meta: - model = ReadOnlyManyToManyModel - - self.serializer_class = ReadOnlyManyToManySerializer - - # An anchor instance to use for the relationship - self.anchor = Anchor() - self.anchor.save() - - # A model instance with a many to many relationship to the anchor - self.instance = ReadOnlyManyToManyModel() - self.instance.save() - self.instance.rel.add(self.anchor) - - # A serialized representation of the model instance - self.data = {'rel': [self.anchor.id], 'id': 1, 'text': 'anchor'} - - def test_update(self): - """ - Attempt to update an instance of a model with a ManyToMany - relationship. Not updated due to read_only=True - """ - new_anchor = Anchor() - new_anchor.save() - data = {'rel': [self.anchor.id, new_anchor.id]} - serializer = self.serializer_class(self.instance, data=data) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEqual(len(ReadOnlyManyToManyModel.objects.all()), 1) - self.assertEqual(instance.pk, 1) - # rel is still as original (1 entry) - self.assertEqual(list(instance.rel.all()), [self.anchor]) - - def test_update_without_relationship(self): - """ - Attempt to update an instance of a model where many to ManyToMany - relationship is not supplied. Not updated due to read_only=True - """ - new_anchor = Anchor() - new_anchor.save() - data = {} - serializer = self.serializer_class(self.instance, data=data) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEqual(len(ReadOnlyManyToManyModel.objects.all()), 1) - self.assertEqual(instance.pk, 1) - # rel is still as original (1 entry) - self.assertEqual(list(instance.rel.all()), [self.anchor]) - - -class DefaultValueTests(TestCase): - def setUp(self): - class DefaultValueSerializer(serializers.ModelSerializer): - class Meta: - model = DefaultValueModel - - self.serializer_class = DefaultValueSerializer - self.objects = DefaultValueModel.objects - - def test_create_using_default(self): - data = {} - serializer = self.serializer_class(data=data) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEqual(len(self.objects.all()), 1) - self.assertEqual(instance.pk, 1) - self.assertEqual(instance.text, 'foobar') - - def test_create_overriding_default(self): - data = {'text': 'overridden'} - serializer = self.serializer_class(data=data) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEqual(len(self.objects.all()), 1) - self.assertEqual(instance.pk, 1) - self.assertEqual(instance.text, 'overridden') - - def test_partial_update_default(self): - """ Regression test for issue #532 """ - data = {'text': 'overridden'} - serializer = self.serializer_class(data=data, partial=True) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - - data = {'extra': 'extra_value'} - serializer = self.serializer_class(instance=instance, data=data, partial=True) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - - self.assertEqual(instance.extra, 'extra_value') - self.assertEqual(instance.text, 'overridden') - - -class CallableDefaultValueTests(TestCase): - def setUp(self): - class CallableDefaultValueSerializer(serializers.ModelSerializer): - class Meta: - model = CallableDefaultValueModel - - self.serializer_class = CallableDefaultValueSerializer - self.objects = CallableDefaultValueModel.objects - - def test_create_using_default(self): - data = {} - serializer = self.serializer_class(data=data) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEqual(len(self.objects.all()), 1) - self.assertEqual(instance.pk, 1) - self.assertEqual(instance.text, 'foobar') - - def test_create_overriding_default(self): - data = {'text': 'overridden'} - serializer = self.serializer_class(data=data) - self.assertEqual(serializer.is_valid(), True) - instance = serializer.save() - self.assertEqual(len(self.objects.all()), 1) - self.assertEqual(instance.pk, 1) - self.assertEqual(instance.text, 'overridden') - - -class ManyRelatedTests(TestCase): - def test_reverse_relations(self): - post = BlogPost.objects.create(title="Test blog post") - post.blogpostcomment_set.create(text="I hate this blog post") - post.blogpostcomment_set.create(text="I love this blog post") - - class BlogPostCommentSerializer(serializers.Serializer): - text = serializers.CharField() - - class BlogPostSerializer(serializers.Serializer): - title = serializers.CharField() - comments = BlogPostCommentSerializer(source='blogpostcomment_set') - - serializer = BlogPostSerializer(instance=post) - expected = { - 'title': 'Test blog post', - 'comments': [ - {'text': 'I hate this blog post'}, - {'text': 'I love this blog post'} - ] - } - - self.assertEqual(serializer.data, expected) - - def test_include_reverse_relations(self): - post = BlogPost.objects.create(title="Test blog post") - post.blogpostcomment_set.create(text="I hate this blog post") - post.blogpostcomment_set.create(text="I love this blog post") - - class BlogPostSerializer(serializers.ModelSerializer): - class Meta: - model = BlogPost - fields = ('id', 'title', 'blogpostcomment_set') - - serializer = BlogPostSerializer(instance=post) - expected = { - 'id': 1, 'title': 'Test blog post', 'blogpostcomment_set': [1, 2] - } - self.assertEqual(serializer.data, expected) - - def test_depth_include_reverse_relations(self): - post = BlogPost.objects.create(title="Test blog post") - post.blogpostcomment_set.create(text="I hate this blog post") - post.blogpostcomment_set.create(text="I love this blog post") - - class BlogPostSerializer(serializers.ModelSerializer): - class Meta: - model = BlogPost - fields = ('id', 'title', 'blogpostcomment_set') - depth = 1 - - serializer = BlogPostSerializer(instance=post) - expected = { - 'id': 1, 'title': 'Test blog post', - 'blogpostcomment_set': [ - {'id': 1, 'text': 'I hate this blog post', 'blog_post': 1}, - {'id': 2, 'text': 'I love this blog post', 'blog_post': 1} - ] - } - self.assertEqual(serializer.data, expected) - - def test_callable_source(self): - post = BlogPost.objects.create(title="Test blog post") - post.blogpostcomment_set.create(text="I love this blog post") - - class BlogPostCommentSerializer(serializers.Serializer): - text = serializers.CharField() - - class BlogPostSerializer(serializers.Serializer): - title = serializers.CharField() - first_comment = BlogPostCommentSerializer(source='get_first_comment') - - serializer = BlogPostSerializer(post) - - expected = { - 'title': 'Test blog post', - 'first_comment': {'text': 'I love this blog post'} - } - self.assertEqual(serializer.data, expected) - - -class RelatedTraversalTest(TestCase): - def test_nested_traversal(self): - """ - Source argument should support dotted.source notation. - """ - user = Person.objects.create(name="django") - post = BlogPost.objects.create(title="Test blog post", writer=user) - post.blogpostcomment_set.create(text="I love this blog post") - - class PersonSerializer(serializers.ModelSerializer): - class Meta: - model = Person - fields = ("name", "age") - - class BlogPostCommentSerializer(serializers.ModelSerializer): - class Meta: - model = BlogPostComment - fields = ("text", "post_owner") - - text = serializers.CharField() - post_owner = PersonSerializer(source='blog_post.writer') - - class BlogPostSerializer(serializers.Serializer): - title = serializers.CharField() - comments = BlogPostCommentSerializer(source='blogpostcomment_set') - - serializer = BlogPostSerializer(instance=post) - - expected = { - 'title': 'Test blog post', - 'comments': [{ - 'text': 'I love this blog post', - 'post_owner': { - "name": "django", - "age": None - } - }] - } - - self.assertEqual(serializer.data, expected) - - def test_nested_traversal_with_none(self): - """ - If a component of the dotted.source is None, return None for the field. - """ - from rest_framework.tests.models import NullableForeignKeySource - instance = NullableForeignKeySource.objects.create(name='Source with null FK') - - class NullableSourceSerializer(serializers.Serializer): - target_name = serializers.Field(source='target.name') - - serializer = NullableSourceSerializer(instance=instance) - - expected = { - 'target_name': None, - } - - self.assertEqual(serializer.data, expected) - - -class SerializerMethodFieldTests(TestCase): - def setUp(self): - - class BoopSerializer(serializers.Serializer): - beep = serializers.SerializerMethodField('get_beep') - boop = serializers.Field() - boop_count = serializers.SerializerMethodField('get_boop_count') - - def get_beep(self, obj): - return 'hello!' - - def get_boop_count(self, obj): - return len(obj.boop) - - self.serializer_class = BoopSerializer - - def test_serializer_method_field(self): - - class MyModel(object): - boop = ['a', 'b', 'c'] - - source_data = MyModel() - - serializer = self.serializer_class(source_data) - - expected = { - 'beep': 'hello!', - 'boop': ['a', 'b', 'c'], - 'boop_count': 3, - } - - self.assertEqual(serializer.data, expected) - - -# Test for issue #324 -class BlankFieldTests(TestCase): - def setUp(self): - - class BlankFieldModelSerializer(serializers.ModelSerializer): - class Meta: - model = BlankFieldModel - - class BlankFieldSerializer(serializers.Serializer): - title = serializers.CharField(required=False) - - class NotBlankFieldModelSerializer(serializers.ModelSerializer): - class Meta: - model = BasicModel - - class NotBlankFieldSerializer(serializers.Serializer): - title = serializers.CharField() - - self.model_serializer_class = BlankFieldModelSerializer - self.serializer_class = BlankFieldSerializer - self.not_blank_model_serializer_class = NotBlankFieldModelSerializer - self.not_blank_serializer_class = NotBlankFieldSerializer - self.data = {'title': ''} - - def test_create_blank_field(self): - serializer = self.serializer_class(data=self.data) - self.assertEqual(serializer.is_valid(), True) - - def test_create_model_blank_field(self): - serializer = self.model_serializer_class(data=self.data) - self.assertEqual(serializer.is_valid(), True) - - def test_create_model_null_field(self): - serializer = self.model_serializer_class(data={'title': None}) - self.assertEqual(serializer.is_valid(), True) - - def test_create_not_blank_field(self): - """ - Test to ensure blank data in a field not marked as blank=True - is considered invalid in a non-model serializer - """ - serializer = self.not_blank_serializer_class(data=self.data) - self.assertEqual(serializer.is_valid(), False) - - def test_create_model_not_blank_field(self): - """ - Test to ensure blank data in a field not marked as blank=True - is considered invalid in a model serializer - """ - serializer = self.not_blank_model_serializer_class(data=self.data) - self.assertEqual(serializer.is_valid(), False) - - def test_create_model_empty_field(self): - serializer = self.model_serializer_class(data={}) - self.assertEqual(serializer.is_valid(), True) - - -#test for issue #460 -class SerializerPickleTests(TestCase): - """ - Test pickleability of the output of Serializers - """ - def test_pickle_simple_model_serializer_data(self): - """ - Test simple serializer - """ - pickle.dumps(PersonSerializer(Person(name="Methusela", age=969)).data) - - def test_pickle_inner_serializer(self): - """ - Test pickling a serializer whose resulting .data (a SortedDictWithMetadata) will - have unpickleable meta data--in order to make sure metadata doesn't get pulled into the pickle. - See DictWithMetadata.__getstate__ - """ - class InnerPersonSerializer(serializers.ModelSerializer): - class Meta: - model = Person - fields = ('name', 'age') - pickle.dumps(InnerPersonSerializer(Person(name="Noah", age=950)).data, 0) - - def test_getstate_method_should_not_return_none(self): - """ - Regression test for #645. - """ - data = serializers.DictWithMetadata({1: 1}) - self.assertEqual(data.__getstate__(), serializers.SortedDict({1: 1})) - - def test_serializer_data_is_pickleable(self): - """ - Another regression test for #645. - """ - data = serializers.SortedDictWithMetadata({1: 1}) - repr(pickle.loads(pickle.dumps(data, 0))) - - -# test for issue #725 -class SeveralChoicesModel(models.Model): - color = models.CharField( - max_length=10, - choices=[('red', 'Red'), ('green', 'Green'), ('blue', 'Blue')], - blank=False - ) - drink = models.CharField( - max_length=10, - choices=[('beer', 'Beer'), ('wine', 'Wine'), ('cider', 'Cider')], - blank=False, - default='beer' - ) - os = models.CharField( - max_length=10, - choices=[('linux', 'Linux'), ('osx', 'OSX'), ('windows', 'Windows')], - blank=True - ) - music_genre = models.CharField( - max_length=10, - choices=[('rock', 'Rock'), ('metal', 'Metal'), ('grunge', 'Grunge')], - blank=True, - default='metal' - ) - - -class SerializerChoiceFields(TestCase): - - def setUp(self): - super(SerializerChoiceFields, self).setUp() - - class SeveralChoicesSerializer(serializers.ModelSerializer): - class Meta: - model = SeveralChoicesModel - fields = ('color', 'drink', 'os', 'music_genre') - - self.several_choices_serializer = SeveralChoicesSerializer - - def test_choices_blank_false_not_default(self): - serializer = self.several_choices_serializer() - self.assertEqual( - serializer.fields['color'].choices, - [('red', 'Red'), ('green', 'Green'), ('blue', 'Blue')] - ) - - def test_choices_blank_false_with_default(self): - serializer = self.several_choices_serializer() - self.assertEqual( - serializer.fields['drink'].choices, - [('beer', 'Beer'), ('wine', 'Wine'), ('cider', 'Cider')] - ) - - def test_choices_blank_true_not_default(self): - serializer = self.several_choices_serializer() - self.assertEqual( - serializer.fields['os'].choices, - BLANK_CHOICE_DASH + [('linux', 'Linux'), ('osx', 'OSX'), ('windows', 'Windows')] - ) - - def test_choices_blank_true_with_default(self): - serializer = self.several_choices_serializer() - self.assertEqual( - serializer.fields['music_genre'].choices, - BLANK_CHOICE_DASH + [('rock', 'Rock'), ('metal', 'Metal'), ('grunge', 'Grunge')] - ) - - -# Regression tests for #675 -class Ticket(models.Model): - assigned = models.ForeignKey( - Person, related_name='assigned_tickets') - reviewer = models.ForeignKey( - Person, blank=True, null=True, related_name='reviewed_tickets') - - -class SerializerRelatedChoicesTest(TestCase): - - def setUp(self): - super(SerializerRelatedChoicesTest, self).setUp() - - class RelatedChoicesSerializer(serializers.ModelSerializer): - class Meta: - model = Ticket - fields = ('assigned', 'reviewer') - - self.related_fields_serializer = RelatedChoicesSerializer - - def test_empty_queryset_required(self): - serializer = self.related_fields_serializer() - self.assertEqual(serializer.fields['assigned'].queryset.count(), 0) - self.assertEqual( - [x for x in serializer.fields['assigned'].widget.choices], - [] - ) - - def test_empty_queryset_not_required(self): - serializer = self.related_fields_serializer() - self.assertEqual(serializer.fields['reviewer'].queryset.count(), 0) - self.assertEqual( - [x for x in serializer.fields['reviewer'].widget.choices], - [('', '---------')] - ) - - def test_with_some_persons_required(self): - Person.objects.create(name="Lionel Messi") - Person.objects.create(name="Xavi Hernandez") - serializer = self.related_fields_serializer() - self.assertEqual(serializer.fields['assigned'].queryset.count(), 2) - self.assertEqual( - [x for x in serializer.fields['assigned'].widget.choices], - [(1, 'Person object - 1'), (2, 'Person object - 2')] - ) - - def test_with_some_persons_not_required(self): - Person.objects.create(name="Lionel Messi") - Person.objects.create(name="Xavi Hernandez") - serializer = self.related_fields_serializer() - self.assertEqual(serializer.fields['reviewer'].queryset.count(), 2) - self.assertEqual( - [x for x in serializer.fields['reviewer'].widget.choices], - [('', '---------'), (1, 'Person object - 1'), (2, 'Person object - 2')] - ) - - -class DepthTest(TestCase): - def test_implicit_nesting(self): - - writer = Person.objects.create(name="django", age=1) - post = BlogPost.objects.create(title="Test blog post", writer=writer) - comment = BlogPostComment.objects.create(text="Test blog post comment", blog_post=post) - - class BlogPostCommentSerializer(serializers.ModelSerializer): - class Meta: - model = BlogPostComment - depth = 2 - - serializer = BlogPostCommentSerializer(instance=comment) - expected = {'id': 1, 'text': 'Test blog post comment', 'blog_post': {'id': 1, 'title': 'Test blog post', - 'writer': {'id': 1, 'name': 'django', 'age': 1}}} - - self.assertEqual(serializer.data, expected) - - def test_explicit_nesting(self): - writer = Person.objects.create(name="django", age=1) - post = BlogPost.objects.create(title="Test blog post", writer=writer) - comment = BlogPostComment.objects.create(text="Test blog post comment", blog_post=post) - - class PersonSerializer(serializers.ModelSerializer): - class Meta: - model = Person - - class BlogPostSerializer(serializers.ModelSerializer): - writer = PersonSerializer() - - class Meta: - model = BlogPost - - class BlogPostCommentSerializer(serializers.ModelSerializer): - blog_post = BlogPostSerializer() - - class Meta: - model = BlogPostComment - - serializer = BlogPostCommentSerializer(instance=comment) - expected = {'id': 1, 'text': 'Test blog post comment', 'blog_post': {'id': 1, 'title': 'Test blog post', - 'writer': {'id': 1, 'name': 'django', 'age': 1}}} - - self.assertEqual(serializer.data, expected) - - -class NestedSerializerContextTests(TestCase): - - def test_nested_serializer_context(self): - """ - Regression for #497 - - https://github.com/tomchristie/django-rest-framework/issues/497 - """ - class PhotoSerializer(serializers.ModelSerializer): - class Meta: - model = Photo - fields = ("description", "callable") - - callable = serializers.SerializerMethodField('_callable') - - def _callable(self, instance): - if not 'context_item' in self.context: - raise RuntimeError("context isn't getting passed into 2nd level nested serializer") - return "success" - - class AlbumSerializer(serializers.ModelSerializer): - class Meta: - model = Album - fields = ("photo_set", "callable") - - photo_set = PhotoSerializer(source="photo_set") - callable = serializers.SerializerMethodField("_callable") - - def _callable(self, instance): - if not 'context_item' in self.context: - raise RuntimeError("context isn't getting passed into 1st level nested serializer") - return "success" - - class AlbumCollection(object): - albums = None - - class AlbumCollectionSerializer(serializers.Serializer): - albums = AlbumSerializer(source="albums") - - album1 = Album.objects.create(title="album 1") - album2 = Album.objects.create(title="album 2") - Photo.objects.create(description="Bigfoot", album=album1) - Photo.objects.create(description="Unicorn", album=album1) - Photo.objects.create(description="Yeti", album=album2) - Photo.objects.create(description="Sasquatch", album=album2) - album_collection = AlbumCollection() - album_collection.albums = [album1, album2] - - # This will raise RuntimeError if context doesn't get passed correctly to the nested Serializers - AlbumCollectionSerializer(album_collection, context={'context_item': 'album context'}).data - - -class DeserializeListTestCase(TestCase): - - def setUp(self): - self.data = { - 'email': 'nobody@nowhere.com', - 'content': 'This is some test content', - 'created': datetime.datetime(2013, 3, 7), - } - - def test_no_errors(self): - data = [self.data.copy() for x in range(0, 3)] - serializer = CommentSerializer(data=data, many=True) - self.assertTrue(serializer.is_valid()) - self.assertTrue(isinstance(serializer.object, list)) - self.assertTrue( - all((isinstance(item, Comment) for item in serializer.object)) - ) - - def test_errors_return_as_list(self): - invalid_item = self.data.copy() - invalid_item['email'] = '' - data = [self.data.copy(), invalid_item, self.data.copy()] - - serializer = CommentSerializer(data=data, many=True) - self.assertFalse(serializer.is_valid()) - expected = [{}, {'email': ['This field is required.']}, {}] - self.assertEqual(serializer.errors, expected) - - -# Test for issue 747 - -class LazyStringModel(object): - def __init__(self, lazystring): - self.lazystring = lazystring - - -class LazyStringSerializer(serializers.Serializer): - lazystring = serializers.Field() - - def restore_object(self, attrs, instance=None): - if instance is not None: - instance.lazystring = attrs.get('lazystring', instance.lazystring) - return instance - return LazyStringModel(**attrs) - - -class LazyStringsTestCase(TestCase): - def setUp(self): - self.model = LazyStringModel(lazystring=_('lazystring')) - - def test_lazy_strings_are_translated(self): - serializer = LazyStringSerializer(self.model) - self.assertEqual(type(serializer.data['lazystring']), - type('lazystring')) - - -# Test for issue #467 - -class FieldLabelTest(TestCase): - def setUp(self): - self.serializer_class = BasicModelSerializer - - def test_label_from_model(self): - """ - Validates that label and help_text are correctly copied from the model class. - """ - serializer = self.serializer_class() - text_field = serializer.fields['text'] - - self.assertEqual('Text comes here', text_field.label) - self.assertEqual('Text description.', text_field.help_text) - - def test_field_ctor(self): - """ - This is check that ctor supports both label and help_text. - """ - self.assertEqual('Label', fields.Field(label='Label', help_text='Help').label) - self.assertEqual('Help', fields.CharField(label='Label', help_text='Help').help_text) - self.assertEqual('Label', relations.HyperlinkedRelatedField(view_name='fake', label='Label', help_text='Help', many=True).label) - - -# Test for issue #961 - -class ManyFieldHelpTextTest(TestCase): - def test_help_text_no_hold_down_control_msg(self): - """ - Validate that help_text doesn't contain the 'Hold down "Control" ...' - message that Django appends to choice fields. - """ - rel_field = fields.Field(help_text=ManyToManyModel._meta.get_field('rel').help_text) - self.assertEqual('Some help text.', rel_field.help_text) - - -class AttributeMappingOnAutogeneratedFieldsTests(TestCase): - - def setUp(self): - class AMOAFModel(RESTFrameworkModel): - char_field = models.CharField(max_length=1024, blank=True) - comma_separated_integer_field = models.CommaSeparatedIntegerField(max_length=1024, blank=True) - decimal_field = models.DecimalField(max_digits=64, decimal_places=32, blank=True) - email_field = models.EmailField(max_length=1024, blank=True) - file_field = models.FileField(max_length=1024, blank=True) - image_field = models.ImageField(max_length=1024, blank=True) - slug_field = models.SlugField(max_length=1024, blank=True) - url_field = models.URLField(max_length=1024, blank=True) - - class AMOAFSerializer(serializers.ModelSerializer): - class Meta: - model = AMOAFModel - - self.serializer_class = AMOAFSerializer - self.fields_attributes = { - 'char_field': [ - ('max_length', 1024), - ], - 'comma_separated_integer_field': [ - ('max_length', 1024), - ], - 'decimal_field': [ - ('max_digits', 64), - ('decimal_places', 32), - ], - 'email_field': [ - ('max_length', 1024), - ], - 'file_field': [ - ('max_length', 1024), - ], - 'image_field': [ - ('max_length', 1024), - ], - 'slug_field': [ - ('max_length', 1024), - ], - 'url_field': [ - ('max_length', 1024), - ], - } - - def field_test(self, field): - serializer = self.serializer_class(data={}) - self.assertEqual(serializer.is_valid(), True) - - for attribute in self.fields_attributes[field]: - self.assertEqual( - getattr(serializer.fields[field], attribute[0]), - attribute[1] - ) - - def test_char_field(self): - self.field_test('char_field') - - def test_comma_separated_integer_field(self): - self.field_test('comma_separated_integer_field') - - def test_decimal_field(self): - self.field_test('decimal_field') - - def test_email_field(self): - self.field_test('email_field') - - def test_file_field(self): - self.field_test('file_field') - - def test_image_field(self): - self.field_test('image_field') - - def test_slug_field(self): - self.field_test('slug_field') - - def test_url_field(self): - self.field_test('url_field') - - -class DefaultValuesOnAutogeneratedFieldsTests(TestCase): - - def setUp(self): - class DVOAFModel(RESTFrameworkModel): - positive_integer_field = models.PositiveIntegerField(blank=True) - positive_small_integer_field = models.PositiveSmallIntegerField(blank=True) - email_field = models.EmailField(blank=True) - file_field = models.FileField(blank=True) - image_field = models.ImageField(blank=True) - slug_field = models.SlugField(blank=True) - url_field = models.URLField(blank=True) - - class DVOAFSerializer(serializers.ModelSerializer): - class Meta: - model = DVOAFModel - - self.serializer_class = DVOAFSerializer - self.fields_attributes = { - 'positive_integer_field': [ - ('min_value', 0), - ], - 'positive_small_integer_field': [ - ('min_value', 0), - ], - 'email_field': [ - ('max_length', 75), - ], - 'file_field': [ - ('max_length', 100), - ], - 'image_field': [ - ('max_length', 100), - ], - 'slug_field': [ - ('max_length', 50), - ], - 'url_field': [ - ('max_length', 200), - ], - } - - def field_test(self, field): - serializer = self.serializer_class(data={}) - self.assertEqual(serializer.is_valid(), True) - - for attribute in self.fields_attributes[field]: - self.assertEqual( - getattr(serializer.fields[field], attribute[0]), - attribute[1] - ) - - def test_positive_integer_field(self): - self.field_test('positive_integer_field') - - def test_positive_small_integer_field(self): - self.field_test('positive_small_integer_field') - - def test_email_field(self): - self.field_test('email_field') - - def test_file_field(self): - self.field_test('file_field') - - def test_image_field(self): - self.field_test('image_field') - - def test_slug_field(self): - self.field_test('slug_field') - - def test_url_field(self): - self.field_test('url_field') - - -class MetadataSerializer(serializers.Serializer): - field1 = serializers.CharField(3, required=True) - field2 = serializers.CharField(10, required=False) - - -class MetadataSerializerTestCase(TestCase): - def setUp(self): - self.serializer = MetadataSerializer() - - def test_serializer_metadata(self): - metadata = self.serializer.metadata() - expected = { - 'field1': { - 'required': True, - 'max_length': 3, - 'type': 'string', - 'read_only': False - }, - 'field2': { - 'required': False, - 'max_length': 10, - 'type': 'string', - 'read_only': False - } - } - self.assertEqual(expected, metadata) - - -### Regression test for #840 - -class SimpleModel(models.Model): - text = models.CharField(max_length=100) - - -class SimpleModelSerializer(serializers.ModelSerializer): - text = serializers.CharField() - other = serializers.CharField() - - class Meta: - model = SimpleModel - - def validate_other(self, attrs, source): - del attrs['other'] - return attrs - - -class FieldValidationRemovingAttr(TestCase): - def test_removing_non_model_field_in_validation(self): - """ - Removing an attr during field valiation should ensure that it is not - passed through when restoring the object. - - This allows additional non-model fields to be supported. - - Regression test for #840. - """ - serializer = SimpleModelSerializer(data={'text': 'foo', 'other': 'bar'}) - self.assertTrue(serializer.is_valid()) - serializer.save() - self.assertEqual(serializer.object.text, 'foo') - - -### Regression test for #878 - -class SimpleTargetModel(models.Model): - text = models.CharField(max_length=100) - - -class SimplePKSourceModelSerializer(serializers.Serializer): - targets = serializers.PrimaryKeyRelatedField(queryset=SimpleTargetModel.objects.all(), many=True) - text = serializers.CharField() - - -class SimpleSlugSourceModelSerializer(serializers.Serializer): - targets = serializers.SlugRelatedField(queryset=SimpleTargetModel.objects.all(), many=True, slug_field='pk') - text = serializers.CharField() - - -class SerializerSupportsManyRelationships(TestCase): - def setUp(self): - SimpleTargetModel.objects.create(text='foo') - SimpleTargetModel.objects.create(text='bar') - - def test_serializer_supports_pk_many_relationships(self): - """ - Regression test for #878. - - Note that pk behavior has a different code path to usual cases, - for performance reasons. - """ - serializer = SimplePKSourceModelSerializer(data={'text': 'foo', 'targets': [1, 2]}) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.data, {'text': 'foo', 'targets': [1, 2]}) - - def test_serializer_supports_slug_many_relationships(self): - """ - Regression test for #878. - """ - serializer = SimpleSlugSourceModelSerializer(data={'text': 'foo', 'targets': [1, 2]}) - self.assertTrue(serializer.is_valid()) - self.assertEqual(serializer.data, {'text': 'foo', 'targets': [1, 2]}) diff --git a/vendor-local/lib/python/rest_framework/tests/test_serializer_bulk_update.py b/vendor-local/lib/python/rest_framework/tests/test_serializer_bulk_update.py deleted file mode 100644 index 8b0ded1a84f..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_serializer_bulk_update.py +++ /dev/null @@ -1,278 +0,0 @@ -""" -Tests to cover bulk create and update using serializers. -""" -from __future__ import unicode_literals -from django.test import TestCase -from rest_framework import serializers - - -class BulkCreateSerializerTests(TestCase): - """ - Creating multiple instances using serializers. - """ - - def setUp(self): - class BookSerializer(serializers.Serializer): - id = serializers.IntegerField() - title = serializers.CharField(max_length=100) - author = serializers.CharField(max_length=100) - - self.BookSerializer = BookSerializer - - def test_bulk_create_success(self): - """ - Correct bulk update serialization should return the input data. - """ - - data = [ - { - 'id': 0, - 'title': 'The electric kool-aid acid test', - 'author': 'Tom Wolfe' - }, { - 'id': 1, - 'title': 'If this is a man', - 'author': 'Primo Levi' - }, { - 'id': 2, - 'title': 'The wind-up bird chronicle', - 'author': 'Haruki Murakami' - } - ] - - serializer = self.BookSerializer(data=data, many=True) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.object, data) - - def test_bulk_create_errors(self): - """ - Correct bulk update serialization should return the input data. - """ - - data = [ - { - 'id': 0, - 'title': 'The electric kool-aid acid test', - 'author': 'Tom Wolfe' - }, { - 'id': 1, - 'title': 'If this is a man', - 'author': 'Primo Levi' - }, { - 'id': 'foo', - 'title': 'The wind-up bird chronicle', - 'author': 'Haruki Murakami' - } - ] - expected_errors = [ - {}, - {}, - {'id': ['Enter a whole number.']} - ] - - serializer = self.BookSerializer(data=data, many=True) - self.assertEqual(serializer.is_valid(), False) - self.assertEqual(serializer.errors, expected_errors) - - def test_invalid_list_datatype(self): - """ - Data containing list of incorrect data type should return errors. - """ - data = ['foo', 'bar', 'baz'] - serializer = self.BookSerializer(data=data, many=True) - self.assertEqual(serializer.is_valid(), False) - - expected_errors = [ - {'non_field_errors': ['Invalid data']}, - {'non_field_errors': ['Invalid data']}, - {'non_field_errors': ['Invalid data']} - ] - - self.assertEqual(serializer.errors, expected_errors) - - def test_invalid_single_datatype(self): - """ - Data containing a single incorrect data type should return errors. - """ - data = 123 - serializer = self.BookSerializer(data=data, many=True) - self.assertEqual(serializer.is_valid(), False) - - expected_errors = {'non_field_errors': ['Expected a list of items.']} - - self.assertEqual(serializer.errors, expected_errors) - - def test_invalid_single_object(self): - """ - Data containing only a single object, instead of a list of objects - should return errors. - """ - data = { - 'id': 0, - 'title': 'The electric kool-aid acid test', - 'author': 'Tom Wolfe' - } - serializer = self.BookSerializer(data=data, many=True) - self.assertEqual(serializer.is_valid(), False) - - expected_errors = {'non_field_errors': ['Expected a list of items.']} - - self.assertEqual(serializer.errors, expected_errors) - - -class BulkUpdateSerializerTests(TestCase): - """ - Updating multiple instances using serializers. - """ - - def setUp(self): - class Book(object): - """ - A data type that can be persisted to a mock storage backend - with `.save()` and `.delete()`. - """ - object_map = {} - - def __init__(self, id, title, author): - self.id = id - self.title = title - self.author = author - - def save(self): - Book.object_map[self.id] = self - - def delete(self): - del Book.object_map[self.id] - - class BookSerializer(serializers.Serializer): - id = serializers.IntegerField() - title = serializers.CharField(max_length=100) - author = serializers.CharField(max_length=100) - - def restore_object(self, attrs, instance=None): - if instance: - instance.id = attrs['id'] - instance.title = attrs['title'] - instance.author = attrs['author'] - return instance - return Book(**attrs) - - self.Book = Book - self.BookSerializer = BookSerializer - - data = [ - { - 'id': 0, - 'title': 'The electric kool-aid acid test', - 'author': 'Tom Wolfe' - }, { - 'id': 1, - 'title': 'If this is a man', - 'author': 'Primo Levi' - }, { - 'id': 2, - 'title': 'The wind-up bird chronicle', - 'author': 'Haruki Murakami' - } - ] - - for item in data: - book = Book(item['id'], item['title'], item['author']) - book.save() - - def books(self): - """ - Return all the objects in the mock storage backend. - """ - return self.Book.object_map.values() - - def test_bulk_update_success(self): - """ - Correct bulk update serialization should return the input data. - """ - data = [ - { - 'id': 0, - 'title': 'The electric kool-aid acid test', - 'author': 'Tom Wolfe' - }, { - 'id': 2, - 'title': 'Kafka on the shore', - 'author': 'Haruki Murakami' - } - ] - serializer = self.BookSerializer(self.books(), data=data, many=True, allow_add_remove=True) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.data, data) - serializer.save() - new_data = self.BookSerializer(self.books(), many=True).data - - self.assertEqual(data, new_data) - - def test_bulk_update_and_create(self): - """ - Bulk update serialization may also include created items. - """ - data = [ - { - 'id': 0, - 'title': 'The electric kool-aid acid test', - 'author': 'Tom Wolfe' - }, { - 'id': 3, - 'title': 'Kafka on the shore', - 'author': 'Haruki Murakami' - } - ] - serializer = self.BookSerializer(self.books(), data=data, many=True, allow_add_remove=True) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.data, data) - serializer.save() - new_data = self.BookSerializer(self.books(), many=True).data - self.assertEqual(data, new_data) - - def test_bulk_update_invalid_create(self): - """ - Bulk update serialization without allow_add_remove may not create items. - """ - data = [ - { - 'id': 0, - 'title': 'The electric kool-aid acid test', - 'author': 'Tom Wolfe' - }, { - 'id': 3, - 'title': 'Kafka on the shore', - 'author': 'Haruki Murakami' - } - ] - expected_errors = [ - {}, - {'non_field_errors': ['Cannot create a new item, only existing items may be updated.']} - ] - serializer = self.BookSerializer(self.books(), data=data, many=True) - self.assertEqual(serializer.is_valid(), False) - self.assertEqual(serializer.errors, expected_errors) - - def test_bulk_update_error(self): - """ - Incorrect bulk update serialization should return error data. - """ - data = [ - { - 'id': 0, - 'title': 'The electric kool-aid acid test', - 'author': 'Tom Wolfe' - }, { - 'id': 'foo', - 'title': 'Kafka on the shore', - 'author': 'Haruki Murakami' - } - ] - expected_errors = [ - {}, - {'id': ['Enter a whole number.']} - ] - serializer = self.BookSerializer(self.books(), data=data, many=True, allow_add_remove=True) - self.assertEqual(serializer.is_valid(), False) - self.assertEqual(serializer.errors, expected_errors) diff --git a/vendor-local/lib/python/rest_framework/tests/test_serializer_nested.py b/vendor-local/lib/python/rest_framework/tests/test_serializer_nested.py deleted file mode 100644 index 71d0e24b518..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_serializer_nested.py +++ /dev/null @@ -1,246 +0,0 @@ -""" -Tests to cover nested serializers. - -Doesn't cover model serializers. -""" -from __future__ import unicode_literals -from django.test import TestCase -from rest_framework import serializers - - -class WritableNestedSerializerBasicTests(TestCase): - """ - Tests for deserializing nested entities. - Basic tests that use serializers that simply restore to dicts. - """ - - def setUp(self): - class TrackSerializer(serializers.Serializer): - order = serializers.IntegerField() - title = serializers.CharField(max_length=100) - duration = serializers.IntegerField() - - class AlbumSerializer(serializers.Serializer): - album_name = serializers.CharField(max_length=100) - artist = serializers.CharField(max_length=100) - tracks = TrackSerializer(many=True) - - self.AlbumSerializer = AlbumSerializer - - def test_nested_validation_success(self): - """ - Correct nested serialization should return the input data. - """ - - data = { - 'album_name': 'Discovery', - 'artist': 'Daft Punk', - 'tracks': [ - {'order': 1, 'title': 'One More Time', 'duration': 235}, - {'order': 2, 'title': 'Aerodynamic', 'duration': 184}, - {'order': 3, 'title': 'Digital Love', 'duration': 239} - ] - } - - serializer = self.AlbumSerializer(data=data) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.object, data) - - def test_nested_validation_error(self): - """ - Incorrect nested serialization should return appropriate error data. - """ - - data = { - 'album_name': 'Discovery', - 'artist': 'Daft Punk', - 'tracks': [ - {'order': 1, 'title': 'One More Time', 'duration': 235}, - {'order': 2, 'title': 'Aerodynamic', 'duration': 184}, - {'order': 3, 'title': 'Digital Love', 'duration': 'foobar'} - ] - } - expected_errors = { - 'tracks': [ - {}, - {}, - {'duration': ['Enter a whole number.']} - ] - } - - serializer = self.AlbumSerializer(data=data) - self.assertEqual(serializer.is_valid(), False) - self.assertEqual(serializer.errors, expected_errors) - - def test_many_nested_validation_error(self): - """ - Incorrect nested serialization should return appropriate error data - when multiple entities are being deserialized. - """ - - data = [ - { - 'album_name': 'Russian Red', - 'artist': 'I Love Your Glasses', - 'tracks': [ - {'order': 1, 'title': 'Cigarettes', 'duration': 121}, - {'order': 2, 'title': 'No Past Land', 'duration': 198}, - {'order': 3, 'title': 'They Don\'t Believe', 'duration': 191} - ] - }, - { - 'album_name': 'Discovery', - 'artist': 'Daft Punk', - 'tracks': [ - {'order': 1, 'title': 'One More Time', 'duration': 235}, - {'order': 2, 'title': 'Aerodynamic', 'duration': 184}, - {'order': 3, 'title': 'Digital Love', 'duration': 'foobar'} - ] - } - ] - expected_errors = [ - {}, - { - 'tracks': [ - {}, - {}, - {'duration': ['Enter a whole number.']} - ] - } - ] - - serializer = self.AlbumSerializer(data=data, many=True) - self.assertEqual(serializer.is_valid(), False) - self.assertEqual(serializer.errors, expected_errors) - - -class WritableNestedSerializerObjectTests(TestCase): - """ - Tests for deserializing nested entities. - These tests use serializers that restore to concrete objects. - """ - - def setUp(self): - # Couple of concrete objects that we're going to deserialize into - class Track(object): - def __init__(self, order, title, duration): - self.order, self.title, self.duration = order, title, duration - - def __eq__(self, other): - return ( - self.order == other.order and - self.title == other.title and - self.duration == other.duration - ) - - class Album(object): - def __init__(self, album_name, artist, tracks): - self.album_name, self.artist, self.tracks = album_name, artist, tracks - - def __eq__(self, other): - return ( - self.album_name == other.album_name and - self.artist == other.artist and - self.tracks == other.tracks - ) - - # And their corresponding serializers - class TrackSerializer(serializers.Serializer): - order = serializers.IntegerField() - title = serializers.CharField(max_length=100) - duration = serializers.IntegerField() - - def restore_object(self, attrs, instance=None): - return Track(attrs['order'], attrs['title'], attrs['duration']) - - class AlbumSerializer(serializers.Serializer): - album_name = serializers.CharField(max_length=100) - artist = serializers.CharField(max_length=100) - tracks = TrackSerializer(many=True) - - def restore_object(self, attrs, instance=None): - return Album(attrs['album_name'], attrs['artist'], attrs['tracks']) - - self.Album, self.Track = Album, Track - self.AlbumSerializer = AlbumSerializer - - def test_nested_validation_success(self): - """ - Correct nested serialization should return a restored object - that corresponds to the input data. - """ - - data = { - 'album_name': 'Discovery', - 'artist': 'Daft Punk', - 'tracks': [ - {'order': 1, 'title': 'One More Time', 'duration': 235}, - {'order': 2, 'title': 'Aerodynamic', 'duration': 184}, - {'order': 3, 'title': 'Digital Love', 'duration': 239} - ] - } - expected_object = self.Album( - album_name='Discovery', - artist='Daft Punk', - tracks=[ - self.Track(order=1, title='One More Time', duration=235), - self.Track(order=2, title='Aerodynamic', duration=184), - self.Track(order=3, title='Digital Love', duration=239), - ] - ) - - serializer = self.AlbumSerializer(data=data) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.object, expected_object) - - def test_many_nested_validation_success(self): - """ - Correct nested serialization should return multiple restored objects - that corresponds to the input data when multiple objects are - being deserialized. - """ - - data = [ - { - 'album_name': 'Russian Red', - 'artist': 'I Love Your Glasses', - 'tracks': [ - {'order': 1, 'title': 'Cigarettes', 'duration': 121}, - {'order': 2, 'title': 'No Past Land', 'duration': 198}, - {'order': 3, 'title': 'They Don\'t Believe', 'duration': 191} - ] - }, - { - 'album_name': 'Discovery', - 'artist': 'Daft Punk', - 'tracks': [ - {'order': 1, 'title': 'One More Time', 'duration': 235}, - {'order': 2, 'title': 'Aerodynamic', 'duration': 184}, - {'order': 3, 'title': 'Digital Love', 'duration': 239} - ] - } - ] - expected_object = [ - self.Album( - album_name='Russian Red', - artist='I Love Your Glasses', - tracks=[ - self.Track(order=1, title='Cigarettes', duration=121), - self.Track(order=2, title='No Past Land', duration=198), - self.Track(order=3, title='They Don\'t Believe', duration=191), - ] - ), - self.Album( - album_name='Discovery', - artist='Daft Punk', - tracks=[ - self.Track(order=1, title='One More Time', duration=235), - self.Track(order=2, title='Aerodynamic', duration=184), - self.Track(order=3, title='Digital Love', duration=239), - ] - ) - ] - - serializer = self.AlbumSerializer(data=data, many=True) - self.assertEqual(serializer.is_valid(), True) - self.assertEqual(serializer.object, expected_object) diff --git a/vendor-local/lib/python/rest_framework/tests/test_settings.py b/vendor-local/lib/python/rest_framework/tests/test_settings.py deleted file mode 100644 index 857375c212c..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_settings.py +++ /dev/null @@ -1,22 +0,0 @@ -"""Tests for the settings module""" -from __future__ import unicode_literals -from django.test import TestCase - -from rest_framework.settings import APISettings, DEFAULTS, IMPORT_STRINGS - - -class TestSettings(TestCase): - """Tests relating to the api settings""" - - def test_non_import_errors(self): - """Make sure other errors aren't suppressed.""" - settings = APISettings({'DEFAULT_MODEL_SERIALIZER_CLASS': 'rest_framework.tests.extras.bad_import.ModelSerializer'}, DEFAULTS, IMPORT_STRINGS) - with self.assertRaises(ValueError): - settings.DEFAULT_MODEL_SERIALIZER_CLASS - - def test_import_error_message_maintained(self): - """Make sure real import errors are captured and raised sensibly.""" - settings = APISettings({'DEFAULT_MODEL_SERIALIZER_CLASS': 'rest_framework.tests.extras.not_here.ModelSerializer'}, DEFAULTS, IMPORT_STRINGS) - with self.assertRaises(ImportError) as cm: - settings.DEFAULT_MODEL_SERIALIZER_CLASS - self.assertTrue('ImportError' in str(cm.exception)) diff --git a/vendor-local/lib/python/rest_framework/tests/test_testing.py b/vendor-local/lib/python/rest_framework/tests/test_testing.py deleted file mode 100644 index 49d45fc2927..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_testing.py +++ /dev/null @@ -1,115 +0,0 @@ -# -- coding: utf-8 -- - -from __future__ import unicode_literals -from django.contrib.auth.models import User -from django.test import TestCase -from rest_framework.compat import patterns, url -from rest_framework.decorators import api_view -from rest_framework.response import Response -from rest_framework.test import APIClient, APIRequestFactory, force_authenticate - - -@api_view(['GET', 'POST']) -def view(request): - return Response({ - 'auth': request.META.get('HTTP_AUTHORIZATION', b''), - 'user': request.user.username - }) - - -urlpatterns = patterns('', - url(r'^view/$', view), -) - - -class TestAPITestClient(TestCase): - urls = 'rest_framework.tests.test_testing' - - def setUp(self): - self.client = APIClient() - - def test_credentials(self): - """ - Setting `.credentials()` adds the required headers to each request. - """ - self.client.credentials(HTTP_AUTHORIZATION='example') - for _ in range(0, 3): - response = self.client.get('/view/') - self.assertEqual(response.data['auth'], 'example') - - def test_force_authenticate(self): - """ - Setting `.force_authenticate()` forcibly authenticates each request. - """ - user = User.objects.create_user('example', 'example@example.com') - self.client.force_authenticate(user) - response = self.client.get('/view/') - self.assertEqual(response.data['user'], 'example') - - def test_csrf_exempt_by_default(self): - """ - By default, the test client is CSRF exempt. - """ - User.objects.create_user('example', 'example@example.com', 'password') - self.client.login(username='example', password='password') - response = self.client.post('/view/') - self.assertEqual(response.status_code, 200) - - def test_explicitly_enforce_csrf_checks(self): - """ - The test client can enforce CSRF checks. - """ - client = APIClient(enforce_csrf_checks=True) - User.objects.create_user('example', 'example@example.com', 'password') - client.login(username='example', password='password') - response = client.post('/view/') - expected = {'detail': 'CSRF Failed: CSRF cookie not set.'} - self.assertEqual(response.status_code, 403) - self.assertEqual(response.data, expected) - - -class TestAPIRequestFactory(TestCase): - def test_csrf_exempt_by_default(self): - """ - By default, the test client is CSRF exempt. - """ - user = User.objects.create_user('example', 'example@example.com', 'password') - factory = APIRequestFactory() - request = factory.post('/view/') - request.user = user - response = view(request) - self.assertEqual(response.status_code, 200) - - def test_explicitly_enforce_csrf_checks(self): - """ - The test client can enforce CSRF checks. - """ - user = User.objects.create_user('example', 'example@example.com', 'password') - factory = APIRequestFactory(enforce_csrf_checks=True) - request = factory.post('/view/') - request.user = user - response = view(request) - expected = {'detail': 'CSRF Failed: CSRF cookie not set.'} - self.assertEqual(response.status_code, 403) - self.assertEqual(response.data, expected) - - def test_invalid_format(self): - """ - Attempting to use a format that is not configured will raise an - assertion error. - """ - factory = APIRequestFactory() - self.assertRaises(AssertionError, factory.post, - path='/view/', data={'example': 1}, format='xml' - ) - - def test_force_authenticate(self): - """ - Setting `force_authenticate()` forcibly authenticates the request. - """ - user = User.objects.create_user('example', 'example@example.com') - factory = APIRequestFactory() - request = factory.get('/view') - force_authenticate(request, user=user) - response = view(request) - self.assertEqual(response.data['user'], 'example') diff --git a/vendor-local/lib/python/rest_framework/tests/test_throttling.py b/vendor-local/lib/python/rest_framework/tests/test_throttling.py deleted file mode 100644 index 41bff6926a2..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_throttling.py +++ /dev/null @@ -1,277 +0,0 @@ -""" -Tests for the throttling implementations in the permissions module. -""" -from __future__ import unicode_literals -from django.test import TestCase -from django.contrib.auth.models import User -from django.core.cache import cache -from rest_framework.test import APIRequestFactory -from rest_framework.views import APIView -from rest_framework.throttling import BaseThrottle, UserRateThrottle, ScopedRateThrottle -from rest_framework.response import Response - - -class User3SecRateThrottle(UserRateThrottle): - rate = '3/sec' - scope = 'seconds' - - -class User3MinRateThrottle(UserRateThrottle): - rate = '3/min' - scope = 'minutes' - - -class NonTimeThrottle(BaseThrottle): - def allow_request(self, request, view): - if not hasattr(self.__class__, 'called'): - self.__class__.called = True - return True - return False - - -class MockView(APIView): - throttle_classes = (User3SecRateThrottle,) - - def get(self, request): - return Response('foo') - - -class MockView_MinuteThrottling(APIView): - throttle_classes = (User3MinRateThrottle,) - - def get(self, request): - return Response('foo') - - -class MockView_NonTimeThrottling(APIView): - throttle_classes = (NonTimeThrottle,) - - def get(self, request): - return Response('foo') - - -class ThrottlingTests(TestCase): - def setUp(self): - """ - Reset the cache so that no throttles will be active - """ - cache.clear() - self.factory = APIRequestFactory() - - def test_requests_are_throttled(self): - """ - Ensure request rate is limited - """ - request = self.factory.get('/') - for dummy in range(4): - response = MockView.as_view()(request) - self.assertEqual(429, response.status_code) - - def set_throttle_timer(self, view, value): - """ - Explicitly set the timer, overriding time.time() - """ - view.throttle_classes[0].timer = lambda self: value - - def test_request_throttling_expires(self): - """ - Ensure request rate is limited for a limited duration only - """ - self.set_throttle_timer(MockView, 0) - - request = self.factory.get('/') - for dummy in range(4): - response = MockView.as_view()(request) - self.assertEqual(429, response.status_code) - - # Advance the timer by one second - self.set_throttle_timer(MockView, 1) - - response = MockView.as_view()(request) - self.assertEqual(200, response.status_code) - - def ensure_is_throttled(self, view, expect): - request = self.factory.get('/') - request.user = User.objects.create(username='a') - for dummy in range(3): - view.as_view()(request) - request.user = User.objects.create(username='b') - response = view.as_view()(request) - self.assertEqual(expect, response.status_code) - - def test_request_throttling_is_per_user(self): - """ - Ensure request rate is only limited per user, not globally for - PerUserThrottles - """ - self.ensure_is_throttled(MockView, 200) - - def ensure_response_header_contains_proper_throttle_field(self, view, expected_headers): - """ - Ensure the response returns an X-Throttle field with status and next attributes - set properly. - """ - request = self.factory.get('/') - for timer, expect in expected_headers: - self.set_throttle_timer(view, timer) - response = view.as_view()(request) - if expect is not None: - self.assertEqual(response['X-Throttle-Wait-Seconds'], expect) - else: - self.assertFalse('X-Throttle-Wait-Seconds' in response) - - def test_seconds_fields(self): - """ - Ensure for second based throttles. - """ - self.ensure_response_header_contains_proper_throttle_field(MockView, - ((0, None), - (0, None), - (0, None), - (0, '1') - )) - - def test_minutes_fields(self): - """ - Ensure for minute based throttles. - """ - self.ensure_response_header_contains_proper_throttle_field(MockView_MinuteThrottling, - ((0, None), - (0, None), - (0, None), - (0, '60') - )) - - def test_next_rate_remains_constant_if_followed(self): - """ - If a client follows the recommended next request rate, - the throttling rate should stay constant. - """ - self.ensure_response_header_contains_proper_throttle_field(MockView_MinuteThrottling, - ((0, None), - (20, None), - (40, None), - (60, None), - (80, None) - )) - - def test_non_time_throttle(self): - """ - Ensure for second based throttles. - """ - request = self.factory.get('/') - - self.assertFalse(hasattr(MockView_NonTimeThrottling.throttle_classes[0], 'called')) - - response = MockView_NonTimeThrottling.as_view()(request) - self.assertFalse('X-Throttle-Wait-Seconds' in response) - - self.assertTrue(MockView_NonTimeThrottling.throttle_classes[0].called) - - response = MockView_NonTimeThrottling.as_view()(request) - self.assertFalse('X-Throttle-Wait-Seconds' in response) - - -class ScopedRateThrottleTests(TestCase): - """ - Tests for ScopedRateThrottle. - """ - - def setUp(self): - class XYScopedRateThrottle(ScopedRateThrottle): - TIMER_SECONDS = 0 - THROTTLE_RATES = {'x': '3/min', 'y': '1/min'} - timer = lambda self: self.TIMER_SECONDS - - class XView(APIView): - throttle_classes = (XYScopedRateThrottle,) - throttle_scope = 'x' - - def get(self, request): - return Response('x') - - class YView(APIView): - throttle_classes = (XYScopedRateThrottle,) - throttle_scope = 'y' - - def get(self, request): - return Response('y') - - class UnscopedView(APIView): - throttle_classes = (XYScopedRateThrottle,) - - def get(self, request): - return Response('y') - - self.throttle_class = XYScopedRateThrottle - self.factory = APIRequestFactory() - self.x_view = XView.as_view() - self.y_view = YView.as_view() - self.unscoped_view = UnscopedView.as_view() - - def increment_timer(self, seconds=1): - self.throttle_class.TIMER_SECONDS += seconds - - def test_scoped_rate_throttle(self): - request = self.factory.get('/') - - # Should be able to hit x view 3 times per minute. - response = self.x_view(request) - self.assertEqual(200, response.status_code) - - self.increment_timer() - response = self.x_view(request) - self.assertEqual(200, response.status_code) - - self.increment_timer() - response = self.x_view(request) - self.assertEqual(200, response.status_code) - - self.increment_timer() - response = self.x_view(request) - self.assertEqual(429, response.status_code) - - # Should be able to hit y view 1 time per minute. - self.increment_timer() - response = self.y_view(request) - self.assertEqual(200, response.status_code) - - self.increment_timer() - response = self.y_view(request) - self.assertEqual(429, response.status_code) - - # Ensure throttles properly reset by advancing the rest of the minute - self.increment_timer(55) - - # Should still be able to hit x view 3 times per minute. - response = self.x_view(request) - self.assertEqual(200, response.status_code) - - self.increment_timer() - response = self.x_view(request) - self.assertEqual(200, response.status_code) - - self.increment_timer() - response = self.x_view(request) - self.assertEqual(200, response.status_code) - - self.increment_timer() - response = self.x_view(request) - self.assertEqual(429, response.status_code) - - # Should still be able to hit y view 1 time per minute. - self.increment_timer() - response = self.y_view(request) - self.assertEqual(200, response.status_code) - - self.increment_timer() - response = self.y_view(request) - self.assertEqual(429, response.status_code) - - def test_unscoped_view_not_throttled(self): - request = self.factory.get('/') - - for idx in range(10): - self.increment_timer() - response = self.unscoped_view(request) - self.assertEqual(200, response.status_code) diff --git a/vendor-local/lib/python/rest_framework/tests/test_urlpatterns.py b/vendor-local/lib/python/rest_framework/tests/test_urlpatterns.py deleted file mode 100644 index 8132ec4c8e6..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_urlpatterns.py +++ /dev/null @@ -1,76 +0,0 @@ -from __future__ import unicode_literals -from collections import namedtuple -from django.core import urlresolvers -from django.test import TestCase -from rest_framework.test import APIRequestFactory -from rest_framework.compat import patterns, url, include -from rest_framework.urlpatterns import format_suffix_patterns - - -# A container class for test paths for the test case -URLTestPath = namedtuple('URLTestPath', ['path', 'args', 'kwargs']) - - -def dummy_view(request, *args, **kwargs): - pass - - -class FormatSuffixTests(TestCase): - """ - Tests `format_suffix_patterns` against different URLPatterns to ensure the URLs still resolve properly, including any captured parameters. - """ - def _resolve_urlpatterns(self, urlpatterns, test_paths): - factory = APIRequestFactory() - try: - urlpatterns = format_suffix_patterns(urlpatterns) - except Exception: - self.fail("Failed to apply `format_suffix_patterns` on the supplied urlpatterns") - resolver = urlresolvers.RegexURLResolver(r'^/', urlpatterns) - for test_path in test_paths: - request = factory.get(test_path.path) - try: - callback, callback_args, callback_kwargs = resolver.resolve(request.path_info) - except Exception: - self.fail("Failed to resolve URL: %s" % request.path_info) - self.assertEqual(callback_args, test_path.args) - self.assertEqual(callback_kwargs, test_path.kwargs) - - def test_format_suffix(self): - urlpatterns = patterns( - '', - url(r'^test$', dummy_view), - ) - test_paths = [ - URLTestPath('/test', (), {}), - URLTestPath('/test.api', (), {'format': 'api'}), - URLTestPath('/test.asdf', (), {'format': 'asdf'}), - ] - self._resolve_urlpatterns(urlpatterns, test_paths) - - def test_default_args(self): - urlpatterns = patterns( - '', - url(r'^test$', dummy_view, {'foo': 'bar'}), - ) - test_paths = [ - URLTestPath('/test', (), {'foo': 'bar', }), - URLTestPath('/test.api', (), {'foo': 'bar', 'format': 'api'}), - URLTestPath('/test.asdf', (), {'foo': 'bar', 'format': 'asdf'}), - ] - self._resolve_urlpatterns(urlpatterns, test_paths) - - def test_included_urls(self): - nested_patterns = patterns( - '', - url(r'^path$', dummy_view) - ) - urlpatterns = patterns( - '', - url(r'^test/', include(nested_patterns), {'foo': 'bar'}), - ) - test_paths = [ - URLTestPath('/test/path', (), {'foo': 'bar', }), - URLTestPath('/test/path.api', (), {'foo': 'bar', 'format': 'api'}), - URLTestPath('/test/path.asdf', (), {'foo': 'bar', 'format': 'asdf'}), - ] - self._resolve_urlpatterns(urlpatterns, test_paths) diff --git a/vendor-local/lib/python/rest_framework/tests/test_validation.py b/vendor-local/lib/python/rest_framework/tests/test_validation.py deleted file mode 100644 index ebfdff9cd18..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_validation.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import unicode_literals -from django.db import models -from django.test import TestCase -from rest_framework import generics, serializers, status -from rest_framework.test import APIRequestFactory - -factory = APIRequestFactory() - - -# Regression for #666 - -class ValidationModel(models.Model): - blank_validated_field = models.CharField(max_length=255) - - -class ValidationModelSerializer(serializers.ModelSerializer): - class Meta: - model = ValidationModel - fields = ('blank_validated_field',) - read_only_fields = ('blank_validated_field',) - - -class UpdateValidationModel(generics.RetrieveUpdateDestroyAPIView): - model = ValidationModel - serializer_class = ValidationModelSerializer - - -class TestPreSaveValidationExclusions(TestCase): - def test_pre_save_validation_exclusions(self): - """ - Somewhat weird test case to ensure that we don't perform model - validation on read only fields. - """ - obj = ValidationModel.objects.create(blank_validated_field='') - request = factory.put('/', {}, format='json') - view = UpdateValidationModel().as_view() - response = view(request, pk=obj.pk).render() - self.assertEqual(response.status_code, status.HTTP_200_OK) - - -# Regression for #653 - -class ShouldValidateModel(models.Model): - should_validate_field = models.CharField(max_length=255) - - -class ShouldValidateModelSerializer(serializers.ModelSerializer): - renamed = serializers.CharField(source='should_validate_field', required=False) - - class Meta: - model = ShouldValidateModel - fields = ('renamed',) - - -class TestPreSaveValidationExclusions(TestCase): - def test_renamed_fields_are_model_validated(self): - """ - Ensure fields with 'source' applied do get still get model validation. - """ - # We've set `required=False` on the serializer, but the model - # does not have `blank=True`, so this serializer should not validate. - serializer = ShouldValidateModelSerializer(data={'renamed': ''}) - self.assertEqual(serializer.is_valid(), False) - - -class ValidationSerializer(serializers.Serializer): - foo = serializers.CharField() - - def validate_foo(self, attrs, source): - raise serializers.ValidationError("foo invalid") - - def validate(self, attrs): - raise serializers.ValidationError("serializer invalid") - - -class TestAvoidValidation(TestCase): - """ - If serializer was initialized with invalid data (None or non dict-like), it - should avoid validation layer (validate_<field> and validate methods) - """ - def test_serializer_errors_has_only_invalid_data_error(self): - serializer = ValidationSerializer(data='invalid data') - self.assertFalse(serializer.is_valid()) - self.assertDictEqual(serializer.errors, - {'non_field_errors': ['Invalid data']}) diff --git a/vendor-local/lib/python/rest_framework/tests/test_views.py b/vendor-local/lib/python/rest_framework/tests/test_views.py deleted file mode 100644 index c0bec5aed15..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/test_views.py +++ /dev/null @@ -1,101 +0,0 @@ -from __future__ import unicode_literals - -import copy -from django.test import TestCase -from rest_framework import status -from rest_framework.decorators import api_view -from rest_framework.response import Response -from rest_framework.settings import api_settings -from rest_framework.test import APIRequestFactory -from rest_framework.views import APIView - -factory = APIRequestFactory() - - -class BasicView(APIView): - def get(self, request, *args, **kwargs): - return Response({'method': 'GET'}) - - def post(self, request, *args, **kwargs): - return Response({'method': 'POST', 'data': request.DATA}) - - -@api_view(['GET', 'POST', 'PUT', 'PATCH']) -def basic_view(request): - if request.method == 'GET': - return {'method': 'GET'} - elif request.method == 'POST': - return {'method': 'POST', 'data': request.DATA} - elif request.method == 'PUT': - return {'method': 'PUT', 'data': request.DATA} - elif request.method == 'PATCH': - return {'method': 'PATCH', 'data': request.DATA} - - -def sanitise_json_error(error_dict): - """ - Exact contents of JSON error messages depend on the installed version - of json. - """ - ret = copy.copy(error_dict) - chop = len('JSON parse error - No JSON object could be decoded') - ret['detail'] = ret['detail'][:chop] - return ret - - -class ClassBasedViewIntegrationTests(TestCase): - def setUp(self): - self.view = BasicView.as_view() - - def test_400_parse_error(self): - request = factory.post('/', 'f00bar', content_type='application/json') - response = self.view(request) - expected = { - 'detail': 'JSON parse error - No JSON object could be decoded' - } - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertEqual(sanitise_json_error(response.data), expected) - - def test_400_parse_error_tunneled_content(self): - content = 'f00bar' - content_type = 'application/json' - form_data = { - api_settings.FORM_CONTENT_OVERRIDE: content, - api_settings.FORM_CONTENTTYPE_OVERRIDE: content_type - } - request = factory.post('/', form_data) - response = self.view(request) - expected = { - 'detail': 'JSON parse error - No JSON object could be decoded' - } - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertEqual(sanitise_json_error(response.data), expected) - - -class FunctionBasedViewIntegrationTests(TestCase): - def setUp(self): - self.view = basic_view - - def test_400_parse_error(self): - request = factory.post('/', 'f00bar', content_type='application/json') - response = self.view(request) - expected = { - 'detail': 'JSON parse error - No JSON object could be decoded' - } - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertEqual(sanitise_json_error(response.data), expected) - - def test_400_parse_error_tunneled_content(self): - content = 'f00bar' - content_type = 'application/json' - form_data = { - api_settings.FORM_CONTENT_OVERRIDE: content, - api_settings.FORM_CONTENTTYPE_OVERRIDE: content_type - } - request = factory.post('/', form_data) - response = self.view(request) - expected = { - 'detail': 'JSON parse error - No JSON object could be decoded' - } - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertEqual(sanitise_json_error(response.data), expected) diff --git a/vendor-local/lib/python/rest_framework/tests/tests.py b/vendor-local/lib/python/rest_framework/tests/tests.py deleted file mode 100644 index 554ebd1ad21..00000000000 --- a/vendor-local/lib/python/rest_framework/tests/tests.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -Force import of all modules in this package in order to get the standard test -runner to pick up the tests. Yowzers. -""" -from __future__ import unicode_literals -import os -import django - -modules = [filename.rsplit('.', 1)[0] - for filename in os.listdir(os.path.dirname(__file__)) - if filename.endswith('.py') and not filename.startswith('_')] -__test__ = dict() - -if django.VERSION < (1, 6): - for module in modules: - exec("from rest_framework.tests.%s import *" % module) diff --git a/vendor-local/lib/python/rest_framework/throttling.py b/vendor-local/lib/python/rest_framework/throttling.py deleted file mode 100644 index 65b4559307c..00000000000 --- a/vendor-local/lib/python/rest_framework/throttling.py +++ /dev/null @@ -1,229 +0,0 @@ -""" -Provides various throttling policies. -""" -from __future__ import unicode_literals -from django.core.cache import cache -from django.core.exceptions import ImproperlyConfigured -from rest_framework.settings import api_settings -import time - - -class BaseThrottle(object): - """ - Rate throttling of requests. - """ - def allow_request(self, request, view): - """ - Return `True` if the request should be allowed, `False` otherwise. - """ - raise NotImplementedError('.allow_request() must be overridden') - - def wait(self): - """ - Optionally, return a recommended number of seconds to wait before - the next request. - """ - return None - - -class SimpleRateThrottle(BaseThrottle): - """ - A simple cache implementation, that only requires `.get_cache_key()` - to be overridden. - - The rate (requests / seconds) is set by a `throttle` attribute on the View - class. The attribute is a string of the form 'number_of_requests/period'. - - Period should be one of: ('s', 'sec', 'm', 'min', 'h', 'hour', 'd', 'day') - - Previous request information used for throttling is stored in the cache. - """ - - timer = time.time - cache_format = 'throtte_%(scope)s_%(ident)s' - scope = None - THROTTLE_RATES = api_settings.DEFAULT_THROTTLE_RATES - - def __init__(self): - if not getattr(self, 'rate', None): - self.rate = self.get_rate() - self.num_requests, self.duration = self.parse_rate(self.rate) - - def get_cache_key(self, request, view): - """ - Should return a unique cache-key which can be used for throttling. - Must be overridden. - - May return `None` if the request should not be throttled. - """ - raise NotImplementedError('.get_cache_key() must be overridden') - - def get_rate(self): - """ - Determine the string representation of the allowed request rate. - """ - if not getattr(self, 'scope', None): - msg = ("You must set either `.scope` or `.rate` for '%s' throttle" % - self.__class__.__name__) - raise ImproperlyConfigured(msg) - - try: - return self.THROTTLE_RATES[self.scope] - except KeyError: - msg = "No default throttle rate set for '%s' scope" % self.scope - raise ImproperlyConfigured(msg) - - def parse_rate(self, rate): - """ - Given the request rate string, return a two tuple of: - <allowed number of requests>, <period of time in seconds> - """ - if rate is None: - return (None, None) - num, period = rate.split('/') - num_requests = int(num) - duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}[period[0]] - return (num_requests, duration) - - def allow_request(self, request, view): - """ - Implement the check to see if the request should be throttled. - - On success calls `throttle_success`. - On failure calls `throttle_failure`. - """ - if self.rate is None: - return True - - self.key = self.get_cache_key(request, view) - if self.key is None: - return True - - self.history = cache.get(self.key, []) - self.now = self.timer() - - # Drop any requests from the history which have now passed the - # throttle duration - while self.history and self.history[-1] <= self.now - self.duration: - self.history.pop() - if len(self.history) >= self.num_requests: - return self.throttle_failure() - return self.throttle_success() - - def throttle_success(self): - """ - Inserts the current request's timestamp along with the key - into the cache. - """ - self.history.insert(0, self.now) - cache.set(self.key, self.history, self.duration) - return True - - def throttle_failure(self): - """ - Called when a request to the API has failed due to throttling. - """ - return False - - def wait(self): - """ - Returns the recommended next request time in seconds. - """ - if self.history: - remaining_duration = self.duration - (self.now - self.history[-1]) - else: - remaining_duration = self.duration - - available_requests = self.num_requests - len(self.history) + 1 - - return remaining_duration / float(available_requests) - - -class AnonRateThrottle(SimpleRateThrottle): - """ - Limits the rate of API calls that may be made by a anonymous users. - - The IP address of the request will be used as the unique cache key. - """ - scope = 'anon' - - def get_cache_key(self, request, view): - if request.user.is_authenticated(): - return None # Only throttle unauthenticated requests. - - ident = request.META.get('REMOTE_ADDR', None) - - return self.cache_format % { - 'scope': self.scope, - 'ident': ident - } - - -class UserRateThrottle(SimpleRateThrottle): - """ - Limits the rate of API calls that may be made by a given user. - - The user id will be used as a unique cache key if the user is - authenticated. For anonymous requests, the IP address of the request will - be used. - """ - scope = 'user' - - def get_cache_key(self, request, view): - if request.user.is_authenticated(): - ident = request.user.id - else: - ident = request.META.get('REMOTE_ADDR', None) - - return self.cache_format % { - 'scope': self.scope, - 'ident': ident - } - - -class ScopedRateThrottle(SimpleRateThrottle): - """ - Limits the rate of API calls by different amounts for various parts of - the API. Any view that has the `throttle_scope` property set will be - throttled. The unique cache key will be generated by concatenating the - user id of the request, and the scope of the view being accessed. - """ - scope_attr = 'throttle_scope' - - def __init__(self): - # Override the usual SimpleRateThrottle, because we can't determine - # the rate until called by the view. - pass - - def allow_request(self, request, view): - # We can only determine the scope once we're called by the view. - self.scope = getattr(view, self.scope_attr, None) - - # If a view does not have a `throttle_scope` always allow the request - if not self.scope: - return True - - # Determine the allowed request rate as we normally would during - # the `__init__` call. - self.rate = self.get_rate() - self.num_requests, self.duration = self.parse_rate(self.rate) - - # We can now proceed as normal. - return super(ScopedRateThrottle, self).allow_request(request, view) - - def get_cache_key(self, request, view): - """ - If `view.throttle_scope` is not set, don't apply this throttle. - - Otherwise generate the unique cache key by concatenating the user id - with the '.throttle_scope` property of the view. - """ - if request.user.is_authenticated(): - ident = request.user.id - else: - ident = request.META.get('REMOTE_ADDR', None) - - return self.cache_format % { - 'scope': self.scope, - 'ident': ident - } diff --git a/vendor-local/lib/python/rest_framework/urlpatterns.py b/vendor-local/lib/python/rest_framework/urlpatterns.py deleted file mode 100644 index d9143bb4c91..00000000000 --- a/vendor-local/lib/python/rest_framework/urlpatterns.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import unicode_literals -from django.core.urlresolvers import RegexURLResolver -from rest_framework.compat import url, include -from rest_framework.settings import api_settings - - -def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required): - ret = [] - for urlpattern in urlpatterns: - if isinstance(urlpattern, RegexURLResolver): - # Set of included URL patterns - regex = urlpattern.regex.pattern - namespace = urlpattern.namespace - app_name = urlpattern.app_name - kwargs = urlpattern.default_kwargs - # Add in the included patterns, after applying the suffixes - patterns = apply_suffix_patterns(urlpattern.url_patterns, - suffix_pattern, - suffix_required) - ret.append(url(regex, include(patterns, namespace, app_name), kwargs)) - - else: - # Regular URL pattern - regex = urlpattern.regex.pattern.rstrip('$') + suffix_pattern - view = urlpattern._callback or urlpattern._callback_str - kwargs = urlpattern.default_args - name = urlpattern.name - # Add in both the existing and the new urlpattern - if not suffix_required: - ret.append(urlpattern) - ret.append(url(regex, view, kwargs, name)) - - return ret - - -def format_suffix_patterns(urlpatterns, suffix_required=False, allowed=None): - """ - Supplement existing urlpatterns with corresponding patterns that also - include a '.format' suffix. Retains urlpattern ordering. - - urlpatterns: - A list of URL patterns. - - suffix_required: - If `True`, only suffixed URLs will be generated, and non-suffixed - URLs will not be used. Defaults to `False`. - - allowed: - An optional tuple/list of allowed suffixes. eg ['json', 'api'] - Defaults to `None`, which allows any suffix. - """ - suffix_kwarg = api_settings.FORMAT_SUFFIX_KWARG - if allowed: - if len(allowed) == 1: - allowed_pattern = allowed[0] - else: - allowed_pattern = '(%s)' % '|'.join(allowed) - suffix_pattern = r'\.(?P<%s>%s)$' % (suffix_kwarg, allowed_pattern) - else: - suffix_pattern = r'\.(?P<%s>[a-z]+)$' % suffix_kwarg - - return apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required) diff --git a/vendor-local/lib/python/rest_framework/urls.py b/vendor-local/lib/python/rest_framework/urls.py deleted file mode 100644 index 9c4719f1d45..00000000000 --- a/vendor-local/lib/python/rest_framework/urls.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -Login and logout views for the browsable API. - -Add these to your root URLconf if you're using the browsable API and -your API requires authentication. - -The urls must be namespaced as 'rest_framework', and you should make sure -your authentication settings include `SessionAuthentication`. - - urlpatterns = patterns('', - ... - url(r'^auth', include('rest_framework.urls', namespace='rest_framework')) - ) -""" -from __future__ import unicode_literals -from rest_framework.compat import patterns, url - - -template_name = {'template_name': 'rest_framework/login.html'} - -urlpatterns = patterns('django.contrib.auth.views', - url(r'^login/$', 'login', template_name, name='login'), - url(r'^logout/$', 'logout', template_name, name='logout'), -) diff --git a/vendor-local/lib/python/rest_framework/utils/__init__.py b/vendor-local/lib/python/rest_framework/utils/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/rest_framework/utils/breadcrumbs.py b/vendor-local/lib/python/rest_framework/utils/breadcrumbs.py deleted file mode 100644 index d51374b0a87..00000000000 --- a/vendor-local/lib/python/rest_framework/utils/breadcrumbs.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import unicode_literals -from django.core.urlresolvers import resolve, get_script_prefix -from rest_framework.utils.formatting import get_view_name - - -def get_breadcrumbs(url): - """ - Given a url returns a list of breadcrumbs, which are each a - tuple of (name, url). - """ - - from rest_framework.views import APIView - - def breadcrumbs_recursive(url, breadcrumbs_list, prefix, seen): - """ - Add tuples of (name, url) to the breadcrumbs list, - progressively chomping off parts of the url. - """ - - try: - (view, unused_args, unused_kwargs) = resolve(url) - except Exception: - pass - else: - # Check if this is a REST framework view, - # and if so add it to the breadcrumbs - cls = getattr(view, 'cls', None) - if cls is not None and issubclass(cls, APIView): - # Don't list the same view twice in a row. - # Probably an optional trailing slash. - if not seen or seen[-1] != view: - suffix = getattr(view, 'suffix', None) - name = get_view_name(view.cls, suffix) - breadcrumbs_list.insert(0, (name, prefix + url)) - seen.append(view) - - if url == '': - # All done - return breadcrumbs_list - - elif url.endswith('/'): - # Drop trailing slash off the end and continue to try to - # resolve more breadcrumbs - url = url.rstrip('/') - return breadcrumbs_recursive(url, breadcrumbs_list, prefix, seen) - - # Drop trailing non-slash off the end and continue to try to - # resolve more breadcrumbs - url = url[:url.rfind('/') + 1] - return breadcrumbs_recursive(url, breadcrumbs_list, prefix, seen) - - prefix = get_script_prefix().rstrip('/') - url = url[len(prefix):] - return breadcrumbs_recursive(url, [], prefix, []) diff --git a/vendor-local/lib/python/rest_framework/utils/encoders.py b/vendor-local/lib/python/rest_framework/utils/encoders.py deleted file mode 100644 index b26a2085a82..00000000000 --- a/vendor-local/lib/python/rest_framework/utils/encoders.py +++ /dev/null @@ -1,97 +0,0 @@ -""" -Helper classes for parsers. -""" -from __future__ import unicode_literals -from django.utils.datastructures import SortedDict -from django.utils.functional import Promise -from rest_framework.compat import timezone, force_text -from rest_framework.serializers import DictWithMetadata, SortedDictWithMetadata -import datetime -import decimal -import types -import json - - -class JSONEncoder(json.JSONEncoder): - """ - JSONEncoder subclass that knows how to encode date/time/timedelta, - decimal types, and generators. - """ - def default(self, o): - # For Date Time string spec, see ECMA 262 - # http://ecma-international.org/ecma-262/5.1/#sec-15.9.1.15 - if isinstance(o, Promise): - return force_text(o) - elif isinstance(o, datetime.datetime): - r = o.isoformat() - if o.microsecond: - r = r[:23] + r[26:] - if r.endswith('+00:00'): - r = r[:-6] + 'Z' - return r - elif isinstance(o, datetime.date): - return o.isoformat() - elif isinstance(o, datetime.time): - if timezone and timezone.is_aware(o): - raise ValueError("JSON can't represent timezone-aware times.") - r = o.isoformat() - if o.microsecond: - r = r[:12] - return r - elif isinstance(o, datetime.timedelta): - return str(o.total_seconds()) - elif isinstance(o, decimal.Decimal): - return str(o) - elif hasattr(o, '__iter__'): - return [i for i in o] - return super(JSONEncoder, self).default(o) - - -try: - import yaml -except ImportError: - SafeDumper = None -else: - # Adapted from http://pyyaml.org/attachment/ticket/161/use_ordered_dict.py - class SafeDumper(yaml.SafeDumper): - """ - Handles decimals as strings. - Handles SortedDicts as usual dicts, but preserves field order, rather - than the usual behaviour of sorting the keys. - """ - def represent_decimal(self, data): - return self.represent_scalar('tag:yaml.org,2002:str', str(data)) - - def represent_mapping(self, tag, mapping, flow_style=None): - value = [] - node = yaml.MappingNode(tag, value, flow_style=flow_style) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - best_style = True - if hasattr(mapping, 'items'): - mapping = list(mapping.items()) - if not isinstance(mapping, SortedDict): - mapping.sort() - for item_key, item_value in mapping: - node_key = self.represent_data(item_key) - node_value = self.represent_data(item_value) - if not (isinstance(node_key, yaml.ScalarNode) and not node_key.style): - best_style = False - if not (isinstance(node_value, yaml.ScalarNode) and not node_value.style): - best_style = False - value.append((node_key, node_value)) - if flow_style is None: - if self.default_flow_style is not None: - node.flow_style = self.default_flow_style - else: - node.flow_style = best_style - return node - - SafeDumper.add_representer(SortedDict, - yaml.representer.SafeRepresenter.represent_dict) - SafeDumper.add_representer(DictWithMetadata, - yaml.representer.SafeRepresenter.represent_dict) - SafeDumper.add_representer(SortedDictWithMetadata, - yaml.representer.SafeRepresenter.represent_dict) - SafeDumper.add_representer(types.GeneratorType, - yaml.representer.SafeRepresenter.represent_list) diff --git a/vendor-local/lib/python/rest_framework/utils/formatting.py b/vendor-local/lib/python/rest_framework/utils/formatting.py deleted file mode 100644 index 4bec838776f..00000000000 --- a/vendor-local/lib/python/rest_framework/utils/formatting.py +++ /dev/null @@ -1,80 +0,0 @@ -""" -Utility functions to return a formatted name and description for a given view. -""" -from __future__ import unicode_literals - -from django.utils.html import escape -from django.utils.safestring import mark_safe -from rest_framework.compat import apply_markdown, smart_text -import re - - -def _remove_trailing_string(content, trailing): - """ - Strip trailing component `trailing` from `content` if it exists. - Used when generating names from view classes. - """ - if content.endswith(trailing) and content != trailing: - return content[:-len(trailing)] - return content - - -def _remove_leading_indent(content): - """ - Remove leading indent from a block of text. - Used when generating descriptions from docstrings. - """ - whitespace_counts = [len(line) - len(line.lstrip(' ')) - for line in content.splitlines()[1:] if line.lstrip()] - - # unindent the content if needed - if whitespace_counts: - whitespace_pattern = '^' + (' ' * min(whitespace_counts)) - content = re.sub(re.compile(whitespace_pattern, re.MULTILINE), '', content) - content = content.strip('\n') - return content - - -def _camelcase_to_spaces(content): - """ - Translate 'CamelCaseNames' to 'Camel Case Names'. - Used when generating names from view classes. - """ - camelcase_boundry = '(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))' - content = re.sub(camelcase_boundry, ' \\1', content).strip() - return ' '.join(content.split('_')).title() - - -def get_view_name(cls, suffix=None): - """ - Return a formatted name for an `APIView` class or `@api_view` function. - """ - name = cls.__name__ - name = _remove_trailing_string(name, 'View') - name = _remove_trailing_string(name, 'ViewSet') - name = _camelcase_to_spaces(name) - if suffix: - name += ' ' + suffix - return name - - -def get_view_description(cls, html=False): - """ - Return a description for an `APIView` class or `@api_view` function. - """ - description = cls.__doc__ or '' - description = _remove_leading_indent(smart_text(description)) - if html: - return markup_description(description) - return description - - -def markup_description(description): - """ - Apply HTML markup to the given description. - """ - if apply_markdown: - description = apply_markdown(description) - else: - description = escape(description).replace('\n', '<br />') - return mark_safe(description) diff --git a/vendor-local/lib/python/rest_framework/utils/mediatypes.py b/vendor-local/lib/python/rest_framework/utils/mediatypes.py deleted file mode 100644 index c09c29338ea..00000000000 --- a/vendor-local/lib/python/rest_framework/utils/mediatypes.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Handling of media types, as found in HTTP Content-Type and Accept headers. - -See http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7 -""" -from __future__ import unicode_literals -from django.http.multipartparser import parse_header -from rest_framework import HTTP_HEADER_ENCODING - - -def media_type_matches(lhs, rhs): - """ - Returns ``True`` if the media type in the first argument <= the - media type in the second argument. The media types are strings - as described by the HTTP spec. - - Valid media type strings include: - - 'application/json; indent=4' - 'application/json' - 'text/*' - '*/*' - """ - lhs = _MediaType(lhs) - rhs = _MediaType(rhs) - return lhs.match(rhs) - - -def order_by_precedence(media_type_lst): - """ - Returns a list of sets of media type strings, ordered by precedence. - Precedence is determined by how specific a media type is: - - 3. 'type/subtype; param=val' - 2. 'type/subtype' - 1. 'type/*' - 0. '*/*' - """ - ret = [set(), set(), set(), set()] - for media_type in media_type_lst: - precedence = _MediaType(media_type).precedence - ret[3 - precedence].add(media_type) - return [media_types for media_types in ret if media_types] - - -class _MediaType(object): - def __init__(self, media_type_str): - if media_type_str is None: - media_type_str = '' - self.orig = media_type_str - self.full_type, self.params = parse_header(media_type_str.encode(HTTP_HEADER_ENCODING)) - self.main_type, sep, self.sub_type = self.full_type.partition('/') - - def match(self, other): - """Return true if this MediaType satisfies the given MediaType.""" - for key in self.params.keys(): - if key != 'q' and other.params.get(key, None) != self.params.get(key, None): - return False - - if self.sub_type != '*' and other.sub_type != '*' and other.sub_type != self.sub_type: - return False - - if self.main_type != '*' and other.main_type != '*' and other.main_type != self.main_type: - return False - - return True - - @property - def precedence(self): - """ - Return a precedence level from 0-3 for the media type given how specific it is. - """ - if self.main_type == '*': - return 0 - elif self.sub_type == '*': - return 1 - elif not self.params or self.params.keys() == ['q']: - return 2 - return 3 - - def __str__(self): - return unicode(self).encode('utf-8') - - def __unicode__(self): - ret = "%s/%s" % (self.main_type, self.sub_type) - for key, val in self.params.items(): - ret += "; %s=%s" % (key, val) - return ret diff --git a/vendor-local/lib/python/rest_framework/views.py b/vendor-local/lib/python/rest_framework/views.py deleted file mode 100644 index d51233a9327..00000000000 --- a/vendor-local/lib/python/rest_framework/views.py +++ /dev/null @@ -1,357 +0,0 @@ -""" -Provides an APIView class that is the base of all views in REST framework. -""" -from __future__ import unicode_literals - -from django.core.exceptions import PermissionDenied -from django.http import Http404 -from django.utils.datastructures import SortedDict -from django.views.decorators.csrf import csrf_exempt -from rest_framework import status, exceptions -from rest_framework.compat import View, HttpResponseBase -from rest_framework.request import Request -from rest_framework.response import Response -from rest_framework.settings import api_settings -from rest_framework.utils.formatting import get_view_name, get_view_description - - -class APIView(View): - settings = api_settings - - renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES - parser_classes = api_settings.DEFAULT_PARSER_CLASSES - authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES - throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES - permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES - content_negotiation_class = api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS - - @classmethod - def as_view(cls, **initkwargs): - """ - Store the original class on the view function. - - This allows us to discover information about the view when we do URL - reverse lookups. Used for breadcrumb generation. - """ - view = super(APIView, cls).as_view(**initkwargs) - view.cls = cls - return view - - @property - def allowed_methods(self): - """ - Wrap Django's private `_allowed_methods` interface in a public property. - """ - return self._allowed_methods() - - @property - def default_response_headers(self): - # TODO: deprecate? - # TODO: Only vary by accept if multiple renderers - return { - 'Allow': ', '.join(self.allowed_methods), - 'Vary': 'Accept' - } - - def http_method_not_allowed(self, request, *args, **kwargs): - """ - If `request.method` does not correspond to a handler method, - determine what kind of exception to raise. - """ - raise exceptions.MethodNotAllowed(request.method) - - def permission_denied(self, request): - """ - If request is not permitted, determine what kind of exception to raise. - """ - if not self.request.successful_authenticator: - raise exceptions.NotAuthenticated() - raise exceptions.PermissionDenied() - - def throttled(self, request, wait): - """ - If request is throttled, determine what kind of exception to raise. - """ - raise exceptions.Throttled(wait) - - def get_authenticate_header(self, request): - """ - If a request is unauthenticated, determine the WWW-Authenticate - header to use for 401 responses, if any. - """ - authenticators = self.get_authenticators() - if authenticators: - return authenticators[0].authenticate_header(request) - - def get_parser_context(self, http_request): - """ - Returns a dict that is passed through to Parser.parse(), - as the `parser_context` keyword argument. - """ - # Note: Additionally `request` will also be added to the context - # by the Request object. - return { - 'view': self, - 'args': getattr(self, 'args', ()), - 'kwargs': getattr(self, 'kwargs', {}) - } - - def get_renderer_context(self): - """ - Returns a dict that is passed through to Renderer.render(), - as the `renderer_context` keyword argument. - """ - # Note: Additionally 'response' will also be added to the context, - # by the Response object. - return { - 'view': self, - 'args': getattr(self, 'args', ()), - 'kwargs': getattr(self, 'kwargs', {}), - 'request': getattr(self, 'request', None) - } - - # API policy instantiation methods - - def get_format_suffix(self, **kwargs): - """ - Determine if the request includes a '.json' style format suffix - """ - if self.settings.FORMAT_SUFFIX_KWARG: - return kwargs.get(self.settings.FORMAT_SUFFIX_KWARG) - - def get_renderers(self): - """ - Instantiates and returns the list of renderers that this view can use. - """ - return [renderer() for renderer in self.renderer_classes] - - def get_parsers(self): - """ - Instantiates and returns the list of parsers that this view can use. - """ - return [parser() for parser in self.parser_classes] - - def get_authenticators(self): - """ - Instantiates and returns the list of authenticators that this view can use. - """ - return [auth() for auth in self.authentication_classes] - - def get_permissions(self): - """ - Instantiates and returns the list of permissions that this view requires. - """ - return [permission() for permission in self.permission_classes] - - def get_throttles(self): - """ - Instantiates and returns the list of throttles that this view uses. - """ - return [throttle() for throttle in self.throttle_classes] - - def get_content_negotiator(self): - """ - Instantiate and return the content negotiation class to use. - """ - if not getattr(self, '_negotiator', None): - self._negotiator = self.content_negotiation_class() - return self._negotiator - - # API policy implementation methods - - def perform_content_negotiation(self, request, force=False): - """ - Determine which renderer and media type to use render the response. - """ - renderers = self.get_renderers() - conneg = self.get_content_negotiator() - - try: - return conneg.select_renderer(request, renderers, self.format_kwarg) - except Exception: - if force: - return (renderers[0], renderers[0].media_type) - raise - - def perform_authentication(self, request): - """ - Perform authentication on the incoming request. - - Note that if you override this and simply 'pass', then authentication - will instead be performed lazily, the first time either - `request.user` or `request.auth` is accessed. - """ - request.user - - def check_permissions(self, request): - """ - Check if the request should be permitted. - Raises an appropriate exception if the request is not permitted. - """ - for permission in self.get_permissions(): - if not permission.has_permission(request, self): - self.permission_denied(request) - - def check_object_permissions(self, request, obj): - """ - Check if the request should be permitted for a given object. - Raises an appropriate exception if the request is not permitted. - """ - for permission in self.get_permissions(): - if not permission.has_object_permission(request, self, obj): - self.permission_denied(request) - - def check_throttles(self, request): - """ - Check if request should be throttled. - Raises an appropriate exception if the request is throttled. - """ - for throttle in self.get_throttles(): - if not throttle.allow_request(request, self): - self.throttled(request, throttle.wait()) - - # Dispatch methods - - def initialize_request(self, request, *args, **kargs): - """ - Returns the initial request object. - """ - parser_context = self.get_parser_context(request) - - return Request(request, - parsers=self.get_parsers(), - authenticators=self.get_authenticators(), - negotiator=self.get_content_negotiator(), - parser_context=parser_context) - - def initial(self, request, *args, **kwargs): - """ - Runs anything that needs to occur prior to calling the method handler. - """ - self.format_kwarg = self.get_format_suffix(**kwargs) - - # Ensure that the incoming request is permitted - self.perform_authentication(request) - self.check_permissions(request) - self.check_throttles(request) - - # Perform content negotiation and store the accepted info on the request - neg = self.perform_content_negotiation(request) - request.accepted_renderer, request.accepted_media_type = neg - - def finalize_response(self, request, response, *args, **kwargs): - """ - Returns the final response object. - """ - # Make the error obvious if a proper response is not returned - assert isinstance(response, HttpResponseBase), ( - 'Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` ' - 'to be returned from the view, but received a `%s`' - % type(response) - ) - - if isinstance(response, Response): - if not getattr(request, 'accepted_renderer', None): - neg = self.perform_content_negotiation(request, force=True) - request.accepted_renderer, request.accepted_media_type = neg - - response.accepted_renderer = request.accepted_renderer - response.accepted_media_type = request.accepted_media_type - response.renderer_context = self.get_renderer_context() - - for key, value in self.headers.items(): - response[key] = value - - return response - - def handle_exception(self, exc): - """ - Handle any exception that occurs, by returning an appropriate response, - or re-raising the error. - """ - if isinstance(exc, exceptions.Throttled) and exc.wait is not None: - # Throttle wait header - self.headers['X-Throttle-Wait-Seconds'] = '%d' % exc.wait - - if isinstance(exc, (exceptions.NotAuthenticated, - exceptions.AuthenticationFailed)): - # WWW-Authenticate header for 401 responses, else coerce to 403 - auth_header = self.get_authenticate_header(self.request) - - if auth_header: - self.headers['WWW-Authenticate'] = auth_header - else: - exc.status_code = status.HTTP_403_FORBIDDEN - - if isinstance(exc, exceptions.APIException): - return Response({'detail': exc.detail}, - status=exc.status_code, - exception=True) - elif isinstance(exc, Http404): - return Response({'detail': 'Not found'}, - status=status.HTTP_404_NOT_FOUND, - exception=True) - elif isinstance(exc, PermissionDenied): - return Response({'detail': 'Permission denied'}, - status=status.HTTP_403_FORBIDDEN, - exception=True) - raise - - # Note: session based authentication is explicitly CSRF validated, - # all other authentication is CSRF exempt. - @csrf_exempt - def dispatch(self, request, *args, **kwargs): - """ - `.dispatch()` is pretty much the same as Django's regular dispatch, - but with extra hooks for startup, finalize, and exception handling. - """ - self.args = args - self.kwargs = kwargs - request = self.initialize_request(request, *args, **kwargs) - self.request = request - self.headers = self.default_response_headers # deprecate? - - try: - self.initial(request, *args, **kwargs) - - # Get the appropriate handler method - if request.method.lower() in self.http_method_names: - handler = getattr(self, request.method.lower(), - self.http_method_not_allowed) - else: - handler = self.http_method_not_allowed - - response = handler(request, *args, **kwargs) - - except Exception as exc: - response = self.handle_exception(exc) - - self.response = self.finalize_response(request, response, *args, **kwargs) - return self.response - - def options(self, request, *args, **kwargs): - """ - Handler method for HTTP 'OPTIONS' request. - We may as well implement this as Django will otherwise provide - a less useful default implementation. - """ - return Response(self.metadata(request), status=status.HTTP_200_OK) - - def metadata(self, request): - """ - Return a dictionary of metadata about the view. - Used to return responses for OPTIONS requests. - """ - - # This is used by ViewSets to disambiguate instance vs list views - view_name_suffix = getattr(self, 'suffix', None) - - # By default we can't provide any form-like information, however the - # generic views override this implementation and add additional - # information for POST and PUT methods, based on the serializer. - ret = SortedDict() - ret['name'] = get_view_name(self.__class__, view_name_suffix) - ret['description'] = get_view_description(self.__class__) - ret['renders'] = [renderer.media_type for renderer in self.renderer_classes] - ret['parses'] = [parser.media_type for parser in self.parser_classes] - return ret diff --git a/vendor-local/lib/python/rest_framework/viewsets.py b/vendor-local/lib/python/rest_framework/viewsets.py deleted file mode 100644 index d91323f22df..00000000000 --- a/vendor-local/lib/python/rest_framework/viewsets.py +++ /dev/null @@ -1,139 +0,0 @@ -""" -ViewSets are essentially just a type of class based view, that doesn't provide -any method handlers, such as `get()`, `post()`, etc... but instead has actions, -such as `list()`, `retrieve()`, `create()`, etc... - -Actions are only bound to methods at the point of instantiating the views. - - user_list = UserViewSet.as_view({'get': 'list'}) - user_detail = UserViewSet.as_view({'get': 'retrieve'}) - -Typically, rather than instantiate views from viewsets directly, you'll -regsiter the viewset with a router and let the URL conf be determined -automatically. - - router = DefaultRouter() - router.register(r'users', UserViewSet, 'user') - urlpatterns = router.urls -""" -from __future__ import unicode_literals - -from functools import update_wrapper -from django.utils.decorators import classonlymethod -from rest_framework import views, generics, mixins - - -class ViewSetMixin(object): - """ - This is the magic. - - Overrides `.as_view()` so that it takes an `actions` keyword that performs - the binding of HTTP methods to actions on the Resource. - - For example, to create a concrete view binding the 'GET' and 'POST' methods - to the 'list' and 'create' actions... - - view = MyViewSet.as_view({'get': 'list', 'post': 'create'}) - """ - - @classonlymethod - def as_view(cls, actions=None, **initkwargs): - """ - Because of the way class based views create a closure around the - instantiated view, we need to totally reimplement `.as_view`, - and slightly modify the view function that is created and returned. - """ - # The suffix initkwarg is reserved for identifing the viewset type - # eg. 'List' or 'Instance'. - cls.suffix = None - - # sanitize keyword arguments - for key in initkwargs: - if key in cls.http_method_names: - raise TypeError("You tried to pass in the %s method name as a " - "keyword argument to %s(). Don't do that." - % (key, cls.__name__)) - if not hasattr(cls, key): - raise TypeError("%s() received an invalid keyword %r" % ( - cls.__name__, key)) - - def view(request, *args, **kwargs): - self = cls(**initkwargs) - # We also store the mapping of request methods to actions, - # so that we can later set the action attribute. - # eg. `self.action = 'list'` on an incoming GET request. - self.action_map = actions - - # Bind methods to actions - # This is the bit that's different to a standard view - for method, action in actions.items(): - handler = getattr(self, action) - setattr(self, method, handler) - - # Patch this in as it's otherwise only present from 1.5 onwards - if hasattr(self, 'get') and not hasattr(self, 'head'): - self.head = self.get - - # And continue as usual - return self.dispatch(request, *args, **kwargs) - - # take name and docstring from class - update_wrapper(view, cls, updated=()) - - # and possible attributes set by decorators - # like csrf_exempt from dispatch - update_wrapper(view, cls.dispatch, assigned=()) - - # We need to set these on the view function, so that breadcrumb - # generation can pick out these bits of information from a - # resolved URL. - view.cls = cls - view.suffix = initkwargs.get('suffix', None) - return view - - def initialize_request(self, request, *args, **kargs): - """ - Set the `.action` attribute on the view, - depending on the request method. - """ - request = super(ViewSetMixin, self).initialize_request(request, *args, **kargs) - self.action = self.action_map.get(request.method.lower()) - return request - - -class ViewSet(ViewSetMixin, views.APIView): - """ - The base ViewSet class does not provide any actions by default. - """ - pass - - -class GenericViewSet(ViewSetMixin, generics.GenericAPIView): - """ - The GenericViewSet class does not provide any actions by default, - but does include the base set of generic view behavior, such as - the `get_object` and `get_queryset` methods. - """ - pass - - -class ReadOnlyModelViewSet(mixins.RetrieveModelMixin, - mixins.ListModelMixin, - GenericViewSet): - """ - A viewset that provides default `list()` and `retrieve()` actions. - """ - pass - - -class ModelViewSet(mixins.CreateModelMixin, - mixins.RetrieveModelMixin, - mixins.UpdateModelMixin, - mixins.DestroyModelMixin, - mixins.ListModelMixin, - GenericViewSet): - """ - A viewset that provides default `create()`, `retrieve()`, `update()`, - `partial_update()`, `destroy()` and `list()` actions. - """ - pass diff --git a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/PKG-INFO b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/PKG-INFO deleted file mode 100644 index a1fcdc0331b..00000000000 --- a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/PKG-INFO +++ /dev/null @@ -1,15 +0,0 @@ -Metadata-Version: 1.1 -Name: rna -Version: 0.0.1 -Summary: UNKNOWN -Home-page: UNKNOWN -Author: Josh Mize -Author-email: jmize@mozilla.com -License: UNKNOWN -Description: UNKNOWN -Platform: UNKNOWN -Classifier: Development Status :: 2 - Pre-Alpha -Classifier: Environment :: Web Environment -Classifier: Framework :: Django -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python diff --git a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/SOURCES.txt b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/SOURCES.txt deleted file mode 100644 index 061f3bb9c32..00000000000 --- a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/SOURCES.txt +++ /dev/null @@ -1,22 +0,0 @@ -setup.cfg -rna/__init__.py -rna/admin.py -rna/clients.py -rna/fields.py -rna/filters.py -rna/models.py -rna/serializers.py -rna/tests.py -rna/urls.py -rna/views.py -rna.egg-info/PKG-INFO -rna.egg-info/SOURCES.txt -rna.egg-info/dependency_links.txt -rna.egg-info/requires.txt -rna.egg-info/top_level.txt -rna/management/__init__.py -rna/management/commands/__init__.py -rna/management/commands/rnasync.py -rna/migrations/0001_initial.py -rna/migrations/0002_auto__add_release.py -rna/migrations/__init__.py \ No newline at end of file diff --git a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/dependency_links.txt b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/dependency_links.txt deleted file mode 100644 index 8b137891791..00000000000 --- a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/installed-files.txt b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/installed-files.txt deleted file mode 100644 index dc462448fa4..00000000000 --- a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/installed-files.txt +++ /dev/null @@ -1,38 +0,0 @@ -../rna/__init__.py -../rna/admin.py -../rna/clients.py -../rna/fields.py -../rna/filters.py -../rna/models.py -../rna/serializers.py -../rna/tests.py -../rna/urls.py -../rna/views.py -../rna/migrations/0001_initial.py -../rna/migrations/0002_auto__add_release.py -../rna/migrations/__init__.py -../rna/management/__init__.py -../rna/management/commands/__init__.py -../rna/management/commands/rnasync.py -../rna/__init__.pyc -../rna/admin.pyc -../rna/clients.pyc -../rna/fields.pyc -../rna/filters.pyc -../rna/models.pyc -../rna/serializers.pyc -../rna/tests.pyc -../rna/urls.pyc -../rna/views.pyc -../rna/migrations/0001_initial.pyc -../rna/migrations/0002_auto__add_release.pyc -../rna/migrations/__init__.pyc -../rna/management/__init__.pyc -../rna/management/commands/__init__.pyc -../rna/management/commands/rnasync.pyc -./ -dependency_links.txt -PKG-INFO -requires.txt -SOURCES.txt -top_level.txt diff --git a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/requires.txt b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/requires.txt deleted file mode 100644 index e1824861857..00000000000 --- a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/requires.txt +++ /dev/null @@ -1,4 +0,0 @@ -South -Django>=1.4.9 -djangorestframework==2.3.7 -django-extensions==1.2.0 \ No newline at end of file diff --git a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/top_level.txt b/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/top_level.txt deleted file mode 100644 index 369c97b76f5..00000000000 --- a/vendor-local/lib/python/rna-0.0.1-py2.7.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -rna diff --git a/vendor-local/lib/python/rna/__init__.py b/vendor-local/lib/python/rna/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/rna/admin.py b/vendor-local/lib/python/rna/admin.py deleted file mode 100644 index 2b631a87b96..00000000000 --- a/vendor-local/lib/python/rna/admin.py +++ /dev/null @@ -1,22 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -from django.contrib import admin - -from . import models - - -class NoteAdmin(admin.ModelAdmin): - list_display = ('bug', 'tag', 'html') - list_display_links = ('html',) - filter_horizontal = ('releases',) - - -class ReleaseAdmin(admin.ModelAdmin): - list_display = ('version', 'product', 'channel', 'is_public', - 'release_date', 'text') - - -admin.site.register(models.Note, NoteAdmin) -admin.site.register(models.Release, ReleaseAdmin) diff --git a/vendor-local/lib/python/rna/clients.py b/vendor-local/lib/python/rna/clients.py deleted file mode 100644 index 57eb66f68f4..00000000000 --- a/vendor-local/lib/python/rna/clients.py +++ /dev/null @@ -1,159 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -import re - -from django.conf import settings -from django.core.exceptions import ObjectDoesNotExist -import requests - -from . import models, serializers - - -class RestClient(object): - full_url_regex = re.compile('^https?://.*') - - def __init__(self, base_url='', token='', cache=None): - """Initialize a RestClient instance. - - Args: - base_url (str): The full URL which all requests will - be relative to. - Defaults to settings.RNA['BASE_URL'] - token (str): Token to add to Authorization HTTP header. - Defaults to settings.RNA.get('TOKEN', '') - cache (dict): Defaults to empty dict - """ - self.base_url = base_url or settings.RNA['BASE_URL'] - self.cache = cache or {} - self.token = token or settings.RNA.get('TOKEN', '') - - def request(self, method, url, **kwargs): - if self.base_url and not self.full_url_regex.match(url): - url = self.base_url + url - if self.token: - kwargs.setdefault('headers', {}) - kwargs['headers'].setdefault( - 'Authorization', 'Token ' + self.token) - return requests.request(method, url, **kwargs) - - def delete(self, url='', **kwargs): - self.cache.pop(url, None) - return self.request('delete', url, **kwargs) - - def get(self, url='', **kwargs): - if kwargs.get('params', None): - return self.request('get', url, **kwargs) - response = self.cache.get(url) - if not response: - response = self.request('get', url, **kwargs) - if response.status_code == 200: - self.cache[url] = response - return response - - def options(self, url='', **kwargs): - self.cache.setdefault('OPTIONS', {}) - if url not in self.cache['OPTIONS']: - self.cache['OPTIONS'][url] = self.request('options', url, **kwargs) - return self.cache['OPTIONS'][url] - - def post(self, url='', data=None, **kwargs): - self.cache.pop(url, None) - return self.request('post', url, data=data, **kwargs) - - def put(self, url='', data=None, **kwargs): - self.cache.pop(url, None) - return self.request('put', url, data=data, **kwargs) - - -class RestModelClient(RestClient): - model_map = {} - - def __init__(self, base_url='', token='', cache=None, model_class=None): - self.model_class = model_class - super(RestModelClient, self).__init__(base_url=base_url, token=token, - cache=cache) - - def model(self, model_class=None, save=False, modified=False, **kwargs): - data = self.get(**kwargs).json() - serializer = self.serializer(model_class or self.model_class) - if isinstance(data, list): - return [self.restore(serializer, d, save, modified) for d in data] - else: - return self.restore(serializer, data, save, modified) - - def restore(self, serializer, data, save=False, modified=False): - data.pop('url', None) - for field in serializer.Meta.model._meta.fields: - if isinstance(field, models.models.ForeignKey): - url = data.pop(field.name, None) - if url: - data[field.name] = self.hypermodel(url, field.rel.to, save) - - # ManyToManyFields - for field in serializer.Meta.model._meta.many_to_many: - urls = data.pop(field.name, None) - if urls: - data[field.name] = [ - self.hypermodel(url, field.rel.to, save) - for url in urls - ] - - instance = serializer.restore_object(data) - if save: - serializer.save_object(instance, modified=modified) - return instance - - def model_client(self, url_name='', model_class=None, **kwargs): - #TODO: decide appropriate level of error handling for this method - if url_name and not model_class: - kwargs.setdefault('base_url', self.get().json()[url_name]) - model_class = self.model_map[url_name] - model_class = model_class or self.model_class - self.model_map.setdefault( - model_class, - self.__class__(model_class=model_class, **kwargs)) - return self.model_map[model_class] - - def post_instance(self, instance, url='', **kwargs): - return self.post(url, self.serialize(instance), **kwargs) - - def put_instance(self, instance, url='', data=None, **kwargs): - return self.put(url, self.serialize(instance), **kwargs) - - def serialize(self, instance): - return self.serializer(instance=instance).data - - def serializer(self, model_class=None, instance=None): - model_class = model_class or self.model_class - return serializers.get_client_serializer_class(model_class)( - instance=instance) - - def hypermodel(self, url, model_class, save): - # assumes url ends in / -- probably want to make this more robust - base_url, pk, _ = url.rsplit('/', 2) - try: - instance = model_class.objects.get(pk=pk) - except ObjectDoesNotExist: - instance = self.model_client( - base_url=base_url + '/', model_class=model_class, - token=self.token).model(url='%s/' % pk, save=save) - return instance - - -class RNAModelClient(RestModelClient): - model_map = { - 'notes': models.Note, - 'releases': models.Release, - } - - -class LegacyRNAModelClient(RNAModelClient): - field_map = {models.Note: {'bug_num': 'bug', 'description': 'html'}} - - def restore(self, serializer, data, save=False, modified=True): - for legacy, f in self.field_map.get(serializer.Meta.model, {}).items(): - data[f] = data.pop(legacy, None) - return super(LegacyRNAModelClient, self).restore( - serializer, data, save=save, modified=True) diff --git a/vendor-local/lib/python/rna/fields.py b/vendor-local/lib/python/rna/fields.py deleted file mode 100644 index bcb48f6fa97..00000000000 --- a/vendor-local/lib/python/rna/fields.py +++ /dev/null @@ -1,8 +0,0 @@ -from django import forms - -from rest_framework.compat import parse_datetime - - -class ISO8601DateTimeField(forms.DateTimeField): - def strptime(self, value, format): - return parse_datetime(value) diff --git a/vendor-local/lib/python/rna/filters.py b/vendor-local/lib/python/rna/filters.py deleted file mode 100644 index 1d488a94c95..00000000000 --- a/vendor-local/lib/python/rna/filters.py +++ /dev/null @@ -1,46 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -from rest_framework.filters import DjangoFilterBackend -import django_filters - -from . import fields, models - - -class ISO8601DateTimeFilter(django_filters.DateTimeFilter): - field_class = fields.ISO8601DateTimeField - - -class TimestampedFilterBackend(DjangoFilterBackend): - def get_filter_class(self, view, queryset=None): - filter_class = getattr(view, 'filter_class', None) - filter_fields = getattr(view, 'filter_fields', None) - filter_fields_exclude = getattr(view, 'filter_fields_exclude', ()) - - if filter_class or filter_fields: - return super(TimestampedFilterBackend, self).get_filter_class( - view, queryset=queryset) - - elif queryset and issubclass(queryset.model, models.TimeStampedModel): - class AutoFilterSet(self.default_filter_set): - created_before = ISO8601DateTimeFilter( - name='created', lookup_type='lt') - created_after = ISO8601DateTimeFilter( - name='created', lookup_type='gte') - - modified_before = ISO8601DateTimeFilter( - name='modified', lookup_type='lt') - modified_after = ISO8601DateTimeFilter( - name='modified', lookup_type='gte') - - class Meta: - model = queryset.model - fields = ['created_before', 'created_after', - 'modified_before', 'modified_after'] - fields.extend(f.name for f in model._meta.fields - if f.name not in ('created', 'modified')) - fields = [f for f in fields - if f not in filter_fields_exclude] - order_by = True - return AutoFilterSet diff --git a/vendor-local/lib/python/rna/management/__init__.py b/vendor-local/lib/python/rna/management/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/rna/management/commands/__init__.py b/vendor-local/lib/python/rna/management/commands/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/rna/management/commands/rnasync.py b/vendor-local/lib/python/rna/management/commands/rnasync.py deleted file mode 100644 index 26030a627ac..00000000000 --- a/vendor-local/lib/python/rna/management/commands/rnasync.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.conf import settings -from django.core.management.base import BaseCommand -from django.core.exceptions import ObjectDoesNotExist - -from ... import clients - - -class Command(BaseCommand): - # TODO: args, help, docstrings - - def rna_client(self, legacy_api=False): - if legacy_api: - return clients.LegacyRNAModelClient() - else: - return clients.RNAModelClient() - - def model_params(self, models, legacy_api=False): - params = dict((m, {}) for m in models) - if not legacy_api: - for m in models: - try: - latest = m.objects.latest('modified') - except ObjectDoesNotExist: - pass - else: - params[m]['modified_after'] = latest.modified.isoformat() - return params - - def handle(self, *args, **options): - legacy_api = settings.RNA.get('LEGACY_API', False) - rc = self.rna_client(legacy_api) - model_params = self.model_params(rc.model_map.values(), legacy_api) - for url_name, model_class in rc.model_map.items(): - params = model_params[model_class] - rc.model_client(url_name).model(save=True, params=params) diff --git a/vendor-local/lib/python/rna/migrations/0001_initial.py b/vendor-local/lib/python/rna/migrations/0001_initial.py deleted file mode 100644 index 42e0933b485..00000000000 --- a/vendor-local/lib/python/rna/migrations/0001_initial.py +++ /dev/null @@ -1,115 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding model 'Channel' - db.create_table('rna_channel', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), - ('modified', self.gf('django.db.models.fields.DateTimeField')(db_index=True, blank=True)), - ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)), - )) - db.send_create_signal('rna', ['Channel']) - - # Adding model 'Product' - db.create_table('rna_product', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), - ('modified', self.gf('django.db.models.fields.DateTimeField')(db_index=True, blank=True)), - ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)), - ('text', self.gf('django.db.models.fields.TextField')(blank=True)), - )) - db.send_create_signal('rna', ['Product']) - - # Adding model 'Tag' - db.create_table('rna_tag', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), - ('modified', self.gf('django.db.models.fields.DateTimeField')(db_index=True, blank=True)), - ('text', self.gf('django.db.models.fields.TextField')()), - ('sort_num', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - )) - db.send_create_signal('rna', ['Tag']) - - # Adding model 'Note' - db.create_table('rna_note', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), - ('modified', self.gf('django.db.models.fields.DateTimeField')(db_index=True, blank=True)), - ('bug', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('html', self.gf('django.db.models.fields.TextField')(blank=True)), - ('first_version', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('first_channel', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='first_channel_notes', null=True, to=orm['rna.Channel'])), - ('fixed_in_version', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('fixed_in_channel', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='fixed_in_channel_notes', null=True, to=orm['rna.Channel'])), - ('tag', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rna.Tag'], null=True, blank=True)), - ('product', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rna.Product'], null=True, blank=True)), - ('sort_num', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('fixed_in_subversion', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - )) - db.send_create_signal('rna', ['Note']) - - - def backwards(self, orm): - # Deleting model 'Channel' - db.delete_table('rna_channel') - - # Deleting model 'Product' - db.delete_table('rna_product') - - # Deleting model 'Tag' - db.delete_table('rna_tag') - - # Deleting model 'Note' - db.delete_table('rna_note') - - - models = { - 'rna.channel': { - 'Meta': {'object_name': 'Channel'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) - }, - 'rna.note': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, - 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'first_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'first_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), - 'first_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'fixed_in_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'fixed_in_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), - 'fixed_in_subversion': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'fixed_in_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']", 'null': 'True', 'blank': 'True'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Tag']", 'null': 'True', 'blank': 'True'}) - }, - 'rna.product': { - 'Meta': {'object_name': 'Product'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}) - }, - 'rna.tag': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Tag'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'text': ('django.db.models.fields.TextField', [], {}) - } - } - - complete_apps = ['rna'] \ No newline at end of file diff --git a/vendor-local/lib/python/rna/migrations/0002_auto__add_release.py b/vendor-local/lib/python/rna/migrations/0002_auto__add_release.py deleted file mode 100644 index 4222dc9c1b3..00000000000 --- a/vendor-local/lib/python/rna/migrations/0002_auto__add_release.py +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding model 'Release' - db.create_table('rna_release', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), - ('modified', self.gf('django.db.models.fields.DateTimeField')(db_index=True, blank=True)), - ('product', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rna.Product'])), - ('channel', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rna.Channel'])), - ('version', self.gf('django.db.models.fields.IntegerField')()), - ('sub_version', self.gf('django.db.models.fields.IntegerField')()), - ('release_date', self.gf('django.db.models.fields.DateTimeField')()), - ('text', self.gf('django.db.models.fields.TextField')(blank=True)), - )) - db.send_create_signal('rna', ['Release']) - - - def backwards(self, orm): - # Deleting model 'Release' - db.delete_table('rna_release') - - - models = { - 'rna.channel': { - 'Meta': {'object_name': 'Channel'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) - }, - 'rna.note': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, - 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'first_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'first_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), - 'first_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'fixed_in_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'fixed_in_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), - 'fixed_in_subversion': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'fixed_in_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']", 'null': 'True', 'blank': 'True'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Tag']", 'null': 'True', 'blank': 'True'}) - }, - 'rna.product': { - 'Meta': {'object_name': 'Product'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}) - }, - 'rna.release': { - 'Meta': {'object_name': 'Release'}, - 'channel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Channel']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']"}), - 'release_date': ('django.db.models.fields.DateTimeField', [], {}), - 'sub_version': ('django.db.models.fields.IntegerField', [], {}), - 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'version': ('django.db.models.fields.IntegerField', [], {}) - }, - 'rna.tag': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Tag'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'text': ('django.db.models.fields.TextField', [], {}) - } - } - - complete_apps = ['rna'] \ No newline at end of file diff --git a/vendor-local/lib/python/rna/migrations/0003_auto__add_field_note_fixed_in_release__add_field_note_tag_num__add_fie.py b/vendor-local/lib/python/rna/migrations/0003_auto__add_field_note_fixed_in_release__add_field_note_tag_num__add_fie.py deleted file mode 100644 index 374b2f11c37..00000000000 --- a/vendor-local/lib/python/rna/migrations/0003_auto__add_field_note_fixed_in_release__add_field_note_tag_num__add_fie.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding field 'Note.fixed_in_release' - db.add_column('rna_note', 'fixed_in_release', - self.gf('django.db.models.fields.related.ForeignKey')(related_name='fixed_note_set', null=True, to=orm['rna.Release']), - keep_default=False) - - # Adding field 'Note.tag_num' - db.add_column('rna_note', 'tag_num', - self.gf('django.db.models.fields.IntegerField')(null=True), - keep_default=False) - - # Adding M2M table for field releases on 'Note' - m2m_table_name = db.shorten_name('rna_note_releases') - db.create_table(m2m_table_name, ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('note', models.ForeignKey(orm['rna.note'], null=False)), - ('release', models.ForeignKey(orm['rna.release'], null=False)) - )) - db.create_unique(m2m_table_name, ['note_id', 'release_id']) - - # Adding field 'Release.product_num' - db.add_column('rna_release', 'product_num', - self.gf('django.db.models.fields.IntegerField')(default=0), - keep_default=False) - - # Adding field 'Release.channel_num' - db.add_column('rna_release', 'channel_num', - self.gf('django.db.models.fields.IntegerField')(default=0), - keep_default=False) - - # Adding field 'Release.version_str' - db.add_column('rna_release', 'version_str', - self.gf('django.db.models.fields.CharField')(default='1.0', max_length=255), - keep_default=False) - - - def backwards(self, orm): - # Deleting field 'Note.fixed_in_release' - db.delete_column('rna_note', 'fixed_in_release_id') - - # Deleting field 'Note.tag_num' - db.delete_column('rna_note', 'tag_num') - - # Removing M2M table for field releases on 'Note' - db.delete_table(db.shorten_name('rna_note_releases')) - - # Deleting field 'Release.product_num' - db.delete_column('rna_release', 'product_num') - - # Deleting field 'Release.channel_num' - db.delete_column('rna_release', 'channel_num') - - # Deleting field 'Release.version_str' - db.delete_column('rna_release', 'version_str') - - - models = { - 'rna.channel': { - 'Meta': {'object_name': 'Channel'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) - }, - 'rna.note': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, - 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'first_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'first_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), - 'first_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'fixed_in_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'fixed_in_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), - 'fixed_in_release': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fixed_note_set'", 'null': 'True', 'to': "orm['rna.Release']"}), - 'fixed_in_subversion': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'fixed_in_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']", 'null': 'True', 'blank': 'True'}), - 'releases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['rna.Release']", 'symmetrical': 'False'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Tag']", 'null': 'True', 'blank': 'True'}), - 'tag_num': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) - }, - 'rna.product': { - 'Meta': {'object_name': 'Product'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}) - }, - 'rna.release': { - 'Meta': {'object_name': 'Release'}, - 'channel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Channel']"}), - 'channel_num': ('django.db.models.fields.IntegerField', [], {}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']"}), - 'product_num': ('django.db.models.fields.IntegerField', [], {}), - 'release_date': ('django.db.models.fields.DateTimeField', [], {}), - 'sub_version': ('django.db.models.fields.IntegerField', [], {}), - 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'version': ('django.db.models.fields.IntegerField', [], {}), - 'version_str': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - 'rna.tag': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Tag'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'text': ('django.db.models.fields.TextField', [], {}) - } - } - - complete_apps = ['rna'] \ No newline at end of file diff --git a/vendor-local/lib/python/rna/migrations/0004_migrate_old_data.py b/vendor-local/lib/python/rna/migrations/0004_migrate_old_data.py deleted file mode 100644 index 25d61b1db46..00000000000 --- a/vendor-local/lib/python/rna/migrations/0004_migrate_old_data.py +++ /dev/null @@ -1,140 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - -class Migration(DataMigration): - - def forwards(self, orm): - PRODUCTS = { - 'FIREFOX': 0, - 'FENNEC': 1, - 'ESR': 2, - } - - CHANNELS = { - 'NIGHTLY': 0, - 'AURORA': 1, - 'BETA': 2, - 'RELEASE': 3, - } - - TAGS = { - 'NEW': 0, - 'CHANGED': 1, - 'HTML5': 2, - 'FIXED': 3, - 'DEVELOPER': 4, - } - - # Hard-coded product IDs. Sadface. - DB_PRODUCTS = { - 1: PRODUCTS['FIREFOX'], - 2: PRODUCTS['FENNEC'], - 3: PRODUCTS['ESR'], - } - - for release in orm.Release.objects.all(): - release.version_str = '{0}.0.{1}'.format(release.version, release.sub_version) - - if release.channel.name == 'ESR': - release.product_num = PRODUCTS['ESR'] - release.channel_num = CHANNELS['RELEASE'] - else: - release.product_num = DB_PRODUCTS[release.product.id] - release.channel_num = CHANNELS[release.channel.name.upper()] - release.save() - - for note in orm.Note.objects.all(): - if note.tag: - note.tag_num = TAGS[note.tag.text.upper()] - - # Migrate to fixed_in_release - if note.fixed_in_version: - version = '{0}.0.{1}'.format(note.fixed_in_version, note.fixed_in_subversion or 0) - filters = {'version_str': version} - - if note.fixed_in_channel: - if note.fixed_in_channel.name.upper() == 'ESR': - filters['product_num'] = PRODUCTS['ESR'] - filters['channel_num'] = CHANNELS['RELEASE'] - else: - filters['channel_num'] = CHANNELS[note.fixed_in_channel.name.upper()] - - if note.product: - filters['product_num'] = DB_PRODUCTS[note.product.id] - - try: - note.fixed_in_release = orm.Release.objects.get(**filters) - except (orm.Release.DoesNotExist, orm.Release.MultipleObjectsReturned): - note.fixed_in_release = None - - note.save() - - def backwards(self, orm): - """No going backwards, as this migration is going to be deleted someday anyway.""" - - - models = { - 'rna.channel': { - 'Meta': {'object_name': 'Channel'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) - }, - 'rna.note': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, - 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'first_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'first_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), - 'first_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'fixed_in_channel': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'fixed_in_channel_notes'", 'null': 'True', 'to': "orm['rna.Channel']"}), - 'fixed_in_release': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fixed_note_set'", 'null': 'True', 'to': "orm['rna.Release']"}), - 'fixed_in_subversion': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'fixed_in_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']", 'null': 'True', 'blank': 'True'}), - 'releases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['rna.Release']", 'symmetrical': 'False'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Tag']", 'null': 'True', 'blank': 'True'}), - 'tag_num': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) - }, - 'rna.product': { - 'Meta': {'object_name': 'Product'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}) - }, - 'rna.release': { - 'Meta': {'object_name': 'Release'}, - 'channel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Channel']"}), - 'channel_num': ('django.db.models.fields.IntegerField', [], {}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rna.Product']"}), - 'product_num': ('django.db.models.fields.IntegerField', [], {}), - 'release_date': ('django.db.models.fields.DateTimeField', [], {}), - 'sub_version': ('django.db.models.fields.IntegerField', [], {}), - 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'version': ('django.db.models.fields.IntegerField', [], {}), - 'version_str': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - 'rna.tag': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Tag'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'text': ('django.db.models.fields.TextField', [], {}) - } - } - - complete_apps = ['rna'] - symmetrical = True diff --git a/vendor-local/lib/python/rna/migrations/0005_auto__del_field_note_first_version__del_field_note_first_channel__del_.py b/vendor-local/lib/python/rna/migrations/0005_auto__del_field_note_first_version__del_field_note_first_channel__del_.py deleted file mode 100644 index 2a3fbea2cba..00000000000 --- a/vendor-local/lib/python/rna/migrations/0005_auto__del_field_note_first_version__del_field_note_first_channel__del_.py +++ /dev/null @@ -1,109 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Deleting field 'Note.first_version' - db.delete_column('rna_note', 'first_version') - - # Deleting field 'Note.first_channel' - db.delete_column('rna_note', 'first_channel_id') - - # Deleting field 'Note.fixed_in_version' - db.delete_column('rna_note', 'fixed_in_version') - - # Deleting field 'Note.fixed_in_subversion' - db.delete_column('rna_note', 'fixed_in_subversion') - - # Deleting field 'Note.product' - db.delete_column('rna_note', 'product_id') - - # Deleting field 'Note.fixed_in_channel' - db.delete_column('rna_note', 'fixed_in_channel_id') - - # Deleting field 'Note.tag_id' - db.delete_column('rna_note', 'tag_id') - - # Renaming column for 'Note.tag_num'. - db.rename_column('rna_note', 'tag_num', 'tag') - - # Deleting field 'Release.sub_version' - db.delete_column('rna_release', 'sub_version') - - # Deleting field 'Release.channel_id' - db.delete_column('rna_release', 'channel_id') - - # Deleting field 'Release.product_num' - db.delete_column('rna_release', 'product_id') - - # Deleting field 'Release.version_str' - db.delete_column('rna_release', 'version') - - # Renaming column for 'Release.product_str'. - db.rename_column('rna_release', 'product_num', 'product') - - # Renaming column for 'Release.version_str'. - db.rename_column('rna_release', 'version_str', 'version') - - # Renaming column for 'Release.channel_num'. - db.rename_column('rna_release', 'channel_num', 'channel') - - - def backwards(self, orm): - raise RuntimeError("Cannot reverse this migration.") - - models = { - 'rna.channel': { - 'Meta': {'object_name': 'Channel'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) - }, - 'rna.note': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, - 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'fixed_in_release': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fixed_note_set'", 'null': 'True', 'to': "orm['rna.Release']"}), - 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'releases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['rna.Release']", 'symmetrical': 'False'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'tag': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) - }, - 'rna.product': { - 'Meta': {'object_name': 'Product'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}) - }, - 'rna.release': { - 'Meta': {'object_name': 'Release'}, - 'channel': ('django.db.models.fields.IntegerField', [], {}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'product': ('django.db.models.fields.IntegerField', [], {}), - 'release_date': ('django.db.models.fields.DateTimeField', [], {}), - 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - 'rna.tag': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Tag'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'text': ('django.db.models.fields.TextField', [], {}) - } - } - - complete_apps = ['rna'] diff --git a/vendor-local/lib/python/rna/migrations/0006_auto__del_tag__del_channel__del_product.py b/vendor-local/lib/python/rna/migrations/0006_auto__del_tag__del_channel__del_product.py deleted file mode 100644 index 971952075ee..00000000000 --- a/vendor-local/lib/python/rna/migrations/0006_auto__del_tag__del_channel__del_product.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Deleting model 'Tag' - db.delete_table('rna_tag') - - # Deleting model 'Channel' - db.delete_table('rna_channel') - - # Deleting model 'Product' - db.delete_table('rna_product') - - - def backwards(self, orm): - # Adding model 'Tag' - db.create_table('rna_tag', ( - ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), - ('text', self.gf('django.db.models.fields.TextField')()), - ('modified', self.gf('django.db.models.fields.DateTimeField')(blank=True, db_index=True)), - ('sort_num', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - )) - db.send_create_signal('rna', ['Tag']) - - # Adding model 'Channel' - db.create_table('rna_channel', ( - ('name', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('modified', self.gf('django.db.models.fields.DateTimeField')(blank=True, db_index=True)), - ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), - )) - db.send_create_signal('rna', ['Channel']) - - # Adding model 'Product' - db.create_table('rna_product', ( - ('name', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)), - ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now, blank=True)), - ('text', self.gf('django.db.models.fields.TextField')(blank=True)), - ('modified', self.gf('django.db.models.fields.DateTimeField')(blank=True, db_index=True)), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - )) - db.send_create_signal('rna', ['Product']) - - - models = { - 'rna.note': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, - 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'fixed_in_release': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fixed_note_set'", 'null': 'True', 'to': "orm['rna.Release']"}), - 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'releases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['rna.Release']", 'symmetrical': 'False'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'tag': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) - }, - 'rna.release': { - 'Meta': {'object_name': 'Release'}, - 'channel': ('django.db.models.fields.IntegerField', [], {}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'product': ('django.db.models.fields.IntegerField', [], {}), - 'release_date': ('django.db.models.fields.DateTimeField', [], {}), - 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['rna'] \ No newline at end of file diff --git a/vendor-local/lib/python/rna/migrations/0007_auto__add_field_release_is_public.py b/vendor-local/lib/python/rna/migrations/0007_auto__add_field_release_is_public.py deleted file mode 100644 index 198f980a103..00000000000 --- a/vendor-local/lib/python/rna/migrations/0007_auto__add_field_release_is_public.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding field 'Release.is_public' - db.add_column('rna_release', 'is_public', - self.gf('django.db.models.fields.BooleanField')(default=False), - keep_default=False) - - - def backwards(self, orm): - # Deleting field 'Release.is_public' - db.delete_column('rna_release', 'is_public') - - - models = { - 'rna.note': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, - 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'fixed_in_release': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'fixed_note_set'", 'null': 'True', 'to': "orm['rna.Release']"}), - 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'releases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['rna.Release']", 'symmetrical': 'False', 'blank': 'True'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'tag': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) - }, - 'rna.release': { - 'Meta': {'ordering': "('product', '-version', 'channel')", 'object_name': 'Release'}, - 'channel': ('django.db.models.fields.IntegerField', [], {}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'product': ('django.db.models.fields.IntegerField', [], {}), - 'release_date': ('django.db.models.fields.DateTimeField', [], {}), - 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['rna'] \ No newline at end of file diff --git a/vendor-local/lib/python/rna/migrations/0008_auto__add_field_note_is_known_issue.py b/vendor-local/lib/python/rna/migrations/0008_auto__add_field_note_is_known_issue.py deleted file mode 100644 index b38166f5e0c..00000000000 --- a/vendor-local/lib/python/rna/migrations/0008_auto__add_field_note_is_known_issue.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding field 'Note.is_known_issue' - db.add_column('rna_note', 'is_known_issue', - self.gf('django.db.models.fields.BooleanField')(default=False), - keep_default=False) - - - def backwards(self, orm): - # Deleting field 'Note.is_known_issue' - db.delete_column('rna_note', 'is_known_issue') - - - models = { - 'rna.note': { - 'Meta': {'ordering': "('sort_num',)", 'object_name': 'Note'}, - 'bug': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'fixed_in_release': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'fixed_note_set'", 'null': 'True', 'to': "orm['rna.Release']"}), - 'html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_known_issue': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'releases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['rna.Release']", 'symmetrical': 'False', 'blank': 'True'}), - 'sort_num': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'tag': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) - }, - 'rna.release': { - 'Meta': {'ordering': "('product', '-version', 'channel')", 'object_name': 'Release'}, - 'channel': ('django.db.models.fields.IntegerField', [], {}), - 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'blank': 'True'}), - 'product': ('django.db.models.fields.IntegerField', [], {}), - 'release_date': ('django.db.models.fields.DateTimeField', [], {}), - 'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['rna'] \ No newline at end of file diff --git a/vendor-local/lib/python/rna/migrations/__init__.py b/vendor-local/lib/python/rna/migrations/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor-local/lib/python/rna/models.py b/vendor-local/lib/python/rna/models.py deleted file mode 100644 index 8938de6c341..00000000000 --- a/vendor-local/lib/python/rna/models.py +++ /dev/null @@ -1,113 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -from datetime import datetime - -from django.db import models -from django_extensions.db.fields import CreationDateTimeField - - -class TimeStampedModel(models.Model): - """ - Replacement for django_extensions.db.models.TimeStampedModel - that updates the modified timestamp by default, but allows - that behavior to be overridden by passing a modified=False - parameter to the save method - """ - created = CreationDateTimeField() - modified = models.DateTimeField(editable=False, blank=True, db_index=True) - - class Meta: - abstract = True - - def save(self, *args, **kwargs): - if kwargs.pop('modified', True): - self.modified = datetime.now() - super(TimeStampedModel, self).save(*args, **kwargs) - - -class Release(TimeStampedModel): - NIGHTLY = 0 - AURORA = 1 - BETA = 2 - RELEASE = 3 - CHANNELS = ( - (NIGHTLY, 'Nightly'), - (AURORA, 'Aurora'), - (BETA, 'Beta'), - (RELEASE, 'Release'), - ) - - FIREFOX = 0 - FENNEC = 1 - ESR = 2 - PRODUCTS = ( - (FIREFOX, 'Firefox'), - (FENNEC, 'Firefox for Android'), - (ESR, 'Firefox Extended Support Release'), - ) - - product = models.IntegerField(choices=PRODUCTS) - channel = models.IntegerField(choices=CHANNELS) - version = models.CharField(max_length=255) - release_date = models.DateTimeField() - text = models.TextField(blank=True) - is_public = models.BooleanField(default=False) - - def notes(self): - """ - Retrieve a list of Note instances that should be shown for this - release, grouped as either new features or known issues. - """ - notes = self.note_set.all() - - new_features = (note for note in notes if - not note.is_known_issue_for(self)) - known_issues = (note for note in notes if - note.is_known_issue_for(self)) - - return new_features, known_issues - - def __unicode__(self): - return '{product} v{version} {channel}'.format( - product=self.get_product_display(), - version=self.version, - channel=self.get_channel_display() - ) - - class Meta: - ordering = ('product', '-version', 'channel') - - -class Note(TimeStampedModel): - NEW = 0 - CHANGED = 1 - HTML5 = 2 - FIXED = 3 - DEVELOPER = 4 - TAGS = ( - (NEW, 'New'), - (CHANGED, 'Changed'), - (HTML5, 'HTML5'), - (FIXED, 'Fixed'), - (DEVELOPER, 'Developer'), - ) - - bug = models.IntegerField(null=True, blank=True) - html = models.TextField(blank=True) - releases = models.ManyToManyField(Release, blank=True) - is_known_issue = models.BooleanField(default=False) - fixed_in_release = models.ForeignKey(Release, null=True, blank=True, - related_name='fixed_note_set') - tag = models.IntegerField(null=True, choices=TAGS) - sort_num = models.IntegerField(null=True, blank=True) - - def is_known_issue_for(self, release): - return self.is_known_issue and self.fixed_in_release != release - - class Meta: - ordering = ('sort_num',) - - def __unicode__(self): - return self.html diff --git a/vendor-local/lib/python/rna/serializers.py b/vendor-local/lib/python/rna/serializers.py deleted file mode 100644 index 804d123d7d7..00000000000 --- a/vendor-local/lib/python/rna/serializers.py +++ /dev/null @@ -1,48 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -from django.conf import settings - -from rest_framework import serializers -from rest_framework.compat import parse_datetime - - -def get_client_serializer_class(model_class): - if settings.RNA.get('LEGACY_API', False): - Serializer = serializers.ModelSerializer - else: - Serializer = UnmodifiedTimestampSerializer - - class ClientSerializer(Serializer): - class Meta: - model = model_class - - return ClientSerializer - - -class HyperlinkedModelSerializerWithPkField( - serializers.HyperlinkedModelSerializer): - - def get_pk_field(self, model_field): - """ - Returns a default instance of the pk field, unlike - the parent class, which omits the pk field. - """ - return self.get_field(model_field) - - -class UnmodifiedTimestampSerializer(serializers.ModelSerializer): - def restore_object(self, attrs, instance=None): - obj = super(UnmodifiedTimestampSerializer, self).restore_object( - attrs, instance=instance) - for attr in ('created', 'modified'): # TODO: dynamic attr list - value = getattr(obj, attr, None) - if value and isinstance(value, basestring): - setattr(obj, attr, parse_datetime(value)) - return obj - - def save_object(self, obj, **kwargs): - kwargs['modified'] = False - return super(UnmodifiedTimestampSerializer, self).save_object( - obj, **kwargs) diff --git a/vendor-local/lib/python/rna/tests.py b/vendor-local/lib/python/rna/tests.py deleted file mode 100644 index 83d36b741a3..00000000000 --- a/vendor-local/lib/python/rna/tests.py +++ /dev/null @@ -1,762 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -from datetime import datetime - -from django.core.exceptions import ObjectDoesNotExist -from django.test import TestCase -from django.test.utils import override_settings -from mock import Mock, patch -from nose.tools import eq_, ok_ - -from . import clients, fields, filters, models, serializers, views -from .management.commands import rnasync - - -class TimeStampedModelTest(TestCase): - @patch('rna.rna.models.models.Model.save') - def test_default_modified(self, mock_super_save): - start = datetime.now() - model = models.TimeStampedModel() - model.save(db='test') - ok_(model.modified > start) - mock_super_save.assert_called_once_with(db='test') - - @patch('rna.rna.models.models.Model.save') - def test_unmodified(self, mock_super_save): - model = models.TimeStampedModel() - model.modified = space_odyssey = datetime(2001, 1, 1) - model.save(modified=False, db='test') - eq_(model.modified, space_odyssey) - mock_super_save.assert_called_once_with(db='test') - - -class NoteTest(TestCase): - def test_unicode(self): - """ - Should equal description - """ - note = models.Note(html='test') - eq_(unicode(note), 'test') - - def test_is_known_issue_for_not_known(self): - """ - Should be False if is_known_issue is False. - """ - note = models.Note(is_known_issue=False) - release = Mock(spec=models.Release()) - eq_(note.is_known_issue_for(release), False) - - def test_is_known_issue_for_wrong_release(self): - """ - Should be True if is_known_issue is True but fixed_in_release - doesn't match given release. - """ - fixed_release = Mock(spec=models.Release()) - release = Mock(spec=models.Release()) - note = models.Note(is_known_issue=True, - fixed_in_release=fixed_release) - eq_(note.is_known_issue_for(release), True) - - def test_is_known_issue_for(self): - """ - Should be False if is_known_issue is True and fixed_in_release - matches the given release. - """ - release = Mock(spec=models.Release()) - note = models.Note(is_known_issue=True, - fixed_in_release=release) - eq_(note.is_known_issue_for(release), False) - - -class ReleaseTest(TestCase): - def test_unicode(self): - """ - Should equal name - """ - release = models.Release(product=models.Release.FIREFOX, - channel=models.Release.RELEASE, - version='12.0.1') - eq_(unicode(release), 'Firefox v12.0.1 Release') - - def test_notes(self): - """ - Should split notes into new features and known issues. - """ - new_feature_1 = Mock(**{'is_known_issue_for.return_value': False}) - new_feature_2 = Mock(**{'is_known_issue_for.return_value': False}) - known_issue_1 = Mock(**{'is_known_issue_for.return_value': True}) - known_issue_2 = Mock(**{'is_known_issue_for.return_value': True}) - - with patch.object(models.Release, 'note_set') as note_set: - release = models.Release() - note_set.all.return_value = [new_feature_1, new_feature_2, - known_issue_1, known_issue_2] - new_features, known_issues = release.notes() - - eq_(set(new_features), set([new_feature_1, new_feature_2])) - eq_(set(known_issues), set([known_issue_1, known_issue_2])) - - -class ISO8601DateTimeFieldTest(TestCase): - @patch('rna.rna.fields.parse_datetime') - def test_strptime(self, mock_parse_datetime): - """ - Should equal expected_date returned by mock_parse_datetime - """ - expected_date = datetime(2001, 1, 1) - mock_parse_datetime.return_value = expected_date - field = fields.ISO8601DateTimeField() - eq_(field.strptime('value', 'format'), expected_date) - - -class TimeStampedModelSubclass(models.TimeStampedModel): - test = models.models.BooleanField(default=True) - - -class TimestampedFilterBackendTest(TestCase): - @patch('rna.rna.filters.DjangoFilterBackend.get_filter_class', - return_value='The Dude') - def test_filter_class(self, mock_super_get_filter_class): - """ - Should return super call if view has filter_class attr - """ - mock_view = Mock(filter_class='abides') - filter_backend = filters.TimestampedFilterBackend() - eq_(filter_backend.get_filter_class(mock_view), 'The Dude') - - @patch('rna.rna.filters.DjangoFilterBackend.get_filter_class', - return_value='The Dude') - def test_filter_fields(self, mock_super_get_filter_class): - """ - Should return super call if view has filter_fields attr - """ - mock_view = Mock(filter_fields='abides') - filter_backend = filters.TimestampedFilterBackend() - eq_(filter_backend.get_filter_class(mock_view), 'The Dude') - - @patch('rna.rna.filters.DjangoFilterBackend.get_filter_class') - def test_no_queryset(self, mock_super_get_filter_class): - """ - Should return None if queryset is None (the default) - """ - view = 'nice' - filter_backend = filters.TimestampedFilterBackend() - eq_(filter_backend.get_filter_class(view), None) - ok_(not mock_super_get_filter_class.called) - - @patch('rna.rna.filters.DjangoFilterBackend.get_filter_class') - def test_non_timestampedmodel(self, mock_super_get_filter_class): - """ - Should return None if queryset.model is not a subclass of - models.TimeStampedModel - """ - view = 'nice' - queryset = Mock(model=models.models.Model) # model - filter_backend = filters.TimestampedFilterBackend() - eq_(filter_backend.get_filter_class(view, queryset=queryset), None) - ok_(not mock_super_get_filter_class.called) - - @patch('rna.rna.filters.DjangoFilterBackend.get_filter_class') - def test_default(self, mock_super_get_filter_class): - """ - Should return a subclass of the default_filter_set instance - attr with the inner Meta class model attr equal to the queryset - model and fields equal to all of the model fields except - created and modified, and in addition the created_before, - created_after, modified_before, and modified_after fields - """ - view = 'nice' - queryset = Mock(model=TimeStampedModelSubclass) - filter_backend = filters.TimestampedFilterBackend() - filter_class = filter_backend.get_filter_class(view, queryset=queryset) - eq_(filter_class.Meta.model, TimeStampedModelSubclass) - eq_(filter_class.Meta.fields, - ['created_before', 'created_after', 'modified_before', - 'modified_after', 'id', 'test']) - ok_(not mock_super_get_filter_class.called) - - @patch('rna.rna.filters.DjangoFilterBackend.get_filter_class') - def test_exclude_fields(self, mock_super_get_filter_class): - """ - Should not include fields named in the view. - """ - mock_view = Mock( - filter_class=None, filter_fields=None, - filter_fields_exclude=('created_before', 'id')) - queryset = Mock(model=TimeStampedModelSubclass) - filter_backend = filters.TimestampedFilterBackend() - filter_class = filter_backend.get_filter_class( - mock_view, queryset=queryset) - eq_(filter_class.Meta.model, TimeStampedModelSubclass) - eq_(filter_class.Meta.fields, - ['created_after', 'modified_before', 'modified_after', 'test']) - eq_(mock_super_get_filter_class.called, 0) - - -class RestClientTest(TestCase): - def test_init_kwargs(self): - """ - Should set base_url and token attr from kwargs - """ - rc = clients.RestClient(base_url='http://thedu.de', token='midnight') - eq_(rc.base_url, 'http://thedu.de') - eq_(rc.token, 'midnight') - - @override_settings(RNA={'TOKEN': 'midnight', - 'BASE_URL': 'http://thedu.de'}) - def test_init_settings(self): - """ - Should set base_url and token attrs from settings - """ - rc = clients.RestClient() - eq_(rc.base_url, 'http://thedu.de') - eq_(rc.token, 'midnight') - - @patch('rna.rna.clients.requests.request') - def test_request_base_url_concat(self, mock_request): - """ - Should concatenate base_url and url - """ - - rc = clients.RestClient(base_url='http://thedu.de') - mock_request.return_value = 'response' - response = rc.request('get', '/abides') - mock_request.assert_called_once_with('get', 'http://thedu.de/abides') - eq_(response, 'response') - - @patch('rna.rna.clients.requests.request') - def test_request_redundant_url(self, mock_request): - """ - Should not concatenate base_url if url starts with it - """ - - rc = clients.RestClient(base_url='http://thedu.de') - mock_request.return_value = Mock(content='{"aggression": "not stand"}') - response = rc.request('get', 'http://thedu.de/abides') - eq_(response.content, '{"aggression": "not stand"}') - mock_request.assert_called_once_with('get', 'http://thedu.de/abides') - - @patch('rna.rna.clients.requests.request') - def test_request_token(self, mock_request): - """ - Should set Authorization header to expected format - """ - mock_request.return_value = 'this aggression will not stand!' - rc = clients.RestClient(base_url='http://thedu.de', token='midnight') - response = rc.request('get', '') - mock_request.assert_called_once_with( - 'get', 'http://thedu.de', - headers={'Authorization': 'Token midnight'}) - eq_(response, 'this aggression will not stand!') - - @patch('rna.rna.clients.requests.request') - def test_request_token_preserves_headers(self, mock_request): - """ - Should set Authorization header to expected format without removing - other headers - """ - - mock_request.return_value = 'this aggression will not stand!' - rc = clients.RestClient(base_url='http://thedu.de', token='midnight') - - response = rc.request('get', '', headers={'White': 'Russian'}) - mock_request.assert_called_once_with( - 'get', 'http://thedu.de', - headers={'Authorization': 'Token midnight', 'White': 'Russian'}) - eq_(response, 'this aggression will not stand!') - - @patch('rna.rna.clients.requests.request') - def test_request_delete(self, mock_request): - """ - Should return unmodified response from requests.request - """ - rc = clients.RestClient(base_url='http://th.is') - mock_request.return_value = Mock(status_code=204) - response = rc.request('delete', '/aggression') - mock_request.assert_called_once_with( - 'delete', 'http://th.is/aggression') - eq_(response.status_code, 204) - - @patch('rna.rna.clients.RestClient.request') - def test_delete(self, mock_request): - """ - Should pass through kwargs and return unmodified response from - self.request - """ - rc = clients.RestClient(base_url='http://th.is') - mock_request.return_value = Mock(status_code=204) - response = rc.delete('/aggression', params={'will': 'not stand'}) - mock_request.assert_called_once_with( - 'delete', '/aggression', params={'will': 'not stand'}) - eq_(response.status_code, 204) - - @patch('rna.rna.clients.RestClient.request') - def test_get_params(self, mock_request): - """ - Should pass through kwargs and return unmodified response from - self.request - """ - rc = clients.RestClient(base_url='http://thedu.de') - mock_request.return_value = 'abides' - response = rc.get('', params={'white': 'russian'}) - mock_request.assert_called_once_with( - 'get', '', params={'white': 'russian'}) - eq_(response, 'abides') - - @patch('rna.rna.clients.RestClient.request') - def test_get_cached(self, mock_request): - """ - Should return cached response without calling self.request - """ - rc = clients.RestClient(base_url='http://thedu.de') - rc.cache = {'': 'abides'} - response = rc.get() - eq_(response, 'abides') - ok_(not mock_request.called) - - @patch('rna.rna.clients.RestClient.request') - def test_get_cache_miss_200(self, mock_request): - """ - Should cache and return response - """ - mock_request.return_value = Mock(status_code=200) - rc = clients.RestClient() - response = rc.get() - mock_request.assert_called_once_with('get', '') - eq_(response.status_code, 200) - eq_(rc.cache[''].status_code, 200) - - @patch('rna.rna.clients.RestClient.request') - def test_get_cache_miss_500(self, mock_request): - """ - Should return response without caching - """ - mock_request.return_value = Mock(status_code=500) - rc = clients.RestClient() - response = rc.get() - eq_(response.status_code, 500) - mock_request.assert_called_once_with('get', '') - eq_(rc.cache, {}) - - @patch('rna.rna.clients.RestClient.request') - def test_options(self, mock_request): - """ - Should pass through kwargs and return unmodified response from - self.request - """ - rc = clients.RestClient(base_url='http://thedu.de') - mock_request.return_value = {'white': 'russians'} - response = rc.options('/drinks') - mock_request.assert_called_once_with('options', '/drinks') - eq_(response, {'white': 'russians'}) - - @patch('rna.rna.clients.RestClient.request') - def test_options_cached(self, mock_request): - """ - Should return cached value without calling self.request - """ - rc = clients.RestClient(base_url='http://thedu.de') - rc.cache['OPTIONS'] = {'/drinks': {'white': 'russians'}} - response = rc.options('/drinks') - eq_(mock_request.called, 0) - eq_(response, {'white': 'russians'}) - - @patch('rna.rna.clients.RestClient.request') - def test_post(self, mock_request): - """ - Should pass through data to, and return unmodified response - from, self.request - """ - rc = clients.RestClient(base_url='http://walt.er') - mock_request.return_value = Mock( - content='Is this your homework, Larry?') - response = rc.post('/larry', data={'world': 'of pain'}) - mock_request.assert_called_once_with( - 'post', '/larry', data={'world': 'of pain'}) - eq_(response.content, 'Is this your homework, Larry?') - - @patch('rna.rna.clients.RestClient.request') - def test_put(self, mock_request): - """ - Should pass through data to, and return unmodified response - from, self.request - """ - rc = clients.RestClient(base_url='http://walt.er') - mock_request.return_value = Mock( - content='Is this your homework, Larry?') - response = rc.put('/larry', data={'world': 'of pain'}) - mock_request.assert_called_once_with( - 'put', '/larry', data={'world': 'of pain'}) - eq_(response.content, 'Is this your homework, Larry?') - - -class RestModelClientTest(TestCase): - @patch('rna.rna.clients.RestClient.__init__') - def test_init_kwargs(self, mock_super_init): - """ - Should set model_class from model_class kwarg - """ - rc = clients.RestModelClient( - base_url='http://thedu.de', token='midnight', model_class='super') - eq_(rc.model_class, 'super') - mock_super_init.assert_called_once_with( - base_url='http://thedu.de', cache=None, token='midnight') - - @patch('rna.rna.clients.RestModelClient.serializer') - @patch('rna.rna.clients.RestModelClient.restore') - @patch('rna.rna.clients.RestModelClient.get') - def test_model(self, mock_get, mock_restore, mock_serializer): - """ - Should pass data from super get to restore method and return instance - """ - data = {'rank': 'lieutenant commander'} - mock_get.return_value = Mock(json=lambda: data) - mock_serializer.return_value = 'mock serializer' - mock_restore.return_value = 'instance' - rc = clients.RestModelClient() - instance = rc.model(model_class='super') - eq_(instance, 'instance') - mock_serializer.assert_called_once_with('super') - mock_restore.assert_called_once_with( - 'mock serializer', data, False, False) - - @patch('rna.rna.clients.RestModelClient.serializer') - @patch('rna.rna.clients.RestModelClient.restore') - @patch('rna.rna.clients.RestModelClient.get') - def test_models(self, mock_get, mock_restore, mock_serializer): - """ - Should return list of model instances if data from get is a list - """ - data = [{'rank': 'lieutenant commander'}, {'eyes': 'yellow'}] - mock_get.return_value = Mock(json=lambda: data) - mock_serializer.return_value = 'mock serializer' - rc = clients.RestModelClient() - rc.model(model_class='super') - mock_serializer.assert_called_once_with('super') - mock_restore.assert_any_call( - 'mock serializer', data[0], False, False) - mock_restore.assert_any_call( - 'mock serializer', data[1], False, False) - - @patch('rna.rna.clients.RestModelClient.hypermodel') - def test_restore(self, mock_hypermodel): - """ - Should return instance from serializer.restore_object - Should remove url field from data - Should use hypermodel method on FK and M2M fields - """ - mock_fk_field = Mock(spec=models.models.ForeignKey) - mock_fk_field.name = 'fk' - mock_fk_field.rel = Mock(to='to') - - mock_fk_field_not_in_data = Mock(spec=models.models.ForeignKey) - mock_fk_field_not_in_data.name = 'no data' - - mock_m2m_field = Mock(spec=models.models.ManyToManyField) - mock_m2m_field.name = 'm2m' - mock_m2m_field.rel = Mock(to='to2') - - mock_serializer = Mock() - mock_serializer.Meta.model._meta.fields = [ - mock_fk_field, - 'non_fk_field', - mock_fk_field_not_in_data - ] - mock_serializer.Meta.model._meta.many_to_many = [mock_m2m_field] - - data = { - 'url': 'http://remove.me', - 'fk': 'http://thedu.de', - 'm2m': ['http://example.com/foo', 'http://example.com/bar'], - } - rc = clients.RestModelClient() - instance = rc.restore(mock_serializer, data) - - eq_(instance, mock_serializer.restore_object.return_value) - - mock_hypermodel.assert_any_call('http://thedu.de', 'to', False) - mock_hypermodel.assert_any_call('http://example.com/foo', 'to2', False) - mock_hypermodel.assert_any_call('http://example.com/bar', 'to2', False) - - hyper_return = mock_hypermodel.return_value - mock_serializer.restore_object.assert_called_with({ - 'fk': hyper_return, - 'm2m': [hyper_return, hyper_return], - }) - eq_(mock_serializer.save_object.called, 0) - - @patch('rna.rna.clients.RestModelClient.hypermodel') - def test_restore_save_modified(self, mock_hypermodel): - """ - Should pass instance to serializer.save_object - """ - mock_serializer = Mock() - mock_serializer.Meta.model._meta.fields = [] - mock_serializer.Meta.model._meta.many_to_many = [] - - rc = clients.RestModelClient() - instance = rc.restore(mock_serializer, {}, save=True, modified=True) - eq_(instance, mock_serializer.restore_object.return_value) - mock_serializer.restore_object.assert_called_once_with({}) - mock_serializer.save_object.assert_called_once_with(instance, modified=True) - eq_(mock_hypermodel.called, 0) - - @patch('rna.rna.clients.RestModelClient.serialize') - @patch('rna.rna.clients.RestModelClient.post') - def test_post_instance(self, mock_post, mock_serialize): - """ - Should pass serialized data to post method - """ - instance = 'instance' - rc = clients.RestModelClient() - response = rc.post_instance(instance, 'http://positronic.net') - eq_(response, mock_post.return_value) - mock_post.assert_called_once_with( - 'http://positronic.net', mock_serialize.return_value) - mock_serialize.assert_called_once_with(instance) - - @patch('rna.rna.clients.RestModelClient.serialize') - @patch('rna.rna.clients.RestModelClient.put') - def test_put_instance(self, mock_put, mock_serialize): - """ - Should pass serialized data to put method - """ - instance = 'instance' - rc = clients.RestModelClient() - response = rc.put_instance(instance, 'http://positronic.net') - eq_(response, mock_put.return_value) - mock_put.assert_called_once_with( - 'http://positronic.net', mock_serialize.return_value) - mock_serialize.assert_called_once_with(instance) - - @patch('rna.rna.clients.RestClient.__init__') - @patch('rna.rna.clients.RestModelClient.serializer') - def test_serialize(self, mock_serializer, mock_super_init): - """ - Should pass instance through to serializer and return data attr - """ - serialized_data = '{"eyes": "yellow"}' - mock_serializer.return_value = Mock(data=serialized_data) - mock_instance = Mock(eyes='yellow') - rc = clients.RestModelClient() - serialized = rc.serialize(instance=mock_instance) - eq_(serialized, serialized_data) - mock_serializer.assert_called_once_with(instance=mock_instance) - - def test_model_client_default(self): - rc = clients.RestModelClient(model_class='super') - model_client = rc.model_client(model_class='amateur') - ok_(isinstance(model_client, clients.RestModelClient)) - eq_(model_client.model_class, 'amateur') - eq_(rc.model_map['amateur'], model_client) - - @patch('rna.rna.clients.RestModelClient.get', - return_value=Mock(json=lambda: {'the_dude': 'http://abid.es'})) - def test_model_client_url_name(self, mock_get): - rc = clients.RestModelClient() - rc.model_map['the_dude'] = 'abides' - model_client = rc.model_client(url_name='the_dude') - eq_(model_client.base_url, 'http://abid.es') - eq_(model_client.model_class, 'abides') - eq_(rc.model_map['abides'], model_client) - mock_get.assert_called_once_with() - - @patch('rna.rna.serializers.get_client_serializer_class') - def test_serializer(self, mock_get_client_serializer_class): - mock_serializer_class = Mock(return_value='mock serializer') - mock_get_client_serializer_class.return_value = mock_serializer_class - rc = clients.RestModelClient() - serializer = rc.serializer(model_class='super', instance='this') - eq_(serializer, 'mock serializer') - mock_get_client_serializer_class.assert_called_once_with('super') - mock_serializer_class.assert_called_once_with(instance='this') - - def test_hypermodel_exists(self): - mock_model_class = Mock() - - rc = clients.RestModelClient() - instance = rc.hypermodel('http://the.answ.er/is/42/', mock_model_class, - False) - eq_(instance, mock_model_class.objects.get.return_value) - mock_model_class.objects.get.assert_called_once_with(pk='42') - - @patch('rna.rna.clients.RestModelClient.model_client') - def test_hypermodel_does_not_exist(self, mock_model_client): - mock_model_class = Mock() - mock_model_class.objects.get.side_effect = ObjectDoesNotExist - - mock_model = Mock(return_value='what was the question?') - mock_model_client.return_value = Mock(model=mock_model) - - rc = clients.RestModelClient(token='midnight') - instance = rc.hypermodel('http://the.answ.er/is/42/', mock_model_class, - False) - - eq_(instance, 'what was the question?') - mock_model_class.objects.get.assert_called_once_with(pk='42') - mock_model_client.assert_called_once_with( - base_url='http://the.answ.er/is/', model_class=mock_model_class, - token='midnight') - mock_model.assert_called_once_with(url='42/', save=False) - - -class RNASyncCommandTest(TestCase): - @patch('rna.rna.clients.LegacyRNAModelClient.__init__') - def test_rna_client_legacy_api(self, mock_init): - """ - Should return a LegacyRNAModelClient instance - """ - mock_init.return_value = None - instance = rnasync.Command().rna_client(True) - ok_(isinstance(instance, clients.LegacyRNAModelClient)) - mock_init.assert_called_once_with() - - @patch('rna.rna.clients.RNAModelClient.__init__') - def test_rna_client_non_legacy_api(self, mock_init): - """ - Should return an RNAModelClient instance - """ - mock_init.return_value = None - instance = rnasync.Command().rna_client(False) - ok_(isinstance(instance, clients.RNAModelClient)) - mock_init.assert_called_once_with() - - def test_model_params_legacy_api(self): - """ - Should return mapping of models to empty dicts - """ - models = ['model1', 'model2'] - params = rnasync.Command().model_params(models, legacy_api=True) - eq_(params, {'model1': {}, 'model2': {}}) - - def test_model_params_non_legacy_api_no_latest(self): - """ - Should return mapping of mock_model to empty dict - """ - legacy_api = False - latest = Mock(side_effect=ObjectDoesNotExist) - mock_model = Mock(objects=Mock(latest=latest)) - - params = rnasync.Command().model_params([mock_model], legacy_api) - - eq_(params, {mock_model: {}}) - latest.assert_called_once_with('modified') - - def test_model_params_non_legacy_api_with_latest(self): - """ - Should return mapping of model to query params dict with a - 'modified_after' key and a value of the latest modified datetime - in ISO 8601 format - """ - legacy_api = False - mock_isoformat = lambda: '2013-10-22T22:29:03.718815' - mock_instance = Mock(modified=Mock(isoformat=mock_isoformat)) - latest = Mock(return_value=mock_instance) - mock_model = Mock(objects=Mock(latest=latest)) - - params = rnasync.Command().model_params([mock_model], legacy_api) - - eq_(params, {mock_model: {'modified_after': mock_isoformat()}}) - latest.assert_called_once_with('modified') - - @override_settings(RNA={'LEGACY_API': True}) - @patch('rna.rna.management.commands.rnasync.Command.rna_client') - @patch('rna.rna.management.commands.rnasync.Command.model_params') - def test_handle(self, mock_model_params, mock_rna_client): - mock_model = Mock() - mock_model_client = Mock(return_value=Mock(model=mock_model)) - mock_rna_client.return_value = Mock( - model_map={'mock_url_name': 'mock_model'}, - model_client=mock_model_client) - params = {'modified_after': '2013-10-22T22:29:03.718815'} - mock_model_params.return_value = {'mock_model': params} - - rnasync.Command().handle() - - mock_rna_client.assert_called_once_with(True) - mock_model_params.assert_called_once_with(['mock_model'], True) - mock_model_client.assert_called_once_with('mock_url_name') - mock_model.assert_called_once_with(save=True, params=params) - - -class GetClientSerializerClassTest(TestCase): - @override_settings(RNA={'LEGACY_API': False}) - def test_get_client_serializer_class(self): - ClientSerializer = serializers.get_client_serializer_class( - 'mock_model_class') - ok_(issubclass(ClientSerializer, - serializers.UnmodifiedTimestampSerializer)) - eq_(ClientSerializer.Meta.model, 'mock_model_class') - - @override_settings(RNA={'LEGACY_API': True}) - def test_get_legacy_client_serializer_class(self): - ClientSerializer = serializers.get_client_serializer_class( - 'mock_model_class') - ok_(issubclass(ClientSerializer, - serializers.serializers.ModelSerializer)) - eq_(ClientSerializer.Meta.model, 'mock_model_class') - - -class HyperlinkedModelSerializerWithPkFieldTest(TestCase): - @patch('rna.rna.serializers.HyperlinkedModelSerializerWithPkField' - '.get_field', return_value='mock field') - @patch('rna.rna.serializers.HyperlinkedModelSerializerWithPkField' - '.__init__', return_value=None) - def test_get_pk_field(self, mock_init, mock_get_field): - serializer = serializers.HyperlinkedModelSerializerWithPkField() - eq_(serializer.get_pk_field('model_field'), 'mock field') - mock_get_field.assert_called_once_with('model_field') - - -class UnmodifiedTimestampSerializerTest(TestCase): - @patch('rna.rna.serializers.serializers.ModelSerializer.restore_object', - return_value=Mock(created='mock datetime str')) - @patch('rna.rna.serializers.parse_datetime', - return_value='mock parsed datetime') - @patch('rna.rna.serializers.UnmodifiedTimestampSerializer.__init__', - return_value=None) - def test_restore_object(self, mock_init, mock_parse_datetime, - mock_super_restore_object): - serializer = serializers.UnmodifiedTimestampSerializer() - obj = serializer.restore_object('attrs') - eq_(obj.created, 'mock parsed datetime') - mock_super_restore_object.assert_called_once_with( - 'attrs', instance=None) - mock_parse_datetime.assert_called_once_with('mock datetime str') - - @patch('rna.rna.serializers.serializers.ModelSerializer.save_object', - return_value='abides') - @patch('rna.rna.serializers.UnmodifiedTimestampSerializer.__init__', - return_value=None) - def test_save_object(self, mock_init, mock_super_save_object): - serializer = serializers.UnmodifiedTimestampSerializer() - the_dude = serializer.save_object('the dude', modified=True) - eq_(the_dude, 'abides') - mock_super_save_object.assert_called_once_with( - 'the dude', modified=False) - - -class URLsTest(TestCase): - @patch('rest_framework.routers.DefaultRouter.register') - @patch('rest_framework.routers.DefaultRouter.urls') - def test_urls(self, mock_urls, mock_register): - from . import urls - mock_register.assert_any_call('notes', views.NoteViewSet) - mock_register.assert_any_call('releases', views.ReleaseViewSet) - eq_(urls.urlpatterns, mock_urls) - - -class LegacyRNAModelTest(TestCase): - @patch('rna.rna.clients.RNAModelClient.restore', - return_value='restored') - def test_restore(self, mock_super_restore): - data = {'bug_num': 42, 'description': 'arthur dent'} - lc = clients.LegacyRNAModelClient() - serializer = Mock(Meta=Mock(model=models.Note)) - restored = lc.restore(serializer, data=data) - eq_(restored, 'restored') - mock_super_restore.assert_called_once_with( - serializer, {'bug': 42, 'html': 'arthur dent'}, save=False, - modified=True) diff --git a/vendor-local/lib/python/rna/urls.py b/vendor-local/lib/python/rna/urls.py deleted file mode 100644 index 74cc93890ad..00000000000 --- a/vendor-local/lib/python/rna/urls.py +++ /dev/null @@ -1,14 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -from rest_framework import routers - -from . import views - - -router = routers.DefaultRouter() -router.register('notes', views.NoteViewSet) -router.register('releases', views.ReleaseViewSet) - -urlpatterns = router.urls diff --git a/vendor-local/lib/python/rna/views.py b/vendor-local/lib/python/rna/views.py deleted file mode 100644 index 28dd166bb38..00000000000 --- a/vendor-local/lib/python/rna/views.py +++ /dev/null @@ -1,15 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -from rest_framework.viewsets import ModelViewSet - -from . import models - - -class NoteViewSet(ModelViewSet): - model = models.Note - - -class ReleaseViewSet(ModelViewSet): - model = models.Release diff --git a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/PKG-INFO b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/PKG-INFO deleted file mode 100644 index efb87374abe..00000000000 --- a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/PKG-INFO +++ /dev/null @@ -1,32 +0,0 @@ -Metadata-Version: 1.1 -Name: six -Version: 1.4.1 -Summary: Python 2 and 3 compatibility utilities -Home-page: http://pypi.python.org/pypi/six/ -Author: Benjamin Peterson -Author-email: benjamin@python.org -License: UNKNOWN -Description: Six is a Python 2 and 3 compatibility library. It provides utility functions - for smoothing over the differences between the Python versions with the goal of - writing Python code that is compatible on both Python versions. See the - documentation for more information on what is provided. - - Six supports every Python version since 2.4. It is contained in only one Python - file, so it can be easily copied into your project. (The copyright and license - notice must be retained.) - - Online documentation is at http://pythonhosted.org/six/. - - Bugs can be reported to http://bitbucket.org/gutworth/six. The code can also be - found there. - - For questions about six or porting in general, email the python-porting mailing - list: http://mail.python.org/mailman/listinfo/python-porting - -Platform: UNKNOWN -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 3 -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Topic :: Software Development :: Libraries -Classifier: Topic :: Utilities diff --git a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/SOURCES.txt b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/SOURCES.txt deleted file mode 100644 index b08d0832df5..00000000000 --- a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/SOURCES.txt +++ /dev/null @@ -1,6 +0,0 @@ -README -six.py -six.egg-info/PKG-INFO -six.egg-info/SOURCES.txt -six.egg-info/dependency_links.txt -six.egg-info/top_level.txt \ No newline at end of file diff --git a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/dependency_links.txt b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/dependency_links.txt deleted file mode 100644 index 8b137891791..00000000000 --- a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/installed-files.txt b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/installed-files.txt deleted file mode 100644 index 3873de50351..00000000000 --- a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/installed-files.txt +++ /dev/null @@ -1,7 +0,0 @@ -../six.py -../six.pyc -./ -dependency_links.txt -PKG-INFO -SOURCES.txt -top_level.txt diff --git a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/top_level.txt b/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/top_level.txt deleted file mode 100644 index ffe2fce4989..00000000000 --- a/vendor-local/lib/python/six-1.4.1-py2.7.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -six diff --git a/vendor-local/lib/python/six.py b/vendor-local/lib/python/six.py deleted file mode 100644 index 85898ec7127..00000000000 --- a/vendor-local/lib/python/six.py +++ /dev/null @@ -1,577 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2013 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.4.1" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) - # This is a bit ugly, but it avoids running this again. - delattr(tp, self.name) - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - - -class _MovedItems(types.ModuleType): - """Lazy loading of moved objects""" - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("winreg", "_winreg"), -] -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) -del attr - -moves = sys.modules[__name__ + ".moves"] = _MovedItems(__name__ + ".moves") - - - -class Module_six_moves_urllib_parse(types.ModuleType): - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -sys.modules[__name__ + ".moves.urllib_parse"] = Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse") -sys.modules[__name__ + ".moves.urllib.parse"] = Module_six_moves_urllib_parse(__name__ + ".moves.urllib.parse") - - -class Module_six_moves_urllib_error(types.ModuleType): - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -sys.modules[__name__ + ".moves.urllib_error"] = Module_six_moves_urllib_error(__name__ + ".moves.urllib_error") -sys.modules[__name__ + ".moves.urllib.error"] = Module_six_moves_urllib_error(__name__ + ".moves.urllib.error") - - -class Module_six_moves_urllib_request(types.ModuleType): - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -sys.modules[__name__ + ".moves.urllib_request"] = Module_six_moves_urllib_request(__name__ + ".moves.urllib_request") -sys.modules[__name__ + ".moves.urllib.request"] = Module_six_moves_urllib_request(__name__ + ".moves.urllib.request") - - -class Module_six_moves_urllib_response(types.ModuleType): - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -sys.modules[__name__ + ".moves.urllib_response"] = Module_six_moves_urllib_response(__name__ + ".moves.urllib_response") -sys.modules[__name__ + ".moves.urllib.response"] = Module_six_moves_urllib_response(__name__ + ".moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(types.ModuleType): - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -sys.modules[__name__ + ".moves.urllib_robotparser"] = Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib_robotparser") -sys.modules[__name__ + ".moves.urllib.robotparser"] = Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - parse = sys.modules[__name__ + ".moves.urllib_parse"] - error = sys.modules[__name__ + ".moves.urllib_error"] - request = sys.modules[__name__ + ".moves.urllib_request"] - response = sys.modules[__name__ + ".moves.urllib_response"] - robotparser = sys.modules[__name__ + ".moves.urllib_robotparser"] - - -sys.modules[__name__ + ".moves.urllib"] = Module_six_moves_urllib(__name__ + ".moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" - - _iterkeys = "keys" - _itervalues = "values" - _iteritems = "items" - _iterlists = "lists" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - _iterkeys = "iterkeys" - _itervalues = "itervalues" - _iteritems = "iteritems" - _iterlists = "iterlists" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -def iterkeys(d, **kw): - """Return an iterator over the keys of a dictionary.""" - return iter(getattr(d, _iterkeys)(**kw)) - -def itervalues(d, **kw): - """Return an iterator over the values of a dictionary.""" - return iter(getattr(d, _itervalues)(**kw)) - -def iteritems(d, **kw): - """Return an iterator over the (key, value) pairs of a dictionary.""" - return iter(getattr(d, _iteritems)(**kw)) - -def iterlists(d, **kw): - """Return an iterator over the (key, [values]) pairs of a dictionary.""" - return iter(getattr(d, _iterlists)(**kw)) - - -if PY3: - def b(s): - return s.encode("latin-1") - def u(s): - return s - unichr = chr - if sys.version_info[1] <= 1: - def int2byte(i): - return bytes((i,)) - else: - # This is about 2x faster than the implementation above on 3.2+ - int2byte = operator.methodcaller("to_bytes", 1, "big") - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO -else: - def b(s): - return s - def u(s): - return unicode(s, "unicode_escape") - unichr = unichr - int2byte = chr - def byte2int(bs): - return ord(bs[0]) - def indexbytes(buf, i): - return ord(buf[i]) - def iterbytes(buf): - return (ord(byte) for byte in buf) - import StringIO - StringIO = BytesIO = StringIO.StringIO -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -if PY3: - import builtins - exec_ = getattr(builtins, "exec") - - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - - print_ = getattr(builtins, "print") - del builtins - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - - def print_(*args, **kwargs): - """The new-style print function.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - def write(data): - if not isinstance(data, basestring): - data = str(data) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) - -_add_doc(reraise, """Reraise an exception.""") - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - return meta("NewBase", bases, {}) - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - for slots_var in orig_vars.get('__slots__', ()): - orig_vars.pop(slots_var) - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper diff --git a/vendor-local/lib/python/south/__init__.py b/vendor-local/lib/python/south/__init__.py index 20c39178e63..86642c6b4ff 100644 --- a/vendor-local/lib/python/south/__init__.py +++ b/vendor-local/lib/python/south/__init__.py @@ -2,7 +2,7 @@ South - Useable migrations for Django apps """ -__version__ = "0.8.1" +__version__ = "0.8.4" __authors__ = [ "Andrew Godwin <andrew@aeracode.org>", "Andy McCurdy <andy@andymccurdy.com>" diff --git a/vendor-local/lib/python/south/creator/actions.py b/vendor-local/lib/python/south/creator/actions.py index 37586c23ca3..2ffc8ca19fa 100644 --- a/vendor-local/lib/python/south/creator/actions.py +++ b/vendor-local/lib/python/south/creator/actions.py @@ -137,12 +137,14 @@ class _NullIssuesField(object): A field that might need to ask a question about rogue NULL values. """ - allow_third_null_option = False + issue_with_backward_migration = False irreversible = False IRREVERSIBLE_TEMPLATE = ''' # User chose to not deal with backwards NULL issues for '%(model_name)s.%(field_name)s' - raise RuntimeError("Cannot reverse this migration. '%(model_name)s.%(field_name)s' and its values cannot be restored.")''' + raise RuntimeError("Cannot reverse this migration. '%(model_name)s.%(field_name)s' and its values cannot be restored.") + + # The following code is provided here to aid in writing a correct migration''' def deal_with_not_null_no_default(self, field, field_def): # If it's a CharField or TextField that's blank, skip this step. @@ -156,17 +158,17 @@ def deal_with_not_null_no_default(self, field, field_def): )) print(" ? Since you are %s, you MUST specify a default" % self.null_reason) print(" ? value to use for existing rows. Would you like to:") - print(" ? 1. Quit now, and add a default to the field in models.py") + print(" ? 1. Quit now"+("." if self.issue_with_backward_migration else ", and add a default to the field in models.py" )) print(" ? 2. Specify a one-off value to use for existing columns now") - if self.allow_third_null_option: - print(" ? 3. Disable the backwards migration by raising an exception.") + if self.issue_with_backward_migration: + print(" ? 3. Disable the backwards migration by raising an exception; you can edit the migration to fix it later") while True: choice = raw_input(" ? Please select a choice: ") if choice == "1": sys.exit(1) elif choice == "2": break - elif choice == "3" and self.allow_third_null_option: + elif choice == "3" and self.issue_with_backward_migration: break else: print(" ! Invalid choice.") @@ -266,7 +268,7 @@ class DeleteField(AddField): """ null_reason = "removing this field" - allow_third_null_option = True + issue_with_backward_migration = True def console_line(self): "Returns the string to print on the console, e.g. ' + Added field foo'" @@ -283,7 +285,7 @@ def backwards_code(self): if not self.irreversible: return AddField.forwards_code(self) else: - return self.irreversable_code(self.field) + return self.irreversable_code(self.field) + AddField.forwards_code(self) class ChangeField(Action, _NullIssuesField): @@ -315,7 +317,7 @@ def __init__(self, model, old_field, new_field, old_def, new_def): self.deal_with_not_null_no_default(self.new_field, self.new_def) if not self.old_field.null and self.new_field.null and not old_default: self.null_reason = "making this field nullable" - self.allow_third_null_option = True + self.issue_with_backward_migration = True self.deal_with_not_null_no_default(self.old_field, self.old_def) def console_line(self): @@ -353,10 +355,11 @@ def forwards_code(self): return self._code(self.old_field, self.new_field, self.new_def) def backwards_code(self): + change_code = self._code(self.new_field, self.old_field, self.old_def) if not self.irreversible: - return self._code(self.new_field, self.old_field, self.old_def) + return change_code else: - return self.irreversable_code(self.old_field) + return self.irreversable_code(self.old_field) + change_code class AddUnique(Action): diff --git a/vendor-local/lib/python/south/creator/changes.py b/vendor-local/lib/python/south/creator/changes.py index 9a11d9eb3b4..6cdbd19de0e 100644 --- a/vendor-local/lib/python/south/creator/changes.py +++ b/vendor-local/lib/python/south/creator/changes.py @@ -309,21 +309,21 @@ def get_changes(self): old_together = [old_together] if new_together and isinstance(new_together[0], string_types): new_together = [new_together] - old_together = list(map(set, old_together)) - new_together = list(map(set, new_together)) + old_together = frozenset(tuple(o) for o in old_together) + new_together = frozenset(tuple(n) for n in new_together) # See if any appeared or disappeared - for item in old_together: - if item not in new_together: - yield (del_operation, { - "model": self.old_orm[key], - "fields": [self.old_orm[key + ":" + x] for x in item], - }) - for item in new_together: - if item not in old_together: - yield (add_operation, { - "model": self.current_model_from_key(key), - "fields": [self.current_field_from_key(key, x) for x in item], - }) + disappeared = old_together.difference(new_together) + appeared = new_together.difference(old_together) + for item in disappeared: + yield (del_operation, { + "model": self.old_orm[key], + "fields": [self.old_orm[key + ":" + x] for x in item], + }) + for item in appeared: + yield (add_operation, { + "model": self.current_model_from_key(key), + "fields": [self.current_field_from_key(key, x) for x in item], + }) @classmethod def is_triple(cls, triple): diff --git a/vendor-local/lib/python/south/db/__init__.py b/vendor-local/lib/python/south/db/__init__.py index 9927c27f0cb..b9b7168e629 100644 --- a/vendor-local/lib/python/south/db/__init__.py +++ b/vendor-local/lib/python/south/db/__init__.py @@ -12,7 +12,8 @@ 'django.db.backends.mysql': 'mysql', 'mysql_oursql.standard': 'mysql', 'django.db.backends.oracle': 'oracle', - 'sql_server.pyodbc': 'sql_server.pyodbc', #django-pyodbc + 'sql_server.pyodbc': 'sql_server.pyodbc', #django-pyodbc-azure + 'django_pyodbc': 'sql_server.pyodbc', #django-pyodbc 'sqlserver_ado': 'sql_server.pyodbc', #django-mssql 'firebird': 'firebird', #django-firebird 'django.contrib.gis.db.backends.postgis': 'postgresql_psycopg2', diff --git a/vendor-local/lib/python/south/db/firebird.py b/vendor-local/lib/python/south/db/firebird.py index c55a82517fd..a079819bc36 100644 --- a/vendor-local/lib/python/south/db/firebird.py +++ b/vendor-local/lib/python/south/db/firebird.py @@ -71,21 +71,23 @@ def _column_has_default(self, params): def _alter_set_defaults(self, field, name, params, sqls): "Subcommand of alter_column that sets default values (overrideable)" - # Next, set any default - if not field.null and field.has_default(): - default = field.get_default() - sqls.append(('ALTER COLUMN %s SET DEFAULT %%s ' % (self.quote_name(name),), [default])) - elif self._column_has_default(params): + # Historically, we used to set defaults here. + # But since South 0.8, we don't ever set defaults on alter-column -- we only + # use database-level defaults as scaffolding when adding columns. + # However, we still sometimes need to remove defaults in alter-column. + if self._column_has_default(params): sqls.append(('ALTER COLUMN %s DROP DEFAULT' % (self.quote_name(name),), [])) @generic.invalidate_table_constraints def create_table(self, table_name, fields): - qn = self.quote_name(table_name) columns = [] autoinc_sql = '' for field_name, field in fields: + # avoid default values in CREATE TABLE statements (#925) + field._suppress_default = True + col = self.column_sql(table_name, field_name, field) if not col: continue @@ -95,8 +97,11 @@ def create_table(self, table_name, fields): field_name = field.db_column or field.column autoinc_sql = connection.ops.autoinc_sql(table_name, field_name) - sql = 'CREATE TABLE %s (%s);' % (qn, ', '.join([col for col in columns])) - self.execute(sql) + self.execute(self.create_table_sql % { + "table": self.quote_name(table_name), + "columns": ', '.join([col for col in columns if col]), + }) + if autoinc_sql: self.execute(autoinc_sql[0]) self.execute(autoinc_sql[1]) @@ -210,13 +215,17 @@ def column_sql(self, table_name, field_name, field, tablespace='', with_name=Tru for stmt in field.post_create_sql(no_style(), table_name): self.add_deferred_sql(stmt) - # In 1.2 and above, you have to ask the DatabaseCreation stuff for it. - # This also creates normal indexes in 1.1. - if hasattr(self._get_connection().creation, "sql_indexes_for_field"): - # Make a fake model to pass in, with only db_table - model = self.mock_model("FakeModelForGISCreation", table_name) - for stmt in self._get_connection().creation.sql_indexes_for_field(model, field, no_style()): - self.add_deferred_sql(stmt) + # Avoid double index creation (#1317) + # Firebird creates an index implicity for each foreign key field + # sql_indexes_for_field tries to create an index for that field too + if not field.rel: + # In 1.2 and above, you have to ask the DatabaseCreation stuff for it. + # This also creates normal indexes in 1.1. + if hasattr(self._get_connection().creation, "sql_indexes_for_field"): + # Make a fake model to pass in, with only db_table + model = self.mock_model("FakeModelForGISCreation", table_name) + for stmt in self._get_connection().creation.sql_indexes_for_field(model, field, no_style()): + self.add_deferred_sql(stmt) if sql: return sql % sqlparams diff --git a/vendor-local/lib/python/south/db/generic.py b/vendor-local/lib/python/south/db/generic.py index 1a26d955b5c..5c1935444db 100644 --- a/vendor-local/lib/python/south/db/generic.py +++ b/vendor-local/lib/python/south/db/generic.py @@ -444,12 +444,11 @@ def _alter_add_column_mods(self, field, name, params, sqls): def _alter_set_defaults(self, field, name, params, sqls): "Subcommand of alter_column that sets default values (overrideable)" - # Next, set any default - if not field.null and field.has_default(): - default = field.get_db_prep_save(field.get_default(), connection=self._get_connection()) - sqls.append(('ALTER COLUMN %s SET DEFAULT %%s ' % (self.quote_name(name),), [default])) - else: - sqls.append(('ALTER COLUMN %s DROP DEFAULT' % (self.quote_name(name),), [])) + # Historically, we used to set defaults here. + # But since South 0.8, we don't ever set defaults on alter-column -- we only + # use database-level defaults as scaffolding when adding columns. + # However, we still sometimes need to remove defaults in alter-column. + sqls.append(('ALTER COLUMN %s DROP DEFAULT' % (self.quote_name(name),), [])) def _update_nulls_to_default(self, params, field): "Subcommand of alter_column that updates nulls to default value (overrideable)" @@ -835,8 +834,13 @@ def create_index_name(self, table_name, column_names, suffix=""): # If there is just one column in the index, use a default algorithm from Django if len(column_names) == 1 and not suffix: + try: + _hash = self._digest([column_names[0]]) + except TypeError: + # Django < 1.5 backward compatibility. + _hash = self._digest(column_names[0]) return self.shorten_name( - '%s_%s' % (table_name, self._digest(column_names[0])) + '%s_%s' % (table_name, _hash), ) # Else generate the name for the index by South diff --git a/vendor-local/lib/python/south/db/mysql.py b/vendor-local/lib/python/south/db/mysql.py index f3f8cb1a698..3e87464ae03 100644 --- a/vendor-local/lib/python/south/db/mysql.py +++ b/vendor-local/lib/python/south/db/mysql.py @@ -37,13 +37,16 @@ def copy_column_constraints(func): def _column_cp(self, table_name, column_old, column_new, *args, **opts): # Copy foreign key constraint try: - constraint = self._find_foreign_constraints(table_name, column_old)[0] - (ftable, fcolumn) = self._lookup_constraint_references(table_name, constraint) - if ftable and fcolumn: - fk_sql = self.foreign_key_sql( - table_name, column_new, ftable, fcolumn) - get_logger().debug("Foreign key SQL: " + fk_sql) - self.add_deferred_sql(fk_sql) + constraint = self._find_foreign_constraints( + table_name, column_old)[0] + refs = self._lookup_constraint_references(table_name, constraint) + if refs is not None: + (ftable, fcolumn) = refs + if ftable and fcolumn: + fk_sql = self.foreign_key_sql( + table_name, column_new, ftable, fcolumn) + get_logger().debug("Foreign key SQL: " + fk_sql) + self.add_deferred_sql(fk_sql) except IndexError: pass # No constraint exists so ignore except DryRunError: @@ -178,8 +181,12 @@ def connection_init(self): e.g. which storage engine (MySQL) or transaction serialisability level. """ cursor = self._get_connection().cursor() + if cursor.execute("SHOW variables WHERE Variable_Name='default_storage_engine';"): + engine_var = 'default_storage_engine' + else: + engine_var = 'storage_engine' if self._has_setting('STORAGE_ENGINE') and self._get_setting('STORAGE_ENGINE'): - cursor.execute("SET storage_engine=%s;" % self._get_setting('STORAGE_ENGINE')) + cursor.execute("SET %s=%s;" % (engine_var, self._get_setting('STORAGE_ENGINE'))) def start_transaction(self): super(DatabaseOperations, self).start_transaction() diff --git a/vendor-local/lib/python/south/db/oracle.py b/vendor-local/lib/python/south/db/oracle.py index 6e002945ff4..79496d0aeeb 100644 --- a/vendor-local/lib/python/south/db/oracle.py +++ b/vendor-local/lib/python/south/db/oracle.py @@ -86,9 +86,12 @@ def create_table(self, table_name, fields): for field_name, field in fields: + field = self._field_sanity(field) + # avoid default values in CREATE TABLE statements (#925) field._suppress_default = True + col = self.column_sql(table_name, field_name, field) if not col: continue @@ -129,7 +132,7 @@ def delete_table(self, table_name, cascade=True): self.execute(sequence_sql) @generic.invalidate_table_constraints - def alter_column(self, table_name, name, field, explicit_name=True): + def alter_column(self, table_name, name, field, explicit_name=True, ignore_constraints=False): if self.dry_run: if self.debug: @@ -163,8 +166,8 @@ def alter_column(self, table_name, name, field, explicit_name=True): params['nullity'] = 'NULL' sql_templates = [ - (self.alter_string_set_type, params), - (self.alter_string_set_default, params), + (self.alter_string_set_type, params, []), + (self.alter_string_set_default, params, []), ] if not field.null and field.has_default(): # Use default for rows that had nulls. To support the case where @@ -177,23 +180,29 @@ def change_params(**kw): p.update(kw) return p sql_templates[:0] = [ - (self.alter_string_set_type, change_params(nullity='NULL')), - (self.alter_string_update_nulls_to_default, change_params(default=self._default_value_workaround(field.get_default()))), + (self.alter_string_set_type, change_params(nullity='NULL'),[]), + (self.alter_string_update_nulls_to_default, change_params(default="%s"), [field.get_default()]), ] + if not ignore_constraints: + # drop CHECK constraints. Make sure this is executed before the ALTER TABLE statements + # generated above, since those statements recreate the constraints we delete here. + check_constraints = self._constraints_affecting_columns(table_name, [name], "CHECK") + for constraint in check_constraints: + self.execute(self.delete_check_sql % { + 'table': self.quote_name(table_name), + 'constraint': self.quote_name(constraint), + }) + # Drop foreign constraints + try: + self.delete_foreign_key(qn, qn_col) + except ValueError: + # There weren't any + pass - # drop CHECK constraints. Make sure this is executed before the ALTER TABLE statements - # generated above, since those statements recreate the constraints we delete here. - check_constraints = self._constraints_affecting_columns(table_name, [name], "CHECK") - for constraint in check_constraints: - self.execute(self.delete_check_sql % { - 'table': self.quote_name(table_name), - 'constraint': self.quote_name(constraint), - }) - - for sql_template, params in sql_templates: + for sql_template, params, args in sql_templates: try: - self.execute(sql_template % params, print_all_errors=False) + self.execute(sql_template % params, args, print_all_errors=False) except DatabaseError as exc: description = str(exc) # Oracle complains if a column is already NULL/NOT NULL @@ -211,6 +220,19 @@ def change_params(**kw): self._print_sql_error(exc, sql_template % params) raise + if not ignore_constraints: + # Add back FK constraints if needed + if field.rel: #and self.supports_foreign_keys: + self.add_deferred_sql( + self.foreign_key_sql( + qn[1:-1], # foreign_key_sql uses this as part of constraint name + qn_col[1:-1], # foreign_key_sql uses this as part of constraint name + field.rel.to._meta.db_table, + field.rel.to._meta.get_field(field.rel.field_name).column + ) + ) + + def _alter_column_lob_workaround(self, table_name, name, field): """ Oracle refuses to change a column type from/to LOB to/from a regular @@ -250,6 +272,7 @@ def rename_column(self, table_name, old, new): @generic.invalidate_table_constraints def add_column(self, table_name, name, field, keep_default=False): + field = self._field_sanity(field) sql = self.column_sql(table_name, name, field) sql = self.adj_column_sql(sql) @@ -262,9 +285,9 @@ def add_column(self, table_name, name, field, keep_default=False): self.execute(sql) # Now, drop the default if we need to - if not keep_default and field.default is not None: + if field.default is not None: field.default = NOT_PROVIDED - self.alter_column(table_name, name, field, explicit_name=False) + self.alter_column(table_name, name, field, explicit_name=False, ignore_constraints=True) def delete_column(self, table_name, name): return super(DatabaseOperations, self).delete_column(self.quote_name(table_name), name) @@ -288,8 +311,12 @@ def _field_sanity(self, field): """ if isinstance(field, models.BooleanField) and field.has_default(): field.default = int(field.to_python(field.get_default())) + # On Oracle, empty strings are null + if isinstance(field, (models.CharField, models.TextField)): + field.null = field.empty_strings_allowed return field + def _default_value_workaround(self, value): from datetime import date,time,datetime if isinstance(value, (date,time,datetime)): diff --git a/vendor-local/lib/python/south/db/sql_server/pyodbc.py b/vendor-local/lib/python/south/db/sql_server/pyodbc.py index 1b200ad13bd..b725ec0da62 100644 --- a/vendor-local/lib/python/south/db/sql_server/pyodbc.py +++ b/vendor-local/lib/python/south/db/sql_server/pyodbc.py @@ -242,19 +242,15 @@ def alter_column(self, table_name, name, field, explicit_name=True, ignore_const def _alter_set_defaults(self, field, name, params, sqls): "Subcommand of alter_column that sets default values (overrideable)" - # First drop the current default if one exists + # Historically, we used to set defaults here. + # But since South 0.8, we don't ever set defaults on alter-column -- we only + # use database-level defaults as scaffolding when adding columns. + # However, we still sometimes need to remove defaults in alter-column. table_name = self.quote_name(params['table_name']) drop_default = self.drop_column_default_sql(table_name, name) if drop_default: sqls.append((drop_default, [])) - # Next, set any default - - if field.has_default(): - default = field.get_default() - literal = self._value_to_unquoted_literal(field, default) - sqls.append(('ADD DEFAULT %s for %s' % (self._quote_string(literal), self.quote_name(name),), [])) - def _value_to_unquoted_literal(self, field, value): # Start with the field's own translation conn = self._get_connection() @@ -432,6 +428,7 @@ def delete_foreign_key(self, table_name, column): INNER JOIN sys.schemas s ON t.schema_id = s.schema_id INNER JOIN sys.indexes i ON i.object_id = t.object_id INNER JOIN sys.index_columns ic ON ic.object_id = t.object_id + AND ic.index_id = i.index_id INNER JOIN sys.columns c ON c.object_id = t.object_id AND ic.column_id = c.column_id WHERE i.is_unique=0 AND i.is_primary_key=0 AND i.is_unique_constraint=0 diff --git a/vendor-local/lib/python/south/db/sqlite3.py b/vendor-local/lib/python/south/db/sqlite3.py index db45511456c..c4014d3bd06 100644 --- a/vendor-local/lib/python/south/db/sqlite3.py +++ b/vendor-local/lib/python/south/db/sqlite3.py @@ -31,7 +31,7 @@ def add_column(self, table_name, name, field, *args, **kwds): field_default = None if not getattr(field, '_suppress_default', False): default = field.get_default() - if default is not None and default!='': + if default is not None: field_default = "'%s'" % field.get_db_prep_save(default, connection=self._get_connection()) field._suppress_default = True self._remake_table(table_name, added={ @@ -64,7 +64,7 @@ def _remake_table(self, table_name, added={}, renames={}, deleted=[], altered={} cursor = self._get_connection().cursor() # Get the index descriptions indexes = self._get_connection().introspection.get_indexes(cursor, table_name) - multi_indexes = self._get_multi_indexes(table_name) + standalone_indexes = self._get_standalone_indexes(table_name) # Work out new column defs. for column_info in self._get_full_table_description(self._get_connection(), cursor, table_name): name = column_info['name'] @@ -117,8 +117,9 @@ def _remake_table(self, table_name, added={}, renames={}, deleted=[], altered={} # Recreate multi-valued indexes # We can't do that before since it's impossible to rename indexes # and index name scope is global - self._make_multi_indexes(table_name, multi_indexes, renames=renames, deleted=deleted, uniques_deleted=uniques_deleted) - + self._make_standalone_indexes(table_name, standalone_indexes, renames=renames, deleted=deleted, uniques_deleted=uniques_deleted) + self.deferred_sql = [] # prevent double indexing + def _copy_data(self, src, dst, field_renames={}, added={}): "Used to copy data into a new table" # Make a list of all the fields to select @@ -136,7 +137,7 @@ def _copy_data(self, src, dst, field_renames={}, added={}): continue src_fields_new.append(self.quote_name(field)) for field, (_,default) in added.items(): - if default is not None and default!='': + if default is not None: field = self.quote_name(field) src_fields_new.append("%s as %s" % (default, field)) dst_fields_new.append(field) @@ -149,32 +150,38 @@ def _copy_data(self, src, dst, field_renames={}, added={}): )) def _create_unique(self, table_name, columns): - self.execute("CREATE UNIQUE INDEX %s ON %s(%s);" % ( - self.quote_name('%s_%s' % (table_name, '__'.join(columns))), + self._create_index(table_name, columns, True) + + def _create_index(self, table_name, columns, unique=False, index_name=None): + if index_name is None: + index_name = '%s_%s' % (table_name, '__'.join(columns)) + self.execute("CREATE %sINDEX %s ON %s(%s);" % ( + unique and "UNIQUE " or "", + self.quote_name(index_name), self.quote_name(table_name), ', '.join(self.quote_name(c) for c in columns), )) - def _get_multi_indexes(self, table_name): + def _get_standalone_indexes(self, table_name): indexes = [] cursor = self._get_connection().cursor() cursor.execute('PRAGMA index_list(%s)' % self.quote_name(table_name)) # seq, name, unique for index, unique in [(field[1], field[2]) for field in cursor.fetchall()]: - if not unique: - continue cursor.execute('PRAGMA index_info(%s)' % self.quote_name(index)) info = cursor.fetchall() - if len(info) == 1: + if len(info) == 1 and unique: + # This index is already specified in the CREATE TABLE columns + # specification continue columns = [] for field in info: columns.append(field[2]) - indexes.append(columns) + indexes.append((index, columns, unique)) return indexes - def _make_multi_indexes(self, table_name, indexes, deleted=[], renames={}, uniques_deleted=[]): - for index in indexes: + def _make_standalone_indexes(self, table_name, indexes, deleted=[], renames={}, uniques_deleted=[]): + for index_name, index, unique in indexes: columns = [] for name in index: @@ -188,9 +195,9 @@ def _make_multi_indexes(self, table_name, indexes, deleted=[], renames={}, uniqu name = renames[name] columns.append(name) - if columns and set(columns) != set(uniques_deleted): - self._create_unique(table_name, columns) - + if columns and (set(columns) != set(uniques_deleted) or not unique): + self._create_index(table_name, columns, unique, index_name) + def _column_sql_for_create(self, table_name, name, field, explicit_name=True): "Given a field and its name, returns the full type for the CREATE TABLE (without unique/pk)" field.set_attributes_from_name(name) @@ -263,10 +270,3 @@ def delete_primary_key(self, table_name): # No cascades on deletes def delete_table(self, table_name, cascade=True): generic.DatabaseOperations.delete_table(self, table_name, False) - - def _default_value_workaround(self, default): - if default == True: - default = 1 - elif default == False: - default = 0 - return default diff --git a/vendor-local/lib/python/south/exceptions.py b/vendor-local/lib/python/south/exceptions.py index e501d91861d..f2e772fe552 100644 --- a/vendor-local/lib/python/south/exceptions.py +++ b/vendor-local/lib/python/south/exceptions.py @@ -15,7 +15,10 @@ def __init__(self, migration, exc_info): if self.exc_info: self.traceback = ''.join(format_exception(*self.exc_info)) else: - self.traceback = format_exc() + try: + self.traceback = format_exc() + except AttributeError: # Python3 when there is no previous exception + self.traceback = None def __str__(self): return ("While loading migration '%(migration)s':\n" @@ -24,6 +27,8 @@ def __str__(self): class UnknownMigration(BrokenMigration): def __str__(self): + if not hasattr(self, "traceback"): + self.traceback = "" return ("Migration '%(migration)s' probably doesn't exist.\n" '%(traceback)s' % self.__dict__) diff --git a/vendor-local/lib/python/south/hacks/django_1_0.py b/vendor-local/lib/python/south/hacks/django_1_0.py index 00d0a8bab3d..e4a60c66a9b 100644 --- a/vendor-local/lib/python/south/hacks/django_1_0.py +++ b/vendor-local/lib/python/south/hacks/django_1_0.py @@ -2,6 +2,7 @@ Hacks for the Django 1.0/1.0.2 releases. """ +import django from django.conf import settings from django.db.backends.creation import BaseDatabaseCreation from django.db.models.loading import cache @@ -51,7 +52,7 @@ def _redo_app_cache(self): Used to repopulate AppCache after fiddling with INSTALLED_APPS. """ cache.loaded = False - cache.handled = {} + cache.handled = set() if django.VERSION >= (1, 6) else {} cache.postponed = [] cache.app_store = SortedDict() cache.app_models = SortedDict() diff --git a/vendor-local/lib/python/south/management/commands/datamigration.py b/vendor-local/lib/python/south/management/commands/datamigration.py index 08c1d0891c8..c3175e73f72 100644 --- a/vendor-local/lib/python/south/management/commands/datamigration.py +++ b/vendor-local/lib/python/south/management/commands/datamigration.py @@ -34,6 +34,8 @@ class Command(BaseCommand): usage_str = "Usage: ./manage.py datamigration appname migrationname [--stdout] [--freeze appname]" def handle(self, app=None, name="", freeze_list=None, stdout=False, verbosity=1, **options): + + verbosity = int(verbosity) # Any supposed lists that are None become empty lists freeze_list = freeze_list or [] @@ -46,13 +48,19 @@ def handle(self, app=None, name="", freeze_list=None, stdout=False, verbosity=1, if re.search('[^_\w]', name) and name != "-": self.error("Migration names should contain only alphanumeric characters and underscores.") - # if not name, there's an error + # If not name, there's an error if not name: - self.error("You must provide a name for this migration\n" + self.usage_str) + self.error("You must provide a name for this migration.\n" + self.usage_str) if not app: self.error("You must provide an app to create a migration for.\n" + self.usage_str) - + + # Ensure that verbosity is not a string (Python 3) + try: + verbosity = int(verbosity) + except ValueError: + self.error("Verbosity must be an number.\n" + self.usage_str) + # Get the Migrations for this app (creating the migrations dir if needed) migrations = Migrations(app, force_creation=True, verbose_creation=verbosity > 0) @@ -63,7 +71,7 @@ def handle(self, app=None, name="", freeze_list=None, stdout=False, verbosity=1, apps_to_freeze = self.calc_frozen_apps(migrations, freeze_list) # So, what's in this file, then? - file_contents = MIGRATION_TEMPLATE % { + file_contents = self.get_migration_template() % { "frozen_models": freezer.freeze_apps_to_string(apps_to_freeze), "complete_apps": apps_to_freeze and "complete_apps = [%s]" % (", ".join(map(repr, apps_to_freeze))) or "" } @@ -103,9 +111,12 @@ def error(self, message, code=1): print(message, file=sys.stderr) sys.exit(code) + def get_migration_template(self): + return MIGRATION_TEMPLATE + MIGRATION_TEMPLATE = """# -*- coding: utf-8 -*- -import datetime +from south.utils import datetime_utils as datetime from south.db import db from south.v2 import DataMigration from django.db import models diff --git a/vendor-local/lib/python/south/management/commands/schemamigration.py b/vendor-local/lib/python/south/management/commands/schemamigration.py index e29fc620b6b..efd4266f3de 100644 --- a/vendor-local/lib/python/south/management/commands/schemamigration.py +++ b/vendor-local/lib/python/south/management/commands/schemamigration.py @@ -168,7 +168,7 @@ def handle(self, app=None, name="", added_model_list=None, added_field_list=None apps_to_freeze = self.calc_frozen_apps(migrations, freeze_list) # So, what's in this file, then? - file_contents = MIGRATION_TEMPLATE % { + file_contents = self.get_migration_template() % { "forwards": "\n".join(forwards_actions or [" pass"]), "backwards": "\n".join(backwards_actions or [" pass"]), "frozen_models": freezer.freeze_apps_to_string(apps_to_freeze), @@ -205,9 +205,12 @@ def handle(self, app=None, name="", added_model_list=None, added_field_list=None else: print("%s %s. You can now apply this migration with: ./manage.py migrate %s" % (verb, new_filename, app), file=sys.stderr) + def get_migration_template(self): + return MIGRATION_TEMPLATE + MIGRATION_TEMPLATE = """# -*- coding: utf-8 -*- -import datetime +from south.utils import datetime_utils as datetime from south.db import db from south.v2 import SchemaMigration from django.db import models diff --git a/vendor-local/lib/python/south/management/commands/syncdb.py b/vendor-local/lib/python/south/management/commands/syncdb.py index 702085b1949..17fc22cbfc5 100644 --- a/vendor-local/lib/python/south/management/commands/syncdb.py +++ b/vendor-local/lib/python/south/management/commands/syncdb.py @@ -98,6 +98,8 @@ def handle_noargs(self, migrate_all=False, **options): if options.get('migrate', True): if verbosity: print("Migrating...") + # convert from store_true to store_false + options['no_initial_data'] = not options.get('load_initial_data', True) management.call_command('migrate', **options) # Be obvious about what we did diff --git a/vendor-local/lib/python/south/migration/__init__.py b/vendor-local/lib/python/south/migration/__init__.py index 221ed071dea..1d91ddf83d7 100644 --- a/vendor-local/lib/python/south/migration/__init__.py +++ b/vendor-local/lib/python/south/migration/__init__.py @@ -162,7 +162,7 @@ def migrate_app(migrations, target_name=None, merge=False, fake=False, db_dry_ru verbosity = int(verbosity) # Fire off the pre-migrate signal - pre_migrate.send(None, app=app_label) + pre_migrate.send(None, app=app_label, verbosity=verbosity, interactive=verbosity, db=database) # If there aren't any, quit quizically if not migrations: @@ -220,7 +220,7 @@ def migrate_app(migrations, target_name=None, merge=False, fake=False, db_dry_ru success = migrator.migrate_many(target, workplan, database) # Finally, fire off the post-migrate signal if success: - post_migrate.send(None, app=app_label) + post_migrate.send(None, app=app_label, verbosity=verbosity, interactive=verbosity, db=database) else: if verbosity: # Say there's nothing. @@ -232,4 +232,4 @@ def migrate_app(migrations, target_name=None, merge=False, fake=False, db_dry_ru migrator = LoadInitialDataMigrator(migrator=Forwards(verbosity=verbosity)) migrator.load_initial_data(target, db=database) # Send signal. - post_migrate.send(None, app=app_label) + post_migrate.send(None, app=app_label, verbosity=verbosity, interactive=verbosity, db=database) diff --git a/vendor-local/lib/python/south/migration/migrators.py b/vendor-local/lib/python/south/migration/migrators.py index 1be895dcf38..f405a15046c 100644 --- a/vendor-local/lib/python/south/migration/migrators.py +++ b/vendor-local/lib/python/south/migration/migrators.py @@ -5,20 +5,18 @@ import inspect import sys import traceback -try: - from cStringIO import StringIO # python 2 -except ImportError: - from io import StringIO # python 3 from django.core.management import call_command from django.core.management.commands import loaddata from django.db import models +from django import VERSION as DJANGO_VERSION import south.db from south import exceptions from south.db import DEFAULT_DB_ALIAS from south.models import MigrationHistory from south.signals import ran_migration +from south.utils.py3 import StringIO class Migrator(object): @@ -116,11 +114,14 @@ def run(self, migration, database): return self.run_migration(migration, database) - def send_ran_migration(self, migration): + def send_ran_migration(self, migration, database): ran_migration.send(None, app=migration.app_label(), migration=migration, - method=self.__class__.__name__.lower()) + method=self.__class__.__name__.lower(), + verbosity=self.verbosity, + interactive=self.interactive, + db=database) def migrate(self, migration, database): """ @@ -130,7 +131,7 @@ def migrate(self, migration, database): migration_name = migration.name() self.print_status(migration) result = self.run(migration, database) - self.send_ran_migration(migration) + self.send_ran_migration(migration, database) return result def migrate_many(self, target, migrations, database): @@ -208,13 +209,19 @@ def send_ran_migration(self, *args, **kwargs): class LoadInitialDataMigrator(MigratorWrapper): - + def load_initial_data(self, target, db='default'): if target is None or target != target.migrations[-1]: return # Load initial data, if we ended up at target if self.verbosity: print(" - Loading initial data for %s." % target.app_label()) + if DJANGO_VERSION < (1, 6): + self.pre_1_6(target, db) + else: + self.post_1_6(target, db) + + def pre_1_6(self, target, db): # Override Django's get_apps call temporarily to only load from the # current app old_get_apps = models.get_apps @@ -227,6 +234,21 @@ def load_initial_data(self, target, db='default'): models.get_apps = old_get_apps loaddata.get_apps = old_get_apps + def post_1_6(self, target, db): + import django.db.models.loading + ## build a new 'AppCache' object with just the app we care about. + old_cache = django.db.models.loading.cache + new_cache = django.db.models.loading.AppCache() + new_cache.get_apps = lambda: [new_cache.get_app(target.app_label())] + + ## monkeypatch + django.db.models.loading.cache = new_cache + try: + call_command('loaddata', 'initial_data', verbosity=self.verbosity, database=db) + finally: + ## unmonkeypatch + django.db.models.loading.cache = old_cache + def migrate_many(self, target, migrations, database): migrator = self._migrator result = migrator.__class__.migrate_many(migrator, target, migrations, database) diff --git a/vendor-local/lib/python/south/modelsinspector.py b/vendor-local/lib/python/south/modelsinspector.py index 115764d7882..13e493d2dcc 100644 --- a/vendor-local/lib/python/south/modelsinspector.py +++ b/vendor-local/lib/python/south/modelsinspector.py @@ -164,6 +164,7 @@ def convert_on_delete_handler(value): "^django\.db", "^django\.contrib\.contenttypes\.generic", "^django\.contrib\.localflavor", + "^django_localflavor_\w\w", ] # Regexes of ignored fields (custom fields which look like fields, but have no column behind them) diff --git a/vendor-local/lib/python/south/orm.py b/vendor-local/lib/python/south/orm.py index 1e5d56ed794..8d46ee7194c 100644 --- a/vendor-local/lib/python/south/orm.py +++ b/vendor-local/lib/python/south/orm.py @@ -181,12 +181,16 @@ def eval_in_context(self, code, app, extra_imports={}): "Evaluates the given code in the context of the migration file." # Drag in the migration module's locals (hopefully including models.py) - fake_locals = dict(inspect.getmodule(self.cls).__dict__) - - # Remove all models from that (i.e. from modern models.py), to stop pollution - for key, value in fake_locals.items(): - if isinstance(value, type) and issubclass(value, models.Model) and hasattr(value, "_meta"): - del fake_locals[key] + # excluding all models from that (i.e. from modern models.py), to stop pollution + fake_locals = dict( + (key, value) + for key, value in inspect.getmodule(self.cls).__dict__.items() + if not ( + isinstance(value, type) + and issubclass(value, models.Model) + and hasattr(value, "_meta") + ) + ) # We add our models into the locals for the eval fake_locals.update(dict([ diff --git a/vendor-local/lib/python/south/signals.py b/vendor-local/lib/python/south/signals.py index f2938d5225a..12a1362e7b6 100644 --- a/vendor-local/lib/python/south/signals.py +++ b/vendor-local/lib/python/south/signals.py @@ -6,13 +6,13 @@ from django.conf import settings # Sent at the start of the migration of an app -pre_migrate = Signal(providing_args=["app"]) +pre_migrate = Signal(providing_args=["app", "verbosity", "interactive", "db"]) # Sent after each successful migration of an app -post_migrate = Signal(providing_args=["app"]) +post_migrate = Signal(providing_args=["app", "verbosity", "interactive", "db"]) # Sent after each run of a particular migration in a direction -ran_migration = Signal(providing_args=["app","migration","method"]) +ran_migration = Signal(providing_args=["app", "migration", "method", "verbosity", "interactive", "db"]) # Compatibility code for django.contrib.auth # Is causing strange errors, removing for now (we might need to fix up orm first) diff --git a/vendor-local/lib/python/south/test_shim.py b/vendor-local/lib/python/south/test_shim.py new file mode 100644 index 00000000000..fdf39f3f620 --- /dev/null +++ b/vendor-local/lib/python/south/test_shim.py @@ -0,0 +1,6 @@ +""" +This file is needed as 1.6 only finds tests in files labelled test_*, +and ignores tests/__init__.py. +""" + +from south.tests import * diff --git a/vendor-local/lib/python/south/tests/__init__.py b/vendor-local/lib/python/south/tests/__init__.py index 3dd9c210a72..26779e35b20 100644 --- a/vendor-local/lib/python/south/tests/__init__.py +++ b/vendor-local/lib/python/south/tests/__init__.py @@ -101,6 +101,7 @@ def tearDown(self): if not skiptest: from south.tests.db import * from south.tests.db_mysql import * + from south.tests.db_firebird import * from south.tests.logic import * from south.tests.autodetection import * from south.tests.logger import * diff --git a/vendor-local/lib/python/south/tests/autodetection.py b/vendor-local/lib/python/south/tests/autodetection.py index dd66103ea5c..c320d3a8d2f 100644 --- a/vendor-local/lib/python/south/tests/autodetection.py +++ b/vendor-local/lib/python/south/tests/autodetection.py @@ -7,6 +7,12 @@ from south.orm import FakeORM from south.v2 import SchemaMigration +try: + from django.utils.six.moves import reload_module +except ImportError: + # Older django, no python3 support + reload_module = reload + class TestComparison(unittest.TestCase): """ @@ -338,7 +344,8 @@ def backwards(self, orm): complete_apps = ['non_managed'] - from non_managed import models as dummy_import_to_force_loading_models # TODO: Does needing this indicate a bug in MokeyPatcher? + from non_managed import models as dummy_import_to_force_loading_models # TODO: Does needing this indicate a bug in MokeyPatcher? + reload_module(dummy_import_to_force_loading_models) # really force... migrations = Migrations("non_managed") initial_orm = FakeORM(InitialMigration, "non_managed") diff --git a/vendor-local/lib/python/south/tests/db.py b/vendor-local/lib/python/south/tests/db.py index 90f62fc0be3..e63c563a8e2 100644 --- a/vendor-local/lib/python/south/tests/db.py +++ b/vendor-local/lib/python/south/tests/db.py @@ -360,7 +360,57 @@ def test_alter_char_default(self): db.execute("INSERT INTO test_altercd (eggs) values (12)") null = db.execute("SELECT spam FROM test_altercd")[0][0] self.assertFalse(null, "Default for char field was installed into database") + + # Change again to a column with default and not null + db.alter_column("test_altercd", "spam", models.CharField(max_length=30, default="loof", null=False)) + # Assert the default is not in the database + if 'oracle' in db.backend_name: + # Oracle special treatment -- nulls are always allowed in char columns, so + # inserting doesn't raise an integrity error; so we check again as above + db.execute("DELETE FROM test_altercd") + db.execute("INSERT INTO test_altercd (eggs) values (12)") + null = db.execute("SELECT spam FROM test_altercd")[0][0] + self.assertFalse(null, "Default for char field was installed into database") + else: + # For other backends, insert should now just fail + self.assertRaises(IntegrityError, + db.execute, "INSERT INTO test_altercd (eggs) values (12)") + + @skipIf('oracle' in db.backend_name, "Oracle does not differentiate empty trings from null") + def test_default_empty_string(self): + """ + Test altering column defaults with char fields + """ + db.create_table("test_cd_empty", [ + ('spam', models.CharField(max_length=30, default='')), + ('eggs', models.CharField(max_length=30)), + ]) + # Create a record + db.execute("INSERT INTO test_cd_empty (spam, eggs) values ('1','2')") + # Add a column + db.add_column("test_cd_empty", "ham", models.CharField(max_length=30, default='')) + + empty = db.execute("SELECT ham FROM test_cd_empty")[0][0] + self.assertEquals(empty, "", "Empty Default for char field isn't empty string") + + @skipUnless('oracle' in db.backend_name, "Oracle does not differentiate empty trings from null") + def test_oracle_strings_null(self): + """ + Test that under Oracle, CherFields are created as null even when specified not-null, + because otherwise they would not be able to hold empty strings (which Oracle equates + with nulls). + Verify fix of #1269. + """ + db.create_table("test_ora_char_nulls", [ + ('spam', models.CharField(max_length=30, null=True)), + ('eggs', models.CharField(max_length=30)), + ]) + db.add_column("test_ora_char_nulls", "ham", models.CharField(max_length=30)) + db.alter_column("test_ora_char_nulls", "spam", models.CharField(max_length=30, null=False)) + # So, by the look of it, we should now have three not-null columns + db.execute("INSERT INTO test_ora_char_nulls VALUES (NULL, NULL, NULL)") + def test_mysql_defaults(self): """ Test MySQL default handling for BLOB and TEXT. @@ -568,8 +618,8 @@ def test_alter_unique(self): db.execute("INSERT INTO test_alter_unique2 (spam, eggs) VALUES (1, 42)") except: self.fail("Looks like multi-field unique constraint applied to only one field.") - db.start_transaction() db.rollback_transaction() + db.start_transaction() try: db.execute("INSERT INTO test_alter_unique2 (spam, eggs) VALUES (0, 43)") except: @@ -581,17 +631,17 @@ def test_alter_unique(self): except: pass else: - self.fail("Could insert the same integer twice into a unique field.") + self.fail("Could insert the same pair twice into unique-together fields.") db.rollback_transaction() # Altering one column should not drop or modify multi-column constraint - db.alter_column("test_alter_unique2", "eggs", models.CharField(max_length=10)) + db.alter_column("test_alter_unique2", "eggs", models.PositiveIntegerField()) db.start_transaction() try: db.execute("INSERT INTO test_alter_unique2 (spam, eggs) VALUES (1, 42)") except: self.fail("Altering one column broken multi-column unique constraint.") - db.start_transaction() db.rollback_transaction() + db.start_transaction() try: db.execute("INSERT INTO test_alter_unique2 (spam, eggs) VALUES (0, 43)") except: @@ -603,7 +653,7 @@ def test_alter_unique(self): except: pass else: - self.fail("Could insert the same integer twice into a unique field after alter_column with unique=False.") + self.fail("Could insert the same pair twice into unique-together fields after alter_column with unique=False.") db.rollback_transaction() db.delete_table("test_alter_unique2") db.start_transaction() @@ -712,8 +762,9 @@ def test_add_unique_fk(self): ('spam', models.BooleanField(default=False)) ]) - db.add_column("test_add_unique_fk", "mock1", models.ForeignKey(db.mock_model('Mock', 'mock'), null=True, unique=True)) - db.add_column("test_add_unique_fk", "mock2", models.OneToOneField(db.mock_model('Mock', 'mock'), null=True)) + db.add_column("test_add_unique_fk", "mock1", models.ForeignKey(db.mock_model('User', 'auth_user'), null=True, unique=True)) + db.add_column("test_add_unique_fk", "mock2", models.OneToOneField(db.mock_model('User', 'auth_user'), null=True)) + db.execute_deferred_sql() db.delete_table("test_add_unique_fk") @@ -811,10 +862,67 @@ def test_make_added_foreign_key_not_null(self): db.add_column("test_fk", 'foreik', models.ForeignKey(User, null=True)) db.execute_deferred_sql() - # Make the FK null + # Make the FK not null db.alter_column("test_fk", "foreik_id", models.ForeignKey(User)) db.execute_deferred_sql() + def test_make_foreign_key_null(self): + # Table for FK to target + User = db.mock_model(model_name='User', db_table='auth_user', db_tablespace='', pk_field_name='id', pk_field_type=models.AutoField, pk_field_args=[], pk_field_kwargs={}) + # Table with no foreign key + db.create_table("test_make_fk_null", [ + ('eggs', models.IntegerField()), + ('foreik', models.ForeignKey(User)) + ]) + db.execute_deferred_sql() + + # Make the FK null + db.alter_column("test_make_fk_null", "foreik_id", models.ForeignKey(User, null=True)) + db.execute_deferred_sql() + + def test_change_foreign_key_target(self): + # Tables for FK to target + User = db.mock_model(model_name='User', db_table='auth_user', db_tablespace='', pk_field_name='id', pk_field_type=models.AutoField, pk_field_args=[], pk_field_kwargs={}) + db.create_table("test_fk_changed_target", [ + ('eggs', models.IntegerField(primary_key=True)), + ]) + Egg = db.mock_model(model_name='Egg', db_table='test_fk_changed_target', db_tablespace='', pk_field_name='eggs', pk_field_type=models.AutoField, pk_field_args=[], pk_field_kwargs={}) + # Table with a foreign key to the wrong table + db.create_table("test_fk_changing", [ + ('egg', models.ForeignKey(User, null=True)), + ]) + db.execute_deferred_sql() + + # Change foreign key pointing + db.alter_column("test_fk_changing", "egg_id", models.ForeignKey(Egg, null=True)) + db.execute_deferred_sql() + + # Test that it is pointing at the right table now + try: + non_user_id = db.execute("SELECT MAX(id) FROM auth_user")[0][0] + 1 + except (TypeError, IndexError): + # Got a "None" or no records, treat as 0 + non_user_id = 17 + db.execute("INSERT INTO test_fk_changed_target (eggs) VALUES (%s)", [non_user_id]) + db.execute("INSERT INTO test_fk_changing (egg_id) VALUES (%s)", [non_user_id]) + db.commit_transaction() + db.start_transaction() # The test framework expects tests to end in transaction + + def test_alter_double_indexed_column(self): + # Table for FK to target + User = db.mock_model(model_name='User', db_table='auth_user', db_tablespace='', pk_field_name='id', pk_field_type=models.AutoField, pk_field_args=[], pk_field_kwargs={}) + # Table with no foreign key + db.create_table("test_2indexed", [ + ('eggs', models.IntegerField()), + ('foreik', models.ForeignKey(User)) + ]) + db.create_unique("test_2indexed", ["eggs", "foreik_id"]) + db.execute_deferred_sql() + + # Make the FK null + db.alter_column("test_2indexed", "foreik_id", models.ForeignKey(User, null=True)) + db.execute_deferred_sql() + class TestCacheGeneric(unittest.TestCase): base_ops_cls = generic.DatabaseOperations def setUp(self): diff --git a/vendor-local/lib/python/south/tests/db_firebird.py b/vendor-local/lib/python/south/tests/db_firebird.py new file mode 100644 index 00000000000..2b6bd532023 --- /dev/null +++ b/vendor-local/lib/python/south/tests/db_firebird.py @@ -0,0 +1,39 @@ +from django.db import models + +from south.db import db +from south.tests import unittest, skipUnless + + +class FirebirdTests(unittest.TestCase): + + """ + Tests firebird related issues + """ + + def setUp(self): + print('=' * 80) + print('Begin Firebird test') + + def tearDown(self): + print('End Firebird test') + print('=' * 80) + + @skipUnless(db.backend_name == "firebird", "Firebird-only test") + def test_firebird_double_index_creation_1317(self): + """ + Tests foreign key creation, especially uppercase (see #61) + """ + Test = db.mock_model(model_name='Test', + db_table='test5a', + db_tablespace='', + pk_field_name='ID', + pk_field_type=models.AutoField, + pk_field_args=[] + ) + db.create_table("test5a", [('ID', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True))]) + db.create_table("test5b", [ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('UNIQUE', models.ForeignKey(Test)), + ]) + db.execute_deferred_sql() + diff --git a/vendor-local/lib/python/south/utils/__init__.py b/vendor-local/lib/python/south/utils/__init__.py index c3c51916331..8d7297ea5d3 100644 --- a/vendor-local/lib/python/south/utils/__init__.py +++ b/vendor-local/lib/python/south/utils/__init__.py @@ -5,13 +5,13 @@ def _ask_for_it_by_name(name): "Returns an object referenced by absolute path." - bits = name.split(".") + bits = str(name).split(".") ## what if there is no absolute reference? - if len(bits)>1: + if len(bits) > 1: modulename = ".".join(bits[:-1]) else: - modulename=bits[0] + modulename = bits[0] module = __import__(modulename, {}, {}, bits[-1]) diff --git a/vendor-local/lib/python/south/utils/py3.py b/vendor-local/lib/python/south/utils/py3.py index 9c5baaded0d..732e9043a8d 100644 --- a/vendor-local/lib/python/south/utils/py3.py +++ b/vendor-local/lib/python/south/utils/py3.py @@ -11,11 +11,18 @@ text_type = str raw_input = input + import io + StringIO = io.StringIO + else: string_types = basestring, text_type = unicode raw_input = raw_input + import cStringIO + StringIO = cStringIO.StringIO + + def with_metaclass(meta, base=object): """Create a base class with a metaclass.""" return meta("NewBase", (base,), {}) diff --git a/vendor-local/lib/python/south/v2.py b/vendor-local/lib/python/south/v2.py index 464605284e7..22afed29231 100644 --- a/vendor-local/lib/python/south/v2.py +++ b/vendor-local/lib/python/south/v2.py @@ -9,7 +9,9 @@ class BaseMigration(object): def gf(self, field_name): "Gets a field by absolute reference." - return ask_for_it_by_name(field_name) + field = ask_for_it_by_name(field_name) + field.model = FakeModel + return field class SchemaMigration(BaseMigration): pass @@ -17,3 +19,7 @@ class SchemaMigration(BaseMigration): class DataMigration(BaseMigration): # Data migrations shouldn't be dry-run no_dry_run = True + +class FakeModel(object): + "Fake model so error messages on fields don't explode" + pass diff --git a/vendor-local/src/Python-Markdown b/vendor-local/src/Python-Markdown new file mode 160000 index 00000000000..d7fa7931bec --- /dev/null +++ b/vendor-local/src/Python-Markdown @@ -0,0 +1 @@ +Subproject commit d7fa7931bec55eec5498cd79882b770d1110b9b7 diff --git a/vendor-local/src/django-extensions b/vendor-local/src/django-extensions new file mode 160000 index 00000000000..b350b088d46 --- /dev/null +++ b/vendor-local/src/django-extensions @@ -0,0 +1 @@ +Subproject commit b350b088d46b91cffb0c2b7d90f54fe38089c87b diff --git a/vendor-local/src/django-rest-framework b/vendor-local/src/django-rest-framework new file mode 160000 index 00000000000..6e92e415aa7 --- /dev/null +++ b/vendor-local/src/django-rest-framework @@ -0,0 +1 @@ +Subproject commit 6e92e415aa7dd6871ef7d6500a85cacebde8dca2 diff --git a/vendor-local/src/jingo-markdown b/vendor-local/src/jingo-markdown new file mode 160000 index 00000000000..002fb6e0c50 --- /dev/null +++ b/vendor-local/src/jingo-markdown @@ -0,0 +1 @@ +Subproject commit 002fb6e0c507a12fe66e41e88a1d54d5d27a107b diff --git a/vendor-local/src/requests b/vendor-local/src/requests new file mode 160000 index 00000000000..e909a923431 --- /dev/null +++ b/vendor-local/src/requests @@ -0,0 +1 @@ +Subproject commit e909a923431be2597498c33adc57707f0488bc76 diff --git a/vendor-local/src/rna b/vendor-local/src/rna new file mode 160000 index 00000000000..39e92604285 --- /dev/null +++ b/vendor-local/src/rna @@ -0,0 +1 @@ +Subproject commit 39e9260428560a677f59db8d12dde8073f7fe7a9 diff --git a/vendor-local/src/six b/vendor-local/src/six new file mode 160000 index 00000000000..f6c47e8852f --- /dev/null +++ b/vendor-local/src/six @@ -0,0 +1 @@ +Subproject commit f6c47e8852f51954ecc2810d5dae7bcd2ca2da98 diff --git a/vendor-local/vendor.pth b/vendor-local/vendor.pth index 807a2a11bdf..aebcb96d634 100644 --- a/vendor-local/vendor.pth +++ b/vendor-local/vendor.pth @@ -1,10 +1,17 @@ +packages/certifi +packages/chardet +packages/python-memcached src/basket-client src/feedparser/feedparser +src/django-extensions src/django-recaptcha +src/django-rest-framework src/django-dnt src/django-statsd src/django-waffle +src/jingo-markdown src/pystatsd -packages/certifi -packages/chardet -packages/python-memcached +src/Python-Markdown +src/requests +src/rna +src/six From db98ea9657d65c5ee896bf694851de055f30baa5 Mon Sep 17 00:00:00 2001 From: Kohei Yoshino <kohei.yoshino@gmail.com> Date: Wed, 26 Feb 2014 19:04:55 -0500 Subject: [PATCH 15/23] Fix Bug 977355 - broken link to superheroes wanted on mozilla.org/contribute --- bedrock/mozorg/templates/mozorg/contribute.html | 2 +- bedrock/mozorg/templates/mozorg/projects/calendar.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bedrock/mozorg/templates/mozorg/contribute.html b/bedrock/mozorg/templates/mozorg/contribute.html index 7b0584d82c1..d6614795964 100644 --- a/bedrock/mozorg/templates/mozorg/contribute.html +++ b/bedrock/mozorg/templates/mozorg/contribute.html @@ -345,7 +345,7 @@ <h5>{{_('Sort By:')}}</h5> <h3 id="support">{{_('Helping Users')}}</h3> <div class="content"> <p> -{% trans fx_support_url='https://support.mozilla.org/get-involved', tb_support_url='http://support.mozillamessaging.com/kb/superheroes-wanted' %} +{% trans fx_support_url='https://support.mozilla.org/get-involved', tb_support_url='https://support.mozilla.org/get-involved' %} Our support process relies on enthusiastic contributors like you to help others get the most out of Mozilla products. Find out more about <a href="{{ fx_support_url }}">how to help Firefox users</a> and <a href="{{ tb_support_url }}">how to help Thunderbird users</a>. {% endtrans %} </p> diff --git a/bedrock/mozorg/templates/mozorg/projects/calendar.html b/bedrock/mozorg/templates/mozorg/projects/calendar.html index ac4c7b4cfc5..dda831eb150 100644 --- a/bedrock/mozorg/templates/mozorg/projects/calendar.html +++ b/bedrock/mozorg/templates/mozorg/projects/calendar.html @@ -39,7 +39,7 @@ <h2>{{ _('Organize your life — it’s about time!') }}</h2> <li> <img src="{{ media('/img/projects/calendar/bulb-icon.png') }}" alt=""> <div class="itemtext"> - <a href="http://support.mozillamessaging.com/" class="title">{{ _('Knowledge Base') }}</a> + <a href="https://support.mozilla.org/products/thunderbird/calendar" class="title">{{ _('Knowledge Base') }}</a> <span class="desc">{{ _('Need help with Lightning?') }}</span> </div> </li> From 12e04ee15ef9664aed4b911b3e380230831b6537 Mon Sep 17 00:00:00 2001 From: Josh Mize <jgmize@gmail.com> Date: Wed, 26 Feb 2014 16:26:48 +0000 Subject: [PATCH 16/23] Update RNA to 98c95295 --- lib/l10n_utils/tests/test_helpers.py | 27 +++++++-------------------- vendor-local/src/rna | 2 +- 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/lib/l10n_utils/tests/test_helpers.py b/lib/l10n_utils/tests/test_helpers.py index 6cfca53ba70..d8b679a36a4 100644 --- a/lib/l10n_utils/tests/test_helpers.py +++ b/lib/l10n_utils/tests/test_helpers.py @@ -3,7 +3,6 @@ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -import jingo from babel.core import UnknownLocaleError from mock import patch from nose.tools import eq_ @@ -12,27 +11,15 @@ from l10n_utils import helpers -def render(s, context=None): - t = jingo.env.from_string(s) - return t.render(context or {}) - - +@patch.object(helpers, 'lang_file_has_tag') class TestL10nHasTag(TestCase): - def test_gets_right_langfile(self): - with patch('lib.l10n_utils.helpers.lang_file_has_tag') as lfht_mock: - lfht_mock.return_value = True - res = render('{{ "nihilist" if l10n_has_tag("abide") }}', - {'langfile': 'dude'}) - self.assertEqual(res, 'nihilist') - lfht_mock.assert_called_with('dude', tag='abide') + def test_gets_right_langfile(self, lfht_mock): + helpers.l10n_has_tag({'langfile': 'dude'}, 'abide') + lfht_mock.assert_called_with('dude', tag='abide') - def test_override_langfile(self): - with patch('lib.l10n_utils.helpers.lang_file_has_tag') as lfht_mock: - lfht_mock.return_value = True - res = render('{{ "nihilist" if l10n_has_tag("abide", "uli") }}', - {'langfile': 'dude'}) - self.assertEqual(res, 'nihilist') - lfht_mock.assert_called_with('uli', tag='abide') + def test_override_langfile(self, lfht_mock): + helpers.l10n_has_tag({'langfile': 'dude'}, 'abide', 'uli') + lfht_mock.assert_called_with('uli', tag='abide') class TestCurrentLocale(TestCase): diff --git a/vendor-local/src/rna b/vendor-local/src/rna index 39e92604285..98c95295d20 160000 --- a/vendor-local/src/rna +++ b/vendor-local/src/rna @@ -1 +1 @@ -Subproject commit 39e9260428560a677f59db8d12dde8073f7fe7a9 +Subproject commit 98c95295d20994c15e54d38dd22a9e48442eb85f From c925f6b1b9ce92baf77dd326a8c16ff0420d570c Mon Sep 17 00:00:00 2001 From: Jon Petto <jonpetto@gmail.com> Date: Thu, 27 Feb 2014 14:54:13 -0600 Subject: [PATCH 17/23] Fix GA tracking on features/specs tabs. Bug 974154. --- bedrock/firefox/templates/firefox/os/devices.html | 12 ++++++------ media/js/firefox/os/devices.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/bedrock/firefox/templates/firefox/os/devices.html b/bedrock/firefox/templates/firefox/os/devices.html index 39c81a61bb7..4c6d6f75cda 100644 --- a/bedrock/firefox/templates/firefox/os/devices.html +++ b/bedrock/firefox/templates/firefox/os/devices.html @@ -106,8 +106,8 @@ <h2 class="section-heading">{{ _('Smartphones') }}</h2> <h3 class="device-title">{{ _('Alcatel One Touch Fire') }}</h3> <ul class="pager-tabs"> - <li><a href="#p1">{{_('Features')}}</a></li> - <li><a href="#p2">{{_('Specifications')}}</a></li> + <li><a href="#p1" data-label="Features">{{_('Features')}}</a></li> + <li><a href="#p2" data-label="Specifications">{{_('Specifications')}}</a></li> </ul> <button class="device-detail-close">{{ _('Close') }}</button> @@ -308,8 +308,8 @@ <h4 class="device-details-title">{{ _('Specifications') }}</h4> <h3 class="device-title">{{ _('LG Fireweb') }}</h3> <ul class="pager-tabs"> - <li><a href="#p1">{{_('Features')}}</a></li> - <li><a href="#p2">{{_('Specifications')}}</a></li> + <li><a href="#p1" data-label="Features">{{_('Features')}}</a></li> + <li><a href="#p2" data-label="Specifications">{{_('Specifications')}}</a></li> </ul> <button class="device-detail-close">{{ _('Close') }}</button> @@ -473,8 +473,8 @@ <h4 class="device-details-title">{{ _('Specifications') }}</h4> <h3 class="device-title">{{ _('ZTE Open') }}</h3> <ul class="pager-tabs"> - <li><a href="#p1">{{_('Features')}}</a></li> - <li><a href="#p2">{{_('Specifications')}}</a></li> + <li><a href="#p1" data-label="Features">{{_('Features')}}</a></li> + <li><a href="#p2" data-label="Specifications">{{_('Specifications')}}</a></li> </ul> <button class="device-detail-close">{{ _('Close') }}</button> diff --git a/media/js/firefox/os/devices.js b/media/js/firefox/os/devices.js index 2be5a86c222..2388eb78e5d 100644 --- a/media/js/firefox/os/devices.js +++ b/media/js/firefox/os/devices.js @@ -252,6 +252,6 @@ if (typeof Mozilla == 'undefined') { // track mozilla pager tab clicks $('.pager-tabs').on('click', 'a', function(e) { - gaTrack(['_trackEvent', '/os/devices/ Interactions', selectedDevice + ' Interactions', $(this).text() + ' Tab']); + gaTrack(['_trackEvent', '/os/devices/ Interactions', selectedDevice + ' Interactions', $(this).data('label') + ' Tab']); }); })(window.jQuery); From 9dab8f1a433f121a7248e085afe01b21b2acaab0 Mon Sep 17 00:00:00 2001 From: Kohei Yoshino <kohei.yoshino@gmail.com> Date: Fri, 28 Feb 2014 01:32:36 -0500 Subject: [PATCH 18/23] Fix Bug 973101 - Please add "lead source" hidden field to Partner with Us form --- bedrock/firefox/tests/test_base.py | 1 + bedrock/firefox/views.py | 2 +- bedrock/mozorg/forms.py | 1 + bedrock/mozorg/tests/test_views.py | 19 +++++++++++++++++++ bedrock/mozorg/views.py | 1 + 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/bedrock/firefox/tests/test_base.py b/bedrock/firefox/tests/test_base.py index 3c8e35b5a35..c919ec4653a 100644 --- a/bedrock/firefox/tests/test_base.py +++ b/bedrock/firefox/tests/test_base.py @@ -387,6 +387,7 @@ def test_sf_form_proxy(self, post_patch): 'mobile': u'', '00NU0000002pDJr': [], 'email': u'thedude@mozilla.com', + 'lead_source': 'www.mozilla.org/about/partnerships/', }) def test_sf_form_csrf_status(self): diff --git a/bedrock/firefox/views.py b/bedrock/firefox/views.py index d87b245489a..2fc6930ac5e 100644 --- a/bedrock/firefox/views.py +++ b/bedrock/firefox/views.py @@ -229,7 +229,7 @@ def firefox_partners(request): 'js_desktop': JS_DESKTOP, } - form_kwargs = {'interest_set': 'fx'} + form_kwargs = {'interest_set': 'fx', 'lead_source': 'www.mozilla.org/firefox/partners/'} return process_partnership_form(request, 'firefox/partners/index.html', 'firefox.partners.index', template_vars, form_kwargs) diff --git a/bedrock/mozorg/forms.py b/bedrock/mozorg/forms.py index 9a8becc8e46..3da8d36e817 100644 --- a/bedrock/mozorg/forms.py +++ b/bedrock/mozorg/forms.py @@ -307,6 +307,7 @@ class WebToLeadForm(forms.Form): def __init__(self, *args, **kwargs): interest_set = kwargs.pop('interest_set', 'standard') interest_choices = self.interests_fx if (interest_set == 'fx') else self.interests_standard + kwargs.pop('lead_source', None) super(WebToLeadForm, self).__init__(*args, **kwargs) diff --git a/bedrock/mozorg/tests/test_views.py b/bedrock/mozorg/tests/test_views.py index 15855758168..01649755535 100644 --- a/bedrock/mozorg/tests/test_views.py +++ b/bedrock/mozorg/tests/test_views.py @@ -439,3 +439,22 @@ def test_post_ajax(self): self.assertTrue('email' in resp_data['errors']) self.assertEqual(response._headers['content-type'][1], 'application/json') + + def test_lead_source(self): + """ + A POST request should include the 'lead_source' field in that call. The + value will be defaulted to 'www.mozilla.org/about/partnerships/' if it's + not specified. + """ + + def _req(form_kwargs): + with patch('bedrock.mozorg.views.requests.post') as mock: + request = self.factory.post(self.url, self.post_data) + views.process_partnership_form(request, self.template, + self.view, {}, form_kwargs) + return mock.call_args[0][1]['lead_source'] + + eq_(_req(None), + 'www.mozilla.org/about/partnerships/') + eq_(_req({'lead_source': 'www.mozilla.org/firefox/partners/'}), + 'www.mozilla.org/firefox/partners/') diff --git a/bedrock/mozorg/views.py b/bedrock/mozorg/views.py index b0dbe2820a2..64d96a7a2fe 100644 --- a/bedrock/mozorg/views.py +++ b/bedrock/mozorg/views.py @@ -132,6 +132,7 @@ def process_partnership_form(request, template, success_url_name, template_vars= interest = data.pop('interest') data['00NU0000002pDJr'] = interest data['oid'] = '00DU0000000IrgO' + data['lead_source'] = form_kwargs.get('lead_source', 'www.mozilla.org/about/partnerships/') # As we're doing the Salesforce POST in the background here, # `retURL` is never visited/seen by the user. I believe it # is required by Salesforce though, so it should hang around From 09528dc5b1b82e19da9b21c7ba72a4262e532121 Mon Sep 17 00:00:00 2001 From: Alex Gibson <agibson@mozilla.com> Date: Fri, 28 Feb 2014 09:32:22 +0000 Subject: [PATCH 19/23] [fix bug 977916] Remove corner tab and tabzilla banner follow MWC --- bedrock/base/templates/base-resp.html | 5 ---- bedrock/base/templates/base.html | 5 ---- .../templates/firefox/partners/index.html | 2 -- .../tabzilla/templates/tabzilla/tabzilla.js | 10 ------- media/css/sandstone/sandstone-resp.less | 28 ------------------ media/css/sandstone/sandstone.less | 24 --------------- .../img/firefox/partners/mwc_badge-corner.png | Bin 5441 -> 0 bytes media/js/base/site.js | 25 ---------------- media/js/firefox/partners/common.js | 3 -- 9 files changed, 102 deletions(-) delete mode 100644 media/img/firefox/partners/mwc_badge-corner.png diff --git a/bedrock/base/templates/base-resp.html b/bedrock/base/templates/base-resp.html index 40b8488b8b5..14ce7591c51 100644 --- a/bedrock/base/templates/base-resp.html +++ b/bedrock/base/templates/base-resp.html @@ -66,11 +66,6 @@ <body id="{% block body_id %}{% endblock %}" class="html-{{ DIR }} {% block body_class %}{% endblock %}"{% block body_attrs %}{% endblock %}> <div id="strings" data-global-close="{{ _('Close') }}" {% block string_data %}{% endblock %}></div> <div id="outer-wrapper"> - - {% block mwc_badge %} - <div id="mwc-badge"><a href="/firefox/partners/">{{ _('Mobile World Congress') }}</a></div> - {% endblock %} - <div id="wrapper"> {% block site_header %} diff --git a/bedrock/base/templates/base.html b/bedrock/base/templates/base.html index 154522a94b8..6681662ef2a 100644 --- a/bedrock/base/templates/base.html +++ b/bedrock/base/templates/base.html @@ -61,11 +61,6 @@ <body id="{% block body_id %}{% endblock %}" class="html-{{ DIR }} {% block body_class %}{% endblock %}"{% block body_attrs %}{% endblock %}> <div id="strings" data-global-close="{{ _('Close') }}" {% block string_data %}{% endblock %}></div> <div id="outer-wrapper"> - - {% block mwc_badge %} - <div id="mwc-badge"><a href="/firefox/partners/">{{ _('Mobile World Congress') }}</a></div> - {% endblock %} - <div id="wrapper"> {% block site_header %} diff --git a/bedrock/firefox/templates/firefox/partners/index.html b/bedrock/firefox/templates/firefox/partners/index.html index 9bc8a1218cf..d4e73f892ee 100644 --- a/bedrock/firefox/templates/firefox/partners/index.html +++ b/bedrock/firefox/templates/firefox/partners/index.html @@ -35,8 +35,6 @@ {{ js('partners') }} {% endblock %} -{% block mwc_badge %}{% endblock %} - {% block site_header %} <header id="masthead"> <a href="{{ url('mozorg.home') }}" id="tabzilla" data-infobar="{{ settings.TABZILLA_INFOBAR_OPTIONS }}">{{ _('Mozilla') }}</a> diff --git a/bedrock/tabzilla/templates/tabzilla/tabzilla.js b/bedrock/tabzilla/templates/tabzilla/tabzilla.js index 616fd724dfc..40b277afb92 100644 --- a/bedrock/tabzilla/templates/tabzilla/tabzilla.js +++ b/bedrock/tabzilla/templates/tabzilla/tabzilla.js @@ -603,15 +603,6 @@ var Tabzilla = (function (Tabzilla) { '<div id="tabzilla-panel" class="tabzilla-closed" tabindex="-1">' + ' <div id="tabzilla-contents">' + ' <div id="tabzilla-promo">' - {% if l10n_has_tag('promo_mwc_2014') or settings.DEV %} - +' <div class="snippet" id="tabzilla-promo-mwc">' - + ' <a href="https://www.mozilla.org/firefox/partners/?icn=tabz">' - + ' <h4>{{ _('Unleash the future')|js_escape }}</h4>' - + ' <p>{{ _('Mozilla at MWC 2014')|js_escape }} »</p>' - + ' </a>' - + ' </div>' - + ' </div>' - {% else %} +' <div class="snippet" id="tabzilla-promo-fxos">' + ' <a href="https://www.mozilla.org/firefox/os/?icn=tabz">' + ' <h4>{{ _('Look ahead')|js_escape }}</h4>' @@ -619,7 +610,6 @@ var Tabzilla = (function (Tabzilla) { + ' </a>' + ' </div>' + ' </div>' - {% endif %} + ' <div id="tabzilla-nav">' + ' <ul>' + ' <li><h2>Mozilla</h2>' diff --git a/media/css/sandstone/sandstone-resp.less b/media/css/sandstone/sandstone-resp.less index ae7ed43395f..99b31242719 100644 --- a/media/css/sandstone/sandstone-resp.less +++ b/media/css/sandstone/sandstone-resp.less @@ -958,31 +958,6 @@ html[dir="rtl"] #colophon { } } -/* {{{ MWC badge */ -#mwc-badge { - display: none; - position: absolute; - left: 0; - top: 0; - z-index: 1001; -} - -.mwc2014 #mwc-badge { - display: block; -} - -#mwc-badge a { - display: block; - text-indent: -999em; - overflow: hidden; - width: 140px; - height: 140px; - background: url(/media/img/firefox/partners/mwc_badge-corner.png) no-repeat; - color: #fff; - border-bottom-right-radius: 100%; -} -/* }}} */ - /* }}} */ /* {{{ Responsive Grid */ @@ -1391,9 +1366,6 @@ html[dir="rtl"] #colophon { } } - .mwc2014 #mwc-badge { - display: none; - } } diff --git a/media/css/sandstone/sandstone.less b/media/css/sandstone/sandstone.less index 334ed50f734..060a381be3b 100644 --- a/media/css/sandstone/sandstone.less +++ b/media/css/sandstone/sandstone.less @@ -340,30 +340,6 @@ input[type=text]:focus { padding-bottom: @baseLine * 2; } -/* {{{ MWC badge */ -#mwc-badge { - display: none; - position: absolute; - left: 0; - top: 0; - z-index: 1001; -} - -.mwc2014 #mwc-badge { - display: block; -} - -#mwc-badge a { - display: block; - text-indent: -999em; - overflow: hidden; - width: 140px; - height: 140px; - background: url(/media/img/firefox/partners/mwc_badge-corner.png) no-repeat; - color: #fff; - border-bottom-right-radius: 100%; -} - /* }}} */ /* {{{ Less Framework Grid */ diff --git a/media/img/firefox/partners/mwc_badge-corner.png b/media/img/firefox/partners/mwc_badge-corner.png deleted file mode 100644 index 75c3733bb98469f2d8ff45ddb8b7b3ac01b5be64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5441 zcmV-H6~5|;P)<h;3K|Lk000e1NJLTq004{t004{#0{{R3nI5qW0004fP)t-s4vD@F zhP(}exebH54v4-CeYFHokO^_D3wyK&W}^gImkM*N1zMR1WugO5kN^Mx4T!=fbD@Nk zsWf(?p0~@f*XtpJzd4V@1~O;<{{D~7>d@==G<~W~m&Lff$PHP88)}+gy5d`yzn|0W zf5qm2$>~tE;4e~sKBw5<@%hi{_SV?k3P*E5uHFn%d$8T{?CtJOuG|T9vkP{y3|WeA zz~mpC)$sWH4PcNjqu2;+s{&4u24bQJaIXYdn*&*(2WO||=H|cR^T6cv50K6bez~C5 z?htLD4{M$SRG0{DvIJb91YV^MXPX9QtPhRL3yaAPkIe>ZuLf+f33s>&d%Xr|t^{GH z3xB@_WU390%m{I{2XC_pc)JO7w+&;L4UNkSg2D@dzzvGZ3xvb}|Njh$$P9<Z5uMl( zn${AY*$<l45uDf$oYxbc+7q7H6QA1=o7WMZ*$|l250cCdm(&oK(-4)>4~@nSmeLN1 z!48YW4wTUklF$v2&WGsAsQ>@~5Oh*bQ-S*NS7b>H*XG3;I<6^_0Ad8NTL1tPV@X6o zRCr!Qli70YI1EGcFz@#_!BvvoOO`wH?Q`T#DkZf@5g-aS-EX(Yc@DMP7&(-=G$ch@ zhea(>*C@9v;*bv@&ypF11Ra(U0p?P6rZQj}GA80CfI=a6l93l$B{a3hIM3Vd_Wu6) z`S$jFJWSOyK+C;Zn&BQ@Rjs3`N-9dAA!x0bC1?|lmrr$9htFBu{iP!(SHsa%^i(xm znjNZy)D&WCg?&7qxA(8lfBwAPo-3#~yJk)f&e_<Y{o2yueH_PBdiMl}mU)Q7D>W1D z+ydEPf}xyQ^Lj9vb+v3<1tL7F+YgMcNPGNydwKcu_I!Sf5Cm@(G-uBsbSP@N0DSuO zz;yt6Py;Cvv0~OCK@*fFJIFLiP@}&Krz%eGqQ8Z@<Xb@NJpbOFSi#FS^RSRN5>BtK z=L+ua^p&KJmPcG~t_x1ROba-mqS@0)t6I~W@^-~Zxf`6G2~RHd-1Zbf)y=|AMs$0B zd0|Ws8|L1UHlucjyJk&C+z%9gKBh^O9MT0xtAphoyC9zw8kLZfL8k1SQ@R>dLM>hc z@G>9cw8yWPJ*LwVis!miv$I$GQaX2vTFtdQIeRUSP_K;T2>>~qDj|tiwkoN+8UWe! zj9s|+xe_Ue<Yx9fZ$ID5_nSFwM2?YW*&4P?Bg2G`Q3{E}hVcWE&{vj*(%1%d7*}y? z`FQ;)sTn3shH#9~7!?EE-851$eB^20RxU3;W4ec&r3yv06w!q6aPHSS6um>hafc3g z4HZh2;{YZ(Tsiq`m`;G)&?3D2>Lu)}Wc;P^^7~${G1<r3+ALp$rIpbhnYG(0K@(_8 z?Wz}PB%7IKF2CSXI&oFX_rOB6QW3xnOkky7g_W&X_V^Dgzh15}?QbTGJ`qPH3BTkj zqgN?gVHP=L#T8Ug!C;E*5gy>n_LQ(I;VG=}%vzC^Mi;88AWO@0*<aqv*Y}Km&DeP^ zj9PG_k)gcDrJk9~bYJU^P^6h484#tl@@~-5?h0ErlCH$Ok>nlM+sJ|p)3|UrK8B(H zKV4<l;=Bz+;eOqBuahf79h!hKy@-u(?KZdB{Rhhnf_EB25o3*3T_wN0=g6V3gxEon z<vF9rXJki%#z<et@&zWUUgpWwf$&>*gptkUoNEVI!hzfF#80Pro=#v!=XeYu1lhJA ztz8AwcI)M?^Rq9y6KJWM@0w{xuV=j^weopkjlRN|h)3|2<~PnAFW(zCb^i=gKM2;p zgznJKfMH_18HLHC=<vgDaK~@Cs`T|tolrN+bow54m_l%XV~|Q1T0AM@gC<*0qr&nP zX0eo1rpYzl>t=FC)$OD~XWdT<nAz*mbpZpVJKm!c4PJeaP(jtXsrQ%0HF}sNh(Z?- zj)3++M}tc6ycRw6or>igV|k~4{22saoyl1Pp5(CcqWux@jjOysTf2@)=5E^x2uLQX zLMDWIL7h5RYvpzTse7dk8+%@Lh-BqRF)QVwj8I9saKAjVtb4`_G<Dxe)pvl|xm^$( zM>m9#wcZQu@Ng%=C%@J|iQ?C`_{nyIHbCdahd>>;(f<}mp*jn%anIEvR&4orU;)f| ziH7j;1Pn+NEntMt0T|3D>BfDh07-PlOxbykg1`{#YujwQzAicoo;o3Le+&kSkc4g; z*v-}Xy2N+BMup|knW!S;$+y$sngnMCSBWH1*iAgK!5!%{f;4$6&J#zHS>uinHLiAz zP^UQWI^0raolPZCE{LwUUG6n{g!x#Oo2fxuxzj-n&g8?GlB(=mLV{|A$pEsHm7SW3 zC|d3J2b0|I_nHhFm|J4s(!{b|6R5z<JdAJqZbiAXJi^3mTmVT>Q8;7LxUo~dq6J2~ zvF}hX5+`Kl5M54cNu+g~ta5T2Oi`DHu^*BVxa$Ejo($;d;LGTCaY2cmuwc);zgaS+ znD%CRtB~>IrDhzs!%hoTxp2e1Guo7E_Xp&atFo!xb>Jj>I=bB#P5b-u_HllB`Sw4{ zW0|5EtCB6}tfo1OVhj=mC5Dz#M$1bx!903ICPbyxA%V&`iFo$Rpg>ZDDOwyU#~hb; z{vADIp)=Q;@lY-wQ)Y5xDl=@?ML0`>^(LBBPRwyBVr6oZ0ih`}B!VYG$?^K3dp)B_ z-+ltiGiR>RQe<K(6-yK-y0ua%8`?%J%*FDcQAwBxk&9;}GzB23$V3X}T9K}KiOc!p z^W`ZEojJc<V_eGui};8cTC*$i-H-$KB2HvnaUyz#-f~0$7rI5xgC`;|Uo{drV;0IB zivlr!F0Y^1yMK}8sWY!{OvWE`Uh@?RumEv@kV`IdfDD({m4riHb2gWH7@@NkP=+&t zNlV;+l$Jq{+cpq|ixve6^iW@N*;`;Euyt7&g=P3EFu76#^swNG5hd~u1eOu)@VEE9 zk#pT$OV|uKLvlX8Ar;RmKOoC(GrXY-U>1*0V%1q|tus(agVszBXmmCUG6dPiSi%un z8KjFXAgNaL(KCrEC-8aYFtRMv<<EcKfVtho&7iqF^FN_|z3$iR37T%Ys9tqCBHV86 z2g<CSStxnGv-6h*W~X{wZ6)O$0!Rj3`NNyn=qFg-g4uZIRCRxD_Ilm5*ZtJBGe2Bc zz%<w&V6<Ki&2gTOI}mPXJ)V)g+o~dUJAJEqJk9O2y;fMxsD|)Lv8jrR`u?^I19f>D z=GKS$TDt>9NA9M>(W~{)A@B3F!@5vL5k?ID+I>Tg=Vk^~WnGSx4}RKNtui>;6-%OP zD@qg|m(ADrSf~sJhZbpp0EMQ{Rq^hoR=eHqe5pEpQHH?)pjD9PMk^ZhAw&q;TFn!b z#$>UBC$9Hkc~=+0EIx*CL@jIqG)N^UY_xmQLuX~8S4;p166O;C*2B|PJxzxvGSI3Z z_pCukVvlJ2;R~+O`?~Np<?PfE#wmE%;5vYD-PY}=6JS=v6OtbT8P2EbOd?SUqPu1~ zxnGvG3mTkO3p*bn%g0!FX1o`7nRYJVRs1Fisxh!kO!suYOh?yFrx4U#2(uLsItSD! z0SFRRp3bd0%%T-c*XUFcb<+F17|UN^c^76}d>^AW4OdffP3Kg^9i9d0RNBKQXcf99 zs1OFu;I`*BL{Mp<I0$^6E|{YMHj+;%O>{1LpUa0?4952XyX`J0P8-l@9j~?u_8#LA zwGo7yy+pu(A;k8)4S~vle-BC9=0F=^0pTP#Cou-+eOflWMr8RIO!h9iXy3X+>)idL zheUuuIi4T~y!<8tm}Ls_WQT{(Wq*eGbdkFa0C6EYt5Cvm`96G97oM3?cxYV2<2=?0 z(Mt@(5I9AM3Wr4T_fZa#co<$o5s=z=p>=}AJUiaU<o#wDKCBC2HY^iG?SUYXso4<p zkt~|xLMPGsKA_u2`UI4{NKd!H5)?7Q20--%HF|`FWxA!@ryvPQ#79XYK#4wjAbJNk zv8YA@3{?vW4h#@41c<!{b}!`cqzqIp`;wR8`vWY18OB^t+>~<k9)=H<#>>8kO+8-0 z@?LV1lzR9DT(AhonE01DC~-7rrJV9OKBkM6X)KB5<-!RmVg^#r9j0V(*~ogdz?Fsn ziuak5B%*;=JP{$yN|WHb-O2`M_rC{Npv-2;CFg7^<W!QiC{NC`bc4l45Ui|#d`(Ew zFiPkB4+Sa-C3<;G7b-JuxIhGhFLw?jfIt~f&-UGIEjBq6bc~bQn}3bLO`>HStVVwW z-~nZZO~U-*e{GBq-gGIpU&}|wDoZ9};fS*G6$=<VXTg>-E_Pi01<OM)FT)0ldnP6k z+Dvbo&2(aE7SDhU%#!mZRbt<w?5=}KDfrU8Jj_Cvaa<@jmPi1x?V?GI;G+h#%+4VC z_9pVvL-=I4gr;V8iw2;O<w2OQ!&vf|2*c!e7?Z<TD3e8!MNOr3m_@Cz(wY6Ab^2>@ z+=ik6-nVTjOFMryX~9{Wyv##_365b!z|bj}m<7FbWDq#Auqry={~Pq2D?B@;eQDww z%Tlmo{c>&+5lgi88Vi$|@ZSapCr;9ucv5A#-<PF2y^1XU8M#mVE8-vlei<<$4XSD7 zb;KeTL(3JI00%Z>`jI=?8jieHs?H&*EquHKL#SjC&oySG3afOAswoC*K{<Y)<$t$n zf(FHa`OSjbm$lMecRqKWSE}5r00s{ZE-+*bJ&RB-k;+XLVk|6@xa4fn8-4y(@RVgs zCM_}bXa+$)Q_>w_ifB<QmMbw6!i{m_7RNI84CNo3e1BvhLYU@+xZskDWJAIeW4SUH zVw`0(63jHUWvvsX+y4IPPFUSp=Vc2n91~B;A~rJQtH?nNb7^R~HW{{BzG2LB?B9vy z%i+tT^a~(emk~7yfff<WA0q^-5JGE>sjkh17}JNqM@=Z7dr~^F91f437SZGi4%`t1 z1=Sl0gCJDsVL4uJA;yM4No12?VI|A%Nl_w0m2HqdM513g1s;^iTRg?~t*Nf>5iza} zmX8fFDEYyBv((bCbgEU9y(yyL)ry0u@}pQ-b7L-&jD?0@%$6RI^P8pgv}sthKKrr< zIda=6Rp4N(l8XF|s)m+ZFs8?o_~0{=(E6RF(<vzub$#YdypslT@Qs~#vev<JlpfuL zX>AaUEz}tlP0RD{DfgOhVZqRyRz(OPz<?r)X&@e+`eeB+7h)<T(_5DEuy|OWpHq(@ zLv`upRj@twC4xs_CYa^Zq@ZZIEg9ECLr$(Wb9qJ`etln`GH84b^z5Fv;Cpb`B4?_q zIl*!(#<ZmLg3*5W{O>wEdJT*XlmwArjS=`cXC#-~Eo_r>7KIIJw59(1{2%qG(5E`x z#dBK8VV!fMX_^x)w_}VW2k9szQ$I;GyU*|I{)v|q?&%#l34+0sas25v&4-UaErBt; zJlGa&Qz@F=(=YF8U$adG?@9<+;DF6lMsk5=0Zc;-qp^3~Qtd@^c&NXX@?_p|Z<OOf z5ZC<W9*?Kf53nqeOy$rhZjvdDnl+jB-s|)tMrDp^h#)~`OLO`ySr+=uh-Q@%c+-$T zhZmJvfk6n*GLb^dQn|2AqTvqqL3T}=ooGBIX?n0CfMhN+j#bkvXd$K=Az`hRXNhJ9 z&BL4ugIOE4(->h0MJy-j(PEg<m|mW4+ALvooivY13xp$Uodn2xWnMlPVlI_2F1^+T zDHus}Uvn*0teJ_#GUAL>OtW+@(kA3Bd*HkQWbV}c{l4~dZLq%^so^xDnr3keF&Apm zHtnV$MY7rNYb8tVi%n}l;9*#>REt}PIbDWfV53HcvwG90S|y8zWyOmr6QGCjauEtG z%VL^g9K~XQK{lCCFy<-Sv?H{G8O#XMz<N0~i(A;HKdNDb2b+v6v)+OusVGj_cI|i- z5^zQ{440vKIW3<{O6CQ9B4w_2z1?I*;Z;#&o9((Kb0C9Mvc5Kqg_gxJUx&+u(GWD7 zR_o1XyWMQoD+9rNm7!FBH%|vSc7s3=K(mUJXp*^4#sP2LSS&ySwSwmU$4FJ_M>zpt z?2oa%;Qi|M7)9-Jz%l_dK8Fw#amK)E=pldf4NiPmkqRsabD4noRk`1QV2pt)SEO)> z_3Mp51E)2_qFiQRiWxUo3PXWt{Er8`p-NgcGvqSKqGSprJTNLe^-sm#xC{>7)K5NF za_HPy7GZMXzB=ouRWVRi@%uLfvr<j5$TBGz13-yX8(QJ=8hB;!31e1%lOoF`%vmsy z2r!03R3+p6;Qi2>N|u$T&q$V8$*@jLKz|<T7<UKA2*6p(FpO66sa)P*nU+j8ZfT}G zII&J<l;KblLDWj~xfUgJS}Rsd!Bm-%VP$-xT=>S6ONJ#KZ{Go!myBoQ?mC1jLRb-_ znBKLf8YNh!V$R%@M6In^!C6f)wZfztc`dgLiY#+6IhTh0xOoGo(NXcJVFd>{?(;3e z985-A7XyMbB@kuR48WZIOc=0C#`K<D{n9u=!JPP`tQN~Tckjosz@lUv1p-DP6rGJh zacbW58Lh}g7|*51zzJ()K~6Sky!nY(ju2p3fMK0-aqdqMuO)NknBDt%BNtj0VD2M3 zhQe@1I9kb+ofuGLS%Nt`G}$3x7R2a|53~1vtja}Yx+%d4g9uG53?g9(VU<NaBZ(qW z99m~e`n}E~OhPj7z~Wua0}dxrdP-@XMP=&Vl?Z2NCS1GsI~_|cO6KleyF0H0IVFDI zv|O+(#Pr@3g#yY1Y286tY7yq>?y|UZ<%)>0gs|A6o?)xPAx3uH9(PKMElNgp;*SR* z=$3?WEw`wFxxdq+Z>ZA}*5@LOG@|fAO;YOySax9Gz#$JtilAKA&#&*xF(DDql?^4R zQ4C>&Majengo2UfRxTg1Y$($!8qN_Xx+O4|9hew_;dm7(Z0Z+bLQGM~@EQXwAG<7S z;27_uuSlJ%e%Xa#nW#w-nw=J5BBGHb22g0(hY{nxS)!e}2y=mw6wBsZluQ8R2^L{4 zO3*I5Eh-Zu3D@>qgdrndPsl}OVlewH!n`Q5?8k^A%YMwqg##7>_G2_;*^haQMHpEg rf|2DZ7+M~Kf#o?ESe}D<f6({~_AHsJ0-P0&00000NkvXXu0mjf39%k| diff --git a/media/js/base/site.js b/media/js/base/site.js index d02baf96d29..ba66957f452 100644 --- a/media/js/base/site.js +++ b/media/js/base/site.js @@ -95,29 +95,4 @@ // Add class to reflect javascript availability for CSS h.className = h.className.replace(/\bno-js\b/, 'js'); })(); - - // Read cookies - function readCookie(name) { - var nameEQ = name + "="; - var ca = document.cookie.split(';'); - - for (var i = 0; i < ca.length; i++) { - var c = ca[i]; - - while (c.charAt(0) === ' ') { - c = c.substring(1, c.length); - } - - if (c.indexOf(nameEQ) === 0) { - return c.substring(nameEQ.length, c.length); - } - } - - return null; - } - - // Add class if MWC cookie is true - if (readCookie('seen_mwc2014') === 'true') { - document.documentElement.className += ' mwc2014'; - } })(); diff --git a/media/js/firefox/partners/common.js b/media/js/firefox/partners/common.js index e03babf5f94..7c96db19d54 100644 --- a/media/js/firefox/partners/common.js +++ b/media/js/firefox/partners/common.js @@ -129,7 +129,4 @@ window.open(this.href); } }); - - // set a cookie - document.cookie = 'seen_mwc2014=true;expires=Tue, 4 Mar 2014 00:00:01 UTC;path=/'; })(window, window.jQuery, window.enquire, window.Modernizr, window.trans); From 42806a87f2664482ffcb91cfbc8f53b24916c233 Mon Sep 17 00:00:00 2001 From: Benjamin Sternthal <ben@devpatch.com> Date: Fri, 28 Feb 2014 16:54:42 -0800 Subject: [PATCH 20/23] Fix Half 971244: Fix first half of 971244 - Move redirects to bedrock conf. --- etc/httpd/global.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/etc/httpd/global.conf b/etc/httpd/global.conf index a2dd7f22719..3ae37d041d9 100644 --- a/etc/httpd/global.conf +++ b/etc/httpd/global.conf @@ -674,3 +674,7 @@ RewriteRule ^/(\w{2,3}(?:-\w{2})?/)?press/speakerrequest(/?)$ /b/$1press/speaker # bug 970957 RewriteRule ^/(\w{2,3}(?:-\w{2})?/)?firefox/aurora/up-to-date(/?)$ /b/$1firefox/aurora/up-to-date$2 [PT] + +# bug 971244 +RewriteRule ^/firefox/its-a-trap.html$ http://www.itisatrap.org/firefox/its-a-trap.html [L] +RewriteRule ^/firefox/its-an-attack.html$ http://www.itisatrap.org/firefox/its-an-attack.html [L] From bef793ffa33f014f2014ebce7d67360e6072d0a4 Mon Sep 17 00:00:00 2001 From: Jon Petto <jonpetto@gmail.com> Date: Mon, 3 Mar 2014 10:05:21 -0600 Subject: [PATCH 21/23] Remove superfluous position: fixed; rule in modal CSS. --- media/css/base/mozilla-modal.less | 1 - 1 file changed, 1 deletion(-) diff --git a/media/css/base/mozilla-modal.less b/media/css/base/mozilla-modal.less index 1e6f9a590fa..5566261d094 100644 --- a/media/css/base/mozilla-modal.less +++ b/media/css/base/mozilla-modal.less @@ -42,7 +42,6 @@ html.noscroll body { } #modal-close { - position: fixed; z-index: 99; position: absolute; top: 9px; From 9129a6c6b5d2de7c45a1c45fe0fe1d6a9d42cbff Mon Sep 17 00:00:00 2001 From: Craig Cook <craigcook@gmail.com> Date: Tue, 4 Mar 2014 00:25:51 -0800 Subject: [PATCH 22/23] bug 979050 - style the Feature and Language tags for release notes --- media/css/firefox/releasenotes.less | 14 +++++++++++++- media/img/firefox/releasenotes/tags.png | Bin 1157 -> 2396 bytes 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/media/css/firefox/releasenotes.less b/media/css/firefox/releasenotes.less index 9958e009a78..78335d583dc 100644 --- a/media/css/firefox/releasenotes.less +++ b/media/css/firefox/releasenotes.less @@ -78,7 +78,7 @@ a.go:after, } .tag { - background: #f3f3f3 url(/media/img/firefox/releasenotes/tags.png) 0 0 no-repeat; + background: #f3f3f3 url(/media/img/firefox/releasenotes/tags.png?03-2014) 0 0 no-repeat; border-right: 3px solid #ccc; box-shadow: 0 1px 1px rgba(0,0,0,0.05), 0 -1px 0 rgba(0,0,0,0.05) inset; display: inline-block; @@ -135,6 +135,18 @@ a.go:after, background-position: 0 -350px; border-color: #999; } + + .tag-language { + background-color: #c3dbff; + background-position: 0 -400px; + border-color: #345b97; + } + + .tag-feature { + background-color: #ffdf9f; + background-position: 0 -450px; + border-color: #e1732c; + } } .sidebar section { diff --git a/media/img/firefox/releasenotes/tags.png b/media/img/firefox/releasenotes/tags.png index 7ff3a40b3957b577ec51397ba475666de700b1b7..1051dffa7c02d6e213140349ac15cbc5688badf3 100644 GIT binary patch literal 2396 zcmah~i9gia8~&C;vSev4qR2XkvSk-HjIv})%$TeVE;o@aqzui-mTVD;8CxMzp_$Pg zWZ#E0#xfW*7^SgwW#;$2f5GqloX<J$d(QKm<vr*5oYZR$HbMf@0ssIA*}^V6gY9Vm z;F06!0X?3mvm*d-c=MW_s}%;2kO|Mf?sk0%p4fn4HW$v<_Gh^`yF`RXbTe4aPR>i2 zc!yZ|oH54MIBjZk2M(=RNXX~n08~vE9Ey)Oo&5OmqscWWkwDx{mFJZ3W%0>0Qj%N7 z@&;Wa9@q|_hYL{L!q?b~+$3$^zJ)9}wN_lqHROSL&@1PA@(Yei9Q1ji_|msIb8FAv zfFW3lNMXtkY6z6_65uQfg~H?Usr5d%*x6qC<R<gCmdj&H3roKbqdJJ>o;T||kCZTg z*bSA^>fr@_zl>dsA{<(o42bp2yuN_S;=JJXOoi$O9MAo-Viqj!p^96+g=H+Wm_ABr zfH-&xE|*K~`%dedTbkJfmyR=}Ui1}SAWu8!D)#pDDo2-~-#LN(mjjZ5^_%bCzn|#Z zmhLhOvOwEQI}@Z$WUX(30M^g%cT7ng9UTqN#=)Urr^?^S8m7i3oYird4Xk&z$@G3L zxYc;G2`~>F4hO`fUx6GP9Doi;2W!p&_Y&+Wkx1lVR6zg;sY`VO!;mr>cx53WAt2E( z{6*x&5r2PwZ}qy!cbcPz^_u|s4nQ8HbLUF`n+FF(Mn=v@Xk3aC^(#<er~3qGzMlpz za-Z3S>2~kui9sqUbUJ-n!Zxf%i~HfWV<sf_je+pXegpym#lC-WNQ!t|LoBb23h4F% zN*jJq?aWVmUkA{ZbN<zG>uYOgUkoM^^t1|k_dXOA7Z(e^{t{ZJS_4SN#l`)l{mIqU z^^fwQq@*O{mwlwe8oKa;l@jbDvQf&r{Q*Gr7G8PTRe1@G>IF18Wjw4N5*CZKN<Ja; zp5{_?auuN(Z$v8qAZ>u`Qj~j_tR=im+A~{@JCd3G*?xC(!yNNb{b~aEY%(%3MAMoc zTqkjd(wLne!4w&1f4-S9<_X1LL_HY?w0P^OBY?VXPNzYz&~`Nj^Woq}w3V5uS(HVG zeay#!a-%>np&56b9bCLjXj_{rD_vueT{9^&Lmgf#BiIl1MZV>4;K}S2vxE4>UIx4P zCz6Wu&T1K6plvK}Q_g+;7rU5Dq`ED}Phmc6Pi}MKZ0T>Derz*HwwvjW+m9<Jqtzaa zSSL#|Qw}a&O?#E{+oe`%YP|a$yY05k8N?L<&d`1cW4iE!sEkpTM3Cq`Q;VLX(j35< zcli(i9L=!3Y~dP%WKmJB67G@@eEf7Lo*W@aIyK_DJbnNC{J!AESxFv<;IZ-~EbkFW zXJo-d33Zl9+MSJS+L?{BWi7e4k?lFt#`_B0i=&J<!|B2f9UZ}rRvpw()Kd>u1zjay z_@_2g5$#eKmUOJ@dji(q@|bdN`%4M4t!OQpxrCIIRBW9a(pL=bQ&ZRbMPOH_(C+HD z^@-bcb*cSPEHSO8EBs>Q7O|rb75in5LLdX#PB*3|+Y^{o%I_L-hme(&)TB;IrRiOW zia?7P=^GI)$1lMvaK!htaPDCkkNcu-%pFN7DUWwAyNR);5bQVNPg>O=+_u5$9LeS_ ztist8@yGnkc3IAqC7TAmz#l87Ch_P5H#L!@=&r7M&l9Hz6u0H$3S=Rn#N_YEJ~VyF zQ-SNF|LENk%wUPHdwnrfQdHa%wud#S#1yqtCL&8MM?X&>%br;`^eZ`<f1*du^4(LD zcs$H69IZx;W>U&bwJf~;JeJQ2S3C6ZN^#puFLndd%jD`66M|jANEP`7PwC~$@v(9; zRpcg6dj9kOob1o9lT^jCAC=;UES&oFp9o4vY91WUy|4M|VsCr(*73=*MfA<9S>XyT za3e|G3;wGqTYn$XA|d<UL+$u!=alxWgMxysgI3k3up0!6u)CowcVm5fL2B4yOlYVs zS!#8vMxHFj99s;2Z-l0Au8s#9;Qk&B4m2TaN}a43RkyZ&t*)k~ZFbfmUi7zto*r(Y zC;PETpd;F<`BLVkv~P}R*#jRm{D9BAx$2O%w)WdboH)W7smUncH1NCQK@BA#6A585 zDb1(O6quU1fZ~t5V=Piilol6fpURs&MJqi`TwS=Qb~6-1N}Qi}>dFaVb+xM{45T_q z%!Uv>yJTf!bn@oEp&q~X6@UtQX!cvR1nNTSXSrpYojV7wQw)SS3hC+T8bzcS&hO7n zR(EHAmLN`_kSiFTv(&COp*z?d`Z=$d#)xiP{<oL*D|0%Fo<a3~5&_#SU(YzgC*c+@ zD=coWswN<3KzRGMqT+2pUdV;ofE)yJgNXZV$T)ces?u5kDt~wNyu3(D3f;rrUWA^m zzpSUEq&IkWZ?F<Sz=yLj@3DJT6I4z#BD%Qb6c!YC@SLk68EKev|FqHTk44Hp`iFM~ zL)_Q6Df=WlJ3A#RVzRdIFBLqyy}ux0b#*oTiw6FDV9AaEzK$@R>hF`e^Vk99hog9n zF1Lt=R827Nww9H(HjGS(n%KEtyY@sqXQ|!tV!C%IxzVrN;E~nCeEOF&@|mpx>g35b zjHily@KXLH|LM+6Xx)xPH<~|cl(Dk%S4fBvBzIV7b|@>2A}IMXHLX9fG>UNMxmZ<D z=tO5l`cmsmVsZH>o*2wV+}`a0jq_=r-8epHKh@gUG(K3`N7~((p*@@6U$m1xGtk%P ztd@8F-?6WGKF^?zuY3e6ehf_J4dfzkZ`It&z5Od^y4wF4GN(y-*GDoyp?70<aNv6B zz8PGKoe=$0i9ARz*5|tl%l}olHkkhO;i#ka{QUBA)Asf@>iHl%P~*;SX7%6onLnaL zaE*7}tH-OTC`W8^v~;o+EKJ(O+}hgu^yrSGj%xgybB2b$-0K<sMr+%$wUaKtkZ?F( z^UOhWyhPjHFIE2x5pL{PfkX=L95IARWn&4u8=gfEDRgdEPmgc6oPLkfKnFqgh9+jl z6=K}58I(1);K6qxLzcStoEJTR%VZ6<D5pQ@jn$PL`zj~hw5~vhbtvR7%^7Qp?JOV6 zWS>~;iCfM__|AShbz*@O?2T}Jq|rI7{W_gOPx1Xv$N%3Lp8#CZtAO|bCvEV@0Bo%s KF4tRnC;bmmM$fqb delta 1150 zcmV-^1cCe95`_tn7JmVd2m=5B0FEOdi~s-tz)(z7MdD8-l)7nYzuCDMIb1Lfo}Qj% zFSO3N?YXkWveAq6@bjY6<=#;}gKVV1!NJ7Zs$F4MuZ!bbDW+yLv42C>RemXz0T<_t zk}PtVJ#r87?)UYC9qDQ*@N^tAfUW83@cR4vjs_c1j~S6nLw`v}PyU|;|NsAOG{84& zmc6~b%E-}2Mn?bu0B~<`US3`wn8o8zCBp(H^1P_+VJYl_T{@G*gMx#8xHtc!0QZR@ z531E;qav>W9r5Pk|Ns8g0yMvD#4rE=04;P<PE+XX?fJI-!r6T7%iGVUw%O9<{($_7 z{PB_fAz?&|`hRt&eEl0u%R~PB{uKTIsX8DD0009=Nkl<ZcwX(-X>Z~%5C-6uEszFi zIl`5L1Z)Dhb`EZO?f?H*I}SlwX(s)&s<gX)KiE;8%n(3v<U9Fg{tDidu__rmW^j^` zBSubF3(QCnBgL$hU~$Xe_J<laY}jz{C3|Q8D_)+LG=G=H=d(vM^Md7BXBl`5b8tD| za`7;O-!vdUds#9l#iC?MGlRaDOC|e&I*exTa`6}peg%8i2{FpIv0=l84YNU`-){^A z&AeZRQw(~`0J8vanzr3@n*BaQJOGUbje!+eP>y)DT7?4`Txr2bup?HGMq@?u3W_1U z9>vbev45IP5UT@?5cgJ&>pD<e42VO=VJvFeVZ(8p5V2^&=|-pHKzc4>8G~Qbj3r|5 zs8^KQpae@1Mz$S=!aN3lk_{U+%!Uus>BErG%%_kA3>>r8MHz6!Y`S<WVm~gX4Dqnk zXE9tXhKNhOj~N^-C_bIu-a<JfS@(@j&w>|i5Pw7IP((3wIYAKLYlk~5^d50|0`G$A zgowqn_NzWpZv*gao-5u4k45SCy$uW-Hf%WiEtR~}q4+NQfP8*_e(dfDZfDz%?G~=s z?%EZ+FG6yVjjzqOyMW~V7)rMl>}C6pakkrj?lX^IA6PdB_DP2BaP#{e$@2EIWSOLx z`G3J(mbC+)naAKCVZ(+Ei^*iYo=hs3uh%okdd)FwogIqIz!8g^+O64|A)b`l64qfh zL0oDr7H~AfoTi6EdI;qtO;gNpvK2vVK1(5p4{18lTL;kB^nkeb3NE4bE2M@vd<CC@ z>V$|z3n0B}joLbZU(>4CI@F5NKe}}=Y=79WVK#pljUMKVW<DCdLq;P`F$c`^TwgH9 z%tjiUw!UJ-5YM&duA6J0BmR-=NLfrj5WoM<?}+oCko-2|<^?lWFmB#1`2D@$HsbK7 zj%^o{g;<O=_`cRLwcKmZbFCH2{kSOo-sRq~VZ(;`3$J9(WcQ^j8K)R3UtW?Vfp?Kp zY$dl?6uU~P`lb$}OEB*ys%~|k>MH4S%t@k@)lIrjN+k*A%~7e&)A6aJ)NzA3j<gpV z#h4{i;0dT=<o8y`YZRwA-q?2iShwv>j9I%Y;nt)8r5F<1v3U&s4>oN07qLnC4Yg** QiU0rr07*qoM6N<$f|utx^#A|> From 88530b1f061c13e76b8d1f8884939d44d7a21cd6 Mon Sep 17 00:00:00 2001 From: Josh Mize <jgmize@gmail.com> Date: Tue, 4 Mar 2014 09:59:15 +0000 Subject: [PATCH 23/23] Add RN template switching to fix Bug 978931 Templates added in this commit are stubs for future use --- .../firefox/releases/aurora-notes.html | 5 +++++ .../firefox/releases/beta-notes.html | 5 +++++ .../templates/firefox/releases/esr-notes.html | 5 +++++ .../firefox/releases/nightly-notes.html | 5 +++++ .../templates/firefox/releases/os-notes.html | 5 +++++ .../{notes.html => release-notes.html} | 0 bedrock/firefox/tests/test_views.py | 19 ++++++++++++++++++- bedrock/firefox/views.py | 7 ++++--- 8 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 bedrock/firefox/templates/firefox/releases/aurora-notes.html create mode 100644 bedrock/firefox/templates/firefox/releases/beta-notes.html create mode 100644 bedrock/firefox/templates/firefox/releases/esr-notes.html create mode 100644 bedrock/firefox/templates/firefox/releases/nightly-notes.html create mode 100644 bedrock/firefox/templates/firefox/releases/os-notes.html rename bedrock/firefox/templates/firefox/releases/{notes.html => release-notes.html} (100%) diff --git a/bedrock/firefox/templates/firefox/releases/aurora-notes.html b/bedrock/firefox/templates/firefox/releases/aurora-notes.html new file mode 100644 index 00000000000..d7a36dbe91d --- /dev/null +++ b/bedrock/firefox/templates/firefox/releases/aurora-notes.html @@ -0,0 +1,5 @@ +{# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. #} + +{% extends "firefox/releases/release-notes.html" %} diff --git a/bedrock/firefox/templates/firefox/releases/beta-notes.html b/bedrock/firefox/templates/firefox/releases/beta-notes.html new file mode 100644 index 00000000000..d7a36dbe91d --- /dev/null +++ b/bedrock/firefox/templates/firefox/releases/beta-notes.html @@ -0,0 +1,5 @@ +{# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. #} + +{% extends "firefox/releases/release-notes.html" %} diff --git a/bedrock/firefox/templates/firefox/releases/esr-notes.html b/bedrock/firefox/templates/firefox/releases/esr-notes.html new file mode 100644 index 00000000000..d7a36dbe91d --- /dev/null +++ b/bedrock/firefox/templates/firefox/releases/esr-notes.html @@ -0,0 +1,5 @@ +{# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. #} + +{% extends "firefox/releases/release-notes.html" %} diff --git a/bedrock/firefox/templates/firefox/releases/nightly-notes.html b/bedrock/firefox/templates/firefox/releases/nightly-notes.html new file mode 100644 index 00000000000..d7a36dbe91d --- /dev/null +++ b/bedrock/firefox/templates/firefox/releases/nightly-notes.html @@ -0,0 +1,5 @@ +{# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. #} + +{% extends "firefox/releases/release-notes.html" %} diff --git a/bedrock/firefox/templates/firefox/releases/os-notes.html b/bedrock/firefox/templates/firefox/releases/os-notes.html new file mode 100644 index 00000000000..d7a36dbe91d --- /dev/null +++ b/bedrock/firefox/templates/firefox/releases/os-notes.html @@ -0,0 +1,5 @@ +{# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. #} + +{% extends "firefox/releases/release-notes.html" %} diff --git a/bedrock/firefox/templates/firefox/releases/notes.html b/bedrock/firefox/templates/firefox/releases/release-notes.html similarity index 100% rename from bedrock/firefox/templates/firefox/releases/notes.html rename to bedrock/firefox/templates/firefox/releases/release-notes.html diff --git a/bedrock/firefox/tests/test_views.py b/bedrock/firefox/tests/test_views.py index 96895b2cc0f..79106dacf6a 100644 --- a/bedrock/firefox/tests/test_views.py +++ b/bedrock/firefox/tests/test_views.py @@ -51,7 +51,8 @@ def test_release_notes(self, get_object_or_404): eq_(self.last_ctx['release'], mock_release) eq_(self.last_ctx['new_features'], 'mock new_features') eq_(self.last_ctx['known_issues'], 'mock known_issues') - eq_(self.mock_render.call_args[0][1], 'firefox/releases/notes.html') + eq_(self.mock_render.call_args[0][1], + 'firefox/releases/release-notes.html') @patch('bedrock.firefox.views.get_object_or_404') def test_system_requirements(self, get_object_or_404): @@ -67,3 +68,19 @@ def test_system_requirements(self, get_object_or_404): eq_(self.last_ctx['version'], '27.0.1') eq_(self.mock_render.call_args[0][1], 'firefox/releases/system_requirements.html') + + def test_release_notes_template(self): + eq_(views.release_notes_template('', 'Firefox OS'), + 'firefox/releases/os-notes.html') + eq_(views.release_notes_template('Nightly', 'Firefox'), + 'firefox/releases/nightly-notes.html') + eq_(views.release_notes_template('Aurora', 'Firefox'), + 'firefox/releases/aurora-notes.html') + eq_(views.release_notes_template('Beta', 'Firefox'), + 'firefox/releases/beta-notes.html') + eq_(views.release_notes_template('Release', 'Firefox'), + 'firefox/releases/release-notes.html') + eq_(views.release_notes_template('ESR', 'Firefox'), + 'firefox/releases/esr-notes.html') + eq_(views.release_notes_template('', ''), + 'firefox/releases/release-notes.html') diff --git a/bedrock/firefox/views.py b/bedrock/firefox/views.py index 2fc6930ac5e..752495249e7 100644 --- a/bedrock/firefox/views.py +++ b/bedrock/firefox/views.py @@ -418,9 +418,10 @@ def fix_fx_version(fx_version): def release_notes_template(channel, product): - #TODO: if product == 'Firefox OS': - #TODO: different templates based on channel with default - return 'firefox/releases/notes.html' + if product == 'Firefox OS': + return 'firefox/releases/os-notes.html' + prefix = dict((c, c.lower()) for c in Release.CHANNELS) + return 'firefox/releases/%s-notes.html' % prefix.get(channel, 'release') def release_notes(request, fx_version, channel='Release', product='Firefox'):