Spreadsheet-Read-0.91/0000755000031300001440000000000014663305531014026 5ustar00merijnusersSpreadsheet-Read-0.91/files/0000755000031300001440000000000014663305531015130 5ustar00merijnusersSpreadsheet-Read-0.91/files/empty.xls0000644000031300001440000000000010313232324016767 0ustar00merijnusersSpreadsheet-Read-0.91/files/attr.xls0000644000031300001440000005700010452463445016635 0ustar00merijnusersаЯрЁБс>ўџ -ўџџџўџџџ,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ њ0ЭЩ@сАСт\ppc09 BАaР=œЏМ=xKЬB}(8X@"Зк1ШџArial1ШџArial1ШџArial1ШџArial1Ш Arial1ШArial1Ш Arial1Ш Arial1Ш Arial1Ш Arial1Ш(Arial1ШArial10ШџArial Unicode MS1*Шџ Letter Gothic1,ШџLettrGoth12 BT1,ШџLucida Console16ШџLucida Sans Unicode1ШџМArial10ШџМArial Unicode MS1*ШџМ Letter Gothic1,ШџМLettrGoth12 BT1,ШџМLucida Console16ШџМLucida Sans Unicode1ШџArial10ШџArial Unicode MS1*Шџ Letter Gothic1,ШџLettrGoth12 BT1,ШџLucida Console16ШџLucida Sans Unicode1ШџМArial10ШџМArial Unicode MS1*ШџМ Letter Gothic1,ШџМLettrGoth12 BT1,ШџМLucida Console16ШџМLucida Sans Unicode1ШџArial10ШџArial Unicode MS1*Шџ Letter Gothic1,ШџLettrGoth12 BT1,ШџLucida Console16ШџLucida Sans Unicode1xџArial10xџArial Unicode MS1*xџ Letter Gothic1,xџLettrGoth12 BT1,xџLucida Console16xџLucida Sans Unicode1hџArial10hџArial Unicode MS1*hџ Letter Gothic1,hџLettrGoth12 BT1,hџLucida Console16hџLucida Sans Unicode7"Ќ "\ #,##0_-;"Ќ "\ #,##0\-A"Ќ "\ #,##0_-;[Red]"Ќ "\ #,##0\-C"Ќ "\ #,##0.00_-;"Ќ "\ #,##0.00\-M$"Ќ "\ #,##0.00_-;[Red]"Ќ "\ #,##0.00\-q*6_-"Ќ "\ * #,##0_-;_-"Ќ "\ * #,##0\-;_-"Ќ "\ * "-"_-;_-@_-,)'_-* #,##0_-;_-* #,##0\-;_-* "-"_-;_-@_-,>_-"Ќ "\ * #,##0.00_-;_-"Ќ "\ * #,##0.00\-;_-"Ќ "\ * "-"??_-;_-@_-4+/_-* #,##0.00_-;_-* #,##0.00\-;_-* "-"??_-;_-@_-#Є"Ќ "\ #,##0.00_-Ѕd/m Іh:mmЇ 00.00.00.000Ј**\ #,###,#00,000.00,**рѕџ Р рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР р Р р+ѕџ јР р)ѕџ јР р ѕџ јР р,ѕџ јР р*ѕџ јР р Р р Р р Р р Р р  Р р  Р р  Р р  Р р @ р H р H р H р H р  H р  H р  H р  H р @ р H р H р H р H р  H р  H р  H р  H р @ р H р H р H р H р  H р  H р  H р  H р @ р H р H р H р H р  H р  H р  H р  H р @ р H р H р H р H р  H р  H р  H р  H р @ р H р H р H р H р  H р  H р  H р  H р @( р H( р H( р H( р H( р  H( р  H( р  H( р  H( р @ р H р H р H р H р  H р  H р  H р  H р!Р р"Р р#Р рР рР рР рР рР рР рР рР р0Р р1Р р2Р р3Р р$Р рР рР р4Р р  Р р Р р Р р Р р Р р Р р Р р Р р Р р Р р Р р Р р Р р Р р Р р Р р Р р Р р Р р  Р р! Р р" Р р# Р р$ Р р% Р р& Р р' Р р( Р р) Р р* Р р+ Р р, Р р- Р р. Р р/ Р р0 Р р1 Р р2 Р р3 Р р4 Р р5 Р р Р рЄ Р р, Р рЅ Р рІ Р р  Р р  Р р  Р р1 Р рЇ Р рЈ Р р €Р р €Р р Р “€џ“€џ“€џ“€џ“€џ“€џ`…xColours…e)Format…z, Alignment… i/FontsŒСС`iќLžredgreenbluewhiteyellow lightgreen lightblueautograyleftmiddlerighttopbottomjustifyfillArialArial Unicode MS Letter GothicLettrGoth12 BTLucida ConsoleLucida Sans Unicodebolditalic bold italic underline6 point18 pointmergedunlockedhiddenџ"  PR‘ њ0ЭЩ@  к#)  dќЉёвMbP?_*+‚€%џСƒ„MЂxeroxмФSџ š 4dXXA4PRIVт0''''ФP4(ˆ/Оhž џЁ" dXXр?р?U  џ џ џ џ џ џ џ џ џ§ § § &§ /§ 8§ A§ J§ S§ \§ § § '§ 0§ 9§ B§ K§ T§ ]§ § § (§ 1§ :§ C§ L§ U§ ^§ §  § )§ 2§ ;§ D§ M§ V§ _§ § !§ *§ 3§ <§ E§ N§ W§ `§ § "§ +§ 4§ =§ F§ O§ X§ a§ § #§ ,§ 5§ >§ G§ P§ Y§ b§ § $§ -§ 6§ ?§ H§ Q§ Z§ c§ § %§ .§ 7§ @§ I§ R§ [§ dз" ~~~~~~~~>Ж@я7 њ0ЭЩ@  !*,  dќЉёвMbP?_*+‚€%џСƒ„Ё"џр?р?U} л џџџџџџџџџ џ џ џ~ €Ш@~ Ё€Ш@§ ЎЎ~ Ђ€Ш@§ Ќ~ Ѓ€Ш@§ ­~ Є€Ш@~ Ѕ€Ш@~ І€Ш@~ Ї€Ш@~ Ј€Ш@~ Љ€Ш@~ Њ€Ш@~ Ћ€Ш@зЬм&>Ж@х я7 њ0ЭЩ@ 6- /  dќЉёвMbP?_*+‚€%џСƒ„Ё"џр?р?U} Ж ’@’@’@’@’@§ § e § f § g § t§ h § i § j § k § u§ l § m § n § o § v§  § e § f § g § t§ p§ q § r § s § wзТPFFFF>Ж@я7 њ0ЭЩ@ Ы37  dќЉёвMbP?_*+‚€%џСƒ„MЂxeroxмФSџ š 4dXXA4PRIVт0''''ФP4(ˆ/Оhž џЁ" dXXр?р?U} Ж} л} I} m} Ж} ’ } m$бббрТТ§ § }§ ƒ§ ‰§ § •§ ›§ § }§ ƒ§ ‰§ § •§ ›§ x§ ~§ „§ Ч § –§ œ§ y§ § …§ ‹§ ‘§ —§ § z§ €§ †§ Œ§ ’§ ˜§ ž§ {§ § ‡§ § “§ ™§ Ÿ§ |§ ‚§ ˆ§ ާ ”§ š§  з:xbbbbbb>Ж@  я7 ўџр…ŸђљOhЋ‘+'Гй0 @HXh € Œ˜фpc09fpc09fMicrosoft Excel@(Ф$FŸЦ@*A@jŸЦўџеЭеœ.“—+,љЎ0є PXp x€ˆ ˜ Яф PROCURA B.V.lig ColoursFormat AlignmentFonts  Werkbladen ўџџџ !"#ўџџџ%&'()*+ўџџџ§џџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ РFўџџџWorkbookџџџџџџџџџџџџк7SummaryInformation(џџџџDocumentSummaryInformation8џџџџџџџџџџџџ$Spreadsheet-Read-0.91/files/empty.ods0000644000031300001440000000000013677406611016770 0ustar00merijnusersSpreadsheet-Read-0.91/files/test.sxc0000644000031300001440000001241710313232324016616 0ustar00merijnusersPKˆ\Ќ2EМ”mimetypeapplication/vnd.sun.xml.calcPKˆ\Ќ2 content.xmlНX[oк0~пЏШђА7c.эж2 ZЁе&б‹D+m&1`5‰#лсђяwbчBhƒJUкипљЮэЫБеоЭкїЌ%’ё oЗMлЂУ]ЬћіыЫ=КВoŸzŸGOУ—?ЯwŸЭ˜CЛ.w"Ÿ 9ЩbY{,xЋФынDў”ŠњHˆ"…КШхМŒмp™…ь,ˆЈЏŸFфщИ{*вqS0$ЛЈH№ ?РІ~<Œѓђ П–<dљ9‚…ѕ‘ˆЊпёˆ”}[†‚W.(ЭЗ ŸRІhcГїЙдёф ЇkЏXц= >Шk9Ь%’вЖfм€fФgоІИЗХ2х@­–D0-@\яс‘љгHZ БЦ­ї^ОЫя”Y:™гc}4šг€ ц@7VLю-.i@ВD"ХAgЬAš"ыŒ~Тwx+ѓ“„Ќ?v˜W^фvj а’PŒЪ8Х)ˆх M)H8bo)‰1C+цЦ*oЗ_ПљОŽv+‚ъpDU8‚ЏЪb1 А‰”Э ќЫFГыЃŒ$EЬ*PHц‹‘ШSe™hЫЎЫdш‘MU$ИВПЩЦ”Л›AЯpщgТkмOтЯb6kкхЉь’ў—@ЕbV=ЈD‚†”( Ѓ№"EИ&aфPЯCл,i%pб+4ЃФeЌŠш€Vры†ƒ­NўьсT•нэavИ†jTO…wrЬn_ЇлZЄgHЏsВо ЃЪ{ZowŽЄ/Žьщ‘vУУьJ;ННR3y(м]kbюgŸ?—:ж'“ъG1NЛЅ1ЄЇTpЇЌќмZpИВџ|ИЭ/ "n‚Ћ:8ъ%‚ŸVлЮRyфŠZлѓѕ§щъW.,‚/3эŠЈджnЫ>(‡У›КhЯіСђв%ЁHЂьЄї<{Њ=ЩŽЄўZВМeнж- ’шјунёwЧЛ“ч ЕЖXd„Г…э<лТ,р!aёТОПћрœлЫoцп^^ПЛћљцНХЃˆxђ O0“N&Ÿ(ЮЌ›ћЗЋпYЖуКз)fз5т"vнЫЛKЫ<_›,0уКяЏlЫ6ъFЁ эхќ€n№e3ГИА7RІ3зх`…зVЦžчЙцй.6шнƒx(с?ЪAДT`Д>Ђ[#Jx(аn­Рx‰x…оэvЃнD#§щtъўtЛr?p‘ Ъ—GJиУAМ^-Ё,OжX {‚$jё’mу>х†РmхrАAb˜?Ј™„G™„%Л9pРsї#,ъ_W5}"TЎељAвaЯ Ф.sПu[ЊЌ8dlˆš-чšРZb™g†Ш™UeˆeЖqŠPBшS{­Ё#%2ЖHUюА…+’ЌѓЬК5жЪяZyRžНiЁŒш‹}ЎMƒvbЬА СТЮv$;J…л€Bd Hщxˆ#”гЂЌ”J џєuuLЉ]ТSЙ $ TюH‚Ј“Rрla[žЂ"ч(†5ЬД р9“lопv8(#ˆuCh`ЅЊХ8УхZЁЕoЉж№$ЅјБ/б*нІO{я"pœђд I&SEкї’DЧІ‡љхм”ЁЂЕТQшй{сQUЩэНэVё”ц&q C ђЕ =ж*A.ДЛЇ>'|яьfШ‘beЫ)’Du)ђ†{ЕъЇdЭiщgŒкЅАJ‰Ћ•Нќэ—_+Її”TЪU/ZZL?іѓв“ДƒŒ•ЋБрyЊ‡}Ќ‘mЮў(•ƒэ\8}M(‡VuEP‚=хРџ•иІ-gЯДa&AiuYHЄю>[Dsќђе‹XОYTyŠв”!pZy<@ГГЖKskї#з(•юсЭŸp6МЗXI‘ЈF=ЇmЗ?/t5+f;"%AU‡€1'g!0ѓРj,зїДНъщЅЕщџыžЕУ$оРDy6ŠиЖЬЧЯ:q›Ќњj4B8Фѕ…zzќтdkв€уђ-€­XДшд+NЦsЁŠ~Dk3ђYѕ357ˆк_уЛ8ДџЌS—ŒѕŸ:$ц’QYXp‰”аA*­іды:ЋцxИ­тъ„ўп˜ћ^Ол€ЭЬRўnуй–рн[дГ OpenOffice.org 1.1.3 (Linux)H.Merijn Brand2005-05-12T13:31:18H.Merijn Brand2005-05-12T13:36:16en-US4PT4M58SPKˆ\Ќ2 settings.xmlэ™mwЂ8ЧпяЇpyЛЧтCЇ3єДЮAДjбЖО Jкp’ ъЇп к2тXХ=;{є•!7П{ЩУ?7стћдЧ… dQrЉ”OJJ‡КˆŒ/•uUќІ|Џ§qёgуСАžЛЭ}yAкG6†:ƒРЂВЊГ@V""”ZщB§ђ)№-|‡!?"WxыаZЉZй›о†hь­\ŽійЖјЂ‚"".œB7э FыЧhбFЮW6л&`uмT”\09”Z\YўTЄ14Їd‡ќ*аMњPнBпƒPl1 qЪК”#!РSŽ“х#љ9Gr›24ЇDм0wд…щA№(лcšC&s(z*њUхЙLŒџ|нhtqFїьЈЋxs–ЎжЬ–=ЙљJјŠZЇBPџр57+ZІŒФњQўЏ Hѕ( G9 ШП' Yе‹мeл_d5iSЂ;{/ ‡QŒmР2гдЪз{vDЉoINЎK:†гдeFНуcgЁсg;Тћbu™­ПuŒO?)ОM)†€(Е€9мнЭ2КˆŸg9,мƒOХЁа-†вчƒШ1堘Вгx•+gеJхЫжЇЄ уz€^i.C}bвЈ +оqВа)4 wјC(0"А?ѓmŠyІїƒ\œє ,j.`z ѓXY ИУ—Їюƒy0!—у™–wт4~m‚И/Ок.š ž~N№ѕСя:uМ>EМ?#ŽЧ(AsИƒэ˜ ,Џ\жp(ЖЛOK !ёр~цbэИgќЯіŒ[Dо Ь>Kэzўџ  ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§џџџ ўџџџўџџџ ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRџџџџџџџџ РF€+%TВkХ РWorkbookџџџџџџџџ„SummaryInformation(џџџџЬDocumentSummaryInformation8џџџџџџџџџџџџ  K(ЬсАСт\p Abe Timmerman BАa=œЏМ=ьџьџЬ=€480@"Зк1ШџVerdana1ШџМVerdana1ШџVerdana1ШџМVerdana1ШџVerdana1Ш Verdana1Ш$Verdana"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)рѕџ Р рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР р Р р+ѕџ јР р)ѕџ јР р,ѕџ јР р*ѕџ јР рєџєР рєџєР р ѕџ јР “€џ“џ“џ“џ“ џ“џ“џ“€џ`… Sheet1…ŠSheet2…‡Sheet3ŒССaiќџњЃl#ПџЃly+€xчœПџŸ˜ )\m\mПџžрz“`UpПџ œПџžt0,„Пџž ”р ФшПџŸ`CМ+)ЌПџž`t0+*˜RПџž@JИ~)DПџž`+/фџЬ`` х`ChiПџŸрgo])hёШ~)DПџžАD$"+0<ПџžР”р Фшўx2№`ПџžрxшDy „uBHПџŸ-ПџŸ \@yФПџŸ0ПџŸPПџŸ]‡ш+&мПџŸP#ПџЃlПџЃlЯгт“ПџЃlz•Тџџџџy&8‘^\ПџŸ€#‘^ПџФHќ„6ПџЃlПџЃn“гтz•Тџџџџy&8‘^\ПџŸРz•Вy&8‘^\ПџŸа‘^pݘϟЃlПџЃsПџЃqxшDПџЃrПџЃpuBHюœќ„y+€xчœПџЁи Пџ  t0]&а$y€y+€$ПџЁрЯрЮ`y&@Пџ pПџЁ<ЙЄПџЃlПџЁ uBHCМy+€Пџ pt0ъ\,RCrc[Ю`},;@$ПџЃluBHПџЂTy+€ПџЁрhаPMПџ Р- ПџЃlПџЁh0$$„Пџ pt0ПџЁxшD]Zy „uBH'uBHz“`ќ†ПџЁPПџЂџџџПџЁ@y+€ ђ(‡…““ТKС•‡…““ТKС•‡…““ПџЁp‡…““ТKС•ݘќ„СПџЃlПџЁ t0 ѕЈ‡…““ПџЁр‡…““ТKС•ݘϟЁрќ„ K(Ь Ы #  dќЉёвMbP?_*+‚€%Сƒ„Ё"р?р?U HBCnй` аA †<ЦџџфФ#‡а…C @–Ћ C №‰ š Šš0‡  D„C”›Eа˜<@ ЄЭ , ~ №?~ №?~ @~ @~ @~ @~ @~ @~ @~ @~ @~ @~ @~ @~  @~  @~ "@~ "@~ $@~ $@~ &@~ &@~ (@~ (@~ *@~ *@~ ,@~ ,@~ .@~ .@~ 0@~ 0@~ 1@~ 1@~ 2@~ 3@~ 4@~ 5@~ 6@~ 7@~ 8@~ 9@з6@р>Ж@ K(Ь B  dќЉёвMbP?_*+‚€%Сƒ„Ё"р?р?U >Ж@ K(Ь ?  dќЉёвMbP?_*+‚€%Сƒ„Ё"р?р?U >Ж@ ўџџџўџџџ ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџ р…ŸђљOhЋ‘+'Гй0œ8@Xp ˆ”'Abe TimmermanxAbe TimmermanxMicrosoft Excel@€юCЁkХўџ еЭеœ.“—+,љЎ0м PXh px€ˆ  Й'ztreethж Sheet1Sheet2Sheet3  Worksheetsўџџџџџ РFMicrosoft Excel Worksheetўџџџ8FIBExcel.Sheet.8CompObjџџџџџџџџџџџџ XџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџSpreadsheet-Read-0.91/files/empty.sxc0000644000031300001440000000000010313232324016756 0ustar00merijnusersSpreadsheet-Read-0.91/files/merged.xls0000644000031300001440000003400012474071332017115 0ustar00merijnusersаЯрЁБс;ўџ ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§џџџџџџџ ўџџџўџџџўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџ Л ЬсАСт\pCalc BАaР=œЏМ=@ 8X@"Зк1&м DejaVu Sans1ШџArial1ШџArial1ШџArial ЄGENERALрЄѕџ Р рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рЄ Р р+ѕџ №Р р)ѕџ №Р р,ѕџ №Р р*ѕџ №Р р ѕџ №Р рЄР рЄ8Р “€џ“€џ“€џ“€џ“€џ“€џ`… М$Blad1ŒССTыZ№R№3 №П Р@@ё  їќ& notes monextintџ { wL0АоЮАоЮ&њaU$ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?VV:?V&HюX{!ќ?V:?V&HюX{!ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?VV:?V&HюX{!ќ?V:?V&HюX{!ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?VV:?V&HюX{!ќ?V:?V&HюX{!ќ?~‰•)Я&њaU$ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џџЋЙ5џ&HюX{!ќ?5џЋЙ5џ&HюX{!ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џџЋЙ5џЙ5џЋЙ5џ№?5џЋЙ5џЙ5џЋЙ5џ№?5џЋЙ5џЙ5џЋЙ5џ№?5џЋЙ5џЙ5џЋЙ5џ№?5џЋЙ5џЙ5џЋЙ5џ№?5џЋЙ5џЙ5џЋЙ5џ№?5џЋЙ5џџЋЙ5џ&HюX{!ќ?5џЋЙ5џ&HюX{!ќ?5џЋЙ5џ&њaU$ќ?&њaU$ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оунннууннну&HюX{!ќ?оуннну&HюX{!ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оунннууннну&HюX{!ќ?оуннну&HюX{!ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оунннууннну&HюX{!ќ?оуннну&HюX{!ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?јџјјјџ&њaU$ќ?јџјјјџ{ wL0АоЮАоЮ&њaU$ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?VV:?V&HюX{!ќ?V:?V&HюX{!ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?VV:?V&HюX{!ќ?V:?V&HюX{!ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?V&њaU$ќ?V:?VV:?V&HюX{!ќ?V:?V&HюX{!ќ?~‰•)Я&њaU$ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џџЋЙ5џ&HюX{!ќ?5џЋЙ5џ&HюX{!ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џ&њaU$ќ?5џЋЙ5џџЋЙ5џЙ5џЋЙ5џ№?5џЋЙ5џЙ5џЋЙ5џ№?5џЋЙ5џЙ5џЋЙ5џ№?5џЋЙ5џЙ5џЋЙ5џ№?5џЋЙ5џЙ5џЋЙ5џ№?5џЋЙ5џЙ5џЋЙ5џ№?5џЋЙ5џџЋЙ5џ&HюX{!ќ?5џЋЙ5џ&HюX{!ќ?5џЋЙ5џ&њaU$ќ?&њaU$ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оунннууннну&HюX{!ќ?оуннну&HюX{!ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оунннууннну&HюX{!ќ?оуннну&HюX{!ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оунннууннну&HюX{!ќ?оуннну&HюX{!ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?оуннну&њaU$ќ?јџјјјџ&њaU$ќ?јџјјјџcc Л Ь d-Cыт6?_€%;С*+‚ƒ„&ffffffц?'ffffffц?(ш?)ш?Ё" d,, Ж` Ж`р? Ж` Ж`р?U} ”;;;;§ § § О § § § § § § § § хьP№H№№0№( № №>Ж@ggџџџџ ўџџџўџџџўџџџ ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџ џџџџРFMicrosoft Excel 97-TabelleBiff8ўџр…ŸђљOhЋ‘+'Гй0  px„ЈДРЬ ф № ќ  щ§H.Merijn BrandH.Merijn Brand0@@@Еb.—Ю@…l‰VRаўџеЭеœ.“—+,љЎDеЭеœ.“—+,љЎ\щ§HШарш№ј AppVersion DocSecurityHyperlinksChangedLinksUpToDate ScaleCrop ShareDocщ§12.0000 Root EntryџџџџџџџџРFРWorkbookџџџџŽ'CompObjџџџџџџџџIOle џџџџџџџџџџџџSummaryInformation(џџџџџџџџPDocumentSummaryInformation8џџџџџџџџџџџџ dџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџSpreadsheet-Read-0.91/files/misc_ws.xls0000644000031300001440000001400011761614021017310 0ustar00merijnusersаЯрЁБс;ўџ  ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§џџџџџџџўџџџўџџџ ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџ  !"#$%ўџџџ'ўџџџўџџџ*+,ўџџџ.ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Л ЬсАСт\pCalc BАaР=œЏМ=@ 8X@"Зк1ШџArial1ШџArial1ШџArial1ШџArial ЄGENERALрЄѕџ Р рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рЄ Р р+ѕџ №Р р)ѕџ №Р р,ѕџ №Р р*ѕџ №Р р ѕџ №Р “€џ“€џ“€џ“€џ“€џ“€џ`… Ёmisc… E … ЧfooŒ11ССTыj№b№( 3 №П Р@@ё  їќ 1 џ n cc Л Ь dќЉёвMbP?_€%С*+‚ƒ„&яюююююч?'яюююююч?(в'}в'}я?)в'}в'}я?Ё" d,, Ж` Ж`р? Ж` Ж`р?U§ ьP№H№№0№( № №>Ж@ggџџџџ Л Ь dќЉёвMbP?_€%С*+‚ƒ„&яюююююч?'яюююююч?(в'}в'}я?)в'}в'}я?Ё" d,, Ж` Ж`р? Ж` Ж`р?UьP№H №№0№( № №>Ж@ggџџџџ Л Ь dќЉёвMbP?_€%С*+‚ƒ„&яюююююч?'яюююююч?(в'}в'}я?)в'}в'}я?Ё" d,, Ж` Ж`р? Ж` Ж`р?U~ ьP№H0№ №0№( № № >Ж@ggџџџџ ўџ џџџџРFMicrosoft Excel 97-TabelleBiff8ўџр…ŸђљOhЋ‘+'Гй0ФHPp ˆ ”   Ќ Ищ§Microsoft CorporationMax Maischein1@а@@€&\ЄiмЛ@ЌТы—>ЭўџеЭеœ.“—+,љЎDеЭеœ.“—+,љЎ\щ§щ§Root EntryџџџџџџџџРFР Workbookџџџџk CompObjџџџџџџџџ&IOle џџџџџџџџџџџџ(SummaryInformation(џџџџџџџџ)єDocumentSummaryInformation8џџџџџџџџџџџџ-tџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџSpreadsheet-Read-0.91/files/empty.sc0000644000031300001440000000000010313232324016566 0ustar00merijnusersSpreadsheet-Read-0.91/files/test.txt0000644000031300001440000000010211275744145016645 0ustar00merijnusersA1,B1,,D1 A2,B2,, A3,,C3,D3 A4,B4,C4, ,,,,,,,,,,,,,,,,,,LASTFIELD Spreadsheet-Read-0.91/files/test_x.txt0000644000031300001440000000005011275744471017200 0ustar00merijnusersA1=B1==D1 A2=_B2_== A3==C3=D3 A4=B4=C4= Spreadsheet-Read-0.91/files/macosx.csv0000644000031300001440000000164311123134730017130 0ustar00merijnusers"'\'\\'\\\'""\""\\""\\\""",,,,,,,,,,,,,, Exported 12/16/2008 10:30 AM,,,,,,Category,Category name,,,,,Category name 2,, Username,Last Name,First Name M.,Section/Group,Status,Notes,Assignment,Category name 1,Category name 2,Category name 3,woot!,dqwdqwd,Category name 2 1,Total Score,Class Grade ,,,,,,Grading scale,Points,Points,Points,Points,Points,Points,, ,,,,,,Points possible,11,11,11,11,11,11,, dcwalker,,,,Dropped,,,1,34,1,,,,109, jdr99,,,devs,Active,"qwd qwd qwd",,12,0,1,,,,39, jlaney,,,devs,Active,,,,2,23,,,,114, mcrawfor,,,devs,Active,"line 1 line 2 line 3 XX fwe and so on yea!",,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,Mean,6.5,12.0,8.33,#DIV/0!,#DIV/0!,#DIV/0!,87.33, ,,,,,,Median,6.5,2.0,1.0,#NUM!,#NUM!,#NUM!,109.0, ,,,,,,Mode,#N/A,#N/A,1.0,#N/A,#N/A,#N/A,#N/A, ,,,,,,Min,1.0,0.0,1.0,0.0,0.0,0.0,39.0, ,,,,,,Max,12.0,34.0,23.0,0.0,0.0,0.0,114.0, ,,,,,,Std. Dev.,7.78,19.08,12.7,#DIV/0!,#DIV/0!,#DIV/0!,41.93,Spreadsheet-Read-0.91/files/gnumeric.xml0000644000031300001440000014214214362015733017465 0ustar00merijnusers WorkbookView::show_horizontal_scrollbar TRUE WorkbookView::show_vertical_scrollbar TRUE WorkbookView::show_notebook_tabs TRUE WorkbookView::do_auto_completion TRUE WorkbookView::is_protected FALSE 2022-12-31T04:57:17Z 2009-04-22T19:24:48Z 2022-09-01T22:03:41Z 3 2009-04-24T04:26:35Z -535 Sheet1 Sheet2 Sheet3 Sheet1 255 53 1 Excel_BuiltIn_Print_Area na() A1 Excel_BuiltIn_Sheet_Title "Sheet1" A1 Print_Area #REF! A1 Sheet_Title "Sheet1" A1 d_then_r portrait na_letter Bank Statement Number Date Description of Transaction Payment Code Fee Deposit Balance Reconciled ** 2022 ** Balance forward 0 0 44816 initial deposit 1 5000 =H7+G9-F9-D9 =I7+E9*(G9-F9-D9) 44816 consulting 1 271.60000000000002 =H9+G10-F10-D10 =I9+E10*(G10-F10-D10) 44823 check printing charge 36 1 Sep =K12-K13-H11 44826 consulting 1 439.60000000000002 bal 5235.6000000000004 44826 another charge 1 6.1200000000000001 outst =D4 44826 ATM 100 1 44838 consulting 1 942.89999999999998 44838 ATM 100 1 44843 ATM 100 1 501 44844 Credit Card One 1238 1 44848 ATM 100 1 Oct 502 44854 Plumbing 925 1 bal 4986.2200000000003 44860 ATM 100 1 outst 503 44862 Utility 152 1 504 44862 Credit Card Two 10 1 44869 consulting 1 117.59999999999999 44869 ATM 100 1 44875 ATM 100 1 505 44877 National Grid (final) 17.600000000000001 506 44877 Credit Card One 1385 1 44882 consulting 1 264.60000000000002 44882 monthly maintenance fee 1 14.949999999999999 Nov 507 44892 Comcast (final) 0.12 bal 2581.4699999999998 508 44892 utility 149 outst =D27 44895 ATM (no receipt) 100 44907 ATM 100 509 44911 Credit Card Two 10 510 44911 Credit Card One 1655 44912 monthly maintenance fee 14.949999999999999 44914 ATM 100 44921 consulting 390.60000000000002 44921 ATM 100 44896 44896 Sheet2 255 0 1 Excel_BuiltIn_Print_Area na() A1 Excel_BuiltIn_Sheet_Title "Sheet2" A1 Print_Area #REF! A1 Sheet_Title "Sheet2" A1 d_then_r portrait na_letter Sheet3 255 0 1 Excel_BuiltIn_Print_Area na() A1 Excel_BuiltIn_Sheet_Title "Sheet3" A1 Print_Area #REF! A1 Sheet_Title "Sheet3" A1 d_then_r portrait na_letter Spreadsheet-Read-0.91/files/test.xls0000644000031300001440000002000010313232324016612 0ustar00merijnusersаЯрЁБс;ўџ  ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§џџџџџџџўџџџ ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџ  !"#$%&'()*+,-./0123456789:;<=>?ўџџџAўџџџўџџџDEFGHўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Л ЬсАСт\pH.Merijn Brand BАa=œЏМ@=рZЯ?N*8X"Зк1ШџArial1ШџArial1ШџArial1ШџArial1ШџArial#,##0\ "$";\-#,##0\ "$"!#,##0\ "$";[Red]\-#,##0\ "$""#,##0.00\ "$";\-#,##0.00\ "$"'"#,##0.00\ "$";[Red]\-#,##0.00\ "$";*6_-* #,##0\ "$"_-;\-* #,##0\ "$"_-;_-* "-"\ "$"_-;_-@_-8)3_-* #,##0\ _$_-;\-* #,##0\ _$_-;_-* "-"\ _$_-;_-@_-C,>_-* #,##0.00\ "$"_-;\-* #,##0.00\ "$"_-;_-* "-"??\ "$"_-;_-@_-@+;_-* #,##0.00\ _$_-;\-* #,##0.00\ _$_-;_-* "-"??\ _$_-;_-@_- ЄGENERALрЄѕџ Р рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рЄ Р р+ѕџ јР р)ѕџ јР р,ѕџ јР р*ѕџ јР р ѕџ јР рЄ Р “€џ“€џ“€џ“€џ“€џ“€џ’т8џџџџџџџџџџџџ€€€€€€€€€РРР€€€™™џ™3fџџЬЬџџffџ€€fЬЬЬџ€џџџџџџ€€€€€џЬџЬџџЬџЬџџ™™Ьџџ™ЬЬ™џџЬ™3fџ3ЬЬ™ЬџЬџ™џfff™–––3f3™f333™3™3f33™333`…™Sheet1…G Second SheetŒЎыb№Z№ 3 №П Р@@ё  їќ_A1B1D1A2B2A3C3D3A4B4C4xxxxxxxxџ 0 Л Ь dќЉёвMbP?*+_‚%џ€С$!&C&"Times New Roman,Regular"&12&A)&&C&"Times New Roman,Regular"&12Page &Pƒ„&333333щ?'333333щ?(333333щ?)333333щ?Ё"d‚,,щ“>щ“>Й?щ“>щ“>Й?U} џЏ § § § § § § § § § §  §  ьP№H№№0№( № №>Ж@ Л Ь dќЉёвMbP?*+_‚%џ€С$!&C&"Times New Roman,Regular"&12&A)&&C&"Times New Roman,Regular"&12Page &Pƒ„&333333щ?'333333щ?(333333щ?)333333щ?Ё"d,,щ“>щ“>Й?щ“>щ“>Й?U} џЏ §  §  §  § § § § § хьШ№Ш №№А№( № №№xЂ № “ №6€ПXPƒPП?П №Рi&Ф№]ь №Ж<Note 1<ьx№xЂ № “ №6€ПXPƒPП?П №Рi&Ф№]ь №Ж<Note 2 Note 2 Note 2<ьx№xЂ № “ №6€ПXPƒPП?П №Рi&Ф№]ь №Ж<Note 3 Note 3<HMBHMBHMB>Ж@ ўџ џџџџРFMicrosoft Excel 97-TabelleBiff8ўџр…ŸђљOhЋ‘+'Гй0  p x „  œ ЈДЬф№ќщ§4@1ŸБ@0:щ@xЏЮцVХ@GцVХH.Merijn BrandH.Merijn BrandRoot EntryџџџџџџџџРF0PdјъХХ@WorkbookџџџџЧCompObjџџџџџџџџ@IOle џџџџџџџџџџџџB_SX_DB_CURџџџџџџџџўџџџSummaryInformation(џџџџџџџџџџџџCPџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџSpreadsheet-Read-0.91/files/misc.xls0000644000031300001440000003300010614376235016610 0ustar00merijnusersаЯрЁБс>ўџ ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ 1ЭЩ@сАСт\ppc09 BАaР=œЏМ=x‡Ь$”8X@"Зк1ШџArial1ШџArial1ШџArial1ШџArial7"Ќ "\ #,##0_-;"Ќ "\ #,##0\-A"Ќ "\ #,##0_-;[Red]"Ќ "\ #,##0\-C"Ќ "\ #,##0.00_-;"Ќ "\ #,##0.00\-M$"Ќ "\ #,##0.00_-;[Red]"Ќ "\ #,##0.00\-q*6_-"Ќ "\ * #,##0_-;_-"Ќ "\ * #,##0\-;_-"Ќ "\ * "-"_-;_-@_-,)'_-* #,##0_-;_-* #,##0\-;_-* "-"_-;_-@_-,>_-"Ќ "\ * #,##0.00_-;_-"Ќ "\ * #,##0.00\-;_-"Ќ "\ * "-"??_-;_-@_-4+/_-* #,##0.00_-;_-* #,##0.00\-;_-* "-"??_-;_-@_-Є"$"#,##0_);\("$"#,##0\)!Ѕ"$"#,##0_);[Red]\("$"#,##0\)"І"$"#,##0.00_);\("$"#,##0.00\)'Ї""$"#,##0.00_);[Red]\("$"#,##0.00\)7Ј2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).Љ)_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?Њ:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6Ћ1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)Ќ"F"\ #,##0_-;"F"\ #,##0\-#­"F"\ #,##0_-;[Red]"F"\ #,##0\-$Ў"F"\ #,##0.00_-;"F"\ #,##0.00\-)Џ$"F"\ #,##0.00_-;[Red]"F"\ #,##0.00\-;А6_-"F"\ * #,##0_-;_-"F"\ * #,##0\-;_-"F"\ * "-"_-;_-@_-CБ>_-"F"\ * #,##0.00_-;_-"F"\ * #,##0.00\-;_-"F"\ * "-"??_-;_-@_-рѕџ Р рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР р Р р+ѕџ јР р)ѕџ јР р ѕџ јР рБѕџ јР рАѕџ јР “€џ“€џ“€џ“€џ“€џ“€џ`… * misc… a  … h fooŒСС€8ќџ 1ЭЩ@ ц  dќЉёвMbP?_*+‚€%џСƒ„Ё"џр?р?Uџ~ №?з">Ж@я7 1ЭЩ@   dќЉёвMbP?_*+‚€%џСƒ„Ё"џр?р?U>Ж@я7 1ЭЩ@ $ ^  dќЉёвMbP?_*+‚€%џСƒ„Ё"џр?р?Uџ~ @з">Ж@я7 ўџр…ŸђљOhЋ‘+'Гй0А@Hhx  œЈфMicrosoft Corporationpc09Microsoft Excel@€&\ЄiмЛ@дЮбˆЧўџеЭеœ.“—+,љЎ0а PXd lt|„ Œ Ћф№" misc foo  Werkbladenўџџџ ўџџџўџџџ§џџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ РFўџџџWorkbookџџџџџџџџџџџџSummaryInformation(џџџџDocumentSummaryInformation8џџџџџџџџџџџџSpreadsheet-Read-0.91/files/Dates.gnumeric0000644000031300001440000000474314370414470017731 0ustar00merijnusers‹э\msт8ў>ПТчЋКOЫћK—АE’p$NцfjЊ(Х mq’H`§Е$л€1IœdwH˜ЬTЪjЕК[§ДZ­`qєћмsЬ8ЁўБYШцMћ6uˆ?>6oЌѓLЭќНёхhь{ѕЏ”нпQzoРŸзtlN„˜жsЙЧЧЧьиŸy˜;Kй8їPШgс˜яœ“5оЧ’т*цѓ…мЛ=СЪŸ флFqRчŠиЁ6ЪЖ­ЊГsю˜/†ЁЬМе“1ZSjO`JІбEPOEx$О|ЌР4ЯgЎ+g\(fЁ™‹Ц7…`фn&0—Є8QгЊ<мнrK№cНЮ'єq8ЁŒќI}м!Зuн;ФŽrбˆUШс†еПiiнжŠs š_a  +ˆНЖјT`I tЧŠЂ™ C›zSЫањ)f>œ2p†-АѓЄчЭЮрEФH*zшhDl “ЖaХј"уa‚5ЉЛŽЭѓыqТ•М.ь:b?R_хЎЋЌi—јїIЋКpxx˜SН!ЋcG|гs—cчА‹ЅžƒE˜ yЅ…/5JђЎšD)Ivmt˜jЪ9н6`2+iЏh~ КЄф ЧЎл #AYММвZap J3љB&_Б •zс ^)|WToШ­ЌžqЬ2;†ЂШ‰›Р<нЙ„O03u‡‚=#Sшц€Ў?6з§Ћг›~г8Щоfr_ІkЬGu Я8„‰E‚:ˆW#пlŒЫё›qШ@ј/Vэ#‰Й Г‘VО‚‚"ZЫРџтЁ•?Ј—ЪѕЪсї@Ф:уš тA› Уф2л…нъп8aШw‚ёqІЭrюђy§fФnЇфБѓзyUщLУЮЕ_Џч([Wa-3E{№)rэ™Ћќ ЛЗ?CnCќ@Еођб‹лГ 2P[ќ<"p ф/"X`#“… ЯBЩ{П ‡>rШќи,Э32&ЦVJ+ХР`‚Бш/кОƒч+‰>ъ0”Нд•ZЋЅZйT„>}Tf”k•ƒЊй8ƒБ0:GGc—i{Sвr)ј…-ŒЏФPЬдЊ5гИФd<ЧfЉV‹[Ъуg„O]Д8ЇЬ‡rхРKтря˜бЈqСˆ5`.—9˜E˜Ь %x5ƒ˜+їСТЛOœ`—>&аћкn пNюˆ kѕиМшu‡ƒЫVЫоЖэ“vЇm}г–iHгР"YДхы№Я\л"•зл‹oЃ  QжнA+Ц3lT#йZeјNЉз(шnѕ7‡”UГ"вjp щ[ ›Ац77§иЦџЯ~ыќџ л”r"УЛб l‹Kk6\ђЌ…*l†.~жФ§oFХПCџыжЛ[МЄ№5Ч+WЖ§D6ŠЩа8В1(6ltj\S ‘{kџšсб фтcгѓєrZcПЃBP/ЭDФ_)?ЫЯфЊH3`Ђжb4ЂT}vФˆBЅљВс"ˆ9OgЙ…:ёУdCкFcиг—Я:ѓцbуd/шWA!sHœaђУВРі^ќ€§! Љя.†\,\ЬЗ3{д‡s!ƒМКЧa0мк-фтxB1рœѕ=И{;—ъ2Йƒ‡L2^їл=+HˆƒVЇujЕЏzƒ)ƒh8C1Љч9M‹ѓ‰ŒZSЪCD„мЫžѕ1:зˆуcS™ЧХђ)ШпЦœы№zљ€)‚iGБ -kЪ:œадёР€эЦV'…U^uЛ­ž5Ж{УыNѓДЕŒQЦ •'ZъЙЩW%Дњ§Ћў`и Якё­uЖ”ЁЭк–cєrP‘_#’иЧcYЙp˜€нFm›Њб—ћЂњ‹всQQKцЦВUВŒЫІKЦО6ќВйi_є†­^ЋпьР>КвwЋћNЎ,ыЊk_šZx.”’С&roбsЂл}*‚кIuоъIОцшPћ;jГ†ШŠ e7bуйpў;‡Ÿzє   ўкž-Чсt“ё нЌN4 !X*:@х uuAвШ%КьЛуdйЋMРAш[Аgу‰ІиŒL•ё†S№“Bб8Б4”RУš‡s‘‹уйoУєш–—шЪzАДDИМ_`jmїsc\Yb\\т[y'|O!­Ењпк‡†Зš˜ Ћ)р !ќhшz^Цq2‹Хч^О[SД>АПзBў•Јв…-ЅVa‰r>ОжЙ•юnVћќлŽЂЛ€ЯsœЯ o!оТ{Рk]]џ‚і'B[L„ЖјаюєМш–бMsоŠюNoКћn5н}ЈŸЧљёл~žч§0$оŸыт– ЋјК ы ЌwЛЦњД‡Ѕт–ЋјКы €wЗЪкp‹‰рІЉВ>jІо|K‰јІЉГžРwЇ+­§РЗšˆя>TZ^ЮЩ}BtK[jЋвыjЋ~ћтђ#ўљ jчбЙOY?—Ж”WЅз•Wл1охъj_№-&т›ІТкŽяn'шНИ”qš"k;Ф;^cэ Ф•­ŸІЉЕ~}VИc—ЗT[хw?+§MЉК–Џ§=>Т•mŸЏЏтНxљюЏт•Žѕ—РхХ у аЬђ'О–я7—kf,8€MОХiєh05г|- 1p‰˜#‡*wŸв™Ф TъYS,/xl(.TтЁmSq)ŸЌѕ ЎU*YхЛиVw\Œгу”…Gнки‘жЅ§+BЬšЅђuАыЦп‚•4#\sс 8Зђ%gKН=^†()VЋЕРЛРўЌ„Т›%п,Ёєf х5 UЏЭйиWЭ^ Ї№”?Š)$$њ3•„DІ’шЯT6§ I'…?‹Oјѓр0ŸBB’?гIHђg: IўL'!1>ЯА§R–žŒЯR Щё™FBr|І‘Ÿi$$Фg)M|–§)хШoF€ …УfKќ17 П‹ сЦѕщ ФVЖŠL(uУq2нnFžьRH+$щЅ0ч7јetЛ]#ЅШт†Ш`г5єЅ #?ЯЗ^ ЏњцИЌО9.ЋiуrIYпr˘БЃKЄјжЋњЭJ§ЄмхR„5‰‰уu­ oџuа‚Ю„aбЉОвг,Ќ”Š‹К˜]ъ`WO"/o”б;{QЛ‹цё4hс§\u? š=ъї№XљђŒp[_,mЮUWЬBqc†МО..Б// >БP„Рœ•ЛГ’Авдп~ ›7э3$Ё‹ьXш. ЙУoeh|љ?r}Ёљ ESpreadsheet-Read-0.91/files/clear.ods0000644000031300001440000001315510327656236016736 0ustar00merijnusersPKНTZ3…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKНTZ3Configurations2/PKНTZ3 Pictures/PKНTZ3 content.xmlЅVMs›0НїW0z“лi›Pл™щtzJNi;НЪb1šшƒ‘„qў}%„БpŒУД2^НЗћіiYВz8žьAІф:Яnв$U9“Лuњычt—>l>ЌTQ0 YЎh-@ZD•ДюoтивdсtжZfŠf2I˜ЬвLU Ќ,Fgm­1і•OІЗр˜mс`Ї’=vР%лщ•[pЬЮ5iІ’=ж™г 5•|0ЪЙ.*bй™Šgђe–жVЦMгЬšхLщžпппуіДL{\UkоЂrЁƒ/f№|6ЧGЌKІъѓиX’ЌХєdkˆ%onеьw“'bПБ†–DOž<Моe>§z—yЬФ–#wr‡Ÿмaћxz<Э‚SkyьР*ЊY5ЙЭ€ŽљJЉ^Њ'„Д•ЛИЙЙХсw„nЎТЭ,шNЏТ)сДw\‰KІ9м;‚Нг~№Нf„АРсИ›|4ѕŸЇЧgZ‚ '0{Œ˜4–HяLЗв{ts\šСpƒћ@с–'*”хfГ У№л_т:§ЦЌБˆH~ƒ&Щ3‘fž&nфxСјы:§H*eО^‡ƒ4‰jTЬR7œ{Ђ™пh)ОЎр')•ЗцMЭўрŸS_аћŸНкЭм𙆃žDƒ^rЭDУJc№“Н0ўtЕ Ї…пa9/ыЕЏмƒОн™№›RбЬчD!JRЇЯ€k–a&vЩ)Щ& ’щЁеŠO šd3FЭџ~ыУ“bCфBжЉ5O0kЩY;}bѕ:ї\\~СH‰њk3гф …˜‚’зBЗЋœ<:хWi2с*0 /GTт'к P~RКѕS„ynВ§ЕYB>ыVy])*sО.˜ ЃёQъТБ„RСвW?€zЅнП†N†gУKѓЈ“f’§ЉІвн”Ђ#ЏUяLUћ#˜ЁOzЊџƒ’g FE N!йСсN}АЗ–sб;‹—.ŽЛ&ЏVW1L7f‰v(Юa=ъ/ ‹>[}рJщ™}НКВR8эPуЩ?я$ЬrCћо„ƒ<Иѕџ'pzу‹LgV77eщ™Bю]DцcЪь[Ёhп8!”~вН”eЎv_Є‘ўiЙщ  Sx#ƒs~ѓIєmВѕtB‡“5Њй(‘lUШгHdЕІЙЁЅ{†ЅЭzŸм™їoUѓWю0Жрфўўў.<_lVЊ3ЮТЎcшz4‘0]ЮRгZЋв OpenOffice.org/2.0$Linux OpenOffice.org_project/680m3$Build-8968H.Merijn Brand2005-10-26T12:37:22H.Merijn Brand2005-10-26T12:37:57en-US2PT35SPKНTZ3Thumbnails/thumbnail.pngы №sчх’тb``рѕєp вх@М€ƒ Hš1}–e``lїtq Љ˜ѓіЂ#'ƒЯЖЏю-Oт94ЗЩ!­œпїГuCљ^cѓ3w Š2hХxУфуЬZwєжšћР˜a№tѕsYч”аPK-šіќjРPKНTZ3 settings.xmlэ™[SтJ€пЯЏАђzJЙъ1”ВВ x[•ЗIв’бЩLjfB€_П"[š%.†№pЖфШ\Оюєєtї$gпц>9˜˜бs­rTж€:ЬХtzЎ†—‡ЇкЗц?gьщ ;аp™њ@хЁ)еq ІSбHКЯЕгC‹E>ˆ†t,Кžжx;КБ–ДЬ І/чš'eа(•Ђ(:ŠjGŒOK]зKЋоѕP‡б'<нVT2њ­(Ци/Aё„D™•АjЙ\/%зкСЋ’яLг\лa}ћЭГWЩЯ!–рЧЖ9xmŽU;з”ШЦ CєЫjкІyячŒБР6ƒВ@[wЪE :1•ZГ|Vњђ)№ <Щ§яБ+НMшjѕјtgz№длЈy§ИВ-§аGС!І.ЬСMK‚hѓ­ц(чт‹mє…ЈыІ”’Ћѕзšqчч4Ё)=‡HйуOŠОŸ2№de ї3C.я1Ѕђў‡Нф=љБ@r‡qМdT"2–ЗЬ…Дљ=Цw№oр;ћЂЇД_ЈШ§љVџ=№ GтЌшЂг ѓTѓСзњГжX++ЂьШ-6vЏЉ-&%ѓ?оај6–euЏ‚ЮЖ П Gё.‰;;o ‡3BlФГгЫ9-;aЬ*NЁ[:†Ž гд•Њ•r^'@SˆѓЧ‡є“œ№ЧЂX@KЅй—‡ИlIёmЦ Њ5Ÿ_Ь8[щ/ВHюРПcr_ш6ЧщЬ^9ІšŒ0žBoЁJѕЄІЊЇ“жuVщ ЁT}jБЈШUUѓ^„Ќ‰Š4{ wХPЊ“ ОЭˆ@:!"d@Q0dв ]ФЮJР]ёZ.яM‚B­wfqXЩ‰гјтЎјAhЛx†EІњС7+ŸзuМ1ЧbА ŽЧХKШˆrVЏ‡ЅЭдбvћУpвr/№gNХ_yу/Ы7˜ОŒIШ>PеОRвWJњJIuJњ“$#”ЬDФ ‰ Ху{ъ˜ЊюуN]dœ`ч*ыЬw‚ЋЭІиHРIН…)т ­iEK58О^7ўŸ~eм-ƒњфсjН7Œ[уЙŸ\”JЇ-У№ъя…ЋООŽ­іeљq`ЬMкZ ћуђфЁЋC{МАkгkЛvLTлуƒиеК>jы ЗsхЁ‡ўѕcUа§xй^\;е;ЯnєлЁ™~Хs|7А}ЫCtМtлbгО~kFбЭwCмСГ]Яп"NЧbНaЗЌd/эіИ:ЙєЗ§ЎOž'Уrd’VпКИ›йд"paynћт:Ї;YŒ№яHЂтнйєGŽђ9“љяћТŸntХ5pjŒh/ЄŽ б†ч‰…<,@3'Џa~P“0Б’!—œљC№ƒЂЬB BT9‡ƒ+f›ˆ:@іPR1фZЊоa”,rмCfq_њэнW)ы­`ѓ'PKЊщЩpMWPKНTZ3META-INF/manifest.xml­“ЭnТ0„я<…ы{ьЖЇЪ" ЈTЉ-ТЁG7йKŽyзоО)@E.”мќ3њfgЄOwЕe[№h—ђ'ёШИМ)ŒЋRОЮо’>ŒЦѓх,ћ^-X­)IuЖZП~МЯOЄ\Жр–eirЏЄœgsійщ"[ЪХgМ{<ТЏ™q(‡ЇkЪƒwЊбhP9]*ЪUНŠ&58Rѕъc2bgpi,$Qшї 0:Ё} )зmkMЎ)– ЗЎG/qi!Аѕ  м?CЪ`mвjкЄ\ry—''bŒШWš*јуgПльR‚ЯЗšїCW&ЇрoЅьHЦйћЉ1 <†ф"э-рриHџкЫ6ЁўqкX”дEыЊЁсУ DqџOеŽхе†N~PKƒаƒИ99PKНTZ3…l9Š..mimetypePKНTZ3TConfigurations2/PKНTZ3 ‚Pictures/PKНTZ3ћтЂЪјЈ Љcontent.xmlPKНTZ3Іu_йb  кstyles.xmlPKНTZ3“ћѕѕt meta.xmlPKНTZ3-šіќjР Thumbnails/thumbnail.pngPKНTZ3ЊщЩpMW ?settings.xmlPKНTZ3ƒаƒИ99ЦMETA-INF/manifest.xmlPK BSpreadsheet-Read-0.91/files/Dates.xlsx0000644000031300001440000002311511130422501017071 0ustar00merijnusersPK!ШЃЭ4vн[Content_Types].xml Ђй( ЌTЩnТ0НWъ?DОVФаCUU]Ž-єLпT bˆ 4–Tй4DУŒqDl …œŒ?иt4’™ŠєЎ*f;+‰@{ЅьЁ—ˆьЎFљŸio{SњmAЬgт`ё2k? LyВй–&`Cwvн™|љИ^zПОv*uвJwа}Ў\ЁYє%ЎЗЈ­ACB$ЧЬЮqskяMmQ6Їў-<­ЦП+жЅŠ чФ_ЮъъѕќнЅуИ‹мGИ|‡Южгg6 ›ифџџPK!ЕU0#ѕL Ю_rels/.rels ЂЪ( Œ’ЯNУ0 ЦяHМCфћъnHЁЅЛLHЛ!TР$юЕЃ$@їі„‚JcлбічЯ?[оюцiTb/NУК(AБ3b{зjx­ŸV b"giЧŽaWноl_xЄ”›bзћЈВ‹‹К”ќ#b4O ёьrЅ‘0QЪahб“Јeм”х=†ПP-<еСj{Њ>њ<љВЗ4Mox/ц}b—NŒ@ž;ЫvхCf ЉЯлЈšBЫIƒѓœгЩћ"cž&к\OєџЖ8q"K‰аHрѓ<пŠs@ыы.ŸhЉјНЮ<тЇ„сMdјaСХT_џџPK!>”—єКxl/_rels/workbook.xml.rels Ђ( Ќ’ЯJФ0Ця‚яцnгЎ""›юE„Нj}€L›Вm2уŸОНЁЂл…eНєјfШї§2™эюkФ&ъƒWP%є&иоw оšч›Фк[= &$иезWл4чKфњH"ЛxRр˜уЃ”dŽšŠбчNвЈ9ЫдЩЈЭAw(7ey/гвъOБЗ воо‚hІ˜“џїmл| ц}DЯg"$ё4фˆFЇYС.2#Шѓё›5у9щГ”ѓY]bЈжdј щ@‘%’sч"Ьнš0фtBћЪ)Џлђ[–хпЩШ“ЋПџџPK!bњДLGxl/workbook.xmlŒQЫNУ0М#ёжоijJT5Љ„ ЂФЁДgoЋŽйiџžЋ@ЙqкЇЧ3ГЋѕЙUь ­“FЬb`Ј+#Є>№Б{yШ9ЯЕрЪh,р‚жх§нj0ієiЬ‰€v4оwЫ(rUƒ-w3гЁІImlЫ=•іЙЮ"ЎAє­Šв8^D-—ЎKћ SзВТЉњЕП‚XTм}зШЮAЙЊЅТ§Uу]їЦ[т}VРwўYHЂ€9•fР? лwOНTу4‹•?"п-Xѓ^љЩ›аЩЏtžІasДb/qpПЦ’R 3@Ц^І|AХњ)|C8ygSяхБёфY$Ђьр§"гAк†{м‘:дшэ–ј'РьRRbЗ" гУŠЋŠдŒ!,Ійcš…щ х7џџPK!їв%сѕ xl/sharedStrings.xmltСjУ0 †яƒНƒ№y­нF(ŽKiЗSƒm`b51$r)Ѓ}ћЙ”1(­щзЇЩЎ}?8rLTЊХм(@ЊSˆд”ъыѓmV(`ё|—KuBVkїј`™2K\ЊVdXiЭu‹НчyВrHcя%—cЃyбnЅяєв˜нћH ъ4‘”*›LП'мўеЮrtVœ)`35‘ТjqVŸлiБМ+ej‡ѕmъљ.ЕOЕяEђљ ‰@кШ№ОНЖўhг(+aVUГSŽы}ЂцЌ‡Їœ Њ*И5ЕУƒŸ:ЫЋРЭыџ"?ь~џџPK!;m2KСB#xl/worksheets/_rels/sheet1.xml.rels„СŠТ0EїўCx{“ж… CS7"ИUчbњкл—ї§{ГeРххpЯх6›ћ<Љf‘,дК…фchА№{к-ПAБ8ъм -<aг.ОšNNJ‰ЧX Б…Q$§У~ФйБŽ Љ>цйI‰y0Щљ‹аЌЊjmђ_Д/NЕя,ф}Wƒ:=RYўьŽ}ЂH9ШEэђ€bAыwіžk}ІmЬЫѓі џџPK!iРRŠVxl/theme/theme1.xmlьYMoEО#ёF{oc'vGuЊиБ[HгFБ[дуx=оfvg53NъjHHˆ‚И qу€€J­ФЅќš@Љwfvз;ё˜&%ѕ!ёЮ>яїЧМ3ОzэAТа’ђДд/зDвiЕƒ;УўЅI…г1f<%э`FdpmынwЎтM“„  Oх&nБRйцЪŠ aЫЫ<#)М›p‘`"Z | |ЖВZЋ­Џ$˜ІJqloO&4$—4KlЬ{ $ЄJъ…‰fMrŠ]œ*Ю…ы"gВЫ:ТЌ€ 1?’*@ K/кAЭ|‚•­Ћ+x3'bj m…Ўo>9]N0>\52E4*…жћж•’П0Еˆыѕzн^Нфg8 СTЋK•gЃПQя<+ ћu‘wЗжЌ5\|…џк‚Ю­NЇгlхКXІdП6№ЕѕЦіЊƒ7 ‹o.рэnwнСХЏ/рћWZы o@1ЃщсZДпЯЙ— g7М№ €oдrјйPІ—1сЉZšl ОЯEЩАЂ)RГŒLpyмХЩHPЌ%рM‚+oьR(–Д0$CA3еоЯ0дФœпЋчпОzўНzўффсГ“‡?œўЬ—UќЯп}єгŸњPBs^|ўф—gO^|ёёЏп<іРЗUсCš‰n‘ctРАЭ8ЦеœŒФљ(†1ІŽЗ‡uOХ№ж 3ЎC\чна=|РыгћŽЎƒXLѕHоИЧ9ыpсuРЎ–Uё№pšF~сbZХ`|ф“нХЉко4ƒОY$ЅућnL5їtU‘”(ЄпёCB<жнЃдёы —|Ђа=Š:˜z]2Є#'‘цD7hq™љl†P;ОйЛ‹:œљЌо!G. 3ђCТ7^ЧS…Ы!NXес7БŠ}Jf"ЌтzRAЄ#Т8ъ‰”>šль­}CУђ†}Э)=єёМ‰9Џ"wјa7ЦIцУhWБяЩCHQŒіЙђСїИ[!њт€гЅсОK‰юз7‚;4rTš'ˆ~3:–аЉў›аєЯš1ЃаmМmЦэ`Ж&_Iм8е‚—сў…wOг}ЙОИёМэЛoћn№ŸяЛЫjљЌнvо`ЁїъсСЦfLN–OЩЪи@ЭЙ)Э ,aЗїaQš3")MY _ѓююр" \}@U<ˆqCv=аL"™ГŽ$ЪИ„гYіђжxд•=6ѕЉС6‰елх5Н\J6fЯ‰ЬДДІœUик•œ)˜§&ТъZЉ3KЋеLЏsЄ•&CMƒХв›0† ^РЫыpJзЂсp‚kПлИ‹‰ТE†HЦxLђiЛcT7A*rХм@юxbЄOzЏёZEZKГ§ вЮЄЊИЦqEєўJ”Š žGIюЉrdiЕ8YŠŽлAЋЙк PˆГv0s-|M2ˆКд“f\…ЪоЗ8EZІ“ œ-fSхѓhЖ Ум"ЈУ]…ѕћ‚СŽˆLHЕƒel%˜Wy АTKВњЏ6С­e€Эє7аbm’сгќш†–L&$Tе`WVДяьcоJљT1ˆЧЧhФІтCјuЊ‚=c*сzТt§—iклц•лœѓЂЋ^aœ]Ч,‹qоnu‰•lсІŽKЬSE=АЭЋЛ1юќІ˜’П SЊiќ?3Eя'p_А6жс2W`ЄыЕpЁb](‹iи09˜-В.dс5$\)›џ‚щџЖц,SжpьS4B‚Т~ЄbAШ>Д%“}ЏaVЯї.Ы’хŒLFUд•™U{DŽъИЎїіХъІ›фmРрNчŸћœWа(вCNЕоœтm–ž^S4я ž|l1ƒ<З›І№ЉЂgWЕє†Ми{Ow§љ˜е(Њ„UЖ‚V^іoЈТ9ЗZлБ,^mЪA-†Хr Ържщ?АџQ2bвXoЈC~НСЏ šЄ dѕ%;x н эт'ЛhуЌYYзцЃ“vчпяRю)gkЭЮяs:ЛЮ\qN-^ЄГs;ОЖkK] ‘=]ЂА4)N2&0ц‡­ъoO|tНwќSІЄI&јaI`=І ј­DCКѕџџPK!zмХќ7 xl/styles.xmlЬWKг0О#ё,Ÿ4н7JВЄ"Є­ДEтА7vZ#?‚уЌк§ѕŒэ6–І]„кэ!ЕЯ7п<<'зK)а3з*ХёЛFLхšr5Oёїщфэ%F•%ŠЁKёŠUј:{§*ЉьJАЛc„ЊRМАЖ|EUО`’TяtЩ|)Д‘ФТдЬЃЊ4ŒаЪ IGЃѓHЎp–ЈZNЄ­PЎkeS|кМBсЫ ф.ЦИOš:.№“’RmzЋOњЋЅМ(Нœд‰гО…хoю<‘i4 yж—”=NKДЖ,K ­њКYR=Ђ"РКи“"’…љ Гж|жvбЧЉ‡ с9ьОhЎ…6ˆ+Ъ–Ьyыr^A$Ћ эф‰‚ ј‚йmо6:‘wј б$ШФНШ’’XЫŒšР­ЧгU йЁ _ƒU~нŽеsCVёјЌ#y…Y2г†ТўиЄf šУЋ,ЌАУч їou Я™ЖVKPNцZУh#БTY’3!юмњQєА—E'‰a7:ы]іЛ!ВМ0qј]Д€н…НЮЯЧEЫЂQа“ŽЯїЁеˆ#R–bѕ­–3f&О@v:GїAУюоeьд ыƒрs%™Ћ$.\d3E mј#8дm8<ьJŸхЙ›Cє|є—Х‹`цЂњ”ŠЏP‡ѓQ>df›[|=ПЭЖp9Ž_іЫžЃИi?jў@=\џмrƒщuєВЛ8vT‡й9А?ыЪђ"4@/ЅˆuvФ0НЃ‡v^Ї%ˆЗЖэ)љЋж–нV№Ѕ; Уљ8#АэuZЎг­уФЁьt™јїОЅ%щ„=IЕіјт…—a8\х§ч№Й2їЌ№mКQш?;MnЏХmšUЄрК“т;П$†т6%f5–ЋІm;\€ЅЫЖgЙŽР’\F]7н(‚ЄЌ ЕАгцcŠлёWFy-ЏšUЗќA[‘тv|уZ{шwUэ7ћ џџPK!sйг 2xl/worksheets/sheet1.xml”U]oк0}ŸДџ`љ}$H "Љк@Е>Lšжm}v‡XMьЬ6ДнЏпЕ E/ћпs?ю]^ПЖ кQЉ˜р)BŒ(/DЩј&ХП~о}ЙТHiТKвNSќFОЮ>ZОљЌjJ5‚\ЅИжК[*jк5х€TBЖDУPnеIJJЛЈm‚( у %Œca!џ'†Ј*Vа•(Ж-хк‘Д!ђW5ыЮ–%ЬB’V)О/ж ВЅUўЭш‹:јFš<=а†š–АcOB<т=L…QY‚‰H Эv4ЇM“т<Нљc5рЏpјНWЛГ[ё]Ђ’Vdлштх+e›ZƒьЬ,/D\јE-3‡QK^S<ƒœXЉыGс(Ž`Xl•эЃ›[eЗжъЏˆ&йRŠ; ATGЬљŒАвˆMрŒ]/ УО1tГ([юВЩ<ŽЏ–СМ=~луg yOˆЮEXѕ„Щ9ТК'L1‚\ЭqюВаg€-я-КЬ›ЁxK"еzПuИЯќЯя?ХWOЮсы^џаииЇpdlr™1CŒ%ѓaЛœ1‡_ѕ‰НУs‡ЯЯсЋ>ОyцVМ Аю ‡Ю†Э=r”KЎЃЁЮтdтїЫ9sИПKЇxю№Љ?’“ѕ+‡ЯЮсы^ўќ]BƒЗu‰1CcP\}рщ‰7O1…х№кЧ—I:HA8/5;‘њ€Sђ(‰ЇЅgŠтЧаSМП|яисусй `я€-ТрoxwСххЊВЋŠ-•[Н*Ф–УŽ˜Rцgћ†1[мк‚xъrWCдЌ€^ Ў]k@њ­ƒЎШE.xпEM9юШ†~#rУИB ­@&%pв•{7аЂ3ђшIhЈціГ†ўHЁ‡# WBш§ љ@ѕЖCщЈ|`AxŽ‘ :Ёm€)ю„д’0 •цџBžЄYu,Хгh>ЧI4‡З*ЌLБМ/mыpšwV ‘†mј#гuŸНiцўљnŸ§џџPK!њ" 'xl/printerSettings/printerSettings1.binьUСrуDm'[и*Ш‘#7NPN6йтЫ–уЭz-$/,U9ьФлкŒ5Њб(ФœђAЙ№/œ8rс–юЭHВЗЈ­‚*8`—4ѓК_їєtїŒЎсRXР)œсs — A ф}НG№СЏ№ѓуф‡^>‚п?–G)єрSxup€уЋƒC|?џдћ:ў ^Џжбx€УЛ&Q<љіЗўЎєяуЯŒ‹у/ш@§Н>:{ьцЛуa-x€cИО:„u№ШSzяиС/?}ry†ДїIѓ6vT'sЃГtы;оЛGgEБ5ё9ю‡nRoсэŽфјOgРUФљ}}LчЯCt4ФѓК€ sn%žЏЯыГќ%Žчјајњ( AЋ˜—RT:“9<эїг"ƒQ8Nђ—%‡ |[\ЮЗ‡2З‚@оq‘Ъr*™kУšГ›d-Е7 Єj*SВёѓс(D3tЁ2ЃlЁF­з\}Ї#ђMzЛ„1лlX‹ap—­eйbДRЬѓt˜-h•і>^XkœXa’m*СLЮFaМ2)8OбUfjГJGJ.3Aйh@mUHm–ЇHЌ2ЊЖИEŸ[е@мЮюŠ@+КXe 7%Й 2љЂ\ЭrБ+Ж Іп_ЁU[C/ТМЗ-!ЉnJЏыLS&+Ѕ_kЎXQdљЪ Љ4рF1}”†DГB`#9˜–Ђвƒ,‡‹JЫ„ n 3йАПй*їL#z™g&љbЭ)mЁiW ж,=[.KЎŸЩт6Рn(ЊаЫ(]љ7‚K)xЛяCЖрCљCN‹еSknЂI6RъЕ` ВеZчМ,ЁпџЊпG#Cхk–/hїmh§PХZаq|!冉o*&2НEv ‹Œ7ЇЩk8В,/в7UйzЮяѕxyOjgш%fЅn%|Xaўя}ЬxъU,5чфыО—Ц“h х­рoТцР SplC"QЈьEQп$X;w•и]‘Ђэ>р9FI3Эвдœ˜š(ŽчбѕK-ŒyZaFчЊЂДNYŽ[ойй”Ї3ЕМШЗи3иf‰КлgДгf\п/’ˆЌ(зМЕ{/IВ9<чšRŠньˆ&)є:Їphх эGмyŸ5о%R­Щtzb lsŠОŒЫ\32FьersВЧ;myBЪщсI—№dpж%œэъ]КШЮ;„KЮюЖ­эXМOiХi(н@#С№R0ЩЄe ьјˆлЯАиRЬgЪ” яOК inUиNиьS{(ъ.ХCаDбK‹*зvЦIЭЉ]ZDN#МЋк}A8ц+:ви*,ХЎ6ћ†џ—Ч n2 GЇјќqў џџPK!ˆž O`docProps/core.xml Ђ( |’AKУ0†я‚џЁфоІйЌnЁэ`Ъ№р@АЂx ЩЗ-кІ!‰vћїІэV;Ё—ф}ѓфЩGгХО*ƒ/0Vж*C$ŠQŠзBЊm†ž‹U8CuL Vж 2t‹љхEЪ5хЕGSk0N‚ Zƒ‘я*X?ШЂvŒ%Гnэ'О‘ –‡?Š­ƒы,0ПтЁкtˆRtДъP‘ YдПги–,{†ˆ=NЩ:,%Ќо6†кјHAўТ№ђl F+x2ŒтPЮНѓZ’‹СŠkc0‚ЄЦ5bЅЩ`|l6шФ‹9ёР0ђŽ8ї@XaЄw„УЃг]ЅЏ]ыСžхцщqН{КЫОцћ\№I?Д}‰;_Й>wюЕ(ЖGXЇџ1ѕ/‚xHs ІYСАž<я§*ьЧ}—‹e^Єoи€IќВйђџџPK-!ШЃЭ4v[Content_Types].xmlPK-!ЕU0#ѕL „_rels/.relsPK-!>”—єКpxl/_rels/workbook.xml.relsPK-!bњДLGЄxl/workbook.xmlPK-!їв%сѕ  xl/sharedStrings.xmlPK-!;m2KСB#? xl/worksheets/_rels/sheet1.xml.relsPK-!iРRŠVA xl/theme/theme1.xmlPK-!zмХќ7 ќxl/styles.xmlPK-!sйг 2#xl/worksheets/sheet1.xmlPK-!њ" 'fxl/printerSettings/printerSettings1.binPK-!ˆž O`ПdocProps/core.xmlPK-!SђЬ`–E docProps/app.xmlPK &#Spreadsheet-Read-0.91/files/blank.xls0000644000031300001440000003400012536775410016750 0ustar00merijnusersаЯрЁБс;ўџ ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§џџџџџџџ ўџџџўџџџўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџ Л ЬсАСт\pCalc BАaР=œЏМ=@ 8X@"Зк1ШџArial1ШџArial1ШџArial1ШџArial ЄGENERALрЄѕџ Р рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рЄ Р р+ѕџ №Р р)ѕџ №Р р,ѕџ №Р р*ѕџ №Р р ѕџ №Р “€џ“€џ“€џ“€џ“€џ“€џ`…g$Sheet1ŒССTыZ№R№3 №П Р@@ё  їќ  џ @ ШЬЊо<@œ@œАсFIXED_NUMBERy2pper`€<QіЙ<QіЙ<QіЙ< їг@їг`жо<аƒеЈчшџччшџттуџ……‰џбpЭxЦЊо<dFormatskey3.LocaleDataPб ž@œQіЙ<QіЙ<QіЙ<`р„Uн<„Uн<„Uн<„Uн<„Uн<`жо<џ€€„џ`жо<@ргCurrencyFormatskey3 ` д[$$-409]#,##0;[RED]-[$$-409]#,##0@т‘ Ÿ@œENCY!@ЃАдP@žCurrencyFormatskey4p[$$-409]#,##0.00;[RED]-[$$-409]#,##0.00АЈЈQ‡@œENCY0Љ!@ЃаžP@№žCurrencyFormatskey5€ЊС`ЁxЦЊо<0.00 CCCQ`ЁxЦЊо<ENCY№Ћ!@ЃаŸ€@№ŸCurrencyFormatskey6Аp№3 №П Р@@ё  їaxЦЊо< ˆ3 №П Р@@ё  ї№H№№0№( № № #,##0;-[$$-409]* #,##0 q xЦЊо<!!@ЃЁP@АЁCurrencyFormatskey8`№Ё[$$-409]* #,##0.00;-[$$-409]* #,##0.00‡`ЁРЃxЦЊо<@@ ЂDateFormatskey1 б€б№сxЦЊо< ЄxЦЊо<! ЄxЦЊо<`@€ЃDateFormatskey9€г/a№сxЦЊо< YYYY`жо<!№сxЦЊо<PЅxЦЊо<@@`ЄDateFormatskey8pжЁ№сxЦЊо<AЋ Є!ІxЦЊо<p@рЄDateFormatskey7рйРйё №сxЦЊо<АкAЋPЅ!АІxЦЊо<p@ЅDateFormatskey10`жо<A №сxЦЊо<`жо<AЋІ!`ЇxЦЊо<p@@ІDateFormatskey11‘ №сxЦЊо<АAЋАІ!ЈxЦЊо<p@№ІDateFormatskey16Њо<с №сxЦЊо<AЋ`Ї!РЈxЦЊо<p@ ЇDateFormatskey12рЈ1 №сxЦЊо<ormAЋЈ!pЉxЦЊо<p@PЈDateFormatskey17Њо<` №сxЦЊо<y6AЋРЈ! ЊxЦЊо<p@ЉDateFormatskey13@Љб №сxЦЊо<YџџAЋpЉ!аЊxЦЊо<p@АЉDateFormatskey2@рЉ! №сxЦЊо<џџAЋ Њ!ЋxЦЊо<p@`ЊDateFormatskey14Њq№сxЦЊо<YYYYpЭ1№сxЦЊо<PЌxЦЊо<@@PЋDateFormatskey15€ЋБ№сxЦЊо<YYYY@ ШЬЊо<@œ@œАсFIXED_NUMBERy2pper`€<QіЙ<QіЙ<QіЙ< їг@їг`жо<аƒеЈчшџччшџттуџ……‰џбpЭxЦЊо<dFormatskey3.LocaleDataPб ž@œQіЙ<QіЙ<QіЙ<`р„Uн<„Uн<„Uн<„Uн<„Uн<`жо<џ€€„џ`жо<@ргCurrencyFormatskey3 ` д[$$-409]#,##0;[RED]-[$$-409]#,##0@т‘ Ÿ@œENCY!@ЃАдP@žCurrencyFormatskey4p[$$-409]#,##0.00;[RED]-[$$-409]#,##0.00АЈЈQ‡@œENCY0Љ!@ЃаžP@№žCurrencyFormatskey5€ЊС`ЁxЦЊо<0.00 CCCQ`ЁxЦЊо<ENCY№Ћ!@ЃаŸ€@№ŸCurrencyFormatskey6Аp№3 №П Р@@ё  їaxЦЊо< ˆ3 №П Р@@ё  ї№H№№0№( № № #,##0;-[$$-409]* #,##0 q xЦЊо<!!@ЃЁP@АЁCurrencyFormatskey8`№Ё[$$-409]* #,##0.00;-[$$-409]* #,##0.00‡`ЁРЃxЦЊо<@@ ЂDateFormatskey1 б€б№сxЦЊо< ЄxЦЊо<! ЄxЦЊо<`@€ЃDateFormatskey9€г/a№сxЦЊо< YYYY`жо<!№сxЦЊо<PЅxЦЊо<@@`ЄDateFormatskey8pжЁ№сxЦЊо<AЋ Є!ІxЦЊо<p@рЄDateFormatskey7рйРйё №сxЦЊо<АкAЋPЅ!АІxЦЊо<p@ЅDateFormatskey10`жо<A №сxЦЊо<`жо<AЋІ!`ЇxЦЊо<p@@ІDateFormatskey11‘ №сxЦЊо<АAЋАІ!ЈxЦЊо<p@№ІDateFormatskey16Њо<с №сxЦЊо<AЋ`Ї!РЈxЦЊо<p@ ЇDateFormatskey12рЈ1 №сxЦЊо<ormAЋЈ!pЉxЦЊо<p@PЈDateFormatskey17Њо<` №сxЦЊо<y6AЋРЈ! ЊxЦЊо<p@ЉDateFormatskey13@Љб №сxЦЊо<YџџAЋpЉ!аЊxЦЊо<p@АЉDateFormatskey2@рЉ! №сxЦЊо<џџAЋ Њ!ЋxЦЊо<p@`ЊDateFormatskey14Њq№сxЦЊо<YYYYpЭ1№сxЦЊо<PЌxЦЊо<@@PЋDateFormatskey15€ЋБ№сxЦЊо<YYYYcc Л Ь dќЉёвMbP?_€%,С*+‚ƒ„&ffffffц?'ffffffц?(ш?)ш?Ё" d,, Ж` Ж`р? Ж` Ж`р?U} љ%§ ьP№H№№0№( № №>Ж@ggџџџџ ўџџџўџџџўџџџ ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџ џџџџРFMicrosoft Excel 97-TabelleBiff8ўџр…ŸђљOhЋ‘+'Гй0 px„œЈДР и ф № ќ щ§TuxH.Merijn Brand3@eЭ@@l€…шъЬ@-ћ˜EНЅаўџеЭеœ.“—+,љЎDеЭеœ.“—+,љЎ\щ§щ§Root EntryџџџџџџџџРFРWorkbookџџџџ/&CompObjџџџџџџџџIOle џџџџџџџџџџџџSummaryInformation(џџџџџџџџDDocumentSummaryInformation8џџџџџџџџџџџџ tџџџџџџџџџџџџўџџџџџџџџџџџџџџџўџџџSpreadsheet-Read-0.91/files/test.sc0000644000031300001440000000771010332420104016422 0ustar00merijnusers# This model file is a sample of a SquirrelCalc Spreadsheet. # # (c) 1986 Minihouse Research dimension 28 {of 28 rows} 10 {of 10 columns} global frame 2 global display 2 global format [F2L] width c1 16 width c2 2 width c3 9 width c4 4 width c5 23 width c6 2 text na "N/A" r0c0 = "sample1.sc" lock r0c0 lock r0c1 lock r0c2 r0c3 = "Maximum Loan Amount Table" lock r0c3 lock r0c4 lock r0c5 r0c6 = date(today) lock r0c6 lock r0c7 r1c0 = [G2*] "-" lock r1c0 r1c1 = [G2*] "-" lock r1c1 r1c2 = [G2*] "-" lock r1c2 r1c3 = [G2*] "-" lock r1c3 r1c4 = [G2*] "-" lock r1c4 r1c5 = [G2*] "-" lock r1c5 r1c6 = [G2*] "-" lock r1c6 r1c7 = [G2*] "-" lock r1c7 r2c0 = " Assumptions" lock r2c0 lock r2c1 lock r2c2 lock r2c3 lock r2c4 r2c5 = " Results" lock r2c5 lock r2c6 lock r2c7 r3c0 = [G2*] "-" lock r3c0 r3c1 = [G2*] "-" lock r3c1 r3c2 = [G2*] "-" lock r3c2 r3c3 = [G2*] "-" lock r3c3 r3c4 = [G2*] "-" lock r3c4 r3c5 = [G2*] "-" lock r3c5 r3c6 = [G2*] "-" lock r3c6 r3c7 = [G2*] "-" lock r3c7 r4c0 = "Monthly Income" lock r4c0 lock r4c1 r4c2 = ":" lock r4c2 r4c3 = [$2L] 3500 lock r4c4 r4c5 = "Maximum Loan Amount" lock r4c5 r4c6 = ":" lock r4c6 r4c7 = r25c1 lock r4c7 lock r5c0 lock r5c1 lock r5c2 lock r5c3 lock r5c4 lock r5c5 lock r5c6 lock r5c7 r6c0 = "% of Income towards Repay" lock r6c0 lock r6c1 r6c2 = ":" lock r6c2 r6c3 = [%1L] 0.3 lock r6c4 r6c5 = "Affordable House" lock r6c5 r6c6 = ":" lock r6c6 r6c7 = r4c7+r15c3 lock r6c7 lock r7c0 lock r7c1 lock r7c2 lock r7c3 lock r7c4 lock r7c5 lock r7c6 lock r7c7 r8c0 = "Percentage of Loan Payment" lock r8c0 lock r8c1 lock r8c2 lock r8c3 lock r8c4 r8c5 = "Required Down Payment" lock r8c5 r8c6 = ":" lock r8c6 r8c7 = r6c7*r17c3 lock r8c7 r9c0 = "towards Tax, Ins, Assmnts" lock r9c0 lock r9c1 r9c2 = ":" lock r9c2 r9c3 = [%1L] 0.35 lock r9c4 lock r9c5 lock r9c6 lock r9c7 lock r10c0 lock r10c1 lock r10c2 lock r10c3 lock r10c4 r10c5 = "Maximum Monthly Paymnt" lock r10c5 r10c6 = ":" lock r10c6 r10c7 = r4c3*r6c3 lock r10c7 r11c0 = "Term of the Loan in Years" lock r11c0 lock r11c1 r11c2 = ":" lock r11c2 r11c3 = [I2L] 29 lock r11c4 lock r11c5 lock r11c6 lock r11c7 lock r12c0 lock r12c1 lock r12c2 lock r12c3 lock r12c4 r12c5 = "Max. Loan Paymnt/Month" lock r12c5 r12c6 = ":" lock r12c6 r12c7 = r10c7/(1+r9c3) lock r12c7 r13c0 = "Interest of the Loan" lock r13c0 lock r13c1 r13c2 = ":" lock r13c2 r13c3 = [%2L] 0.1475 lock r13c4 lock r13c5 lock r13c6 lock r13c7 lock r14c0 lock r14c1 lock r14c2 lock r14c3 lock r14c4 lock r14c5 lock r14c6 lock r14c7 r15c0 = "Available for Down Payment" lock r15c0 lock r15c1 r15c2 = ":" lock r15c2 r15c3 = [$2L] 25000 lock r15c4 lock r15c5 lock r15c6 lock r15c7 lock r16c0 lock r16c1 lock r16c2 lock r16c3 lock r16c4 lock r16c5 lock r16c6 lock r16c7 r17c0 = "Required down Payment" lock r17c0 lock r17c1 r17c2 = ":" lock r17c2 r17c3 = [%1L] 0.1 lock r17c4 r17c5 = "Adapted from: \"VisiCalc Home and" lock r17c5 lock r17c6 lock r17c7 lock r18c0 lock r18c1 lock r18c2 lock r18c3 lock r18c4 r18c5 = " Office Companion\"" lock r18c5 lock r18c6 lock r18c7 r19c0 = "Payments per Year" lock r19c0 lock r19c1 r19c2 = ":" lock r19c2 r19c3 = [I2L] 12 lock r19c4 r19c5 = date(31320,"Date created: %d-%h-%Y") lock r19c5 lock r19c6 lock r19c7 lock r20c0 lock r20c1 lock r20c2 lock r20c3 lock r20c4 lock r20c5 lock r20c6 lock r20c7 r21c0 = " Workspace" lock r21c0 lock r21c1 lock r21c2 lock r21c3 lock r21c4 lock r21c5 lock r21c6 lock r21c7 r22c0 = "Calc 1:" lock r22c0 r22c1 = r4c3*r6c3/(1+r9c3)*r19c3 lock r22c1 lock r22c2 lock r22c3 lock r22c4 lock r22c5 lock r22c6 lock r22c7 r23c0 = "Calc 2:" lock r23c0 r23c1 = 1/(r13c3/r19c3+1)^(r11c3*r19c3) lock r23c1 lock r23c2 lock r23c3 lock r23c4 lock r23c5 lock r23c6 lock r23c7 r24c0 = "Calc 3:" lock r24c0 r24c1 = 1-r23c1 lock r24c1 lock r24c2 lock r24c3 lock r24c4 lock r24c5 lock r24c6 lock r24c7 r25c0 = "Calc 4:" lock r25c0 r25c1 = r22c1/r13c3*r24c1 lock r25c1 lock r25c2 lock r25c3 lock r25c4 lock r25c5 lock r25c6 lock r25c7 r26c0 = "" r26c1 = " " r27c0 = " " r27c1 = "" goto r0c0 model on Spreadsheet-Read-0.91/files/perc.xls0000644000031300001440000003300011131150660016571 0ustar00merijnusersаЯрЁБс>ўџ ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ FЭЩРсАСт\pH.Merijn Brand BАaР=œЏМ=рxŒUn78X@"Зк1ШџArial1ШџArial1ШџArial1ШџArial1 џArial "т?Ќ"#,##0_);\("т?Ќ"#,##0\)% "т?Ќ"#,##0_);[Red]\("т?Ќ"#,##0\)&!"т?Ќ"#,##0.00_);\("т?Ќ"#,##0.00\)+&"т?Ќ"#,##0.00_);[Red]\("т?Ќ"#,##0.00\)=*8_("т?Ќ"* #,##0_);_("т?Ќ"* \(#,##0\);_("т?Ќ"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)E,@_("т?Ќ"* #,##0.00_);_("т?Ќ"* \(#,##0.00\);_("т?Ќ"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_) Є"т‚Ќ"#,##0_);\("т‚Ќ"#,##0\)%Ѕ "т‚Ќ"#,##0_);[Red]\("т‚Ќ"#,##0\)&І!"т‚Ќ"#,##0.00_);\("т‚Ќ"#,##0.00\)+Ї&"т‚Ќ"#,##0.00_);[Red]\("т‚Ќ"#,##0.00\)=Ј8_("т‚Ќ"* #,##0_);_("т‚Ќ"* \(#,##0\);_("т‚Ќ"* "-"_);_(@_)EЉ@_("т‚Ќ"* #,##0.00_);_("т‚Ќ"* \(#,##0.00\);_("т‚Ќ"* "-"??_);_(@_) Њ0.0% Ћ0.000%рѕџ Р рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР р Р р+ѕџ јР р)ѕџ јР рЉѕџ јР рЈѕџ јР р ѕџ јР р A Р рЋA Р “€џ“€џ“€џ“€џ“€џ“€џ`… <Blad1ŒССTќџcc FЭЩР ј‚  dќЉёвMbP?_*+‚€%џСƒ„Ё"џр?р?U} I џџџџџџџџџ џ џ џ џ џџџџџџН@@$@$@Нy@@@Нi@@@НY@№?№?НD@D@D@Н4@4@4@Н$@$@$@Н@@@Н@@@Н №?№?№?~ D@ ќЉёвMbp? ќЉёвMbp?~ 4@ ќЉёвMb`? ќЉёвMb`?~ $@ ќЉёвMbP? ќЉёвMbP?~ @ -Cыт6:? -Cыт6:?~ @-Cыт6*?-Cыт6*?~ №?-Cыт6?-Cыт6?ќЉёвMbp?ёhуˆЕј?ёhуˆЕј?ќЉёвMb`?ёhуˆЕјє>ёhуˆЕјє>ќЉёвMbP?ёhуˆЕјф>ёhуˆЕјф>з*bh22222266>Ж@я7 ўџ р…ŸђљOhЋ‘+'Гй0Ј@HXp ˆ ” фmerijnH.Merijn BrandMicrosoft Excel@€x2ќЄmЩ@xсpЩўџ еЭеœ.“—+,љЎ0а PXp x€ˆ ˜ Њф PROCURA B.V.WoA Blad1  Worksheetsўџџџ ўџџџўџџџ§џџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ РFўџџџWorkbookџџџџџџџџџџџџSummaryInformation(џџџџDocumentSummaryInformation8џџџџџџџџџџџџSpreadsheet-Read-0.91/files/blank.ods0000644000031300001440000002006013701052226016714 0ustar00merijnusersPKщVчP…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKщVчPConfigurations2/images/Bitmaps/PKщVчPConfigurations2/accelerator/PKщVчPConfigurations2/toolpanel/PKщVчPConfigurations2/progressbar/PKщVчPConfigurations2/statusbar/PKщVчPConfigurations2/toolbar/PKщVчPConfigurations2/floater/PKщVчPConfigurations2/popupmenu/PKщVчPConfigurations2/menubar/PKщVчP manifest.rdfЭ“Эnƒ0„я<…eЮи@/r(ЪЙjŸР5†X/ђšоОŽ“VQЄЊъŸдуЎF3пŽД›эaШ‹ВЈСT4c)%ЪHhЕщ+:Л.ЙЅл:киЖ+šёjƒЅŸ*Кwn*9_–…-7 lЯГЂ(xšѓёшžGmЋЉXщЄдлјХћ3УИišЄЩыJœ’сKю9zSамХCGзМkg˜х•Њ˜с'Ј˜ЬžСŒьeСVK1IkЇƒ4tMІ Х#{бЪќЙхŒn6Њ#j­РЮE?я8ЦїёD‡шGv†оg Ятbмn7k‘‡‰…ю[Елƒ"%4E$EtБ'+F—ŒЌs|ƒы{•Q^qBЭКb__њК’KС47eЭK(ŒFпw9žЇКњШ~MОSЏ&zrмШРЭ}> ВD4лг”‘–­83ВЕ`J$ў UAgWщЌЌ]ВјI>_ёSЉя(С€ žvъшрGи+^%$<ЧIяwЪд—УяѕђА\D3ьpvі„Ч„м?еJKDБїS{•щTОЏМQШ{~䈄­oПlм'h}ГЧNhЬ’9ў№р[ї­јPKўо‡ЖО­PKщVчP styles.xmlэ\ыoу6џ~…ЁХЛ@e=œФ&юклЛн`бlqДDЩМRЂ@бqВ§‘”DНeљm› šŠ3Юќf8ъСћЧз^  4khj:ФEЁџ §ёхЃ>бчЛ'ž‡8s‰Г `Шє˜Нaxч0žEЦМ0)cEУ1Šg!`aeи žA7 ѕˆHќS…/iь1|‘#BЬсЎ~Щ)ГAЕТ Єоbƒ}4ј–$ у+ТОЃma‘Ж'ѕUІЅ =АТiе•INU’YHw ЦZЦ | ЂЅёљ)CМTKHœ›K!‘юЂ˜PЌ6–=М ‚Q д;JE[BЧ#3 B|N…ЁlpxZb”ыїЧГVЁѓТ*š™ˆŒњm™QRYсчЇКDБќbјZ%Uq,QUЎ"§њ$}гњќ>Yтв•Ўф‰•'SЋ0 вЋ…2њМŸ‹|ФbКЈAІ’сЌ(х•ј[гP–m}63+^цЮ‹7Ѓ+Ј5x -кёИCРz„yrЭИм‚ондКUеЇdЩ=„T*\Dз| L——ъЊls_(ДВ№їс—Ч‡ŠЦ‰ˆTœ†.J6W/Џрћ?јьЇ Šp Ž^ŠcOhэяQІ акђЃLv˜№ъїч™ќЇЊЧї€TСДo@ŽŽv'ЌіхфшЈiяp%ЪFˆВ›яQІ И”ДwЕyг+ љ6{р6К€—ЛЫŠЮF3Ъ.xыЧјТ<Н‘‡IшUЮuыЁюжЁƒоЌƒДkP ЌnіP‹aФЎ Ў№NjLДSТСPаЂЧ4зcIV4ЎŒ8k…+Ц“Bs ueЇєztЮмЌѓШ<ВЮ-b(ТЙŒЖŽ`єNŠи—ˆ~‡%­sp4:[Њэ,wrCZHў4ƒгЃ(ъ^СЯЙх+жЯкƒз=ччхЭЈRоl єэОauЮ’z{kOVзZ5ЫАи'Ќю6‡UWВѕЦКxЊiЋBИœЩ}АНћlЙыJ™{ jŸU}Ћ˜ ЉYї~:J|В3В Сй/EtgˆЛ$Cє…7‹Вњ‰кД„“‹ЕЇBДпЭ–бxПЄеzgхЏ“ЭvЙ‡Хaн+Ѓ жыLu;BОWК;,ф­yАХДіL8ОШL8>\&(Ž7fТЎХrrIХлUэ/&зRМccВЊg(оNНNд6œЊ'™3'‡Ы™“хЬЩžеує*ЊЧk{ЪaНіъёœЙvGШ/ЉzМиDМuљ:НШT<=\*ž(O7ІтжЧa7…‡‘ч{ЦеЎ^>Ёљ„ ё ˆ„:yдУтCр^йНvkэг8Ѓ- Xя(:o #cёЉˆ<фшнiЧъL;VЯL/Ј№5"ЁјаЏNV$љ}Ч‹x7aЄˆЁtѓю1ђУњ›х21МТ/Щ иъeяіоѓІњ‹ы”$ъK]BЎ˜Z]ЇУ!Ji ТщxО№Ц”?Еб _hpц?нP]cєMМ oEЌдK4g/Узˆхзс;эУ“*–ѓж?юЪ(КT'‡~ƒ‡џјаДУУ)%T}uЊ—Ѓc _•aЕorЊ-™Ю!Ё|ЪфЭkˆќ%‘н­эњj›_UёшЂ˜OФ7НФ1АvВ=Уmgл­ЩЖЇэЛXow[oŸЩzћˆжскьаFЛь'ТрNВЅRнй’лНЮŸЂЬ]=эyŽ“{ј$фљruFЫЙTб'+šJЈ+О 5‡c>у1СШМ›˜т_ЏT;’?5'šGtтGBXxАлэJ!шcbё-„bJsг6usЬЕЙiђз4S-уќЧAІ0ЗТ4gђW)нFe§Ю[тFБƒ<2k>;$mg‰EaЯГИўzы}}свВ{ЮЫ\с;Њ„яŒЗѕF/Іэ‘2šѓЄб|tяќџPK-іУИW њWPKщVчP content.xml­XKoу6ОїW*аM?4Q“ьЁХžВ@бЄ@o šйФRЂ@R–ѓя;%™r$Ghz‘#Юы›™C*_NЙZСXЉ‹ЧdН\% (ИВи?&П~%wЩ—ЇŸt–IЉаМЪЁp„ыТся­ ›–,О1з8ЉL‘jfЅM –ƒMOu Eg›ОЗI›Иa[ЛuЩСЙ2ЅДЎыeН]jГЇЏQ/#NŽvк{#„гоЌV[КЇ‚9FŽъŸ;‹гСхЃыћћ{кH;еL›ќдцƒ Д5IСЉ#}>LЅZЃб"#Ыbt™žФЙЌœРКІџ|{~сШњАŽ:+SžыqЦбYоRЅ6ЎгМW.+Ѓ5С)(№`-]/з}ѕј7Зarœ=ючкЂ*R&/Бл;БaX=з‹зE^Ццž sЭНnlЋЕцW {C9SМOжН)˜ЎWОU_ U‰Фщдspln,Џ;р˜’Хi~{щ™пsƒœЌ"™žh!&w5З№оk7osЗ{n@˜­˜O˜­А…эц7БQŽ­‹*п™'Я{dѓGЛMПQ‘‰gІ›}?ˆ3]"Ьа‘ЙфЭв‡wеИоМ{к(Х›ѕЊСzEНNЇЏєнЖ<ђ0hПЮ'GЈТpєSЎgИ%цMpMr{9ОНѕp~‹чwП‰™;LьУ;њ …Эулs|кЬeЧхСbЙ‘хьAД‰y‡v"З тdбж/К.l“ЇюnМZк/dxG у@peŸТvш—сн#}L~gJюŒLxTt*ЙToБ$6ї2В‡[ˆCмжвк„^ё,qћ6Д[МАТŽ„њ…•кўvЁg„5Jщ8vџШŒl6ааО€ L‘ш €7ы џ ‚WvаžЛятї‚ЯFЇSДhзYх0“œ4~zО4ЯVЎз}Аe3І№|RU^$eМHJмз`œЛШtК3Р~ БбЁнylеk)ќінЌ–л›Ињq\5$(Ѕ‡Ш3=KзGО zB,И‹DRщr‚t•яb|?Э}9кMew6ŒђЇgЅTф6›I’œ'нsЫfћъъЊ™>нEФч;ѓ,мiЕо5ГычбщUUЧvo™:ЖћџEhКNo‡§ыїЎwя’§iPЁ‰ЭйюЖ1vуh—н5…ф9jNбМзsЉЄs}d†‘ГЈЖ‘~HЙrz­ыцЗ oУBйAўƒjUнiuЛGЃ.W…ž_tЎЊЂ7B5(`Aо$ХŸ(Ѓщ"ЖUќ…dфœ”Jшяяє кoђд€цќœrєѕo кш7ˆ…D1AI•fџŸ5Вф5ђ_EШ•#ѓyˆ‚~EЎѓ"Fея@>ќ+G№„ЂО-єœїћеЙ>_њoПя+К†}JјВ$<УРїўжЌY{иi™Ђ‰[ЏvяQoQ) kў‚Ю4J­Œ6 „ХyдlЗY‚бжяЂ_ю­0љEаМlЯює”ˆсРХС}LfАQїКЈX0LЦА$ўЖЬж‚0YbЌрцЫдTі8Э!Uзqš]JвW–FŽж9_ cs"JЋ…іEЛr>џŸаe„6nuйє4` WХЬ˜њ/ы_=џ3*[аv–МA CQH—ЮeЗгЙИЌсГZЪHэyђ)&C n‚ЌI…D+є‘М•nСл†sdвƒ|~ЏХHЪјЁЎ˜Љ Д:~тF8KщtФ"I“h†S"фIU‡ XПSжjYГ0ЉЩUкXД;яTЛ<|qwq$МЯКІВд§šРыlF2ƒяoЈєЖКШщзr–ўиuЮЎЋ/ AUпЕЩnФ‚6НeћцS8-ўaФ`ЃыЉ;]ѓXЙдP_RТэ›ы0œРЬ=gл Сwmд(B5ЋФIUЕАXИœЄААX-к­Y&КН2ŸTœп6˜ —яn)'bы4џѕLЋ“ˆ"/эЇА(nГоџWЫлэJ?ŠR ‰"'Xќuж!Ї+ЦH‚Љждzoс#їc…Тќ˜UJЂ#S•­х‘5ЬVq8ч„ВЉчн)иg}QМwTAКvИЪa AЌˆ ОЖdъ4вЌЄкїŒЦ”?=DІ`љ‰С'bЖ7 ГуЯ{>`(mHБѕІv$Сг ys_ХЄриЃCйW6„Ўћ­ˆЮH~мX{šМVvњLwlщќчТ}8@€JЏц7шЭВŸєўPKž‡эЅ8œ PKщVчPЉЩЛдššThumbnails/thumbnail.png‰PNG  IHDRеџQЉcс PLTEџџџџџџ~яOLIDATxкэС1Т ѕOm  €Пе*ѕ{•pIENDЎB`‚PKщVчPMETA-INF/manifest.xml­“MnУ Fї9…ХЖ2ЄэІBqВЈдЄ fp№€`ˆ’л[qтЊŠKйё3Мя1ˆЭюдЛъ1Y {хkVЖ^[ьіНџЊ?иnЛкє ­DrTхІыДa9Ђє*й$Qѕ$Ев@элм’ќ[/ЧЄыl&№Ю.hчс4qc''ёЕЂR} ‚S€h‡-хЄ7ЦЖ g„1iЛЊnW0жA]Ъуљ&`ВsuPth˜ИыukhЋj:h˜ СйvGд|ьŸ_ЇAщt &–Ј|z4ЖЫqЄЇ7ё BЪШKxЖМ–…Okўџ ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§џџџ ўџџџ)ўџџџ !"#$%&'(*,+ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ РFWorkbook џџџџ4_VBA_PROJECT_CUR"џџџџ ўџџџVBAџџџџўџџџ ЉЭСсАСт\pH.Merijn Brand BАaР=гК ThisWorkbookœЏМ=hЭP<-8X@"Зк1&м: DejaVu Sans1&м: DejaVu Sans1&м: DejaVu Sans1&м: DejaVu Sans1&м: DejaVu Sans1h8М:Cambria1&,8М: DejaVu Sans1&8М: DejaVu Sans1&м8М: DejaVu Sans1&м: DejaVu Sans1&м: DejaVu Sans1&м<: DejaVu Sans1&м>: DejaVu Sans1&м?М: DejaVu Sans1&м4М: DejaVu Sans1&м4: DejaVu Sans1&м М: DejaVu Sans1&м : DejaVu Sans1&м: DejaVu Sans1&мМ: DejaVu Sans1&м : DejaVu Sans"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)рѕџ Р рѕџ Р рѕџ Р рѕџ Р рѕџ Р рѕџ Р рѕџ Р рѕџ Р рѕџ Р рѕџ Р рѕџ Р рѕџ Р рѕџ Р рѕџ Р рѕџ Р р Р рѕџ ДŸ рѕџ Д­ рѕџ ДЊ рѕџ ДЎ рѕџ Д› рѕџ ДЏ рѕџ ДЌ рѕџ Д рѕџ Д‹ рѕџ ДЎ рѕџ ДЌ рѕџ ДГ рѕџ Дž рѕџ Д рѕџ Д‹ рѕџ ДЄ рѕџ ДБ рѕџ ДД рѕџ ДО рѕџ ДŠ рѕџ ДЙ рѕџ ДЄ рѕџ ДБ рѕџ ДЕ рѕџ ”— — – рѕџ ”ffППЗ рѕџ д`Р р ѕџ ДЊ р ѕџ ”— — Џ р+ѕџ јР р)ѕџ јР рѕџ дPР рѕџ дP Р р ѕџ д Р р ѕџ єР р ѕџ ДЋ рѕџ œ  š р ѕџ Д­ р ѕџ јР рѕџ єР рѕџ дa>Р рѕџ ”ПП– р,ѕџ јР р*ѕџ јР рѕџ єР рѕџ єР ||>‰q—}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(}  00\);_(*}(}  00\);_(*}(}  00\);_(*}(}  00\);_(*}(}  00\);_(*}(} 00\);_(*}(} 00\);_(*}(}- 00\);_(*}(}. 00\);_(*}(}: 00\);_(*}(}; 00\);_(*}(}6 00\);_(*}-}7 00\);_(*}<}/ 00\);_(*_)?_);_(}<}0 00\);_(*џ?_)?_);_(}<}1 00\);_(*23_)?_);_(}(}2 00\);_(*}<}+ aџ00\);_(*ЦяЮџ_)?_);_(}<}5 œџ00\);_(*џЧЮџ_)?_);_(}<}3 œeџ00\);_(*џыœџ_)?_);_(}Œ}, ??vџ00\);_(*џЬ™џ_)?_);_(џ џ џ џ}Œ}9 ???џ00\);_(*ђђђџ_)?_);_(???џ ???џ ???џ ???џ}Œ}( њ}џ00\);_(*ђђђџ_)?_);_(џ џ џ џ}<}* њ}џ00\);_(*џ€џ_)?_);_(}Œ}) 00\);_(*ЅЅЅџ_)?_);_(???џ ???џ ???џ ???џ}(}= џџ00\);_(*}Œ}4 00\);_(*џџЬџ_)?_);_(ВВВџ ВВВџ ВВВџ ВВВџ}(}< џ00\);_(*}P}8 00\);_(*_)?_);_( }<}" 00\);_(*_)?_);_(}<} 00\);_(*ef_)?_);_(}<} 00\);_(*ЬL_)?_);_(}<} 00\);_(*23_)?_);_(}<}# 00\);_(*_)?_);_(}<} 00\);_(*ef_)?_);_(}<} 00\);_(*ЬL_)?_);_(}<} 00\);_(*23_)?_);_(}<}$ 00\);_(*_)?_);_(}<} 00\);_(*ef_)?_);_(}<} 00\);_(*ЬL_)?_);_(}<} 00\);_(*23_)?_);_(}<}% 00\);_(*_)?_);_(}<} 00\);_(*ef_)?_);_(}<} 00\);_(*ЬL_)?_);_(}<} 00\);_(*23_)?_);_(}<}& 00\);_(*_)?_);_(}<} 00\);_(*ef_)?_);_(}<} 00\);_(*ЬL_)?_);_(}<}  00\);_(*23_)?_);_(}<}' 00\);_(* _)?_);_(}<} 00\);_(*ef _)?_);_(}<} 00\);_(*ЬL _)?_);_(}<}! 00\);_(*23 _)?_);_(“ 20% - Accent1’H’џ 20% - Accent1 efлхёџ џ“ 20% - Accent2’H’"џ 20% - Accent2 efђнмџ џ“ 20% - Accent3’H’&џ 20% - Accent3 efъёнџ џ“ 20% - Accent4’H’*џ 20% - Accent4 efхрьџ џ“ 20% - Accent5’H’.џ 20% - Accent5 efлюѓџ џ“ 20% - Accent6’H’2џ 20% - Accent6  ef§щйџ џ“ 40% - Accent1’H’џ 40% - Accent1 ЬLИЬфџ џ“ 40% - Accent2’H’#џ 40% - Accent2 ЬLцЙИџ џ“ 40% - Accent3’H’'џ 40% - Accent3 ЬLзфМџ џ“ 40% - Accent4’H’+џ 40% - Accent4 ЬLЬРкџ џ“ 40% - Accent5’H’/џ 40% - Accent5 ЬLЖншџ џ“ 40% - Accent6’H’3џ 40% - Accent6  ЬLќеДџ џ“ 60% - Accent1’H’ џ 60% - Accent1 23•Гзџ џџџџ“ 60% - Accent2’H’$џ 60% - Accent2 23й—•џ џџџџ“ 60% - Accent3’H’(џ 60% - Accent3 23Тжšџ џџџџ“ 60% - Accent4’H’,џ 60% - Accent4 23ВЁЧџ џџџџ“ 60% - Accent5’H’0џ 60% - Accent5 23“Энџ џџџџ“! 60% - Accent6’H’4џ 60% - Accent6  23њРџ џџџџ“ "Accent1’<’џAccent1 OНџ џџџџ“ #Accent2’<’!џAccent2 РPMџ џџџџ“ $Accent3’<’%џAccent3 ›ЛYџ џџџџ“ %Accent4’<’)џAccent4 €dЂџ џџџџ“ &Accent5’<’-џAccent5 KЌЦџ џџџџ“ 'Accent6’<’1џAccent6  ї–Fџ џџџџ“( Berekening’z’џ Berekening џђђђџ џњ}џџџџџџџ џџ“) Controlecel’|’џ Controlecel џЅЅЅџ џџџџџ???џџ???џџ???џ џ???џ“*Gekoppelde cel’L’џGekoppelde cel џњ}џџџ€џ“ +Goed’6’џGoed џЦяЮџ џaџ“ ,Invoer’r’џInvoer џџЬ™џ џ??vџџџџџџџ џџ“-€џ’ ’џKomma“.€џ’(’џ Komma [0]“ /Kop 1’:’џKop 1 I}џOНџ“ 0Kop 2’:’џKop 2 I}џџ?ЈРоџ“ 1Kop 3’:’џKop 3 I}џ23•Гзџ“ 2Kop 4’,’џKop 4 I}џ“ 3Neutraal’>’џNeutraal џџыœџ џœeџ“ 4Notitie’h’ џNotitie џџџЬџџВВВџџВВВџџВВВџ џВВВџ“ 5Ongeldig’>’џOngeldig џџЧЮџ џœџ“6€џ’$’џProcent“€џ’4’џ Standaard џ“ 7Titel’1’џTitel I}џ%“ 8Totaal’J’џTotaal џOНџOНџ“ 9Uitvoer’t’џUitvoer џђђђџ џ???џџ???џџ???џџ???џ џ???џ“:€џ’"’џValuta“;€џ’*’џ Valuta [0]“<Verklarende tekst’D’5џVerklarende tekst џџ“=Waarschuwingstekst’F’ џWaarschuwingstekst џџџŽXސTableStyleMedium9PivotStyleLight16`… y-Blad1… ›/Blad2… Н1Blad3ššЃЃŒССgцќD A1B2C3D4D1C2B3A4A3B4C1D2џ–, О,4ccgg––Bх››ŒŒ——Ԙщ7хЩЙдqШыї1™ ЉЭС .//  dќЉёвMbP?_*+‚€%;Сƒ„&ffffffц?'ffffffц?(ш?)ш?Ё";Ԙщ7333333г?333333г?1œ&œ<3U;;;;§ § § § з ˆ<>Ж@‹‹ggџџџџD ЉЭС Б0Q1  dќЉёвMbP?_*+‚€%;Сƒ„&ffffffц?'ffffffц?(ш?)ш?Ё";џ333333г?333333г?œ&œ<3U;;;;§ § § § з ˆ<>Ж@‹‹ggџџџџD ЉЭС г2Ћ3  dќЉёвMbP?_*+‚€%;Сƒ„&ffffffц?'ffffffц?(ш?)ш?Ё";џ333333г?333333г?œ&œ<3U;;;;§ §  § §  § § §  § з Р<>Ж@‹‹ggџџџџD Module1џџџџThisWorkbookџџџџџџџџ й_VBA_PROJECTџџџџџџџџџџџџh dirџџџџџџџџџџџџC  ўџџџўџџџ !"#$%&'()*+,-./0123456789:;<=>?@ABўџџџDEFGHIJKўџџџMўџџџOPQRSўџџџUVWўџџџYZ[\ўџџџ^ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№|дАџџџџƒзкОџџЖџџџџџџџџџџџџџџџџџџџџџџџџxџџMEџџџџџџџџџџпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(<џџ<џџ< џџ<џџџџџџџџџџ@џџџџƒџџџџџџ0џџџџџџџџџџџџџџ%џџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџtGРRпўЪџџџџџџџџxџџџџ"АAttribute VB_Name = "Module1" №ФдџџџџЫкуZџџ#ˆЖџџџџџџџџџџџџџџџџџџџџџџџџxџџMEџџџџџџџџџџпџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(SLџџџџSџџџџS”џџџџ<џџџџџџN0{00020819-0000-0000-C000-000000000046}џџџџ8€ўџџџџџџџ(џџџџџџџџџџ%џџџџHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпўЪџџџџџџџџxџџџџААAttribute VB_Name = "ThisWorkbook" ŒBasŒ0{00020P819-0C$0046} |GlobalаSpac’False dCreatablPredeclaIdБTru BExposeTemplateDeriv’BustomizD2Ьa…џ  фњ*\G{000204EF-0000-0000-C000-000000000046}#4.0#9#C:\PROG~FBU\COMM~CP1\MICR~NEI\VBA\VBA6\VBE6.DLL#Visual Basic For Applications*\G{00020813-0000-0000-C000-000000000046}#1.6#0#C:\Program Files\Microsoft Office\Office12\EXCEL.EXE#Microsoft Excel 12.0 Object LibraryМ*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\windows\system32\stdole2.tlb#OLE Automation(*\G{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}#2.4#0#C:\Program Files\Common Files\Microsoft Shared\OFFICE12\MSO.DLL#Microsoft Office 12.0 Object Library џџџџџџџџtGРRџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкModule10652c047ccџџModule1џџОнџџThisWorkbook015af84d84џџ!ThisWorkbookџџуZ %џџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџUCbD39*Bo˜ЗUС*џџџџџџџџ`X˜uё_Ј>J Ž%ї$>Їџџџџџџџџ€џh&Excel€+VBAїтWin16С~Win32MacГВVBA6­#Project1 stdole“` VBAProjectОПOfficeuModule1b €џ_Evaluateй „џџџPasteValueж€џRangeк  €џSelectionZЎ€џCopyЦП ThisWorkbook|уWorkbookkџџTџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$В€0* pH‚dф VBAProjeˆct4@j = r tGРR” J< r€stdole>stdo€le h%^*\G{00€020430-C 0046}#2.0#0#C:\windows\syst em32\e2.tlb#OLE Automation`ƒEOffDic„EOf€iдc‚Ež€”€E2DF8D04C-5BFA-10€1B-BDE5€EдAA€C4€2ˆE€˜gram Files\CommonMicrosoft Shared\OFFICE12\MSO.0DLL#‡ƒM 1€q ObС Li`braryK‚д‚к€ Modul`e1G­dDuЏ1 2E€ HB1ЕТpнƒB,BЈО!B+BТqThisWork€bookG@‚T@sisW€  rkbРoРЮ 2к Я$%bЭ$уZ"B#У$ТModule1Module1ThisWorkbookThisWorkbookID="{58B0B1F8-B010-4070-8AC2-6A72FF08AF79}" Module=Module1 Document=ThisWorkbook/&H00000000 Name="VBAProject" HelpContextID=PROJECTwm џџџџџџџџLAPROJECTџџџџџџџџџџџџNYSummaryInformation(џџџџ џџџџTрDocumentSummaryInformation8џџџџџџџџџџџџX"0" VersionCompatible32="393222000" CMG="E6E435E9CD192F1D2F1D2F1D2F1D" DPB="44469747ABA4ACA4ACA4" GC="A2A0712DCE2ECE2E31" [Host Extender Info] &H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000 ўџр…ŸђљOhЋ‘+'Гй0А@H`x  œЈфH.Merijn BrandH.Merijn BrandMicrosoft Excel@'ŸЮ@€дЩ3TевўџеЭеœ.“—+,љЎ0и PXd lt|„ Œ Вф Blad1Blad2Blad3  Werkbladenўџ џџџџ РF%Microsoft Office Excel 2003-werkbladBiff8Excel.Sheet.8є9ВqCompObjџџџџџџџџџџџџ]qSpreadsheet-Read-0.91/files/test_m.txt0000644000031300001440000000005011275744475017171 0ustar00merijnusersA1;B1;;D1 A2;B2;; A3;;"C3";D3 A4;B4;C4; Spreadsheet-Read-0.91/files/values.xls0000644000031300001440000003300010313232324017136 0ustar00merijnusersаЯрЁБс>ўџ ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ ь0ЭС@сАСт\ppc16 BАaР=œЏМ=hKL;‚#8X@"Зк1ШџArial1ШџArial1ШџArial1ШџArial7"Ќ "\ #,##0_-;"Ќ "\ #,##0\-A"Ќ "\ #,##0_-;[Red]"Ќ "\ #,##0\-C"Ќ "\ #,##0.00_-;"Ќ "\ #,##0.00\-M$"Ќ "\ #,##0.00_-;[Red]"Ќ "\ #,##0.00\-q*6_-"Ќ "\ * #,##0_-;_-"Ќ "\ * #,##0\-;_-"Ќ "\ * "-"_-;_-@_-,)'_-* #,##0_-;_-* #,##0\-;_-* "-"_-;_-@_-,>_-"Ќ "\ * #,##0.00_-;_-"Ќ "\ * #,##0.00\-;_-"Ќ "\ * "-"??_-;_-@_-4+/_-* #,##0.00_-;_-* #,##0.00\-;_-* "-"??_-;_-@_-рѕџ Р рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР р Р р+ѕџ јР р)ѕџ јР р ѕџ јР р,ѕџ јР р*ѕџ јР р Р “€џ“€џ“€џ“€џ“€џ“€џ`… ЧBlad1ŒСС`iќ@ A1 labelspaceemptynulonequoteџu Ѕ< ь0ЭС@ ƒW  dќЉёвMbP?_*+‚€%џСƒ„Ё"џр?р?Uџџ§ § Н№?§ § § § § § § зМ@>Ж@я7 ўџр…ŸђљOhЋ‘+'Гй0 @HXh € Œ˜фpc16fpc16fMicrosoft Excel@™2 LЙХ@N9LЙХўџеЭеœ.“—+,љЎ0а PXp x€ˆ ˜ Њф PROCURA B.V.We Blad1  Werkbladenўџџџ ўџџџўџџџ§џџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ РFўџџџWorkbookџџџџџџџџџџџџSummaryInformation(џџџџDocumentSummaryInformation8џџџџџџџџџџџџSpreadsheet-Read-0.91/files/perc.ods0000644000031300001440000003474313701334513016575 0ustar00merijnusersPK'bшP…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK'bшPConfigurations2/images/Bitmaps/PK'bшPConfigurations2/accelerator/PK'bшPConfigurations2/toolpanel/PK'bшPConfigurations2/progressbar/PK'bшPConfigurations2/statusbar/PK'bшPConfigurations2/toolbar/PK'bшPConfigurations2/floater/PK'bшPConfigurations2/popupmenu/PK'bшPConfigurations2/menubar/PK'bшP manifest.rdfЭ“Эnƒ0„я<…eЮи@/r(ЪЙjŸР5†X/ђšоОŽ“VQЄЊъŸдуЎF3пŽД›эaШ‹ВЈСT4c)%ЪHhЕщ+:Л.ЙЅл:киЖ+šёjƒЅŸ*Кwn*9_–…-7 lЯГЂ(xšѓA‹љ„ювo‰ZЏ9’)V _€Ёž-•Щu–‰ кSŒwЛ]А‹Ѕs<Уч8Ѓ†њ[ЛяЈЋhŠ'Јж’(ZёŠHZ@E #ЊйKw,qmЕqЦŽRe­…ЪMQ…Ѓ Т=v/ИќsЉГh<cЗкC•RG`гEыЗЗqлјˆvбџZшfчLtп'QкOЗёš&Ю1—мp*|ІЅг4“ ОȘdŒєп^‚OЂ–ЬEVЮЗ[Љѕ3іУШуy“h@†qЧ{ŽkXЯ †ѓhHЂFNЄEЙЪ$hЇ8у+ OЮО BїЎ,dp5уВо/n–7зо lYjѕЬр0МzЈЙШќАычЕU9žОЪи>+У™чђ†ЎјLеви‰Ђ6Щ@ˆ>7Мэ’jе(ѕщсŽЙЎ@ћЌЙ„ЌE6:AїeљкnJЃAкЇыэДт$SU”TPњыљiКxОї‚зру4ŠНЋ57‡ЮЭ–Š|s(эъZ(jPњ‰і~кzнм…jКЁ2‡ьћJ)дaMEз˜5є‹rЎэ™љўFLЕ*П‚{C5исŽŸнm|щ?šўPKiƒіQ…PK'bшP styles.xmlэ\moл8ў~ПТPБ‹XE’х$Ж7qАННо-А ŠmїБ`$Ъц-% '§ѕGRѕ.ЫђћЂNбDфp8ѓpјp(™К{xёёшв‘р^ГЎLm‡И(Xоk~љ OЕ‡Х?юˆч!Ю]тФ> ˜БW ЃoDѓТˆ&uФ4˜ЁhFsцЬIƒЌщМоf.ЛMЪ(ВйНЖb,œЦzНОZлW„./ЂNg№…™4 sYбIbІ”›цЕAaH(ЫЄ]G ‡1ХRЬu ˆЁ0,2Ќ+KivV€ВОЮHсЂбѓВo[.Њ;Ф9O•ИЌћjВ|ШŠЭP}› йb[BˆгьФpv”Г"zЛ+„+]­;ЛZSФ ЭФ}Ш@пО„lБЋŒ‚ПšbЫšЭf†ЌЭD=вЗ“—ыiBю\ЇoЩЕ’–W};NЇd)`lЗРиn)ZРSџA”ТХжAь?AкЛoР@=МўŽѓvc5Qy$ц‘N—ŠЃ<nТ/‰6јBŠDРВйМЄЁ†FїрЭ )TœЌ ,г2™ќ’К.nŠEЎк68/qŒєgзoВ˜ p3 ’‚†RРПХЫр:|МЈц‚8‹/х]cЇ„ш~ЄЃ€Я[Ю ­‹ћ€­Z&удјШ+хЯЇ$ѕћ†ˆ-ёБCQи› щsЌ˜п8Z sˆZm”RXLmm‘­œсЋІЈЛаСбт.™Њx”\ ГюЕ_(\!_2сзЌмшnќ;тSQФш3Ђ5?‚D?Wф’BmTR-фѕ% јиђѕ ZЃ(*I„ˆ9|Ÿ7LL† І} ЖиTЈъ0р5bапХ‚/`E|ааПЊиЕwЃmРгђ$sЪЌtЁbœцS™цд$Щ/К1ж2ёPАЄ \щ!ŸY2Ф“АЄŠKs-$д]1ˆuФ_]ћ~‰Xхы ЅЁ-Ёу‘9С2K^ YрpТa”лїчg­ЊBчs U43YэЗUV“ъЪ*ўљXз(V _ъЂД*‰ЊъUUП=ЪБi}q—,^щV‰•GSЋв+’х–М‹–ˆEtйQƒNЅƒУяЂфІ7tfЕіЦуљы!цQХ{тьTАЃЛЖбЪД^„ХтeГМTWUcU+'І”я^}[ŸЬl,ž ц!%’ FcЈ5(xѕŸ6ŽтuVЛЄ$хGUcдFйчОPheхo+ЪЯŽw‹}ЊйИ(йќ=УЗя~\ВŸяU€0Ф)8z)BŒЁ2…жЦђ’В1сйљЯ3љЇjЧї€TСДk@к Шq'Ќуѓ Hћ Дw 8eіЂlђ=ЪчB{“^щжœ­ŽЏѓ ѓyвОЊиl4Ѓь‚з~‚Џ(Ьг˜ЫЂЩЙm=ЬНб:lа›m~ 51РЭ#дЂ@81дрлН<ШŒЉvL8ђ[ь˜хvЌHLЃJѓ@P3N ЭдХNщ№ѕа/иœИйfл<АЭ- "(сTN[pz!уsDПУ“ж9hл'ЃкСВїAn …фW38=’Ђюќ”[ОЂc§Мн{оszp‘ои•єfk Џw ЋSІдл{{фАКдЌY†Х.auГ9ЌКШжCыт[РaЄ*ч3ЙїЂ7ŸЌc"wY”ЙЊуЃЃЊo’šmяgЃTР';ƒлœ§(Ђ›!n†шЁ oVeѕSЕДФ sO…hП›-іэnЄеzgхяУfCюaqXwbДНСz™T7ђшnПЗђ`‹kэLx{–LxЛ?&МноndТЎХrzNЩлEэ/І—’МbcВЊ'HоŽНNд6œ{ЪЇgЩ™г§qцtOœ9н1{œ]DіxiO@9Ќ—ž=ž’kB~Nйуйёжщыь,ЉxЖ?*žэ‰ŠgЉИѕqиЄ№0ђtЯИкЭЫ'4ŸP#ž‘@'ЯzXђŽр…=бkїv|œСhЃkƒсIчЄ№02rŸŠШCŽоM;V'эX=™^дТ—т bНZUЩѓ'ЯтЛ ЖЊєu ›7а2Ј3Ђ1…м№ЕэЩЄя!Л{ ƒПЗ˜[7§зфл№ъ›їэЇђЂњ)J’Гœ:Рв€уЋI!щpгК'Тйц\BzЦ#MЧaкO дыг#‰ќdРЈў8лUZЊNЩъe˜{<`3х'ї7BпИ‚ё$d…Вdz„њEhж-WL@Œн­§њ:6ПЊdвEЩWН$1Вљžс6иwkК…яiљяЧноOф§ј€осжьаFЛюGТр нвЈnкс~?ч/‘іЎž?›і<ЧЩG,IР‰ч ыŒ–IIе1^­ъ„VB]q–еМКх3nŒмб›Љ)~к9Ћ0ˆЖќдб<р ~ „ћЛнЏ‚>~!ЦЉойУд|хv$чВш˜˜sn5`<ќЄ0“‘г"ВFЎ8ѕ bFZ$кŒ сgО.ЧбЁfјП qщNЭ2ЧGЮё>Sб4onјєSёЦŒвŽ#’_PfГЃƒђ=J=qœЦUї€ќа`h&YхЌћЅ„ŸВoЄm„Ф“Ÿ й.ЗўХћАгlюVЧŽ!ИaHA )GŠ…mЇG[ЫV#…mиNcиЖШoO ›н ›}lи\љй‚_И^сЧћaq‹Jќ§)ЙWгь™l1ЪФGйA|’ѕ#^1SЌя0ђ7XШЊќХ"gѕCŽžUd-ЁЮэ%1+Йњ1є-­AЈсNЂ/"ЩнЋ{MмоGAЌ64т%P|Нд}тŠ›šTgOyЌЎј;П]W*ѓјЦˆџ*ЃИБЖJ#ёVО"C–КфzМи,вDИRšмЧКздk6Œv{RCŽn##aнРВ1Fmˆz эИпа^РИїќуЋЩ,пѓеИЩ+ёЬ+kš5jHDLёЃ )H ŸУT ‘š›чCч жтйюЯœŸtёr)Рф#‡ДEœi EљKХk)@ЌуѕеЄ%k5ЩYГ+ѓКq˜TMб i~:BŒЯЖў9€/ŒˆЕмќЁ‹y‹r=тэ‡б(}a4"Oџƒ/ј)бхЭшмцќпŠЋж:­№AЄTЈe;-šКgCУКžРВИщт—+ 5Џ] о o;Н„ЖЧЩhfIЃљ•Ч‹џPKЅЧЃHo 2YPK'bшP content.xmlэ\]oл6}пЏ0+›зЕGJ]щгжљ*Жлэl{52 оџвtЇƒЪ;‘„№cо‹0М ’€`б=ЃлЋЛNі˜поожZЙЦBІЛr<0€rм ш.Ї’™ё`О: AbФ`ZЄШWћЭБэыС:ўyѓњ]ДЁ)†Jу,ЂU/™ячcЃъЙ $Э…д•7‰jчМмК‘( œА*˜ЯцѕьE,ѕаГЮЭбЈћdh_pЪЄ9Ќіšгf"ёvhу Мlv7dкнј6ћ !Ђ{D˜Gѕ`ѕЇƒ‡kœ;ЉЖ'Sm%тTю)еxh.ултgйЧ~~ыžпC“ьGБшYBмЩБЙякл~ M\юЙaЎШpТ\‘[№zј"ZчfяЌHзTЮ •чё№CПEНQ‰{ІЫЄ.ФБ(2тjш‘КdК­ZfуєтнжЉЙYOv˜‡ёЉќЙ8tЙф­хio 5E˜о›*W3œQN†UpRе-пІwЛ~“OзяzcНщй‡Я‚7`Д?оМnЊЭPvt…EE’хƒ Ёѓn ЬT=c[Ю<”ѓз8.\MяЊГ‹Њ‚К!†3ŠqDЁWwЯнvЈ›'юл }1§U2 Т BQ9ЄŒ?TэСщЮЏlLKЈЩ;œЉ#a~ЦЙPПtќ\уtв mќQB3рЈƒк2ЅZ9гЌы=`fk|к’вL г JгєsМЧaXyП6|nі oСЫv\hHЄY„lœš іg k$цuВЅ-@ <МHГiеГйˆrиБTjFе$ЋЕЄј#ZS ,4ЉЋˆЅћ–Г1ч7ГлešZќ 8ЇА-ОЖE8›пј`“}ѓ&ХЖ ZšЈœЩ4n(K6PCЎgfZNУ-E"з,Х5ћjYасЈ5>ŽКjLA@ЉD9N(r=оТЏяŒэУ2ў№Šc2яŒЎ12Їп„Љœу‡ZиœЖр ‰RA (—HЏ=x@ћ8J9Џ,9–цšd?JьПяРсУ"ќ№Њ`\ƒд˜ппRc—<щp‘ЊVM#˜ъђJъ”’э/fэё†‘СZ­9вp‚ЩDvhг`юиЬ‰aЮ’ )QHslЛЧМ H?фЕ\?(n$Ž1WдёGiФоl! (ЈwnnЌЧVтмЩЈI&љv]…$єЉ„[WЎe^И;$ТYbwсЁС  Jm`В>"-PЬіэоL:—Њ~kЁЁ|M'ю(R[џ-”fёCЙ/ъ ƒУ Œbг\?{ЇuГйюf†šb™А q’0M“дl‚}ъ€ fWТ‰Р†ДЅИžєЂНЂЂаp  q[“iGz‹–lPyч9`DЫЩPЁэcsЗTFiћчaЎmU™–Ў6‡к`bюLЩMTZ-xUИmY‰Њx H&;‚УЮ* MЃнЉЅѕHgї„ƒАН qКлg:йk{Oўко ытQЗњєы3ъVЕ5Э3KГгŸѓыыяEэ{Qћ^дОЕ/Qд‚оЋDiX ђАПŠцpr%jCЉО{юЮц§Ѓрnя(Њ Ћ#b„bŠf ЈyП'3юЦ@BФёšrеё1•4№бyи6зуc^[ЦI„%Q%+tцёЯнKнwŠw,-RDXS(,ІH…Г0 чvjњ‡TД?Ы`ŽЕюД\65KЕ9…7юьpбŸич…ЦШETЈF 4Ц<‡{"ЁЪ”QЗ™9h!(ЏAGВк›^‰ЯОЋ•Ў ЙвK \ƒ*Bc\€іXБhFљЭ<В~˜ŸЩЭќмДpЛ:’гмї:№ ^§>SЫЌ XO[ГQCP”ъI№аBC~gnюЃтн>сGцЧм—Ž ЫнТHРМур=Zњ|ˆ‹Џ qv.ЬS” :€+п€<ЫмYŽAх№eYŽB?€D›Х@к,Ц ЭbјЊ,FЁР ЂЭ|ИR T^"0†LyМ к,‡jдЗ'M8ѓв€X󉹂hГЊQcаЦKFЁТ ЂMпmр@ЃЦ —ŒB/„D›ž*леЈ1Hњ(Р(ЄёBxAЄщЉБ]……4>ѕвј М вєTиЎ>BŸъ?i|^izЏк€п(ФёQ€‘˜уІё‚Ј3LІРoъxшР8gb?ˆГs_%#u†‰јC5‹:>gчОL>Fъєелю„#I–— ŒФ?б Я|Ђ|”єЊZсHВѕtЫOИТ3Ÿ*%}†*W8’t=эђЏ№Ь'ЫGIŸсъ5š|= §ђА№МЬЧIЁС 6š„= ѓБ№МчЬЧIЁС*6šŒ= ѓВ№М'ЊЏDЁvt№k†ž‡зЯ–Ы›c<ћЈы/Ьы3ѓ5[ЊЈ&iў§vу_ЖЖў Мjtr^}uџз(wџPKˆa|ж[EPK'bшP settings.xmlэZmsк8ў~П"уя„—М\уIшкмq ƒIкы7a/ ‰ЌѕH2†ўњ“lШ$Ўн#ЦтЎ3ї)Б-=Л^=zvWцњ§:d'+’"ПqкЇ-чИх‹чazзxчМяўrѓ9ѕС аCрЊ!A)=Džшщ\К>ђ9еbС]$’J—“ЄЋ|#рЛiюЫбnj,ЛГf”?н8KЅ"ЗйL’ф49;EБhЖЏЎЎšщгнPD|hА3ЯвСVыМ™]?NЏіulћ–Љcлџ_„цЬщютА{§юѕі]В? Њ 4Б9йо6ЦnэВЛЂњK№„ЂО-єœїЛеЙ?_њoПч+К‚}BјЂ$<iГѓЗfЭкСNЪх@мzЕ{‡z‹JaX#№WФpЊQjeД}$,ЮЃІŽЖ[Uc@`Єѕ‡ш—СН%&П šWэ"ТЎ1TммзС„` kuЏ‹Š9Уd тoЪlЭ “%Ц nОЬLeгВя>N“KIіJГШС2ч dlFDiБаОh_§ЯчCљl мъЊщi,Р”јЖ™Џ 0ѕ_жПy ў'TЖ эьxƒкG†Ђ.ЫГNчЂb-ќjY-e@Єі<љ“@ї@VŒxKЅ…ЦњPоЧJїрmТ2щA>Нзb$eќ@ЬZ?rЃ›Ѕt:`“ ЅЧI4Х ‘ ђЄЊУ@Ќп)ыДЌY˜€дф*э+к_+Њ]ОАЙ8о‹g]QYъ~MрХЮWЅNп[Sщmt%"гoх,§ЙЫœmO_<@‚кџа&Л bиє–г›с Дј‡ƒЕЎshЄюtЭcAцRC=I ЗofЄУp3їœm$?ДQЃеЌGICiCŠ­7ЕCљžVШу˜ћ*&_=ъ0”­В!ьtнoEt†ђУіƒЕЇЩkх”ЁЧtЧ–nСпqж'м‡ Tкx5Пћ~о,ћeAїoPKPЎУ6› PK'bшPl‹ВWССThumbnails/thumbnail.png‰PNG  IHDRдџОkп§PLTE:*!:::)1@<>A<@E>M^E5)C<9C@>XF9FDDGLTKRZTLGROR\SLZWYHUdW\gY_p^`^Yaj[dtbWMgZUq]Ip^Vg`Wab^m`Ulb[u`LqbUsdZui^xfVxf\~iT|k]ffhckwkr{vlexrlzvv\mambqƒdu‰fxŒiuƒlx„kz‹k}‘u|†m€”t€Œ{€…zƒ~ˆŽsƒ”t…™u‰{…’}Š—|ŠšzŒЁ}‘Ѕ~“Јm]€n`ˆvf„}x’~l‘vŠ‚|•€m”‚r”ƒyš†t˜†{‰uœ‰{ЁŒzІ’}Ј“~ƒƒ‚‚†Œ‚‰Šƒ€‰†ŒŒŒƒ‹”„™ˆŽ“ˆ˜Š“œ‡‚”‹„’‰œŒ‚ž…œ‘‰‘‘‘’•›’™–”š››•’ž™–›š›‚’Є”Љ„™­‹–Ё™Ђ›ЉˆœБ“›Ѓ‘ЊšžЃ˜ ЁЖ— Ї” Ќ˜ Ї›ЃЊŸЉЏ–ЈЙЄ’Ё”‹Ї˜‡І˜ŒЉ•Ўš…Ќ›‰ —‘Ђš‘Ёœ™Ќž’Аœ‡ЋЃ›ЖЂŽЛЈ–ЈЈЇЃЋДЁ­ИЊ­БЇА­ЅАЕЅВМ­ВДЉДОЏИДДЋЃБЌЉАЏАЙГЎБББАЖНАИЕДНМЛЖБИЗИОЙЕЛК˘­ТœБХЄЖЧЈМаГЛУЗПШЙОУЖРН­СгКУШДФгВЦиЕЪкЙЦгЛЩеМЭмМапКЭрОвтСЎšХВžЧИЇУЛГСНКЪОБбНЉЬСЗеТ­зШЖрЮЙтбНШЧЦФЫвСЭиШЭгХвнЬвеЪглЭиддЭХквЩзззТдуСжъХицЧлъЪжрЭкхЫлщЩођгмхЭрэдтьлрхлхьлщђн№њхиШхмбспнщовцсмьтеьфл№уЮѓщкљ№оцчшфьђфёіуєћчј§ъёіьєљьњ§ѓьуєяшїёсіёъњѓфљєьќјчќњъєѕѓёіњѓњ§љіёќњѕўўўю”StIDATxкэPSчšЧЛйЖТ „ФШд1Tм^HjЌэ-p‘Њ№F+ўhЛRзЕNэє^Ѓw˜Ž+нЖ6PшЖЛzЗх‡гEЪ-Г… ТA,­иkaИ41))Y7! Љp8ЯьћžHNюўЕчl}п™ш “Џчф§ОЯћ9Я›рg8№џ‘ї3{Љ р­#4ѓЯGцЦп‚cлИНы№ќУG0Мн чИШрUљ›щyщєц­#РМ|рд—їЅЋpQHQCђ'!ў5umqŠaЭжєМГcд‚JFіa„3ю˜КN§zЬ—yп&SUlЄsdЪlйG—ж ь:€­щ†ЕљYЙ…­бo­4еj )ъ‡ЮDPѕLмЛ‹дюёшйБ.Sх 6зDвT–.э?ОЇ@Gs‘†"Škt[†ZŸˆEЙъџ^ББމ4Їщ^p zћнLd"щЖЌИ[wЉFЧЭ‰5T Ў„-5‘€EЕю‡Ўгх Z6b6#Qе ИœŽ$#QъQ/Ъџ1zу—шџЈЋѓHB‚[@Qƒ) ю0Tn,3'цV5dЬu7т;UПњЋмjyОМЉ­FюZ5™АuявЏ6VЈЏцVУdnUIFnЕщ™†Œ6tЕsYЛћ5|ŠњіуQNOЌцПцФЈ?9т5А+RРЂHhыіцe#m5аqe&гU M}фIHИ5Ћq39Š^Ќ†];„М§~–S:ѕџHдPyљДЗД_ё‹YЪЫiцl0gћ`ъаuoТ//Ÿ€ІЋРœc†s[аЫђРYчЌпHд‰_эщkTЊŒ%ژښБeл_qхjЅНz­ДџйђLЧб™Hќі=nƒVжЋ•§чšЂUіАЧ3i=B‹Šзэ Гн‰Vпј1z~LІ+ƒdМ`>МсBъЖЩ™ˆ\w tkV4яˆЛѕcДњжMM~-Ѓ8ѕžі ЋаЂ>Нbи{ыЎr §гЂy!ІМ§‘:lО‘аКvьнO-_=щP#[ЖЄу(€j™7}'ка ‘Ѕ-;s’iaE§жeЮЪ­Г?ЁЏo{j^hќUШ­‘;‹ зtkц4ћЬ-„_a6UЉЌІЂgq€ўK*1О›J2 )vYVчї +ЊAnJ{аЫяфI4tsшBЗ9D9 TѕxТЬ‡Х еLЖ„†ЛšC•nЊчкЅaжБ˜‡ja№Ѓг |ЅˆOQŠ+G†йєРщѓўЦ\zІJЏ Wњ=tЬDFаO˜лaЊœЕьOЯsљэх“ЬЧVшZTмŽ˜Њ’шј"“&Ю8Пи—Н"эзЇЩКзШz7|’vљѕ™Щ^ЖGж“›"ЏзЇЪКpnБ&Ж’ ЯKl0j‡_Zд”уlуQъ[wќЬзњT юCц{рйгrю™яmШ§RkbК™яb”ЋО5ЌЩЏc” GД/лџL5khЎђНЛШ/vќEРo™я>яѓБ„Ь™Ш;™‰+_Р•oьшOШМя Ъ—‰œ8лОsЙЮ-ЌЈ†LY,ѕЄОЎ5q~ЬPFƒЪКЕBюмTкZ1mОnUU_q‘ЪК›ячTbvН9ЃфР 2п ]Л…5_F&‘О>$ГЪТчп5ƒ‰Д›’Fг-R T­G7mОУIh=хnAQЊlHf)l^ЕДۘœbОDд},Ъ‹ьѓT) яОчsXaьэѓ0іЛ рйы„іYОŒjay›ЕьSяsљMПwOНн7ћї*чc’РДR_XќДОp~ЌsAdяŒЉ{Uv=яJr[йНBA%ш Tuё( PŒђЗЄdЉ…ЛKЊД7 -Ъб’qЖЛЪи[у~цлўfЎoї)љц—fъюЭiІJр6Є[зbѓЧцЛbc=Ѓ0ш^r ~ћ Є@Ќ›A•kѓ-ЉB‹wЬЉ}цЪвfл[(РžIЗ­XBГ•Џ&ЗŽVщ„џLйгСPнњЄОЦœю3UCLџЦЪыoЊ™mОX”Кg‹QеЗ еФњZs’ОЖ1Ѓd­™я ]Y›/РЭЃрQ…;‡UJџ%[s-XdZšŠ@Ѕ,Uяеэœ‰\Т›VЂ\чBщœЪћ?bж?OЬ—ˆКПEystЕЬяŽŒYtЉ}˜љzю1пi3аЅ^НЭ2_xуЭМ|ŒcО{fОгЃ5БНokzю@БЭЦ‹N–љ^›fОгcЫсvчcЧдŸГЬwџц,}Qs”˜яє8vUР|ёXхТ[ЯЧ_Y=ЋђХ#>BщDжМчЊGБљ‚˜ЏoќрД/Tе5Q’‰™o‡љ}ЅvnЄ!IсЋ|ЧQх|GcшfаE–љњЦю/Јh?цыЫП+> явзРндKГЬ }п;kљй2р\}uIVC†™я6ЧjСЭ/jcЃЌžиhW ёє„ETїдњЃs–Л эЈE‘BSU8зЋqMхaц{vˆрі#>ED )ЊхB@ц‹Чдйo8ц{nrЫeЮvL3п–цKC“˜/Хše˜/ыFЩВj–љОŸiŸ3O€>Y^хcОQЊ Q1_r„!фпю@П'ŒЈbeЬ~ОипiCъѓїf і‹ЌгJkУdе%сВjћCБYцеZяsbѕ=}s%Џ‡A‰1яZђzw€HCбЬЖѓ›kЅщМі~бм~ž%ќяХЂЄ=;šŽјOщ`WNјњ|ЙЪ7rbO{Сњ4‘LщЪоXГvms™ŸљЖрUd_ПМ2ОїrвЩ Њ|w_+‹љ>*‘Єѓэ`ќDZTеpBЪќШIhYK•=фС^KШƒ§™Єy—kˆљQD#ЕЬї˜/™лч{˜‹"aОьЛЫ_ШЛ­^ўЬБИ ˜гч›.ц‹Чаy%oŒ:Е 6ј1_ЖH<…ЇL_Ÿя›љ–ˆ†љВ—*Š?vyмЦ}О/њ›/Х1пqѓAŸя=Q ADeСœ>пyЂfњ|\Ÿo–XЬ-ЬŽжКИЯ7г!ВІћ|#њ=rѓMž$S:u?‹jњ#њУЛw/щыНˆљЂС1_6wѓЕа‚‹jˆ^VаЊ)хнKїФd?ѓХƒcО8їЄF]й†ћ|ХС|уmј‘р-J ЏgvšŸЬ|§/Ч|ЗЂ\ѓUˆ„љ.Г1Ш]:П1ѓюаBл30vЦљЂСp…sYцћ%(h–љ ўЯc7И3CEАЊhЯљ™/юзцrUntЅъёOуG™lB‹–‡ѕQUYX­™oэпJ•cОv”ы…лМБв/ѓ%Ђˆ(ЖK˜wё~ЦіњѕљNЛ2лч;UzlвЧ|'EТ|K4zД7Ќ6$ёeЦя”woШ|ГwЦќРo ПоšЬіљ>%цoУO%MСe^QИеhnŸя\ѓePЎШ˜яВьЃVЅ‹/?pХ|f~?!9Аљт\е(kО‘,ѓМžкXE­DŽdWUЮѕљ^ђgО1жЭ•\ЎОжœQВыѓѓѕЈТmTЅ^"MчнxС}О™ЏEІЁЙм!9лчЫ1пbОDд}-ЪС•Мќ| кР G Рr;­гɘћўаС2п„е&Џ@чпvЮMиђŸщ№gО†Ј~.3_‡TЕ3п4сE­ыЧ•ярП№o;G€Й0я›”лЮ 0ЃеШр{JXŒ™o Ѓ0зўAЬwй­ЛXOmgdОk<{1_ю„+МЛЋѕm;ГЬWpQЙu+ шЖsФФЩŠРЬWю2сGєQСџ*щd™‡;^rї_„х‘|нZLTƒфсЩ€ЬЬ’07Us-!ѕљ˜яaОDд},ъ"Ыg;ёA‘ѓ>CЫœыуcОgЇ™ЏчуГ…gО о6n\Ј2Ж*ї|С—ЉOдчЫЮœZi/šH”1•—”{ЎА}ОЕwfО*ЗДтчšT'Пљ6Ь|Й>_м#МY“цкф;лY`ѓUа—3№йЮ-L+‚˜як€Ь—сњ|ёЙа8Ÿ­|…gОj›ЉлЏ}хЛЖAоu’мЈЯ—НвNlЫыКЉФwœŽh‘єљЖ„†ЛлЪRi/%•vѓeš%ЪIЖЯзoљcYшІ*1ѓmAљуrвчKDQ?CQј|f–њmJЩ^Х—™§їlŸЏнП˜cО%šXЃ!%{M[xN:>лљ…і)ь3qШ|GРžЄђ ачЫUΘ$тсИœ”џ9ЃСйЮј№HќинEрˆt1п§SA˜oЌх[œИђѓUїЃ{*З†JlгИx3Й>п@­F1ж­lŸokЅuзчћl—Р'\Q2Ѕ›*’‡ѕЧKфнvnцњ|=ўЦQОГУ­K%вЌБщГ ѓ%Ђю[QSОГ™ёЙЮќЄvьm~ц[;;_ЬWџbL€IЛќ€7ћaоЬИCВо<ц+џŠыѓЫ^"aО>ѓН15вХПCЋ€KјlчT>ц‹ћ|‡О‰‚|q0пHИ3рГƒэаВЬ™ЏџЖsL?fОьЙао( ѓХЬЖ­ S_`Жёfњ˜я˜ю` |мчЋ@љЯГ 3птSD”Ђ,l.ІЖ]]РœЛјo*fОA˜/цНје~ЎK`ц{\)§`cThЏ9LVE…Ї^рЫd™яЋ™ўg6ЂBбDgцњ|k†ЅлЪWkН™Т‰RRЋ€§т„xлјЂПксRљц]K~љ.Н1Нєж †R>g5Uы„мvŽЄэ)иXл2b‘љ6ј‡A*п},ѓ=ш™6_мчk)- ћ­ ЬWэlм7ŽKŠєнšSЮaо%Х_cОыzэlŸoK7‚†]з „cОЭЉЭдm–„9!’юfЩƒѕ|™љк%’мчыJЪpŸяуZ™в‰ЈћQЧ{›zXцЫžяЬW{№3п&у>пvфЮ–O&fОљY=KmПХЬїИ&v _І^„љіpЬзЄ”W5‡чD мч;cОk0ѓЁV1п Ьw1{ШЦАЦ3щY$pŸяѓUТрkѓ]{ћmdОў51оˆ§‰5_{ќ FXцЋЖ6@зЫj2ъыэOиЃјwфЮ•ЭWх<‰ЬŸ џg*Щ“€‡ДЯWŸѕ‹Я~y`СšЂу sыљ35.Иу™mEЫч‹BйзNЎјeб‰'56ряcR‡Eа?E|Šˆ@sл-ƒ;u›№цsoцTyGа>_6џєgьП!pŸЏ!Y^‡ЉЏЌЛ$:Ўh*/œ7sљѓЗeпйЮjу›šиJxѓoAряѓUb4Š+пЧl?E }єiчУМ}ОћЙГc‘љN}В„˜љFв‰œљrлЮќ;ĘљzЫy˜/kОм WK`JXцЛИЯTˆЭїDў>п {щџц›ЈЏ7gрGэ~рЪ"UКощІЄQnќ}ОР№g#Ы|лj=Ыyњ|PОCюФgDцKDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQџЧуšЏцзІmОIENDЎB`‚PK'bшPMETA-INF/manifest.xml­“MnУ Fї9…ХЖ2ЄэІBqВЈдЄ fp№€`ˆ’л[qтЊŠKйё3Мя1ˆЭюдЛъ1Y {хkVЖ^[ьіНџЊ?иnЛкє ­DrTхІыДa9Ђє*й$Qѕ$Ев@элм’ќ[/ЧЄыl&№Ю.hчс4qc''ёЕЂR} ‚S€h‡-хЄ7ЦЖ g„1iЛЊnW0жA]Ъуљ&`ВsuPth˜ИыukhЋj:h˜ СйvGд|ьŸ_ЇAщt &–Ј|z4ЖЫqЄЇ7ё BЪШKxЖМ–…Ok\9№ђwpжU$ќџр…q…5(Ph*џ6" Xё фЫХкЕў6ˆ V”*§!ЗСф$ уНW|6#!ЁCˆІJKЌP“іЈхЦ‚yI" вSЁЧW˜Ѕ$^л3 "‰iJиЫЁЈЎ}ўќЙbNSд(Ь№VБ + +˜b§‚Ќ@VR\ЭсЉLiмЖ|ќ™H2%"Ехо†СфОзѓƒчўЄнє§_ьrаsЭpЄ{ЖЊПюN…4ZЬЉvT,Ёр@нnиуdW@ёrz—GјЪљВ\oжХїe Щѓ”ђ Р#dkt мї ~Ёшџ0юнўgЏшчаV\эйэNТ[иrГЇ’w94>јDQќ.‹џ§5цъGЃ|ЛќŸГЛ…Ш­=ій |юАFs˜$іxP|х1шыw”[ЩД[L|9ѓoи‹­au+˜3Ўm›g˜јЎ7ъ;ƒƒ6О~№§‡сПfўћЬ|q$~ f>'†џ5№пlрмСnCЉ‡7Ї‹g(ІjB~УКKКИЬе‚tЂлУЊ5ЫŸšФ І84sЈs ЩEš(ь.ЩEЗK‰NШ-е­У] жіё]1ЅХJЅaNъаж›Сu#т›я#˜@ЏM”ЏбпНЁБwƒsu-ЁЎюQ/гЯГ'бпыѕЃвCфA_пЃ‡ос њяуОqTwчPяЫ~ѕОфчPŸ$їВыиC,ц8В^tpsжюдНN:пР!ЄыšwS?€”й~e  •уѓ•э€;ЕbFрєњу!0ЕRVѕЦЇ/Г§­}ВДH?g™q Ж#ЮFxnЬд%2Д_b:Бтf"KЏ› Дл$Š™žЏ_‰кŒsЃGюkSсу“Ь>$=ѕЛH!Чцљhš\`БгџbД?ќbђV;Spreadsheet-Read-0.91/files/blank.csv0000644000031300001440000000001513231316207016720 0ustar00merijnusers ,,, ,,, ,,, Spreadsheet-Read-0.91/files/values.xlsx0000644000031300001440000001655611130422501017343 0ustar00merijnusersPK!ыzв“bм[Content_Types].xml Ђи( ЌTЫNУ0М#ё‘Џ(qЫ!дДGЈ|€Б7UЧЖМлвў=›„V€JЄЊН$ŠЂ™{2л4.[CB|)ЦХHdрu0ж/Jёўі”пŠ IyЃ\№PŠ- ˜M//&oл˜ёДЧRдDёNJд54 ‹СѓŸ*ЄFІ…ŒJ/ефѕht#u№žrj1ФtђТ’5ЭUЂgе0м8IŒ§s\0žШюћС–Л*FgЕ"V.зоќaЭCUY &шUУ\EvеЂШ ‘Ж№d*Œ ”С€Wє ;цЈдЪQіИazг8Œ]gлщ Шю>™~џџPK!ЕU0#ѕL Ю_rels/.rels ЂЪ( Œ’ЯNУ0 ЦяHМCфћъnHЁЅЛLHЛ!TР$юЕЃ$@їі„‚JcлбічЯ?[оюцiTb/NУК(AБ3b{зjx­ŸV b"giЧŽaWноl_xЄ”›bзћЈВ‹‹К”ќ#b4O ёьrЅ‘0QЪahб“Јeм”х=†ПP-<еСj{Њ>њ<љВЗ4Mox/ц}b—NŒ@ž;ЫvхCf ЉЯлЈšBЫIƒѓœгЩћ"cž&к\OєџЖ8q"K‰аHрѓ<пŠs@ыы.ŸhЉјНЮ<тЇ„сMdјaСХT_џџPK!>”—єКxl/_rels/workbook.xml.rels Ђ( Ќ’ЯJФ0Ця‚яцnгЎ""›юE„Нj}€L›Вm2уŸОНЁЂл…eНєјfШї§2™эюkФ&ъƒWP%є&иоw оšч›Фк[= &$иезWл4чKфњH"ЛxRр˜уЃ”dŽšŠбчNвЈ9ЫдЩЈЭAw(7ey/гвъOБЗ воо‚hІ˜“џїmл| ц}DЯg"$ё4фˆFЇYС.2#Шѓё›5у9щГ”ѓY]bЈжdј щ@‘%’sч"Ьнš0фtBћЪ)Џлђ[–хпЩШ“ЋПџџPK!]ЮkHxl/workbook.xmlŒQЩNУ0Н#ёжмiваtS“J zA =›xвXѕйiџžIЂАм8ЭъчїоlЖ­и':/­Щ`:‰Ё)Ќц”Сћлгн˜мЎЌС Ўшa›поlZыЮжžŸABНŽ"_TЈЙŸи MJы4TКSфk‡\ј 1h%q<4—„Ећ†-KYрƒ-& DпWВіoJЉ№0(bМЎ_И&оLq… (2˜Qi[ќгpMНkЄъІi<‡(џљъ˜Р’7*М‘МќJfIвovV$ЖўчQWВЫQaл ючdэuЌ)АЖŸЅ!Ѕг%- Нg”Ї*dАŠWqG#њ…оћGПє‘™^мNq1Ѕ;uжю‰>хn-)q{ъwуЋ‚Ћ‚ФtЁ_LвE’іу=ѓ/џџPK!UUЧа_xl/sharedStrings.xmldСJC1Eї‚џfoѓъBД$)"јњёНБ/LвЬЄиП7-%.я™{g†kі?)ЊV™,l7(Є9/>?оžAБxZ|Ь„ЮШАwїw†YTЯ[XEЪNkžWLž7Й ѕЩwЎЩK—ѕ ЙTє Џˆ’Ђ~œІ'| Psn$^@5 Ч†oкЮˆ{н-Юш‹К’Ыб?їgњVЦzBpjpщлˆ‹ў урpз#ФTф”?Ил’ЙЦЎ->Ћœг‹%Ю„ АчыƒФ?gыЙgДЩЌПгВЖљџQЭ>№ дmzўsЗдпЬ„ŒbXšŠœoК•AёБ'ЖkДAэЦ'ˆVЕ“ЇнtЁмб@'ЗЧ‹ШZЅl nЧЭœOј”nь§xъM=v9Ÿ№KzњхmЇjњkŠoџџPK!iРRŠVxl/theme/theme1.xmlьYMoEО#ёF{oc'vGuЊиБ[HгFБ[дуx=оfvg53NъjHHˆ‚И qу€€J­ФЅќš@Љwfvз;ё˜&%ѕ!ёЮ>яїЧМ3ОzэAТа’ђДд/зDвiЕƒ;УўЅI…г1f<%э`FdpmынwЎтM“„  Oх&nБRйцЪŠ aЫЫ<#)М›p‘`"Z | |ЖВZЋ­Џ$˜ІJqloO&4$—4KlЬ{ $ЄJъ…‰fMrŠ]œ*Ю…ы"gВЫ:ТЌ€ 1?’*@ K/кAЭ|‚•­Ћ+x3'bj m…Ўo>9]N0>\52E4*…жћж•’П0Еˆыѕzн^Нфg8 СTЋK•gЃПQя<+ ћu‘wЗжЌ5\|…џк‚Ю­NЇгlхКXІdП6№ЕѕЦіЊƒ7 ‹o.рэnwнСХЏ/рћWZы o@1ЃщсZДпЯЙ— g7М№ €oдrјйPІ—1сЉZšl ОЯEЩАЂ)RГŒLpyмХЩHPЌ%рM‚+oьR(–Д0$CA3еоЯ0дФœпЋчпОzўНzўффсГ“‡?œўЬ—UќЯп}єгŸњPBs^|ўф—gO^|ёёЏп<іРЗUсCš‰n‘ctРАЭ8ЦеœŒФљ(†1ІŽЗ‡uOХ№ж 3ЎC\чна=|РыгћŽЎƒXLѕHоИЧ9ыpсuРЎ–Uё№pšF~сbZХ`|ф“нХЉко4ƒОY$ЅућnL5їtU‘”(ЄпёCB<жнЃдёы —|Ђа=Š:˜z]2Є#'‘цD7hq™љl†P;ОйЛ‹:œљЌо!G. 3ђCТ7^ЧS…Ы!NXес7БŠ}Jf"ЌтzRAЄ#Т8ъ‰”>šль­}CУђ†}Э)=єёМ‰9Џ"wјa7ЦIцУhWБяЩCHQŒіЙђСїИ[!њт€гЅсОK‰юз7‚;4rTš'ˆ~3:–аЉў›аєЯš1ЃаmМmЦэ`Ж&_Iм8е‚—сў…wOг}ЙОИёМэЛoћn№ŸяЛЫjљЌнvо`ЁїъсСЦfLN–OЩЪи@ЭЙ)Э ,aЗїaQš3")MY _ѓююр" \}@U<ˆqCv=аL"™ГŽ$ЪИ„гYіђжxд•=6ѕЉС6‰елх5Н\J6fЯ‰ЬДДІœUик•œ)˜§&ТъZЉ3KЋеLЏsЄ•&CMƒХв›0† ^РЫыpJзЂсp‚kПлИ‹‰ТE†HЦxLђiЛcT7A*rХм@юxbЄOzЏёZEZKГ§ вЮЄЊИЦqEєўJ”Š žGIюЉrdiЕ8YŠŽлAЋЙк PˆГv0s-|M2ˆКд“f\…ЪоЗ8EZІ“ œ-fSхѓhЖ Ум"ЈУ]…ѕћ‚СŽˆLHЕƒel%˜Wy АTKВњЏ6С­e€Эє7аbm’сгќш†–L&$Tе`WVДяьcоJљT1ˆЧЧhФІтCјuЊ‚=c*сzТt§—iклц•лœѓЂЋ^aœ]Ч,‹qоnu‰•lсІŽKЬSE=АЭЋЛ1юќІ˜’П SЊiќ?3Eя'p_А6жс2W`ЄыЕpЁb](‹iи09˜-В.dс5$\)›џ‚щџЖц,SжpьS4B‚Т~ЄbAШ>Д%“}ЏaVЯї.Ы’хŒLFUд•™U{DŽъИЎїіХъІ›фmРрNчŸћœWа(вCNЕоœтm–ž^S4я ž|l1ƒ<З›І№ЉЂgWЕє†Ми{Ow§љ˜е(Њ„UЖ‚V^іoЈТ9ЗZлБ,^mЪA-†Хr Ържщ?АџQ2bвXoЈC~НСЏ šЄ dѕ%;x н эт'ЛhуЌYYзцЃ“vчпяRю)gkЭЮяs:ЛЮ\qN-^ЄГs;ОЖkK] ‘=]ЂА4)N2&0ц‡­ъoO|tНwќSІЄI&јaI`=І ј­DCКѕџџPK!к3йдОxl/worksheets/sheet1.xmlŒSСnд0Н#ё–яЌ“…nЋU’Њнm$T œНЩ$БъиСžювПgoCB9pГчЭМїfЦЮЎѕšСyeMЮгUТ˜ЪжЪД9џў­|wХ™GijЉ­œ?ƒчзХл7йЩКGп #уsо![!|еA/§Ъ`iЌы%веЕТd=ѕZЌ“d#zЉ  [ї?ЖiT{[=ѕ`0’8аЩПядрy‘еŠАаsафќ&н–k.ŠlT~PpђГ3Cyј *„šРYhь`эcHќDЁ„§˜e…ъ;а:чФЪќЯQ# ˆIЁШўœ_дЪq_ЋЁ‘Oяэщ#ЈЖC’]Џ./&‹{‰ВШœ=1 9ђƒ NЗВR…р EЉ,4{,’LIЏ:cЗs,]bћє_w1њWn”G§Ii=Б r7Y cxm‘ЂSсћЉpД;Ч>,БнЛXbћ9ЖYbwsьr‰…EM^Ў&,6g>tєШQUДЄЦŒыgј<аЫ7vgЭљЇ„U В…ЯвЕЪxІЁ!ў$,‘ЙИвxA;Œ#œіNcѓMЮњ .;ƒ„ —ˆƒвCНR?!žM‰{†wРЙ%ОсЪ)^џbКшѕв7AЙ“\=>,З7йmОЫUёлИ—Д ЇЦЩ^Šb}P*њŒБ~Ф= 5кЮdyPnеиѓБаэСnXv9›чўћGM№ѓZЫџџPK-!ыzв“b[Content_Types].xmlPK-!ЕU0#ѕL o_rels/.relsPK-!>”—єК[xl/_rels/workbook.xml.relsPK-!]ЮkHxl/workbook.xmlPK-!UUЧа_ xl/sharedStrings.xmlPK-!ЁѓЌ˜{  xl/styles.xmlPK-!iРRŠVЩ xl/theme/theme1.xmlPK-!к3йдО„xl/worksheets/sheet1.xmlPK-!‘Яр4GVŽdocProps/core.xmlPK-!HыЄ– docProps/app.xmlPK €иSpreadsheet-Read-0.91/files/gnumeric.gnumeric0000644000031300001440000001141014362015733020467 0ustar00merijnusers‹э]{sЃ8Жџ>ыН5елГvŒЖёLВх$NткФIйюž;НГх" им`фœЧ~њ+ Œ1 ZŠ{2эGoэУбљџђ—™Ћ:z~~ЎMМХ љŽUУўфшI­зьаЎФs_gmю3dГ@НЎ§яЭѕаšЂ™YuМ 4= ЊРil№[fШdуоЪЈНvхфEab~ŽЃtчиš’%U”ѓџАOŽ9tqВ8ёЊѕjЙФ`L‘.$Б>уК]Ѓ 6дПdј$sз8-фWmєрxШVи…ёИ2 А‹к$М Й9!@АKЬЌЋсыœLxpБVNЊ:дуЅY-m?R2Аfц‰C?3]kс2)I(№І;@Ф›$†гѕЬ{ѕBфЧa†Х‹—d #u2/‘ј4Jђ‰_$P™ІэМW@|zюLœаъ0Y†S„Т>QDЯГбKЪk$&/v %аv:РЯфДЁыАQ9a3еhЋ'ToчО'XР)3”ЌšёПD˜ фП*П:vHу4D—WШ™LCЂ7­‘U\N9w‚ЙkО^`F№ žWŽО ''—Оc''dWШД‘ŸŒ•ЄFbŽЗ‹И/0kˆO†ЏГ{Ђ„Sфтч‚ёA$7џьЮНу:сыqхВ3^uЛЃёчоАwкЛю~‹ЏЛ…ŠF$Ђ IНMўWYsџL‹iМћйAь”Ÿ]&Фч™)d…':LfагєŒ/ЯNт;АуЌ ‰“HЫ• Ѕ#\їХBюјtсИaЯпQч6ю•o™ч™ў– qЉYs8ЬЩtbA“•h9IŠЫ4=9Ё‹О*яџYр№ч›шј§Ѕ—Pя_н‹ПМП„п™FW#Сš3EіМтEЬ hЫјR˜фdё\ЙУ„”z @|Ч>yqГYфЛжцпу0Ф3)=„ A|uОO} С”y>ŠLrV1ŠЅЧЩЈ/ђп$ў"% љsф[$fГ|`u…нЃ нНJюЯЬ‚zьь„щз&LˆЯх_EOШ;cьЙЏу |%)ђ {ЄТєIуЯБ}“`ШНвЭQr RЌŠiЬђDў,vyL’’I" GзNoGЃл›ŠђЋoЮGш%dїNЩBGјТ‰Ю8Œ3ov‘ ;ЂЩЂЭИЦж#В™„$c#Уl”d}h™7)ЇІEJб ђЏќ‡x&“bъ­ЅX”Ž(Ш‰<’ЧЛkKM ьЖШЅ„7vЃВšЎU Ÿˆt>Эў"ЉIЩ§ˆFФ,&гhФђ9“ўЄу;ІAHљЎiі(QmжmІА“GU]ЁкZЁЊPнjTС ењ Up@ѕлЁJCЩћ‚ A…P— ЊкЦЈžсЩP|Ѕžп\­\§юVћсF!ЊЊЛАe›+pЎЏрmрMр­oaœmЛтC н‰]ЋkœmKŸPтэжm]•SїРCнS„*иBTaaчi/ќё+љї{u6ћНjлЛх”UNѕі,Oо„[…яGRЕЛЮpx@№Ч€ћ.Сp‚/иГрЛ“ХфlйжaЫ€Л-]GШйВpЯВЉпџ‡ўЁхяиV!Жћ‘Gэ"ИЇ}Ёкˆ;~—Jуxc§@эиŽе wь^„кнЗUю~ФкDWчлЕч@‡pЛuO tŽKnэ™KоХYчxфжОyф]ЗСI”›{–(я"Ж-Ж­=УvЗЇ}l^јcЖьŸ+,„u/2Ј]†ЕUЋq€uЛaU9^ј№ЏXu›€U‹=8тmпБМ7дУЋ[їїЧыШЧX2|РuЛ}БQ,8й-їХ@х=8ьйэіХ€ГeЯ–ћbX\№РCпiЫ}1ф=’н<Лх‹ЉœХЊяYЋјНюМЯŽ]ЧуК-Š]ЦЕХйЏ`ЗX•ƒь~TВЛŒlКоI#ЛyёŽ!Ћђ^Ќ\kяА;–ѓ>lАў)’Ал l‹ЗcШn9В*к§H vкtЕэ~dP[mъТњWњЩњх=˜ 7:џEwєѓѓЌЅпьXNЄ_ЩVњ8^]!lеДVюЋмщЉъrЊkMb'WІoгћа+et`Iє&F˜.щš-q"-YOƒ Y6U_Nе5 БžЦ’ЎU—ЂkОQ­ф~†д§ŒDЭZ–C›˜Aж$nЁ&6ЁЕjД}†tЗMЯ~œZчšЙвШЩ™ЋЊеzж^ЩЬМНЊF ъЋцФL%Јц-"=3o–­tЇ6)>Ѕsет;Јrљ›ыЗHVнЬj™*uMЫCф"‹§J“rЖ№ь/?iE ‘еxBХћ< H}т5ѕ}аШ ДКџКЏBЎ›§?S–•п’ѓgњc #і+ тDOMя‘ИY3dП/[ЁуВ1ЋzŽU1Л_ўœ 5ЧтœШ!С ПœsАA5”‘Ob„i­~qOˆ-ЬБН3_%еЃхxœa[fmzŽС’Ёoш†§dfЙИєwШ$xДr<ШТžхИЫ!,eЃqЁўјQЁПRЇ|ќ(РІQВиŠ”ь?'-Сk];сU— nН‰КUИu(ЕІЕ䆇М&тгUla;i;•F• nфЈѕz]FЭЪЩёUѓЇKЃzaTЯ ЪЁь5ъ?,Љџ&@nlŒ‚СEь€pЧ›HАyаTkzъ`GіEїeюїЮYgёјЪјщR­W/ШџЯUXеYђ'уЇЎZ'@­˜‰`ЅжЫРP†EZSd=*ьЧbŠ55§‰ˆwLXТœTPФ~њЗ!ŸЏa•KLѓѓз0˜oф46Ds)дъЋ;BbџTAѕŸ*Ќ^ЉBыTKСвДњmЖjТчˆЉмЭЊAC~Г&ќD-@•Д•kїЫ‚аеѓё@}mЩšУтДSЪј‰ЇщсpŠ| Pœ) лCqžGЩ5ЄЭЁ.ХOд€Є=Ў=рEˆd+S>A#>с\~И9ќ gt#У яѕUЁŒ'a№FЃ’ CIЕ2У–ˆˆќ„_Юнj›iJуn/CЕ–‘њ'Е,QЭk’šз7зМОЉuы›ZЗОfКЄŽuI7ЪtЌ e’ќ:TPЧMuмиLЧ I7$uм,l/EEЁ€ЭR„"E“ в™Oƒ^93}[Йѕ„Т|“л—ЭЭkJ"ж”DЌД%Ё ­п“м­MwХf Е%ЉужuœOžn-Ёд)i­œ*ЙЃQВ…ъ‹в‰.ДљM’;w1ЛL Ўm@—a№Fл(l‹h^д6 ЎmZFЪ6ВP­F ЄЊ ‘ J;. ‘§ј1ј§16kАЩ lА~ƒEДœE-­ьžj‰O2ŒвnLCФ­~7цSшИNј*УЄР8t))оh’Н й{ХЯш" DћCDгU.}ЧV><8фXфй(щv4зŸy5€dїHv/@YїBЄУ JЛb0|Ыю(щ^Р–amжН’н йНЅн‹–PІУя^Ш…оЭz yСгќ†&џ€Hі4€dO”6Ф4ЯoЬАNнWef:^ˆМш/|Фў~jГr?!зѓфZЭаЄ3 Щіl~ћ Ÿdm-Сz‰“ёpАДП`ˆXфїЮ№Ь2ƒP"JA~ЏЁ^SЅФJv П[ ж#‚щ^AжЛш-ЕІ5фž‡СВ^‚ƒ Œ€пKXї`I/AйрPВ%›ЩќЗwŠVКЎгЇэ@h“–Ж ‘дђ[$ыW>xXё‘…œy(ДKЫz"%”ь@Щ.,ыbžqг?P€›ў”,иЁdСЕП!ДнЪ*~CшЪ Пт—omСВъ_†^Tс’е;дљ АЌќT8Пќ—/i`I+ Ё љ%ЩbJѓАЌ7Ф ~-ўіЬ8aњR[(YCЩj–г†*в‡ќbZаЁ–аbUВ†’0,+€ Д=ПQ љ,4ъђ,”Ќ`Ёd Ы*XAеё+XAћт?нД/ЩњJж—ZyБ&вг$Ћ#MВ:вЪK !%“x­<‰_н1ѓюсЁ№к|%‰Л2ТѓkєW:kяВiи}BОrƒmфFk!ЙѓёН‹fЩљљ2rf‘Бб“^ˆ|šсзЩi{}4a 9wЫgEˆ‡–щ&ь&О9D/e#/pBч‰”Ll 'Z:HЮ)пЙkОв—ЦЎ06WŽО ''Д]œœ}]!гF~2BT™‰9о.BњњxРЄO†ЏГ{ьЇШЅЪЯœЩ4Œрwчž•~бћіУЋnw4ўміN{зНбoбсuЗТ:йgщїпзш›3tТ;*6žA4NШIёgёyf YсђЕАј,=с ЦГeSŠgEШОš–"єш`їХBюјtсИaЯпбїYЦ™sЏˆю‰n•ЯќW_бyv{•ŒОlп‰MVЂх4$).Sєxф„.њЊМ?ўgУŸ#hЂуї—^BНt/ўђў~g]ЌћCІHњR7§ђDўc7І?qМ 'CˆчЪ&ЄдIцЬаCє:јl–ікёќ{†x&Eтзœ4СWчћдЩL™у“ЁxР8ЄXzœŒњ"їMC€В02GО…Маœ ŠВ:fQ$ќžшUrfЉ БZбз&LшУCюUє„МБѓ0Цžћ:иЧ<ј“I„­Љgˆ?ЧіM‚!їrH7GЩ-l<іp8fЏђgБЫcпє&‰$4юм z§Q}†ныюйЈwлЯcŸ˜Р‰=Їdщё‹їбXvžC‘a;dާа7—oїІЏЌгDU‰R ’ 8ЖM#?§цЪпhBbЖmіњцlўѓПFгW”8’ц$НˆlO€л1 %byзЙь–№œ›ФфHќЛˆ~&і&lp}Ђ…gєх§@!щХ>sVђйэЭMЗ?Ž;ЃqЗžЗ+пЧ~ 0WгeЧ Mп n„z8>я яЎ;ПuЯГ‰ЯMEћiэЛ3щСмg†ъ"ѓkш:дпкŸя e>ЃчОr&ёЁ˜L!Qј­Z^­ОuRљд Яrы+Л­gХ–|ш$#faYЄЊЂяЖ*‚‡Њш{­ŠрЁ*њЦUбЅбCUtЈŠUбЁ*ZWнЁ*:TE‡ЊшPmwU”:e eВ~ъ›ЁЉD*@іШМDГХўу=Ц'?ќ?–Ј{|bФSpreadsheet-Read-0.91/files/test_t.csv0000644000031300001440000000005010614363313017134 0ustar00merijnusersA1 B1 D1 A2 B2 A3 'C3' D3 A4 B4 C4 Spreadsheet-Read-0.91/files/values.ods0000644000031300001440000002427613701030010017124 0ustar00merijnusersPKjBчP…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKjBчP content.xmlХXQoл6~пЏ4`oДьЄС-qбaиS K ь­ Х“L”5’ВьПЃ(Щ”*9jZd/ЖE~wїнёюxђ§ћc.‚(ЭeёnVы0€"‘ŒйCјщуŸф6|П§щ^І)O f2Љr( Ida№;@щBЧЅOд4J*UФ’jЎу‚ц c“ФВ„Ђ“П–‰Лn=SŒ‰‡poLGQ]зЋњz%U]­ззQ1j(9pЈю$Ž{“OJlюююЂfЗ‡j>Ѓz§ѓєјœь!Ї„ка"Г{YЊЇRхzЙэЬd>ЋЂ­ХKГ4Рэ‡жš^*mБОlNЭ~&ЦЗбn6OНgŠжKmY,ц›oŽЉkЖ\ќšљВŽ‹ƒdБОЌ6'‹#lСƒ ЁK…-ж—•RіёЕpWq]:М‹мs‡ђьЄЪњКLeU0WRЮ6KPмnQЗEьiИ~Ш;~ШАф%Zк # гЅ:dŠrWg9KmЙlуШ Е—ЪЕ ЉœЁŸr]оѕg0J)IЎБSPВŒ=i_нQ№тЫ|gВЛ~m—YЖAВtl|TА,щ —•Y–D Р*вбfЕ‰:lВЇjqЩ4`п’В=i6so"ЅTІЏNК[^a иЗ•h}mІ"њёяШю[аН_E•я@-ю#xГ|UвxаѕХКЌЧc№рЩExBE2ХхКП‹Pя>JПЂ№­X<а0ьЕДОШbГŽ,& кЌєЦ…ЋpлЭюОбQПтŒ@RšaННwСэ—їlљ>„ЇxMcgщ9Їn=К,ќШё˜яƒgZш 5ПаRъпF8ЗеO2(0zx’КцZ%7 о„ŠФьЩМ@­с|*8ЮT<=Яr—;iљKьЂЙуhзie$ою–"Љд„ƒ,ŸibлѓZw&oл#pSЧЗ™|9еЃ‘"Ьсџ/Љ›n§ІAе%N]ojђвœодbQНmLq xM–N5ияЅђo%ЭЋШ|sЩј+Vы ѓ' oфŒ<б`(ъžЦџшnџPKМѓTќPKjBчP styles.xmlэ\ћoу6ў§ў C‹+v“ѕpЧnт НЛ^ tƒЂйХ§И`$JцUŠЖ“§ыoHНŸ–ПВиlаTфp4ѓЭ№уPЏлћgпm0‹ юcЌ+#Xд&{Ї|ўє‹zЃм/џvK‡XxaSkэу€Ћёp4‚СAДŽ qЉcЭ‚E‰ђqДр悆8H‡.ъcђДqЛЫlлЛSVœ‡ MлnЗуэdL™Ћ™К>б\ЭFЉ‚ЗявЯ+ю7Ž0цѓЙ&{SQ›њ-Њ $TМ“ЂT:В y_‡bщЂ+e~пбBЖ8жG|етгі:х>ўžyЦаЖяЙ„,„Зx:›MьўУ'vq,ЧЯНAВХБ2z#,„K aŽњВХБ”в _!'xšWZ|œJ{4w’Йй4pш:АуŽЯŸCЬˆшBо"™3 %з7noЧ7ЎjQ?„3=• N_дqf>N˜жЌtЄ”к}Ч>Gžъаѓ‚Н4яВ4BIЉъG* 8f4\Fе={$јЋ Do–№V&Ў™'ЅlKУgŒ4clhЉЌЕBЌw†KсЂQLPHkЂM5†CЪx6™аSџ !…‹чВЂhТ›јєЇ&њT1џ2П‚Еџ„YяiФ[›—mч4к2!+ˆ[тђЌнгtЎIЁЬ}=`žŠa‹’†25ЂmЇ†Ў e”Єoa15•eКr:VMYXЕБхEЫлЫЌy ѓю”ŸAАhСМO|тНЄэZїрп DU:;zDAд цвшЧŠ\мЈŒJЊ…МътР‚РE[E%‰p жЉ УD v˜&э}xєёБеЖЊ`у^"ާ]жimсHкуК&ѕТЦZ{IЕ“jN •™ЇZиѓ”T”ЛЋŠЭZ3Ш6zщ'ј‚QyrAЬЃ[49З­‡Й7J‡ jГ вЏQЁgМцЕ(N 5x~pƒ‡˜1б•SТС‰пb‡‘лБЂkUЮИh„kœаœH]ф” _ §‚ЭЙ=l6ls‹‚ B8—г“#8=ШЋKDПУ“і98=еіH–ƒЙт?ЭрЬv—Dн ј7{EПњ9{№ЊчьиЃИ‘IБыVЮѓз&еЫщ§=qRНбŠY&Х+’ъЊыzU HзТQвуЯSХm4dqЬr™JћХЬъC%'€fœ Д7E“Џд<) ъ^Љ ЈйnЅW9"Рєц8р;rВ)trТUrсА‡*oЗ*ЃŸЊnš’.VšЂ§ЎЌ\ѕ(Јъ—JО-–rE pkgЊУті&‰j ІэduL[ЙЊХјvЖš]$[ЭЧVГБеl'[u,fSуRJЊ7Tяho Є:У&с€žИЄ:1ѕзЖ}‡)щІЦ%’Єф”УЄœi I™`Џ(щІƒnM[,9Єќм.ПЄ;#QФєД%нЅrхО%хДњTХeАхєpl9=[NwВeыMЃщuсVЫйюЕ›7ЫrfL`‰;%4Pщ3Ч;Ш‹№ЛяеюэЭi‚бЦЦУЛJТТнћШ"0‰C,Е›uŒ.ж1z2ЙшХЯ! Ф i…юXsж#_йˆћї“ДЯЁЬТv>8"nPx \тХ^зјWќlrіžСŒEд#ішн.ўЕsV!ˆљS Ђ~Ф ўB)vЛ_ }ќ"Јо:Рд|;тзш˜˜sяА‚NH?i#NedЦДˆl‰-о‹FkN[$кŒ с#ЌЫышX3ќ?”кƒt'f ™у–%чxŸЉЈызз |zЬЉј€зœЪށ’_Pцѓ“ƒђ3:y–8zbYЋю1љ/bСаJВ ЪE9іoЦ(;=#Є<э„Ф‘?Џ‚dПкњ'ЫOЯГe8К[;†X`р†!mH.$Hœ(і9l-[Жa;WРЖG}{Vи&АMN ›-ъŽh•зё“CQїљˆKM;RЃ\Ќ‚7tЭK~ }CijИZBXЭB$ОьsЇˆ Ы$Xg›ё) XsTŸктrSљSяlRЋзŠ’66№ЇŒ…ИvЕJЂ9O}_йGЬ…;аЌ—Y,\iЏн)Ід‘уиdObШЩmф4ЌX6FЋ…ЈGhЭ~Ё}q+ю›Эёе<п7ІйёWЙєБq“jXЬuё/ƒІ A|€Љ–"57/=‡.ЌфѓЄ_>?ЉтsaˆЫЋнЩF€•)#љwиФg…"Муt|е’Еž8DЦ|ЌOУ”ѕЭц'т0лњsld!X;8ыЁўї.ц-žєˆЏ.EЃфЫfбˆ>§[а№3ЊЪ[iбЅЭљoŠЋЕж:щ№Q”ЉШ–эЄQhъКЅRœ ыz ЫђV”\‹0љ­0ŽЅ—їїїЗZЕ1i +AЈ@-€+зKщ}G­Јьь_’ƒ<б—FzОB[Э„TU єNДŽЛ §3љкXВf йјˆaWм э vм -пЧџЧ їŠЂёё‡ Ѕ3–šdђVЌ/гЅH‰DKдиdB1!@šыІЎъ3јU–КЎЩ_]OЌ‚ЫŒRƒ§нЊхmгDЕЁ/ŒљBПЯЏ cjоˆЯ–шњBўfN7ЅaйПѓхf1­8@~Єi9ŸФmgЩeсЯЃ8ў2uОќь!Лe+Ы•„“RIўя‹^BћуЄ5ГЌжќежхџPKЊŽтN ѕUPKjBчP settings.xmlэZ[sк8~п_‘ёыNŠэ4ta:цN“АСПЩЖ5Вф•d љѕ+шІw)ийvІ<–Ѕя}ч&ИљИ №Х2Ž(ЙUДwЊr‰G}DцЗЪxдОќKљXћу†ЮfШƒUŸzQ‰ИфP9…_Шх„W=JfH.ˆЉRРЏ@^^•†ь–U_ЯЎІТ6#+ŒШѓ­В"Ќ–JqП‹ЏоQ6/i•JЅ”онMнhrЌЈ­оЏDQJПJlfЄТtU}_к\+л•ЏLЃ+Еv_Лй>Ыцу $ЖЙи'Њн*Rdu‰`ќХjЪЁu_ЏБG.†ƒ`DCewSЌCyЁдд›вЗ ?|gЂф ђХтДІъЊ~6|Ђљт ъѕъXєЫ„—ˆјp§}I0>МGщЩ.Ж>F_їќ=%Й`’J-ЁƒіCš& {zŽ€ДЧ)њѕ’:Оv§у” (GBВzШдзЇmузШOIrr—2єB‰и 1д‡ћж_PvП!Ш+ }OћђєЯзњ€ox-aŠn2Я0Я‰оПг7ч˜Еƒ5ГЪ™ИљЦюj AƒJƒ‘DЩ•б Ј pДКMЇкЬaZП‹^>мZаИУа~дv)ХЅ&XOtтIcBWтQ3Lу{8о:Kж `ž!ьРрыЬ”u;M!Чњqš\2ВWšEЮsЃЛ€e Ў~ѓљl>'ъВhz0˜”'№э1d4еŸчя< ~ŸŠЂ ‹ёјЕA1eщЂ—Џt§КœУЖ`”.рRѓ( &ЛјВ*DˆЕ€PШ@Sz?FBіаZ.Хм‚ћщ=!)уЛВxРI!ƒc‹$q3“Ng8Y[„#j.р>ЉђА–ЯДiД “`B.Щ•йWhњ‡Ѓн>ќсцтLx+r}ДDбўЉяхsoTй§Њuзяюђџi эЮоЊ НGфy“nВOьўЩш ћ7iС m:ŒHаР^TL~пЦ{йзGћGь.рАќОŽ`kЅЖ4К–t<ьПєДуч 5{8~ Уqг[їGп:1ŒCџїКe +љєх›TйiЋO–БjњLЎUgкЋлИzј<ŽAEŽй‘/ч€I%иѕЅGЬѕгЋ Пє:{/ъ*љюvV П3Ў8A›{њјЮДзŽŽ#ЇгўлŸіU7СiЊё}гр8оЌЉЌŽћyхсѓ№ЮыіЙ3uА+чI}žРФ~€?;ЃŒtО&}<wуvН5д+R?ћ}њУ№“KъšпюsїjX~вл/žnЋђўТŸšKЃej^g…a3lљгК”Еxt5Ss'ŸИ3ЌŸ&>ыИьŒТz?1вМоЉкph›3ГmG-ћiЊjГ5СjiKЇ3.?>Џ–nрЗŽтѓЈ­O @YR]tŽ<š„0LЛжлd):ZDK:ЁћШlћKпќ{Ѓ”ѕП–к?PKС]…vi#PKjBчPmeta.xmlЕ”]Oл0†яї+"[ЧIBkЕAP4qС‚‚v‡\ћ4˜Йvф8”ўћ9_]й*m ‘цЂ>ч9яy}тdzњКVС иJ=CqЁ47Bъb†юп№ц_ІfЕ’Ј0М^ƒvx ŽОTWДАBЈzrЎЄ„l6›p3 -HE#RСУ/6_Q_aŒйёІн‰5)щж;К]ЭPm55Ќ’еl uœ6Хƒ%КOгv#]фUI§ѓПx2™6; ‚яИВЖЊЅ'  щP‘8ŒЩР6ј_S лYъээ ?]`Qлжk~ГХw=ќWђm пrUžќAїсŽніЪy‰ЪIДqЧ– 07ЕvўЂ.ШAЉ]lšeГ“!!в+зX,`%5ˆŽlNЯ •хCw2P'aфЏор~Х?Dцf]2НEљЭэѕќўі,8ТїЫ\~МЖвmћнМ0UvлвgWЪ0‡ђиЛєѕЖyщЊљгˆъKc0?„SМПЧU#_.Ь…?Ÿ Ч™‚Й5хgh?1 ~ј“&o>%фаg;џPKКЖЋ'DєPKjBчP'S22Thumbnails/thumbnail.png‰PNG  IHDRеџQЉcсжPLTE'#!*%!/(".,+/26212679>86;;<=>@>ADA>=C<@ME=PG?CCDCGICHNIEAKIGKKKDJQHPUKQYRICWOIYMDSPNYSOUUUUWXVZ_[UQ[W[_YS[[[FSeMVaMZkRZbR]i]_a[cn\ftaVKj[O`XWd\[l_Xp_Raa_mf^ygW|jZabbefhojekkkdmylkqft~jr}rjerki}sluv{}vu|||ky„n|‰ty~†s„”z‡zŠ—y‹œn^„p_„p`…ym‰tcŽyg‹zkƒ{sŽ~p‘}i‡‚}•€n‘‡|–Š~š†r‰u ŒyІ‘}Љ“~…„…€‚‰Š†ƒŒ‹ŠƒˆˆŒ“‡‘œ’Ё™‘‹“‘’—˜™š˜–˜™šƒ”Єƒ–ЉŒ˜ЅŠšЊ‹ŸБ–ŸЉŒЁЖŽЃИЃЎ’ЄВ‘ІЛ•ЉЛŸАМЋ–Ў™…ЋœЄš‘ЌŸ‘Б‰Ђ žЏ ‘ЎІžДЁŽГЃ’ВІ™ЗЊКЇ”МЌšЃЃЂЄІЎЁЊЏЎЌЋЃЌГЄАЛ­АВЋГКДЌЄБ­ЌК­ БАЎНГЌГГГЖИЖЕИОЙИЖКЙИ–ЋРšЏУœБФЃЗЩЇЛХЅЙЬЊНЮЋОбЕПЧАОЫИПШ­СЫЏТгДСЮЛЦЬГХдАХиЖЪгЕЪлКХбЛШвМЬлСЏœТАУГЂЬЛЉХМГРПСЬУЛвФГжЩКХХХСЧЫЯЧТЩЩФЩЩЩТЬзФЯйЬЯвУвпЬдмжЭЦгЭЩлЮТквЪббггзкозапйгиииТгсЫкцЯнщвктноржтэксчощёсжЩхлЮукбсмишпеытзьуйцццхцшфщэщцхяшсыыытьѓьяђэєљђэуёяы№я№іђхѕёыјѓюєєѓєіјєћ§љіёћљѓўўўџџџŽр‡иIDATxкэжџOUuЧqXYWJXШvНS9&ЁVы‹зсдФ](œwзюф ”,(ŠЋаРЗ чU (“yKЎLБ/jKAp9ќR.ЗД{ чѕ^ИяЁkігѕ~k‘gcЯЯЮЮgŸзЮљ<і9чМ?q2[œШ`C §Vх‰м,:5ѓћ‘=žиTY уr#ЕXe•ЖeцЅ(‘Чm"K†cRygП['чЋЌrщхѓЂdœŸTнБНuггЏa‰ЪЊL9P-dЗХќ]Эщњ:§g9ЇђZyuўв§ЇњcЁHЇA.nVљЛкўФ|_ДЬўOc^ЋБРyьяCн66A™ў“Г^MJе{пxї!<ђЮУP=ЏknМ?ЬrMШ]7FКјТ„M~cx•NNфе7Џ7ј­Цп2CЊzM=RST=ўI^4П7›nGF oзюjШїь(ЈэпЛCњ/E,ІбщНЄDи6™Šюю2ч{О3і„‹x ъ?Ў‘СГ'зѕєЦїkУЈМ9ЮЄmЯv=Е3ћˆVJхO<л$šЖхл^?šx*§Xnщkг‚3/ПџоњЧ%•ЏmžвЕА1щzЦэ•#A‘ŒђЗпTdгщЊYmяlHљ0Ї4с›єС0‘ ЪБПёєБgіЅŒЬ8’§eHе\ЯЊ’„-ђ’~™aiH•4ЭKѕшхЧЌUЙSЫъdTY]М<8’h0фш$гeЗщХ^ІШ;—G2]зЄIё™*­xХћC†ІdХб0Х#zиѕ[ФfSМVяНVчІ[у6i-3›žЋЮ ­JЋMб˜­]dŽ?lЛ§ЫЋС‘ьќТ­ŠЌЖлБЄіЭ›ВћAеЕ5SЋ5‘жjAстЗєО3ЙOZ_МЎZч™”йцY›5жi}Щ7R,‹O…TuHћЇГв-ŽJwwШ:wЙbHtэimqмЊМ.эUюрˆЏЕХз!нО_ЏъZ‡Фё“_ћРNЁлwЫyЅъИЋ3МъЯЏкЅS†ћ~Љ86гцPмUчЏ^ ЬЉЃЯ]uш?еЋЅџ.ИЌќћmћVЈP…UпzБcB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB…jRДП1Р.9ŒхN IENDЎB`‚PKjBчPConfigurations2/accelerator/PKjBчPConfigurations2/statusbar/PKjBчPConfigurations2/toolpanel/PKjBчPConfigurations2/toolbar/PKjBчPConfigurations2/progressbar/PKjBчPConfigurations2/menubar/PKjBчPConfigurations2/floater/PKjBчPConfigurations2/popupmenu/PKjBчPConfigurations2/images/Bitmaps/PKjBчP manifest.rdfЭ“Эnƒ0„я<…eЮи@/r(ЪЙjŸР5†X/ђšоОŽ“VQЄЊъŸдуЎF3пŽД›эaШ‹ВЈСT4c)%ЪHhЕщ+:Л.ЙЅл:киЖ+šёjƒЅŸ*Кwn*9_–…-7 lЯГЂ(xšѓv„нѕu(#к| а‚5r4ФNЈш8КŒNSˆ T:dТжX‘ѓЈqюЈчš хUм”/вѓБsн›чƒdёtшсXм cЫѓ‘ьяˆ'z`C}•ЪЇGmњЧIірЅ‚C`Z •KТЪЙMпhTњскѕ:qЫўНјн/PKNДЮt2,PKjBчP…l9Š..mimetypePKjBчPМѓTќ Tcontent.xmlPKjBчPЊŽтN ѕU ‰styles.xmlPKjBчPС]…vi# settings.xmlPKjBчPКЖЋ'DєВmeta.xmlPKjBчP'S22,Thumbnails/thumbnail.pngPKjBчP”Configurations2/accelerator/PKjBчPЮConfigurations2/statusbar/PKjBчP Configurations2/toolpanel/PKjBчP> Configurations2/toolbar/PKjBчPt Configurations2/progressbar/PKjBчPЎ Configurations2/menubar/PKjBчPф Configurations2/floater/PKjBчP!Configurations2/popupmenu/PKjBчPR!Configurations2/images/Bitmaps/PKjBчPДїhвƒ !manifest.rdfPKjBчPNДЮt2,Ю"META-INF/manifest.xmlPKeC$Spreadsheet-Read-0.91/files/attr.gnumeric0000644000031300001440000001344414374657065017656 0ustar00merijnusers‹энrл8–Чяћ)8Jэ\dкЖH‘”ЌN”ql9жЎПJRв›дTЉh –8Ё I%ё\юѓьSэ“,RI2A[_внiўё;Žшн‡_SGљ<п†юћŠz\­(РТ‘эŽпW>ї/•­понiѓOш}€№Л‚ŠИ~%НЏL‚`ж<9љљѓчёиOgЁ7>љЁVGСЈх§хлЉМ?k$—V­Њ'џ}sнNРд:В]?Ам!@Ѕ|Лщ“Фk8ДR7юЅNљЃJы7E!еќоŒвžСснREЙБў =єICm4аm^ЮпБЊЃУ“ИќYxіУ<>NЪ&†iQЊkMAkб,_l№Гйє'№ч`=ћпа ,gр=ш8–їю$.‘”јa9sаъw?ЗУ сqxсЦ• дб ьсnдХ…РIƒРz№ЗRXѓ†p:s6­­TУі35Ц0Ѓ•И<ЛюхЊA&‰Xя;јјhКщ!ъ1np4ѕЩ№дћЪмs›ађmŸдРoУ&œwQЄ™Ьн$DдЇл§Юъеъщщщ 9ЛШ:ЦљfsЯ!ЙFУр|џuТ“E^\УМ•Тy“U‚ЦТйУJ/†§$<Ў(бЭ$†=­Еkt +Ч0FУцаVНжй#dЖ‰„Dž‘…@hUе8Њ6Ž4ЕЏж›еFS­~#ШйEnRёЙМЃxД]0RH Озї”y6plМJx‚? žfшДЛуJыО{wўЙ{І|<ўrќю„RЬw­БџиФЄќЃ‘эOŒЫ!“u€хVZ–уƒ]ШGƒXѓ%РpюйЬyt TZеgѕ ZdGаЊyT­Uѕ>ЂЉЭЊў-’HgLiиЎи–sД0“йАz•ЪžЪuoПџWѓ н‡GhO,w FыkKrНоФђРш‹_чнIІCХ Љ!)~јž[ЮpюVEmwn9]€ЌЈ“З]ыСx‘K@žэПтЅTQО8Ёъшa?FОzшc#шZ#ћзћŠ^иc;@eZТ шMnQ[tмј•су Љ/t№UЭZCЏ„.ќIЊЁ7ŒКYiЁѓpюEOКИhaЙKшM­рЕдЮЅ"ЏW=4š3Ф2Iq“’K|™€їЄќiьАi Ф№ иуI€=5#KХЯжOЙА§™c=сжAЦуcЙВGр№`|№ЩГGёК“+`€Ї [IЄDŠwѓѕ7рS‹zOгд2вЛaНQњлЗlFя+ŸnoНЋvЛ?јвщu>vЎ;§ЏсЧыvEСUУ–‚ЏнDџTR~iХ”!нf]д P†V#<e2 LdРGЩ п œЖд№4љœ­ПHIж*NJ::їшљ Юа№F;6чцMЗ}љЪЙId›AпЦ=Йuе-NXж†j’gkHЌfаЗ<[ХПўkƒ?Ђц^НТЫ?еюЄ%;ю#щѕiЃ7Fs&Њœ)їEv[GЃмН?ЃЇЮћЪtvІTіp*RТAœпаŸЭяс>!R`Bzb\Ђf>[т"g:_‰EШ4^8ž`E qшa;DƒЃ5F>ЫђsјŒ9Щ”ћЯЂыЃР#H6УфЙ c4№Я‚Риш:O?xr€ЯЯ<….šњzhXхчybШ=рОБтh…Іrh ƒš›Ÿ‹œxиWYdТс}Зsл†У^ћК}оямнR…Ё‡L 5tыб”5LЫцГ1в?fа <ЫЙ—gвeТ‘^ЙFvќО‚ЃЃ‘№ЇhєІ*sšWў3 ™LЫібlS’’Ю…&ЁdЄ ‡ЭL†’-t~wsгОэїлС§ѕйy›6 ЯƒžЏqЂM>ŸљI…vЗ{зэ Юzƒ‹NI|m_,5ТjёЦ˜А;KЫіœиcьЃљхhp$MrаХOEE-вбЧ(•ъЖDKЙ"žHXёЋГыЮЇлСЇіmЛ{vžЂ‰s_Тsяњ§Л›ŠђЇgЭњрW@.в› љо‡—vxм…Aф%’“ˆ7љ„}7Ьq ‡пСˆ<Њ‘€’I*r"Рт1Ќ|Д†hŠ{‰ў4уПаРbШмд[ ]3TOр"ŸгIнjlDЈГ„#’ŠХЁ:$РrьаХ§ŒЊ‡]ќАВ=4ећњЈ+ЯЧ“0eшй3R§ж™‡f!C,œjк“ИmГУ^ž8V•‰UнЌЂ$K“е˜dЕ§![m6Њ I–&[c’­эйjФP’M‘е™dѕ§!›%)љІјLОЦ>ђ•УrЎЩ„kюмЊ$Ы&[g’­яйsєGŽЩ,И &мЦўР%^rќ—ф›с{Кф‹ПцЈ%fЙфKŽ=zњЪFXхDІдŠLЉ/РJŽЈЪКѕ˜T~ Ь˜дa3е˜LЗщЄŒhдa3­1™n=%6№R>ёa3е™LЗ{йЈУ&k0Щnнћ-BVТЬЈ“КCQ'‘AX2Э0­3™n=о$Т”o:lЌ &ж­Gšђc]i:8В'Ёэb9е9X *ш‡ $гdB+EB2M† ДR„ $гdB+QB’M† ДВ„ $жdB+EB2M† ДВ„ $жdB+Qт0Щж8!ˆZBе|­ЅЦ AдJ‚8xІ“щ^‡ žiЩtЏCЯTg2-AтрЩLВћ‚8xЌ&ы^‡ žiЩtпCЕСФZ‚Ф!’е9!}џC‡МОFч"єR"$Y:Ё—"!ЩвA НA I–Mш% MHОt€B/K€BТЅУz)Т’,ЌаЫЌpщ…^ЂХ!ѓ58 ЃL‹ъ3U™LKЕ8dЌk)B‡ŒЕЦФZŠxХ!cе™XKЌ8dИnY"‡Lжd’-E˜тБж™XЫЃ8dВ &й( ЎЩ‰N˜ћЈJ *ш‡&$гd\Т,E\B2M%ЬR%$гdDТ,QDB’M†#ЬВ„#$жd,Т,E,B2M"ЬВ"$жdТ,Qт0Щж9!ˆzB‰о{АLU&гНŽBHЌЉ@DН$‰5‹Ј—$!БІТѕR…#$мTDЂ^žˆ„$› JдK”XSq‰zyт’l*4Q/Uhт@с68б‰ЦўG'ВЄЋЪФКЧ I–ŽQ4JЃdщ0EЃa I–ŽT4JЉ|щ`EЃ,С —ŽW4JЏdщEЃ,! —ŽZ4JЕ8dОЇœР…jжЛДjUnšЩ@›8сЧi8 н Џ\€Gkю=ћпр>№‘sмЈœЄr!Дt.U;Ў™Œ=р€!Fт+чsЯ‡оbiWxDЙощBЂЋБO2З_<}‹РqќЬ%qšВ0e"ŒўџХrц џ4C`Lдјж<€Ё0Ю§Ќ€J x`$P^ЃЪ=\…Ѕ№€ŽtJрчФD Jс х?$LJ “@Д1ъlСi0 XO9TЎYхГ ѕ…VЅr­JЌ…зЂrމ5ЎA аі$(PјAWуZ“ mL‚Д- аІ$(@[RNkHyНkIЂ Д)‰*аЖ$ЊPмkвЙж$Њ@›“ЈmOЂ ДAхU0И•л{4И&%,Aл”АmTТДU KМР7Иv%,A–АmYЙ%LЎi Э*LЎy’ЁMЌ mf…dhS+$C›[!™ЮџLЎй’ЁMOHІОкќr>qыЋ­OP…c|‚*лTс˜ž  ЧђU8†'ЈђВИC}ЕйхTiЌ˜<цŠ^4И'(Рš: АfŽBЌ‰Ѓkо($Рš6 АfByЃXЫ”tЕ7 ИЖžр8`пXПњі4Ќ>шРУЁђ*:М…ю-ЋЛА§ЁG œЭиZN,‡Њ>э†rрњv`џАƒ'’U' у:G ё1ж9жфЯЫ'2Wі|Œ>yі(>@ xЌ№тдД‰”HёnрОOjєžІаё?'ŠЅгЛИG‡}ЬіэлAї~вЛjЗћƒ/^чcчКгџ~МnW\Едw)ЗжДТ/)ТF ЩЈХQё–žŽŽ2а§ЕдZœ&s|ƒpкRУгфsЖйX{ВqЂ‹я=л gАB9—•ѓЖмж›nћђ/aЎ0!›mБ-@Зuе-NШ|;’ЎЮ35$V3шлž­т_џ5‡Сaѓ‡Ÿ_НОЫ”t% йqЩЕщoєn,olЛ>U‡Ю”{ˆŠ"Г­kИwЧ№ЛЋщtйЙуь0рTЄ„ƒFŠ8ПЁ?›пУ]BЄР„tФИDЭ|ЖФ#„AЮ‹.iМp8СC’amМ!pk *Ъђ3еRrФ№Yt}b‰AkyGЯeЃ!€ќюР~@зyјфћ>~ц)tсpтС)рчybШ=рЎБт#8pa0˜aхч"ЇžхŽуšрq№ОлЙэGЃaЏ}н>яwюnЉТаC&а ‚ Кu/„Іeѓй˜ щ3шže‹мЫ3щ2с@Џ„O<єРВG#ќ$Њ(брMUц24Џќf2™–k €ПqŽЦ’˜Ю8„г)ЊЅЏ ЧЭLЩ7мЫF:ПЛЙiпі{ƒЮэрўњьМM[†чAЯWШPб&ŸЯќЄBЛлНыіgНСEЇ‡$ОЖ/В_Ађ†™АGЄО\N&RяTѓНKАѕ…ђ]сзDЊœ…еZБ ЌеуjЕ”L5&г­/игаЉћПџљп№У?”7ППyƒAŽJ‰КЦDНѕ5›@=8Ђ`ПMрўcхљpЮ‡ŸЂ3>™П—дvtІэl}еХ&lgt2-%Rƒ‰tы -6tвœ–“ЉЩdКѕѕ›ђаўЃ”PыLЈ[_ZБ Јo”'J ЕС„zЏлуžкў[IчSЇLЎЇ‡РѕяЅЊVйQƒˆfUq_ џ-gwU91­ƒjН}Ц<аеъяU‚љїЗoЫ ZуЦЅеЊо0ъ1ё)YtZхDЇГ€%к§F›ьЛ;ЙЌ.БЊы*ЌњŠ!y7йЪ.›{4N ЧZAЧъМ}лow%з-sеxCqКЯюшp,бЎ@[уuйьx,]Ј„›8‘oˆŒU lј§хFЗ€o№Д†7‚PЎ,o„‹тVЮО|”,W[”Cђ Я'ѓЎЎPЊ†+і Ш\ хŒ/†Їq-Ќ%я‚X?§Bs/ 5Е—EЪЮгЅФtылЮBG6Єj5нШёв8{ч‚" єъ)№Ц/Xў.R ўђїЙыб ‡{ЭДH5ј‹І'ФжWЏ{}Ѕˆ{]zEШ:ѓЉЋ\^N%R ў"(лWr#a/АЉЧщЫ{й+tѕWшыќЮŽЮ+jMiW•ПэE8n+^ЎUŸ*у ёКа+ˆЎrk№7]ИЖќ ян№ї=ћŽˆ}7Є&8gўA7d]‹ьГˆœk}TЕцЙЊEЏа“$f6”‹•)‘”НLј”•+’іgEёъё ы/\”ДЬ з$ ­IŠШeIЄ„\–$—%ЩeIrYRЮeIUЙ$iiG;жЪuНK’њwї’iЩ–$-ОT’Xхђ#‰uзW§чч^ПsљUrнцђ љО\IЋМ…њХ<тыіe_2н%І*“Љˆ;Ьe*}снyѓQФц•Ž№–˜ж^ќ6ЋxwЉЮd*тs™JxƒP5އЄѓфЌЛG•ѓОжыP•^в–_JжŠyI+J?iKTkLЊ"~’~wЊЮЄ*т)­ *}Ѕ b­q|Ѕ‚[>v;ŸЎфЌfЇ ЊLЈ"ЎЊє”ЖATcё”јDЅЃД%Ј5&TGIŽН;UgBё“јPЅ›ДAЊ:ЧMв‹ЙI—kљEъN1U™LEМ$.Sщ$mЈЦ*т$qJiKLkLІ">’xwЉЮd*т"q™JiƒP|ПrЛякФ‰злƒТ05=Н…rчИщ5m-_[ЋЋ9/s“ =ЕЩ„ž­k‰\нњv˜Р ‰­ys,EЎrWŒуuyєў)Yз$ AЏЈ&k§шѕд6k)5%Р^{8(_Ие—7ЃњтfT_кŒќrпЋœ-ЉНМ%љфmIўv9[’ПWAИТV@ЂpKж^о’ќЭђЖ$Ћ„œ-ЩоБ ќsюіcžпnе_к”њЫ›RqSъ‚MЙL‘ћ=,іnПьњŒ]pBДЛƒЙXФЮлыa™Aюѕ јћГЈёх>Є„мчAюѓ їyШБЯƒэУmЏ#7y{—юdм(?жўвЭbХrCфm+7=Й7@й_“”O0˜иУ2э ё.№zЎЊ)ћ[л+ СWю№Њ|чC{d)чаѕсbі(VДt|{–ы/У›…\ч~ё*7ќиW7:Ч†rvФРЊюж—o!Бюмьш•7Œ„wkvєЪ{GHМ;6;R9Г#UЮŽжФwГГ#•3;Rхьh­|7:;ЪБŒtžWЯ‰дtž_yч‰uчœчWоEDо-чљ•З‘xwЬyж8ЮГ&ч5ёнЌѓЌqœgM:ЯkхЛQч9Чц@вy^=CкEчљ•7“‘XwЮy~хe$снrž_y‰wЧœчЧyЎIчyM|7ы<з8ЮsM:ЯkхЛQч9Ч–QвyyGн чљ•7’XsaнЄѓќЪ[IТЯоЌѓќЪЛIМy№nаyж9ЮГ.ч5ёнЌѓЌsœg]:ЯkхЛQч™З›˜!gdsOоd78ОГ!}чѕQнЄыlp\gCКЮkМYЯйрxЮ†єœзFwƒŽГСqœ щ8Џяf§fƒу7вo^'оКЭ&Чm6ЅлЬ`Ќ6іФo69~Г)§ц5bнЄуlrgS:Юы!МYЯйфxЮІєœз‡wƒЎГЩqMщ:Џ‰яf}g“у;›вw^+п:Яѕ|П`!Aяф*‰Џї jЕvlP;g&ГЊqVоУ4™Q[jšЯhж–šЕ•ѕќѕ4YЭ*ў UYЭXѕT=жжўCЕcЭˆœCЃj–,ЗЁV_™/n@Mc4K2gм‚šО2Ÿ‘Rdд6lœœ?%RK§”ШižŸIН2xЪ|e№tзJф є&љ6b$шMђqazЋќљbˆP1(S™сMЇ4LJCmфсџМIb.ј'Ђ 4]QЎЈUTF*Њ@ЭЋРџ•vјЂря­М@ŒУȘw11љbb#(&ЦБ11ўЯЦ0т=ІЈmE•h‹(ЊD›CQ%кŠ*б† ЊФџЩVxЄр/п–bлA!)Ж!’b[B!)Ж)’bл‚”С7F,%—УŠJ1ŒЁЈУŠJ1ŒЁЈУŠJ1ŒATЪ|ЮшРK.=ЎEдуšEA=ЎmдуHA=Ў•дуšЪjНeJ‰~ё+qHюŠдѕsчТ Ps™2ѕ­|Y$цўzп ќоњэџzэIб ЅSpreadsheet-Read-0.91/files/test_x.csv0000644000031300001440000000005010313232324017131 0ustar00merijnusersA1=B1==D1 A2=_B2_== A3==C3=D3 A4=B4=C4= Spreadsheet-Read-0.91/files/example.xlsx0000644000031300001440000001261713502622245017505 0ustar00merijnusersPK2дN _rels/.rels­’СNУ0 †я{Š*ї5н@ЁІЛLHЛ!4Р$nЕ‰ЃФƒђіD ВУŽq~ўbЅоLn,о0&K^‰UY‰Н&c}ЇФЫўqy/6ЭЂ~Ц8GRoC*rOJєЬсAЪЄ{tJ шѓMKбчcьd=@‡r]Uw2ўdˆц„YьŒqgVЂиМ„Mmk5nIz>3тW"“!vШJLЃ|Ї8М e† yоe}ЙЫпя” 0HM—!цюШгЗŽ!§”Ыщ˜˜КЙцrpbєЭМ„0gt{M#}HLюŸ3_J‹ZžќЫцPK…š4šюЮPK2дNxl/sharedStrings.xml5ŽСj1 Dя§ ЁCn‰З=”’xh!ї@ћbWЭжВkЩ!§ћ8…‡сЭМЅЎ\5fёy7 АLyŽrёыѓД}CP#™iЭТ#ўВт1Tл))xVd’8›™ €y("‡йQУ9m@ ЪOєA‰Аee ќЄ ‚Xк-ўКž›Н‰œhіƒ [\8уG‹ю{“дtўKPRdЎrjbоСˆ˜§x?ŽЦЩdѕЂe8ш…сzдћ0Žzщ:MivЩ*™І?IYuFOrхoбаoђхцBл=Чl}ЮA.'ŸвЎoGЭяTБјPK`:I‹ўrPK2дN xl/styles.xmlэY]Oл0}пЏАЌНBвв/І4Ј:MZ&4ЪД xpЇёpьШqЁхзЯŽ›4щŒA˜šЧзїм{rьм:Ўs4‹)ИХ"%œѕacп†3Ÿ„Mњ№b4мыAJФD9У}8Ч)ŒЄL>XVъG8Fщ>O0S#!1’Њ+&VšŒ‚Tƒbj5mЛcХˆ0ш:lc™ŸO™ьУvaІљ(n&м)•˜a(Д6:ЗЋЮ—яїZісѕрjЯѓМ-NђC]ž7lёюnLрYKЗ€zUч]YƒСUАBИNШйR4зIяС-Ђ*R#K€blњŸБ”т#—QЃ NFz,D1Ёs3jkƒ!‘Њщ2ј,›‰ЙйЎF>ФhМАŽ№Yј'њ6чˆЅРуŒЏF:јaЦf@Š)жcеT>Ї\1їсphЋЋg?'ƒЌбЋPZЌ†&4зI”XАЁъ€Х§hžЈuХдЛjТd~Пёž4o4л%@жЈМc.UђЬ ˜›@@а„3D/’> M1,L~ЧrЃыPJXIЄ[ЩK‘’Чъ&Чшд&rqЃвћ˜вs]hО‡ЫЇЗUаYИ^XжQѕKs_мšH‹J:r$›Lc8Щ\*ІcJ&,Ц+Žg‚KьЫЌNffзAЙ#ˆИ ї*ДžРЩЂ.щВ*‰ЏMцy!x&Пr‰LХщN dЄŒ…ˆ„Yb5–F‚А›’bXЩ”4хў r’ ДфiЭТЅьЅNЇъДрЙ*Tй\V*_o‡LsGf ™'П[;2;2;2;2;2O!г:Јг/eЋQ+6­ZБiж‰Эс+“БЪлwГ™/эуЛOнЦЯТuцe>I§­эщ+ВЕ'лѓMјлS­§Њmљz|X4§С\VЬWXд@БЮЄ˜ЩѓыжUА\ GН–/"YЏЎ’eчWuTЌT§лЕRl}‘Н^%Г›в‘bхpНА}rл‡_є=-Щ6ž* 3=kpЪухўvpА.эыдЉ€:AS!0ѓчІ[СДТTrѕ*Ию&мzО Шab‹—bЊЮђ!їPKˆŽPVPK2дNdocProps/custom.xmlЕгMo‚0№ћ>Eг;PPT `4;,™ёэо•"dа6mu3ЫОћЪЭNK6эЉoљџžЖi8yЏ+pЄR•œEаЕ”ž•lСэfa PГ WœбžЈ‚“ј!\J.Јд%UР$0СBk1vE Zce›efVr.kЌЭPюžч%Ё)'‡š2эx rPšз–ИФС6o|дЬ8iЊSЛЭI˜М8<‡Ÿ@^ы2‹рGъ'iъ#пђцAbЙШYA/Zh„7ѓ’E0B šЭ зцфS!vэ=™ШЃWтMiЛžL ыTшtт?э^g'М˜~РЫеsВ]MСЬойwбћnЎwMЩA–њ\Aйл›ЮЭ8ПуЭГЩЊdЏ*)0лгЌE_8ЏЮьwїf№ ƒŸs+6<ХšоvшšрŠ&&ъЮршX6?цwЯЙ~ђј PKЉOŸW)PK2дNdocProps/core.xml}RСnТ0 Ня+ЊмлЄ0DЅHlB; iE›vЫRam%Тп/-Б&х`ћН<ћХIЦћВv ЈфХAH^хBЎFh‘MУ Œe2gE%a„`а8НKИЂМв№Њ+к 0’†r5BkkХи№5”ЬDŽ!ИЌtЩЌKѕ +ЦПи p‡>.СВœY†СPyEt’ЬЙ—T[]Д9ЧP@ вG1ўсZаЅЙyЁE.˜ЅА7ЉgаГїFxb]зQнmЉnўПЯ^ц­еPШцЉ8 49 BЙf!œ=Ж;#oнЧЇlŠRЇ1нщ 3ђ@ЛїД7ќH№Ÿћр1ЎtњЭ@‹ &к-ІсzЈЁх`ИЪКІ-јЋрђ‚Щеж= 2\Ь[Š/5‹-˜Б3ї–ђЩсЊн5УЛ-OЕэЦУєУЩШ€Ц}JzvЯэvЂљ—iм6ѕiуСl?7Рэб O\l…-рX>‡W5§PK$0EѕyїPK2дNdocProps/app.xmlM‹Т0†яћ+J№кЄ)"iD]і$(Reo%›L5KѓA“Jћя7юВъйУРМя Я|ах лф Wж”hŠ3”€V*s.бБњHч(ёЩ[k D#xДdotпY]Pр“H0ОD—м‚/. ЙЧБlbЅБц!ЪюLlг(яVєL y–†F‚Lнˆўˆ‹kx*­ИэчOеш"б ДkyFЩ#­lрmЅ4АiДя‚Ўœk•р!~„mеWЛпЄР9žХШ&[eњЁўœu1KžZъxФ7ˆл“uЏZ™ц”<ушЦjЧЭШі‡нцxX%k|Т”ќЛ”<оЪ~PK,3Ќ"џ›PK2дN[Content_Types].xmlН”ЫNУ0Eї§Š([ЛeJл%TЂЌ‘Б'‰iќэ–ія'‰њP#V–=sя™[ЮЇkU'+p^=NGd˜& ЙR—уєeў]ЇгЩ Ÿo,јsЕЇUі†RЯ+PЬcAcЄ0NБ€[WRЫј‚•@/‡У+Ъ CЂG:Щя `Ы:$їkЗЈ>•ˆжgї ёЃ ~Г9m~щЩ'PKр YgдPK2дN…š4šюЮ _rels/.relsPK2дNдmМВм'xl/sharedStrings.xmlPK2дNO№љzв%xl/_rels/workbook.xml.relsPK2дNŽzyƒЊ5xl/worksheets/sheet1.xmlPK2дN`:I‹ўrўxl/workbook.xmlPK2дNˆŽPV 9 xl/styles.xmlPK2дNЉOŸW)Ф docProps/custom.xmlPK2дN$0Eѕyї\docProps/core.xmlPK2дN,3Ќ"џ›docProps/app.xmlPK2дNр YgдQ[Content_Types].xmlPK €љSpreadsheet-Read-0.91/files/test.gnumeric0000644000031300001440000000355613223172672017652 0ustar00merijnusers‹эZџOы6џ§§Y&э7к&myAЇ)T*ЕЗНiŠмФДIœ9_о_ПГЄIк>ш6щmZ@BёљЮўј|wўœФЩO/a =a–ъFЋЃk8ђЈOЂхЉ~чŒŽєŸN–Qh}ЂьqAщЃ&QbшT_q[эіѓѓskЅ!fФkQЖl?–Я}=г}IHEїЙ+ЕЬNЧhџ|=™{+Ђ%EЋ„X‰NЈ‡ИФЖsЋужKтыƒš&aоЋУhvLНIзЎбя”С— Ÿ$ŸнК6Jƒ@œи0[0lіCЮYЄ'BT*Y&PˆЙ[ю ~ЖЌdEŸнeф 8 мФc4ˆД ‹ђO(HёР™нйJAеЦэ-;џ4pЛœxџ,хXˆ\ŽЩ7сSЅœК у‹ањ&0HтЦ œсqьРh8™П AM$Ѓї„><УЁ=ؘˆ„˜Ѓ,'едЉžВШЂ(!‰DXмГhŒЃмФ*k[В@d9шq[VЧЧЧm9›Ћњ^ЁЇ,ZОзЦ;$mHТvЎ+О”а-CЂ” u:/5НЖыZv˜Rй3ѕЬЏй”XЙИ пГ|N6;ЦбAЧ8шtЃo™=Ћg~>iчГЙЖх1,ЫжС6CУ2ŽСp‹bvЗ5… rEС:G—r(uQŠ‚†tŸƒcь-<ц˜eeTжУ—B€Єz…РЁ|E"2:-ЈЯP(Šј љфхT7ГсYЖ§nЉrЮWѓ)мз8ђёK)+Š MтЅXš§C]gє†‡§~їPHMC…raѕзW2џБ•К[VЊ‰ŠSЫѕ/1…[bЏк'тsёѕzрц+L–+.–>Њ;.Љƒг.HшuDYї›ШћМ">ўŒ-—ŒјХŽq…‘Y!“”$йŠ7)‡єФ‰Œ†l0 р„3ач-ђ™Т ђ{’ =е/ЇзюќЪЖї~<Ÿ'cчѕ9БuM@DтСэX№ЋWЪ›єbљОЇѕq цуHЭgУšpа+ФЈЌ№™вp­/Пы’\RFUˆЪѕћ–‘ˆЛCШзЭz]ЋйпЯьбw5ЛЄг„ˆd 3l…`fУ'o"”ЮtТќ&ФўH)џQЙ_}џуxз’ЄтvщШqєajkЈ[dK`‚8Е[ І"lMц[†ю"Q†*™*њ Ъ9 ї2 №/ >šoъ3‘ћЌd*юcё@$МЯ"O‚šћTAkќ5†ВcцС#‚–№ЎПе;аЎй=‰Yи_†…(!u…е[ K(ЛgёŽ\ђрв(xuўрdЗrH# є ъъnŸ!ИУг\$ЧWЖvЈИ{З–œvс•\HD%МЇŽ;*KdжSGgx)шєЇŒУ#$S9˜‰зR6ЭО”›§ОHЙ }}#ЇхŠке0 ЫHСПNЦ—SївžкГсоивмНš;Лqœ›k]ћФPьр.wЏр85žQžб<9 ё П3‰”єги—9аK)P œ?вкђ€зрЧ*ў@еAB$ЊМчТм8qЄ1ЈЕ-Ш$UЎ Б8 ]CwLGНxLp ˜Gь@žЇЫ•’xŒФў`ŽЂЌmыV<л.\[/‰ЅЌCѕОOr"Ј]р”|NОр[Qu{Gz-(@M‘6ЅъXъ€§У– зNSсmГ{bэЪf‚fnlf˜­§’Љ ­’'щКvžВ„2kbc5”бжЋƒ,ЌJqkTЗЗ\ЃГŽл^љzџЊГpдгEШД<+ђTЙEв‘ЏЯ!мbЮ"„ю›цЦ†љй>цн ѓ‹ї˜ЛС›{˜oџssїюн=ЬЭ ѓѓ}ЬЗИю=цннр{{˜oqн>ц[Юўѓ^Ξᆧd8wFc{rБЙЬZRMЩЏ'ш•І\shЌозЁQЯn<Сы{M}Јэ$UЅаИ‡Хš‡„ JоСKЮУ)Іx)]žЇzНaЪЉЄ}љrK†Т™*Ј8є§ zИY‰п”њйџm/j~Н=0оъEKM3К3j6ЭhгŒ6ЭhгŒ6ЭhгŒ6ЭшіfДJџfYm";яi"wХ[Љ…ььгBж`6Єљ?FšЛ iўІЄЙлц†47ЄЙ!Э inHsCšвќ#ЭЅЁњЗE1М_ Ž4хь;h‘- ДѓЇ|јђЌЩыФ,Spreadsheet-Read-0.91/files/perc.xlsx0000644000031300001440000001710611130422501016765 0ustar00merijnusersPK!Ь~цЁNп[Content_Types].xml Ђл( Ќ“ЫNУ0EїHќƒх-ŠнВ@5э‚ЧК(`ьIcе/yмвў=“„"JEU6Б"kю9s=™mНcШhcЈљXŒ8ƒ ЃБaYѓзХSuЫŒr1@Эw€|6Н̘,v QuРšЗЅЄ;)QЗрŠ˜ аMГW…~ѓR&ЅWj ђz4К‘:†ЁTЅгргЩ 5­6WЙ<+O>rыd!5ОcAzœн…wЭUJЮjUЈsЙ ц‡k›Цj0QЏ=y‰^ьЊS‘Пbй9РГ­0eP[€тDїЮаЈЕ+ьqKшž6к'LA•§јик„GŽГ;Юф=це[ŒЋџІвб^йАяћPh{ѓJкѕй @‡м€ЉIB.ΘђІvГїkDйчЇ№{4ОєџФ@Ч ЇCиgЅЋ>0ЙьпёєџџPK!ЕU0#ѕL Ю_rels/.rels ЂЪ( Œ’ЯNУ0 ЦяHМCфћъnHЁЅЛLHЛ!TР$юЕЃ$@їі„‚JcлбічЯ?[оюцiTb/NУК(AБ3b{зjx­ŸV b"giЧŽaWноl_xЄ”›bзћЈВ‹‹К”ќ#b4O ёьrЅ‘0QЪahб“Јeм”х=†ПP-<еСj{Њ>њ<љВЗ4Mox/ц}b—NŒ@ž;ЫvхCf ЉЯлЈšBЫIƒѓœгЩћ"cž&к\OєџЖ8q"K‰аHрѓ<пŠs@ыы.ŸhЉјНЮ<тЇ„сMdјaСХT_џџPK!‡кpр-xl/_rels/workbook.xml.rels Ђ( Ќ‘ЫjУ0Eї…ўƒ˜}=v Ѕ”Шй”BЖХ§!Ф–„f’ж_с‚н@H6йЎнs$mw?у NЙїNC‘х ШY_їЎе№U}<Н‚b1Ў6ƒwЄa"†]љјА§ЄСH:Ф]XЅЧ:‘№†ШЖЃбpцЙ4i|Є[ ЦLKИЩѓŒџ; <ыTћZCмзЯ Њ)$ђэnп4НЅwo#9Й€@–iHP•‰-‰†Пœ%GРЫјЭ=ё’ž…Vњq^‹kХ=О} A”tŠаі№Їр;ЗюЄКГ|NГъ*ђн яTмЂМ‘§bSЦвф`ХNB~ œівл#хZ{QСѕЉЕ—"Ж%eХc~­Н‚<ДљЇXЩ~ё'ёŸ‰IђжŠ‹/5˜ЛA˜ћ…ФФoА>ŒЏjЎj”3„4Шfїl–&Ц‹VпџџPK!< „Њ; xl/styles.xmlЄTM‹л0Нњ„ ЧFv–nw‹эe[0кВі*[В#а‡‘фїзw${m'e›B/ЩŒ4ѓ<яЭŒВ‡“’шШ­Fч8н$q]&t›уŸћђ§FЮSЭЈ4šчxр?oпdЮ’яœ{кхјр}ї‰WИЂnc:ЎсІ1VQЎm‰ы,ЇЬ…$%Щ6In‰ЂBу"гН*•wЈ6НіPЧ|„Ц›Џ ?о`4Т}1 jI6I’МУЄШШ”_dб Ь Р„ƒ"sПа‘JРHBИІŠўЃTF„1юЂяўMbiPr&К ТA‘uд{nu šь§аK КЦИ+б­ЅCК§АJ ёƒEVЫ Яk‰ЧЃ"“Мё ‹э!ќ{гСoeМ7 &hk4•`’—ŒЩpEVs)waž›;А:5ЋжСTіЁ‹С"“9трŸ%н/IщЋIˆvJаЃј‹ї9ђ^ќG)Z­ј:сЩЯkW YГ9Ўш…Б:ЋєŸшЁSs•чытLй ФŠpк|VЩД#зЄО@ћбЋŠл2njXО?ОѕVэ>kі, Ћ•cД…ёђЊв ˆУy™Б‹o Еь%ЄXх\t aЇeот­ЇB…йўж"Н+ЕМzХoџџPK!iРRŠVxl/theme/theme1.xmlьYMoEО#ёF{oc'vGuЊиБ[HгFБ[дуx=оfvg53NъjHHˆ‚И qу€€J­ФЅќš@Љwfvз;ё˜&%ѕ!ёЮ>яїЧМ3ОzэAТа’ђДд/зDвiЕƒ;УўЅI…г1f<%э`FdpmынwЎтM“„  Oх&nБRйцЪŠ aЫЫ<#)М›p‘`"Z | |ЖВZЋ­Џ$˜ІJqloO&4$—4KlЬ{ $ЄJъ…‰fMrŠ]œ*Ю…ы"gВЫ:ТЌ€ 1?’*@ K/кAЭ|‚•­Ћ+x3'bj m…Ўo>9]N0>\52E4*…жћж•’П0Еˆыѕzн^Нфg8 СTЋK•gЃПQя<+ ћu‘wЗжЌ5\|…џк‚Ю­NЇгlхКXІdП6№ЕѕЦіЊƒ7 ‹o.рэnwнСХЏ/рћWZы o@1ЃщсZДпЯЙ— g7М№ €oдrјйPІ—1сЉZšl ОЯEЩАЂ)RГŒLpyмХЩHPЌ%рM‚+oьR(–Д0$CA3еоЯ0дФœпЋчпОzўНzўффсГ“‡?œўЬ—UќЯп}єгŸњPBs^|ўф—gO^|ёёЏп<іРЗUсCš‰n‘ctРАЭ8ЦеœŒФљ(†1ІŽЗ‡uOХ№ж 3ЎC\чна=|РыгћŽЎƒXLѕHоИЧ9ыpсuРЎ–Uё№pšF~сbZХ`|ф“нХЉко4ƒОY$ЅућnL5їtU‘”(ЄпёCB<жнЃдёы —|Ђа=Š:˜z]2Є#'‘цD7hq™љl†P;ОйЛ‹:œљЌо!G. 3ђCТ7^ЧS…Ы!NXес7БŠ}Jf"ЌтzRAЄ#Т8ъ‰”>šль­}CУђ†}Э)=єёМ‰9Џ"wјa7ЦIцУhWБяЩCHQŒіЙђСїИ[!њт€гЅсОK‰юз7‚;4rTš'ˆ~3:–аЉў›аєЯš1ЃаmМmЦэ`Ж&_Iм8е‚—сў…wOг}ЙОИёМэЛoћn№ŸяЛЫjљЌнvо`ЁїъсСЦfLN–OЩЪи@ЭЙ)Э ,aЗїaQš3")MY _ѓююр" \}@U<ˆqCv=аL"™ГŽ$ЪИ„гYіђжxд•=6ѕЉС6‰елх5Н\J6fЯ‰ЬДДІœUик•œ)˜§&ТъZЉ3KЋеLЏsЄ•&CMƒХв›0† ^РЫыpJзЂсp‚kПлИ‹‰ТE†HЦxLђiЛcT7A*rХм@юxbЄOzЏёZEZKГ§ вЮЄЊИЦqEєўJ”Š žGIюЉrdiЕ8YŠŽлAЋЙк PˆГv0s-|M2ˆКд“f\…ЪоЗ8EZІ“ œ-fSхѓhЖ Ум"ЈУ]…ѕћ‚СŽˆLHЕƒel%˜Wy АTKВњЏ6С­e€Эє7аbm’сгќш†–L&$Tе`WVДяьcоJљT1ˆЧЧhФІтCјuЊ‚=c*сzТt§—iклц•лœѓЂЋ^aœ]Ч,‹qоnu‰•lсІŽKЬSE=АЭЋЛ1юќІ˜’П SЊiќ?3Eя'p_А6жс2W`ЄыЕpЁb](‹iи09˜-В.dс5$\)›џ‚щџЖц,SжpьS4B‚Т~ЄbAШ>Д%“}ЏaVЯї.Ы’хŒLFUд•™U{DŽъИЎїіХъІ›фmРрNчŸћœWа(вCNЕоœтm–ž^S4я ž|l1ƒ<З›І№ЉЂgWЕє†Ми{Ow§љ˜е(Њ„UЖ‚V^іoЈТ9ЗZлБ,^mЪA-†Хr Ържщ?АџQ2bвXoЈC~НСЏ šЄ dѕ%;x н эт'ЛhуЌYYзцЃ“vчпяRю)gkЭЮяs:ЛЮ\qN-^ЄГs;ОЖkK] ‘=]ЂА4)N2&0ц‡­ъoO|tНwќSІЄI&јaI`=І ј­DCКѕџџPK!a~’†š xl/worksheets/sheet1.xmlŒ–лnœ0†я+ѕ,пgС$фЄнВЄQ{QЉъ)зы]PSpvгЗяиУСgеНH€Цпx ПfyїVф š6—еŠВEH‰ЈRЙЭЋ§ŠўњљxvMIЋxЕх…ЌФŠў-Н[ќА<ЪцЅЭ„PVЈкЭ”Њoƒ M3Qђv!kQВ“MЩм6ћ ­СЗ&Љ,‚( /ƒ’чХn›џYCюvy*dњZŠJс"(И‚њл,Џ[К^nsає†H#v+zЯnvCƒѕв чтиZзDёчЂЉ[ш%zgЯRОшР/№(„%[ —фЉЪ"EБЂ DЗ $ С@Y/Чыžјhњё­![БуЏ…њ.ŸEОЯ ЃХUЌЫLeс№—”9Ъ9%%3џљVe.Ђы˜Х—QLЩГhеcЎѓ)I_[%ЫЇ.JЏрbІІЎјzйШ#VывkЎŽнžУS§№žСеaЭТ0\н Ў“PvEг†ІbЈyy˜Яp:КЧХj]ц 90h™gsz›‡5МwC’йєFGїАШед6jьТ Лш;щ.Ибб=ŒЙZ‚ZзЧAs`pрžХO7Іƒ{VȘіUЄйЊУЛєђ.ЛN5b#u№Шлeдеž7ЊяЪЫЛъš9сщр‘7э&Њ=oTžЖЗљgp§œрtьˆ Ї§DЙчYВМёoАЁ ŽЕ€cЫАЁ(РQv€ ,нГExlОх вD[ЬБmШьє:ъ.є{AБп6|s˜э/ёќЧўБOgчnI—€uœNp ѓћы746Б+ЬvЂШS‡эFŽюb§ŽФа’ТХиЦk{’oћЖ/9К‹ѕ{Cs жKкqm{ђЕѕbzЖgNp+ѓC'ƒЪfa›YфyCf•йўv:С­Ьoy =*›•m{pГBlуst—ыЗ>†очkэф›и@шшГx9ЇŽе%Мѓ9 nЉ~зdh›ЮWаНVЖuЮЮТ™„–в[СЪN'И•љэЦ?cvГяwЪи3нœжЌgЖыžNРЪpФйЋЮ`ˆVy ѓпNVJO—ръo “u%Yu“ИžмjО_yГЯЋ–b^ЈчCврДˆ7JжкЌЩГT0ј™Ы flГ˜,ŠT§ Ќ‰кЃyHx‘яЋЇ\eEOКzb&ћѕ?џџPK!л2'ЩCXdocProps/core.xml Ђ( Œ’AKУ0Чя‚пЁфоІYЉЬаv В“СŠт-$o[ДICэіэMлY;єр1я§ѓЫя=RЌЊ‰>С:йъ‘$Ehо Љw%zЊзёEЮ3-Xгj(бZU—7”ЗlkРz . $э(7%к{o(ЦŽяA1—„„Эmkѓсhwи0ўЮv€iz…x&˜gИЦf"ЂR№ i>l3Ча€э& С?YVЙ?/ YRI4aІ“юœ-јиœв'Ї`зuI— СŸр—Э§у0j,uП+Ј*Їмѓ­­XљІ <+ѕыk˜ѓ›Ащ­qsЌЂџ.Ь`=В@DСƒŽжпчьіЎ^Ѓ*Ј\Ч)‰гЌ&% šgЏ§›gї{ЏБ N/џ‡˜з$ЇdIs2#~ЊСћќ/T_џџPK!HыЄ–docProps/app.xml Ђ( œ’Moл0 †яі нk9С0 ЌЂM7єАЁAѓбГ*г‰PY$жHіыGлpуД=M'ђ%ёъEq}llжBLЦЛ’Эђ‚eрДЏŒл—lЛљuѕƒe •Ћ”ѕJv‚ФЎхз/b}€ˆRF.•ь€œ'}€FЅœЪŽ*ЕBJуžћК6юМ~mР!ŸХwGWAuо йрИhёM+Џ;ОДлœKq‚5Z!НRў1:њфkЬ~5XСЇEAtkаЏбрI‚OSБжЪТ’Œe­lСЯ‚Ие mЅLLRДИhAЃY2ils–=ЋNЩZrHX]лєБ Ѓ|‚јђlUNpjФ>œіNcѓMЮњ .;ƒ„ —ˆƒвCНR?!žM‰{†wРЙ%ОсЪ)^џbКшѕв7AЙ“\=>,З7йmОЫUёлИ—Д ЇЦЩ^Šb}P*њŒБ~Ф= 5кЮdyPnеиѓБаэСnXv9›чўћGM№ѓZЫџџPK-!Ь~цЁN[Content_Types].xmlPK-!ЕU0#ѕL ^_rels/.relsPK-!‡кpр-Jxl/_rels/workbook.xml.relsPK-!ЈR'мFjxl/workbook.xmlPK-!< „Њ; н xl/styles.xmlPK-!iРRŠV! xl/theme/theme1.xmlPK-!a~’†š мxl/worksheets/sheet1.xmlPK-!л2'ЩCXЌdocProps/core.xmlPK-!HыЄ–&docProps/app.xmlPK >ђSpreadsheet-Read-0.91/files/empty.xlsx0000644000031300001440000000000011130415007017156 0ustar00merijnusersSpreadsheet-Read-0.91/files/Active2.xlsx0000644000031300001440000002053513111550441017337 0ustar00merijnusersPK!q9+p л[Content_Types].xml Ђз( Ь”MNУ0…їHм!ђ%n‹„jк?KЈРи“ЦЊc[ЗДЗg’а PˆTв›DQ4яНљfьщ|[™dЕГ9g#–€•NiЛЬйыЫCzЭŒТ*aœ…œэй|v~6}йyР„Њ-цЌŒбпpŽВ„J`цЎИt6‚iЌ5иlњD‚V,DˆЂ"О5<’ДЯqFz,Йm kяœ я–"RrОБъ‡kъŠBKPNЎ+ђЪБ‹Z…џjˆqg[Ё –Б2Y+КwОƒBЌMLюЗD …Ррq­}ТЬЈВiKэБЧЁŸ]?“wVoЮ­NMЅІ“UBл}юЎ% щ-‚ѓШiжƒ@\J=IBˆЬКМiыо›1"o^“СОЏЦAПAGŽЫ’cјЉќ,EѕнR'?Ў_ЕћцrиMщ?§ЎЋ;6’7їыьџџPK!ЕU0#ѕL Ю_rels/.rels ЂЪ( Œ’ЯNУ0 ЦяHМCфћъnHЁЅЛLHЛ!TР$юЕЃ$@їі„‚JcлбічЯ?[оюцiTb/NУК(AБ3b{зjx­ŸV b"giЧŽaWноl_xЄ”›bзћЈВ‹‹К”ќ#b4O ёьrЅ‘0QЪahб“Јeм”х=†ПP-<еСj{Њ>њ<љВЗ4Mox/ц}b—NŒ@ž;ЫvхCf ЉЯлЈšBЫIƒѓœгЩћ"cž&к\OєџЖ8q"K‰аHрѓ<пŠs@ыы.ŸhЉјНЮ<тЇ„сMdјaСХT_џџPK!о §(дxl/_rels/workbook.xml.rels Ђ( М“ЯjУ0 ЦяƒНƒб}q’ne”:НŒAЏ[ї&QтаФ6–і'o?“CК@Щ.Ёƒ$ќ}?аЇ§сЇяФjU%)ДЅЋZл(ј8Н><ƒ жЖвГЈ`@‚CqЗУNsќDІѕ$ЂŠ%†йяЄЄв`Џ)qmœд.єšcщuyж Ъr”xl/workbook.xmlŒRЫnТ0МWъ?XО—< E$HЈ­ЪЅъ!…Г‰7ФТБ#л!№їн$%ЅU=yЃййY/WчJ’+ДJh0ё)•k.д!ЁйЫУœы˜тLj Н€ЅЋєўnйjsмk}$H lBKчъ…чйМ„Šй‰ЎAaЇаІbSs№lm€q[ИJzЁяЧ^Х„ЂУТќ‡C…ШсIчMЪ $$s(п–ЂЖ4]BТvиˆАК~cъ>KJ$Гю™ <Ё3Lu ? ІЉз]7ђ#ъЅу’я† '0PeЅАЛЏэ)сPАFК зОNEУYЦCgбV@kПЩК”œwBqн&tЃх—1УЄэ;;С]™аачбЕі тP:ЄЂ9YюФ 2ЖЧJ7ЫЛжлŒCћ—ЈоƒЕd<Рsvир–›…РРlАŽПСс уўžо€1Сг^кUOЮdоЙ‰O/!œEСcИ~ЈєџџPK!iРRŠVxl/theme/theme1.xmlьYMoEО#ёF{oc'vGuЊиБ[HгFБ[дуx=оfvg53NъjHHˆ‚И qу€€J­ФЅќš@Љwfvз;ё˜&%ѕ!ёЮ>яїЧМ3ОzэAТа’ђДд/зDвiЕƒ;УўЅI…г1f<%э`FdpmынwЎтM“„  Oх&nБRйцЪŠ aЫЫ<#)М›p‘`"Z | |ЖВZЋ­Џ$˜ІJqloO&4$—4KlЬ{ $ЄJъ…‰fMrŠ]œ*Ю…ы"gВЫ:ТЌ€ 1?’*@ K/кAЭ|‚•­Ћ+x3'bj m…Ўo>9]N0>\52E4*…жћж•’П0Еˆыѕzн^Нфg8 СTЋK•gЃПQя<+ ћu‘wЗжЌ5\|…џк‚Ю­NЇгlхКXІdП6№ЕѕЦіЊƒ7 ‹o.рэnwнСХЏ/рћWZы o@1ЃщсZДпЯЙ— g7М№ €oдrјйPІ—1сЉZšl ОЯEЩАЂ)RГŒLpyмХЩHPЌ%рM‚+oьR(–Д0$CA3еоЯ0дФœпЋчпОzўНzўффсГ“‡?œўЬ—UќЯп}єгŸњPBs^|ўф—gO^|ёёЏп<іРЗUсCš‰n‘ctРАЭ8ЦеœŒФљ(†1ІŽЗ‡uOХ№ж 3ЎC\чна=|РыгћŽЎƒXLѕHоИЧ9ыpсuРЎ–Uё№pšF~сbZХ`|ф“нХЉко4ƒОY$ЅућnL5їtU‘”(ЄпёCB<жнЃдёы —|Ђа=Š:˜z]2Є#'‘цD7hq™љl†P;ОйЛ‹:œљЌо!G. 3ђCТ7^ЧS…Ы!NXес7БŠ}Jf"ЌтzRAЄ#Т8ъ‰”>šль­}CУђ†}Э)=єёМ‰9Џ"wјa7ЦIцУhWБяЩCHQŒіЙђСїИ[!њт€гЅсОK‰юз7‚;4rTš'ˆ~3:–аЉў›аєЯš1ЃаmМmЦэ`Ж&_Iм8е‚—сў…wOг}ЙОИёМэЛoћn№ŸяЛЫjљЌнvо`ЁїъсСЦfLN–OЩЪи@ЭЙ)Э ,aЗїaQš3")MY _ѓююр" \}@U<ˆqCv=аL"™ГŽ$ЪИ„гYіђжxд•=6ѕЉС6‰елх5Н\J6fЯ‰ЬДДІœUик•œ)˜§&ТъZЉ3KЋеLЏsЄ•&CMƒХв›0† ^РЫыpJзЂсp‚kПлИ‹‰ТE†HЦxLђiЛcT7A*rХм@юxbЄOzЏёZEZKГ§ вЮЄЊИЦqEєўJ”Š žGIюЉrdiЕ8YŠŽлAЋЙк PˆГv0s-|M2ˆКд“f\…ЪоЗ8EZІ“ œ-fSхѓhЖ Ум"ЈУ]…ѕћ‚СŽˆLHЕƒel%˜Wy АTKВњЏ6С­e€Эє7аbm’сгќш†–L&$Tе`WVДяьcоJљT1ˆЧЧhФІтCјuЊ‚=c*сzТt§—iклц•лœѓЂЋ^aœ]Ч,‹qоnu‰•lсІŽKЬSE=АЭЋЛ1юќІ˜’П SЊiќ?3Eя'p_А6жс2W`ЄыЕpЁb](‹iи09˜-В.dс5$\)›џ‚щџЖц,SжpьS4B‚Т~ЄbAШ>Д%“}ЏaVЯї.Ы’хŒLFUд•™U{DŽъИЎїіХъІ›фmРрNчŸћœWа(вCNЕоœтm–ž^S4я ž|l1ƒ<З›І№ЉЂgWЕє†Ми{Ow§љ˜е(Њ„UЖ‚V^іoЈТ9ЗZлБ,^mЪA-†Хr Ържщ?АџQ2bвXoЈC~НСЏ šЄ dѕ%;x н эт'ЛhуЌYYзцЃ“vчпяRю)gkЭЮяs:ЛЮ\qN-^ЄГs;ОЖkK] ‘=]ЂА4)N2&0ц‡­ъoO|tНwќSІЄI&јaI`=І ј­DCКѕџџPK![з3(†юxl/worksheets/sheet2.xmlŒ’ЫNУ0EїHќƒх=I -EU’ЊЅBА@BМіn2I,OА‡ўžqЂFК`iцкg7N—Ÿ­;p^ЃЭф$JЄ[`ЉmЩ—ч›Г+)<)[*ƒ2љ^.ѓг“tюЭ7$И‚ѕ™lˆКEћЂVљ;А|RЁkqъъиwTйC­‰Я“ф2n•ЖrЈАpџЉUЅ и`ёб‚ЅЁˆЃˆчїюМЬгRѓYXH8Ј2Йš,6SчiпљUУоџˆЉэ(J6@ŠАиё-\Мc)сŠОП*Њ‚єЎС˜LЎЯй›їО‡м ;ќŒнnz+œ(ЁR†q КnˆлЮЂљlqЃHхЉУН`Kx"пЉ`№d1хQŠ nXe,,ЛЫЇiМу~ЬŒ`юxЭъЮŽƒЧР5Ћ#xyœWЌŽрќ86ьлЉю•ЋЕѕТ@ХLЭЅpƒC}LиѕъLŠ-a{Ш~WРО$Y!в! ?e|Љљ7џџPK!™–#Pxl/worksheets/sheet3.xmlŒ“СNу0†яHМƒх;qRкЊ$ZЁнZэr7Щ$Бp#™ЇЭЗЮ-ё69ЊЂ"qЫ1ы§аq4фт'ЬшїwaXoЎ.Ј1`UBдмьыJ'SU8г'm{Ь+…ŽП‡@< mЁ ŽЅzП1 .Ї6Юэђ@ў57ьs#Аї[O?t)yДЙ я’ ™хФ›6™M›иŸЦŠssЫgтUк7I/сEo)wуѓƒЈхB‡о:ВxЫ;РX}Оta•‡@pрЗšћГтfhг@яhП–ђЂm{џmёњmOFD)/њgжњqtZ~ˆъ џџPK!–2 HbЌxl/worksheets/sheet1.xmlŒ’MO„0†я&ў‡Іw)ь‡lV7=˜ЃоЛ0@Га!mwWџНSШЂQH:3}fц}iВњhvcъ”GAШш ЅЋ”ПНnЏn9ГNъB6Ј!хŸ`љ*ЛМHNhіЖpŒ:h›ђкЙ.Тц5ДвиІJ‰І•ŽBS лEЕ˜…сЕhЅв|ш›џєРВT9l0?Д наФ@#эokеYž%…ЂšФ ”)_GёfСE–є“пœь3ѓBvˆ{_x,RњЋтЯнm/фйАJyhм ž@UЕ#з–СЭrА‘Nf‰С#AЙзIoO/hЕм'з”%ЬЏzЬТDi^N1#8›я(;‚б48Ÿя);‚Гip1’qпрќ8˜4шэdOвTJ[ж@IУТр†338дŸv}vЩйУіеє*€| ZГDtчРџˆёe_џџPK!a&8NmdocProps/core.xml Ђ( |’QKУ0…пџCЩ{›Є[UBлС”сƒСŠт[HюЖh›–$кэп›Ж[­L|LЮЙ_ЮЙ$]ьЋ2јcU­3D#‚аЂ–Jo3є\ЌТXЧЕфe­!CАh‘_^ЄЂaЂ6№hъŒS`Oв–‰&C;ч†Б;ЈИМC{qS›Š;4[мpёСЗ€cBЎpŽKю8ю€a3б)Хˆl>MйЄРPBкYL#ŠМLeџш•‰ГRюајNЧИSЖƒ8КїVЦЖmЃvжЧ№љ)~]?<ѕUCЅЛ] @y*ИЋM~­СЈw,_dŠ'RЗЦ’[Зіп(ЫУ™ћмсй}•сЧ†*'хev{WЌP: IRRа„Ъ’љ[рз|vИЈŽ1ў'^‡$ уЄ 1›SF’ ёШS|іAђoџџPK!9€а”DdocProps/app.xml Ђ( œ“Ooл0 Хяі н9щ0 ЌbK7єАa’vgVІЁВ$HЌ‘ьгЖ‘ФйŸЫ|Ђј~Ђhuwh]бaЪ6јJЬgЅ(а›P[ПЋФуіЫЭQd_ƒ +qФ,юєл7jBФDsС>WbO—RfГЧђŒeЯJR ФЧД“ЁiЌСћ`^[є$eљ^тазXпФs —§ohLЯ—ŸЖЧШРZ}ŒбYФЗдпЌI!‡†ŠЯƒNЩЉЈ˜nƒц5Y:ъRЩщQm 8\qАnРeTђвP§аж`SжЊЃe‡†B*В§Щc[ˆт2і8•ш Y№ФXНm< Е‹™’ўщхйA^I6ŒЭЁœzЇЕ}ЇoзЦ>`aсqkЩaўоЌ!б_ˆoЇФУШ;т|bОљя к+‹*#цєJУ”ю7œUh#ј# чъЋѕ/љ1nУ=ž^рКЉ6{HXѓЃєKC=№№“ыCV{№;ЌOž?…~_žЦŸBЯГ’ПaMN=%/ыЏџџPK-!q9+p [Content_Types].xmlPK-!ЕU0#ѕL |_rels/.relsPK-!о §(дhxl/_rels/workbook.xml.relsPK-!ВŽt>r”Њxl/workbook.xmlPK-!iРRŠVI xl/theme/theme1.xmlPK-![з3(†юxl/worksheets/sheet2.xmlPK-!™–#PРxl/worksheets/sheet3.xmlPK-!§њКШХz“xl/sharedStrings.xmlPK-!KсŸV Šxl/styles.xmlPK-!–2 HbЌTxl/worksheets/sheet1.xmlPK-!a&8NmьdocProps/core.xmlPK-!9€а”DqdocProps/app.xmlPK ;Spreadsheet-Read-0.91/files/misc.xlsx0000644000031300001440000001755511130422501016777 0ustar00merijnusersPK!XVЦ`к[Content_Types].xml Ђж( Ь”MNУ0…їHм!ђ%n‹„Jк?KшЂРи“ЦЊc[ЗДЗg’аJ Љ„›D‘5яНљfœ|БЏMВƒ€кй‚MГ KРJЇД]ьuѕ”оВЃАJgЁ`@Ƙ_^фЋƒLЈкbСЊ§ч(+ЈfЮƒЅ“в…ZDњ kю…мˆ5№йdrУЅГlLcЃСцљ ZAВ!>‹š|јо№Hjа=ЇщБфО+lМ &М7ZŠHЩљЮЊoЎЉ+K-A9Й­Щ+kХЎўЃ!Цƒm…>€PXФкdшбљJБ51yмzƒчЕі 3ЃЪЖ}ЌДЧ‡avУLо]иМ9Зљk* Ќкsї-MoœGNГф TъIBдpbжчM иєоŽyћšЮ№u5NњC zr\џ“уoх/xœvBКчƒ8оІКgxћ_›џџPK!ЕU0#ѕL Ю_rels/.rels ЂЪ( Œ’ЯNУ0 ЦяHМCфћъnHЁЅЛLHЛ!TР$юЕЃ$@їі„‚JcлбічЯ?[оюцiTb/NУК(AБ3b{зjx­ŸV b"giЧŽaWноl_xЄ”›bзћЈВ‹‹К”ќ#b4O ёьrЅ‘0QЪahб“Јeм”х=†ПP-<еСj{Њ>њ<љВЗ4Mox/ц}b—NŒ@ž;ЫvхCf ЉЯлЈšBЫIƒѓœгЩћ"cž&к\OєџЖ8q"K‰аHрѓ<пŠs@ыы.ŸhЉјНЮ<тЇ„сMdјaСХT_џџPK!ЛDк№Gxl/_rels/workbook.xml.rels Ђ( М’ЭjУ0„я…Мƒи{МЖг–"чR Й–є„Нў!Ж$ДлП}… nСН„\ЃE3ЋйэП†^}PрЮY Y’‚"[КЊГ†ЗуЫњ ‹Б•щ% #1ь‹еню•z#ёЗg],khEќ‘Ы–У‰ѓdуЄva0ehа›ђdТ™BнgI‰dЮПqсчtŠЅщрOУЖЭK+d˜Юв9MŠ›Щ/K8TЌ•~ƒіЎь˜W6ЭВˆ QltюїQ(Щy'47]€bД—[5™QвХбNp_чєy}ыФЁіQіXщХ 6l$AT2игФё$:ZUТ•јбBЮkє2ІФ.^ьšЧїC,Г0 ‹†Рژt2€NЂІˆE!%“%ІŽИ<›=fГˆИў0ХџџPK!iРRŠVxl/theme/theme1.xmlьYMoEО#ёF{oc'vGuЊиБ[HгFБ[дуx=оfvg53NъjHHˆ‚И qу€€J­ФЅќš@Љwfvз;ё˜&%ѕ!ёЮ>яїЧМ3ОzэAТа’ђДд/зDвiЕƒ;УўЅI…г1f<%э`FdpmынwЎтM“„  Oх&nБRйцЪŠ aЫЫ<#)М›p‘`"Z | |ЖВZЋ­Џ$˜ІJqloO&4$—4KlЬ{ $ЄJъ…‰fMrŠ]œ*Ю…ы"gВЫ:ТЌ€ 1?’*@ K/кAЭ|‚•­Ћ+x3'bj m…Ўo>9]N0>\52E4*…жћж•’П0Еˆыѕzн^Нфg8 СTЋK•gЃПQя<+ ћu‘wЗжЌ5\|…џк‚Ю­NЇгlхКXІdП6№ЕѕЦіЊƒ7 ‹o.рэnwнСХЏ/рћWZы o@1ЃщсZДпЯЙ— g7М№ €oдrјйPІ—1сЉZšl ОЯEЩАЂ)RГŒLpyмХЩHPЌ%рM‚+oьR(–Д0$CA3еоЯ0дФœпЋчпОzўНzўффсГ“‡?œўЬ—UќЯп}єгŸњPBs^|ўф—gO^|ёёЏп<іРЗUсCš‰n‘ctРАЭ8ЦеœŒФљ(†1ІŽЗ‡uOХ№ж 3ЎC\чна=|РыгћŽЎƒXLѕHоИЧ9ыpсuРЎ–Uё№pšF~сbZХ`|ф“нХЉко4ƒОY$ЅућnL5їtU‘”(ЄпёCB<жнЃдёы —|Ђа=Š:˜z]2Є#'‘цD7hq™љl†P;ОйЛ‹:œљЌо!G. 3ђCТ7^ЧS…Ы!NXес7БŠ}Jf"ЌтzRAЄ#Т8ъ‰”>šль­}CУђ†}Э)=єёМ‰9Џ"wјa7ЦIцУhWБяЩCHQŒіЙђСїИ[!њт€гЅсОK‰юз7‚;4rTš'ˆ~3:–аЉў›аєЯš1ЃаmМmЦэ`Ж&_Iм8е‚—сў…wOг}ЙОИёМэЛoћn№ŸяЛЫjљЌнvо`ЁїъсСЦfLN–OЩЪи@ЭЙ)Э ,aЗїaQš3")MY _ѓююр" \}@U<ˆqCv=аL"™ГŽ$ЪИ„гYіђжxд•=6ѕЉС6‰елх5Н\J6fЯ‰ЬДДІœUик•œ)˜§&ТъZЉ3KЋеLЏsЄ•&CMƒХв›0† ^РЫыpJзЂсp‚kПлИ‹‰ТE†HЦxLђiЛcT7A*rХм@юxbЄOzЏёZEZKГ§ вЮЄЊИЦqEєўJ”Š žGIюЉrdiЕ8YŠŽлAЋЙк PˆГv0s-|M2ˆКд“f\…ЪоЗ8EZІ“ œ-fSхѓhЖ Ум"ЈУ]…ѕћ‚СŽˆLHЕƒel%˜Wy АTKВњЏ6С­e€Эє7аbm’сгќш†–L&$Tе`WVДяьcоJљT1ˆЧЧhФІтCјuЊ‚=c*сzТt§—iклц•лœѓЂЋ^aœ]Ч,‹qоnu‰•lсІŽKЬSE=АЭЋЛ1юќІ˜’П SЊiќ?3Eя'p_А6жс2W`ЄыЕpЁb](‹iи09˜-В.dс5$\)›џ‚щџЖц,SжpьS4B‚Т~ЄbAШ>Д%“}ЏaVЯї.Ы’хŒLFUд•™U{DŽъИЎїіХъІ›фmРрNчŸћœWа(вCNЕоœтm–ž^S4я ž|l1ƒ<З›І№ЉЂgWЕє†Ми{Ow§љ˜е(Њ„UЖ‚V^іoЈТ9ЗZлБ,^mЪA-†Хr Ържщ?АџQ2bвXoЈC~НСЏ šЄ dѕ%;x н эт'ЛhуЌYYзцЃ“vчпяRю)gkЭЮяs:ЛЮ\qN-^ЄГs;ОЖkK] ‘=]ЂА4)N2&0ц‡­ъoO|tНwќSІЄI&јaI`=І ј­DCКѕџџPK!LЃЩ‘„- xl/styles.xmlЄ’=kУ0†їBџƒао( 4ДХvш(ДPH ]хHЖњ0в9и§ѕ=йŽcOКXяuю+йЗF“‹єA9›вЭjM‰Дg'”-Sњu:<Ц> v[л˜ƒ7‘RœXlТUb!ЃxƒљsкРў7–ДХ’ФYк‹ЄЇчIœcJ§Vq/шD!yЃ4(Лdі@Ќho]шїxŽ+ћ3=„ЭВр†гє3Ѕ7§!…jЬѓtыS]єˆ”оє{жfз:L{ž§џџPK!kХ3q]Dxl/worksheets/sheet3.xmlŒQЫjУ0МњBїZvJлЁ4„іP(ЅГbЏ-[+ЄMвќ}зv Нє и—ffgѓХwhб2KR)РUX[зђу}uu/E$эjнЁƒB ЪEyy‘я1lЂ С.вљЙRБ2аы˜ ЧCЏ‰гаЊшшzќдwj–ІЗЊзжЩ aўƒMc+XbЕэСб гФњЃБ>Ъ2Џ-ї†…D€І™Te>в~ZиЧ_БЖX#n†Цs]ШtUfWуЏAдашmGoИлbЫfЩнЭ™`ЉI—yРНрm2ЖЮыС›lžБЎj(Вš2п•зЙк1SХЇOœгwoиjВѓ5шhв%шрй‡шŽїXНnсE‡жК(:hXP:шaR7%„~TГF"ьЧа№%€хЄ 7ˆtJsъ­ЦЂаmн—%sd9ytОљџџPK!^щ)2Cxl/worksheets/sheet2.xmlŒ‘MkУ0 †яƒ§ућ’ДАF’2VЪvŒ}žнDŽMЫиъКўћ)I[ЛьfYzщ•ЪХwяФФdбWr–R€oАЕОЋфћлътFŠDЪЗЪЁ‡Jю!ЩE}~Vю0n’ СŸ*iˆТmžЇЦ@ЏR†(IЪh)лa0Ц>ЮnЂ$ІŽхйjКўћЩЩZzм!XВЌїžž’/z#№AЃ-d6KЅ[a­m[ШїЭЭƒ”­•A …в~j8„‹XФ)ЖˆЛXxЎ ™r{UФŠV` ЃЬйˆя p“3тe|BпŒsПzQCЃі†о№№КэˆMžЯюoЯ’жŠT™{<ž?cЇЂ›й"c)UМd§e>”Yž ЬTёЧЏOœSЛыx9Є+цkав4‰ ЃуY\Ё§лpduЊ…х[mƒ0аА 4ъ~R7%„nTГE"ьЧАунЫIgќИAЄSҘSm3^ etkП4u,бешзљ)џџPK!мзєІUgdocProps/core.xml Ђ( |’ЫNУ0EїHќCф}тИЅ/+I%ŠКЂA v–=m#т‡lCлПЧIк Фв3wЮм;rЖ<Ъ:њы*­rD’E И•кхшЅ\Чs9Я”`ЕVЃ8Д,no2n(зžЌ6`}. $х(79к{o(ЦŽяA2—… Э­Ж’љ№Д;lџ`;РЃ4b ž цn€Бщ‰шŒМGšO[ЗС1д Ay‡IB№жƒ•юЯЖ3PЪЪŸLШtЖ;d о5{ѕбUН№p8$‡qk#ј'јmѓјмF+емŠ*2С)ЗРМЖХІтV;НѕбJ[Ѓ-ѓси(škжЬљM8ќЖq*Ђ џ.jЂCƒˆ‚-к…Иt^ЧЋ‡r ВXLcBтбЌ$cz7ЇdіоьМšolvyоќ1d]Ф)‰гII&”ЬщhHМŠжїѕз(ОџџPK!=ирE=docProps/app.xml Ђ( œ“Aoл0 …яњ нЙщ0 ЌbH;єАa’vgVІЁВ$ˆЌ‘ьзOЖ‘ФщzšOфуУУgšVwћж&ВСWтfVŠН ЕѕлJњ<љВЗ4Mox/ц}b—NŒ@ž;ЫvхCf ЉЯлЈšBЫIƒѓœгЩћ"cž&к\OєџЖ8q"K‰аHрѓ<пŠs@ыы.ŸhЉјНЮ<тЇ„сMdјaСХT_џџPK!JЉІaњGxl/_rels/workbook.xml.rels Ђ( М’ЭjФ0 „я…ОƒбНq’ўPЪ:{)…НЖл0Б‡MlcЉ?yћš”ю6АЄ—аЃ$4ѓ1Ьfћ9єт#uо)(ВКк›ЮЕ ^їOWї ˆЕ3КїŒHА­./6ЯиkNOdЛ@"Љ8R`™Уƒ”T[4e> K—ЦЧAsc+ƒЎКEYцљŒП5 šiŠQwцФ~ Щљomп4]О~аё Щ‰ “ Ž-В‚iќ^YyžЁ\“сУЧYD>qW$ЇKЙSќ3Ьb2ЗkТеЭ ЧT>:Ѕ3[/%sГ* }ъњБ+4Э?іrVџъ џџPK!5$є4H,xl/workbook.xmlŒQMO1Н›јšоe—ХE$ь’5r1$"œk;Ы6tлІ-.ќ{Ї%(м<ЭМ™yoОfѓCЇШ78/ЎшpSš!ѕЖЂŸЋзЛ %>0-˜2*zOчѕэЭЌ7nїeЬŽ €іmCАг,ѓМ…ŽљБ 1гзБ€аm3o0с[€аЉЌШѓqж1ЉщIaъўЃašFrx6|п'ŠпЗвzZЯЉ`}кˆ0kпY‡s%Šљ№"dQб{„І‡Ћ€ллЇНT1[цcšеПK.‚ИэZBяџт’УFjazdM№zЧ3zDаЇЬFŠатqЧЃQyŽНмЖƒљd”ЧVй…|КЖI–шДРGМлŸэgDпM%:n!†QсЊИб‚$вЇИрЉk"a+Ю_:M/Ъ‡ЂLчGз?џџPK!у§ЏPЎз xl/styles.xmlЌSMkу0Нњ„ю­т@KЗX.{ ,ДPH {DВ#а‡‘Ц!юЏяШvтК{йНиoFš73oFхЫбYvа1™р%/юœiП ЪјFђЭъю‰Г„рирЕфНNќЅКН)іVЏїZ## Ÿ$п#ЖЯBЄн^;HїЁеžNъ ™БЉTЪAЮŠхbё(ЯЋВл…ЮЃфЫЩQ•щ“РR] .ЊвƒгЃ§3АйUƒ3ЖЫь™iфћ‡№%БіК,rTe ˆ:њlТ›О%uузМХуАBѓ‹ЌОџџPK!МЋ 1жИ#xl/worksheets/_rels/sheet2.xml.relsЌЫj1 Eї…ўƒб>жLЁ”xВ …lCњТж<шјхІЩпзЁаv аMw’.::hЛЛјY9ЫƒV7 8ишІ0x=НЌž@IЁрhށ \Y`з=>lъ"юk&ј“ЗКж7'\ќЛћџџPK!А—j%ацВрm•аŸ›Ы“9%кАЖ`BЖаgає"§ј!оIѕ kCЁе ­щ"Ягy гйA‹H)UУ ўU•Ї;ЌpE№Bп?їЦ[к3Dъ_8dYђ2™ohMOЂ@0ƒўuЭ;MгИрˆй†ˆ‚2ЁЫ ZOЉ—ЦNљ‡§&Ж‘{),p]$дЗЉо_Й—Ў‘E (йV˜•wМ05-˜Ь1б=x+wWРЋк NиЋgЬА4VrGАлGл1;Л :CпЙ .1ŠeЖЧ4bянф/ръ Сѕ8@хЭ№-ЭЏ=hž•ЮPfKœйCЪйqЪzŸb'7V›ОЅЖФшъќ˜jeK^ЉЭŽSВ} Њ9‡јvG„ѓ!ЛЗвПЪ~№ Ј V „&ЙмЖш"Ф9бўМda„ !љЋјjЁДmq№ uЌ‚oLUМеD@‰”ўd6Ÿ.FюъOУ›˜‘н;UївйМжИL€'f1™ŸЃЧŸЏO№…”RšїalУ:џfл‘’›мXМЄтИ\nЇкIeу†’уП%"ыxBЇ>Ітеax>Š qoьвщ&xеоqSП Щ.XЫЂИrігOЌщОЌм'нртjђvфV6Ќ§| еV0E„юk{‡bЫгыќЯ 6Nй#{aˆНБё4PБќ9Sl‡—!Q/ЊЎ‹РсњKџџџPK!ђŽіыŽD xl/theme/theme1.xmlьYOoл6Пиw toc'vuŠиБ›-MФn‡i‰–иPЂFвI|ку€УКa—Лэ0l+аЛtŸ&[‡­њіHJВЫkвfЖ%‡Ђ~||~|ЄЎп8Ž:$BRžДНњеš‡Hтѓ€&aлЛ;ь_YѓT8 0у i{S"НяОsЏЋˆФСјDЎуЖ)•Ў/-IКБМЪS’РЛ11V№(ТЅ@р#ГЅхZmu)Ц4ёP‚c{g<І>ЙЂEbo#оc !QRwјL Дh’иС‰т\ppPз9•]&а!fmќhHŽ•‡– ^ДНšљѓ–6Ў/сѕlS Ц–ЦѕЭ_6.,"Jы§FыкV!п˜šЧѕzНnЏ^Ш3ьћАT;—ВЬF­оЩe–@Ж9/Л[kж.О$enЮ­NЇгlesБB Ш6sјЕкjcsйСХ7ч№ЮfЗЛър ШтWч№§k­е†‹7 ˆбф`­кяgв ؘГэJјРзj|†‚h(ТKЋѓD- Ж?рЂdXбЉiJЦи‡8ютx$(ж№:СЅ7ЖЫ—s]Z’О Љj{яЇrb&яеѓя^=Š^=rђ№йЩУO=:yјƒ•х мЦIXјђ›Oџјъ#єћгЏ_>ўМ/Ыј_ОџјчŸ>ЋB Эfєт‹'П>{ђтЫO~ћіq|SрQ>Є1‘ш69Bћ<†ЕУИ3'#qОУSgŽ@v…шžŠрэ)fUИqwO{ToN8sDbЂh…ц(v€ЛœГ•ибКJN’АZɘ”qћVщютФqmo’oцAщиОgš{ X‡$! щwќ€ŠенЇдБы.ѕ—|Ќа}Š:˜VšdHGN Эmгќ2­Z3ИкБЭю=дсЌjе[фаEBB`V1љ!aŽoт‰Тq•Ш!ŽYйрЗАŠЊ&9˜ ПŒыIž уЈ)ЋЦмАо’гw0VЅлwй4v‘Bбƒ*™З0чeф?шF8NЋАšDeь{ђBЃ=ЎЊрЛмЭ§ ~РЩBwпЃФqїы‰р. )ЭDП™эK`j‡cšќ3 llcр’Œло&lMU)Б}Š‚сў…ФЛ…'ЩXŸпx.yї’wНџ<я.ЪхГВэŒ`{uё` cS&Ч‹Ћф1el ІŒм’ІP–А[}шдЭ‘ЧІ4‚fЦю.иŒA‚ЋЈŠNЁШЎ{ZH(3бЁD)—pК3н•В5 ueЯ†M}jА„ Бкхэ^бнљс cіœаAsE+ZРY•­\Ы„ТВпDY]OъЬкъfj†ыmХ’С‰ѓKƒЮТšP† (^РЪЋpJзЊсp‚ ДнэœЛХxс"]$#ЬGzнѓ>Њ'хБbю v*|ЄOzЏБZI[K‹} mgqRY]cКм{oуЅ<‚g^в‰{*YRNN– ЃЖзj.7=фуДэс\ Э8ЏK]љaТѕЏь}‹“ЄE8YЧйd6Y>ѓf+_˜›uИЋАvŸ[АЃ"RmaY цU,бšьќ—›`ж‹Z€є7˜ХЪУ?6 АЃыZ2_•]ъбЖГ•ђ‰"bGhФ&bƒћuЈТz*сzТ0‚~€Ы4mmѓЪ%ч,щЪWXgћ1K#œб­Nб<“-мфq1ѓTšЌ­rюfqч_ŠIљ ZJ9ŒџgKбћ мЌк>\ц ŒtОЖ=.TФ…вˆњ}•ƒй2!ZрB^CPѕš/ШЁўosЮЪ0i Ч>ЕOC$(ьG*„ь-™ш{АzЖwY‘,d"Њ4]™кiШ!aCЭЋzoїPЁnи$Ѓƒ;юs–AЃP9х|s8Є’,+И&'я Ў|l2ƒ>—‡MA“лϘbХЎjЧ›сљо{šѕgeV#Я PVк ZYкПсЮЙеZЦš[ёr3Ÿxq~ХаYD)мњ §ћ>#&Œѕ†:фћР­О6ha6еWlс4AкЮNЖгњY‹ВІЭJ'mЮПЩп…оSЦж3;‹ПЯiьЂ8sе9Йx‘ЦЮ,ьикі-45xіtŠBз8?Щט[хoO|єНwќfПFЩžLЄ{ŽрИIф&:ŽЧ"жoљxŒŽ ХM3‚ƒ=ьX!:ыP$@o^TчCќ‰T7 7Уё!АЉн0Ш[8Ъ[ўq’7E‡6сLПzЦЫx]УjЫ*\v*якЮG/іvхbY‡‰У"ЫGФ%^|’Ц&СA/ Ь%jлKрѓЄЇ)<&ь,vн2H…); lc ЪЂъАq$СЩк#LСн№ЙTнŸ1у Яg4ХАЯA­ќс ˜{/i}my >Ÿ*ѓ ’7Fyc’Тжm˜(эв–jЙк,ШXrmox8ЙŒ6tЦhЫ‚ r`žю€Г†ƒіРьњ‘ЂмјџџPK!ЂIяžkixl/worksheets/sheet1.xml””Ms›0†ящашаScРvќU “иѕЄ‡f2‰лœeX@ЈДЖлўњ."ЦxšЬД>иxэћЎVZТЋŸЅb{0Vъ*тСРч ЊDЇВЪ#ўmГΘqfQTЉPК‚ˆџЫЏтїяТƒ6ЯЖ@F •xX/<Я&”Тt ‘L›R §5Йgk"uIЅђ†О?ёJ!+о*,ЬПhш,“ ЌtВ+ЁТVФ€HѕлBж–Чa*‰5bВˆ_‹е˜{qшœПK8ио3CБ} BJ рЌйиVычfс љЄhн‚FQ$(їАЅHxLНљбz8ЏsˆУгѓбmэZqoX ™и)\jѕ$S,Ш5L>š^ђ#|а‡[yD‡ЧњWE}`д/*зжЂщ~АSIМІ(Ѕ5иЧ~шэЉ˜ф…нєYpЮV}6ь˜G^с№UCŠv†Ѓ.бsгgуŽ‰Ž^Ѕh'zй%:бeŸMЮйЊЯІ;3lЮэяЖQД3œu‰э.њl~Ю–}œњн:Жз =ДZф№U˜\V–)ШШЬLgгёМїЁq3эБПЪPзodm5Ђ.п€Эае˜f“ їёgŸ/ш€2­ёmL7ЏЉќpWГLтFo&Н,Д‘4‡nќ"^kƒFHфlga-Х{JМл•лFЎWAЫkZЏVЕŒјШ'zљ Lzђkы]Л˜P2Џž$/НkGRЇщ­лUќA”ѕЇЅћц}ЫюрРt)Њя”0мб`ш~ЎCя”вcыѓ?:ЭƘЛwb/ Ёз/œЦЎ{IЦџџPK!у)?ŽО xl/drawings/vmlDrawing1.vmlьV[kл0~ь?яЁ/Nc;uлЈv ышSщЦVиУEБ”XЌclХuњыwd9ЗВKaфek Б|ЮwючCIкBќъš6ЉЗЌ4­Г\Ќ2Ћ †™dPаІPол7=~‡„йLf‚КЧжІ}h3ЁМ ЦI€ж9+…b+XвPбšд\šNmѕ’ЌмгЮ KНШv.†{>&Iу\šU)ˆфЉwпјЙ7Qy$Јx-Ÿк‡ЇAрwПA%FЖL‹”ЬфЉWјЪщ+‡UюбŠ>9Œd*XђRзfЅаk!Ј\fSБŽШМb\ mКRa‘zЦЬ@k‘›gъUxZзГSРІšнJъ(8{ФОл+Я%qTB-MйДЕ4тТUАj.ѕ@‰™Ёсшф8ŠKsб ”4v’GЩMNЧcTцBЮsCујиBŸRsбвАѓжШZNЅ’fEsЩЙаGd&•Ъ@A•zRЯр=Ыѓ –š“oчСw[3ЖI˜8VЬ–6}Д–84~nлк6{Шс‘€юКиG›* …ўЇuЖЌЮМяхfЯК­A‹эŒ .нZЛL„$\6ЄoЃU ˜’sMmгŽ&ЩЕ.6tз.iщ•В3ў€ЛI>NpžwнdoСєћBєWяЋ4љ•PЊvEYёЅЮrЈ\$ђIћ$№Щ™OF>9Х—”’с> o [>ЙfЊVнПЛRZњЉ’кИlƘ]сx‰гИЦ!lQЩ.фFjБщ$kˆ~‡MлB6’5ф3R ыU Љ‰­ЇK ?п_ЫP,ŽZзGТШpА‹7У,*u‰KшD†НжмtЏт€”&ч8')ŽЭУˆЎхQBЏ7EёЎƒѓЊ‰IКћ j"Аўkи[#ЖZ-жшпє’c&ЇLЊMжЪЄкЮwъLN™TЛyы˜IЩ}^њwащcі џџPK!х€ф „xl/comments1.xmlД‘ЯJ1Ця…}‡Лэ.ˆШ&Х EAХƒ>@иэђgЩФвњєІЭn‚рЅ’™o&_~IšѕСЖЧ@к;СWЫ’3t­яДл ўљБНЙуŒЂr2оЁрG$О–ХЂiНЕш"БdрH№!Цё€к­ЂЅбЅJяƒU1Ѕa4T ˆбЈЪђЌвŽЫF}ХСšљєКi ‹rRu:ђESМ$,`/јІт,ї?w‚—Щ2т!5…4огDпlЏLК_Щ!I[яb‚VцЄѕЪjsЬbuрМ1Ъ7‘­Hnœ УФђ›ЃО.GU,Ю<—ѕŸ\WцЊ‹ХDVџM4ПYўП9#љџџPK!…QA2docProps/core.xml Ђ( |’бNь †яOт;4мЗїьFЩ.&jЬЙp“SЃёa\б–@ыОНSК­Л֘pСЬќ|ЬќА<ћhъь|0­]V”$ЋZmьfEnЋЋќ„d!JЋeнZX‘-r&Žў,•уЊѕpу[>’lрЪ­ШsŒŽSд342ЈАX|j}##†~CTЏrєИ,Д(ЕŒ’іРмMDВCj5!н›Џ@+ 54`c Ќ`єKС7сЧЉВЇlLм:œiзю>[ЋЁ8Љ?‚™„]зн,Е§3zПОўŸFЭэНR@ФR+MЌA,щзwсэёTвS€хAЦж‹ХМyБйЙGлгщБд›ў лЎѕ: р B‚† МqŸrР$P]ЫзјЖOєљVd ё-йпсснєBќMŠ)ьkНќЦA Ж(YžVU–М\№{˜˜ЃHЦ‚ЮаJ>?Vюf—ешц<ЧХŽ+ЦЦй ђFUro€Эn”п‰ЇЉУyХцœrVюGРрхсwŸџџPK!Нcѕъ„"docProps/app.xml Ђ( œ’Akм0…я…ўЃ{Vо%”ВШ !!фPшТ:щybз"В$Є‰Щізwl7ЛоіPЈN3oO#Љ›їоІlƒЏФzUŠ}Œѕ‡J<еW_E‘ Мї]rяQwГ"abИ4Lия{:ŒяѓЛ§MоS'іућаY‘ј>qящš„хSї‡Љя3ЌќJœМрЧГФ‡O'ф5>œІ=zжy†#g‰Ÿі"g }8MЫ ѕ№ё9…>ќЦœВR_­Ф?ёт5№Уя§e’Ќяƒэvћa;ќ@ЃХРšЭfƒьюЮaw—nН‰‚,•чH@RАx`}АeкIЈiкC—ТЭъ™DрЂqчЕП,РŒxYдЛt"07ВФЧе;єре;єŸ]9ЩВІNІƒGv3ћёјeЯ…hХJг•љkp6ѓд‡ЯSJwЎІф 4sз6Эб џ|z{6љ6ђ$wЯ&wРн•8]UKg X ƒМЄ4н?-ˆИц{по%ŽНZгџxќђф.ЩЪй'і/'6ќ0Nœ0-™"ЄХбOeаЬ <ь.ЬY№4цŽK ИAќщcNўнх^ў9­Ф‡ўчШw‚~qМLАђƒЗђњрќУ_HТЊЂїgš,}ЗТШo5џp”*Пдя™MS ’Шg•ЙЂ‰Bv”кДьо_Я‚я“сЁo\пsz?в0ІЉG?J††žUŽU[kчт­Ч ћНoЁЯzjв{|ЊЭпiB@Aхіф„qi§RІсЦзЗ5)CР“}rx­&Yћ‰Ы"ќм%о%7№“8‰ˆГъ§Dў# i­Ѓu€Ы­ЉЇŸƒg'|ы}~ќZХо‚SЛ4ю`/#ыŒaГќUРнl БwЗYŽРЬ—чЌR!LmУЅЇoO?hyœ ЫБA]ЗX\w6 eУ)п52;Лў2ћy” —Z;АТёlЬЮF‡СfіЫ'/ыˆJЂФ'qoNяŸYЋћn<6v`Sшвb‘|ы{щШЮќ0™Yw~ж ќ9чœн–sж‡сd8хsnи^ЩM­ЉХчмЈН’›у1ŸsуіœЛ997iБфF3›ЯЙЛKn:уlгФt8уsnж–s6+9›‹sQ]ŽшіФ3vха­ќVzqIќХ2I‹ЦšЬ† §МЫ›˜tј+'0OЂ сqМ&@7rмО›YŸ;AЬхyMєnфљаДЇ­yMdoшxКлqМ&ъ7sмMZrЩтAіrдѓуuрМЮІгй–.Œt2ѕа"#yцёЛКq§ў™Fl)Уэъ– tћsр/ТTЛ“сyuгx*д ѓ:˜ йјЅїЕћ'‰zХ'6ЗШšvIЬ:И~ygх‡†&dС,zў‚MСйР!ƒЎ@лYg9rYЅХPс†e!њQмOз0>§fчUіqїщд@QM|Œ]Ÿ=эГy—qЛ‡wЩыš†щЊQyлОXЊѕоо™{oч‘у&> ЯЙbЙТў$‘“а:W=Rіћ$Х%oг*ЈЌ}ѓРй,QБnv`pџь™ёЉ›з’`Ї&Ў(-уьCб"џDцЮ&8)жё8іhєаџѕ|nВЅ­,!н$’r4rx+Нn$ЫˆnЫёЁВ:>šъKЁ +ЛћџfW-s\+-А d—ѓRY:^Кжph9ЛБ =e>a—цЖEЯXк;№)E7œиwТв‡У›Yбw+ЮэžIYOWЂђZkwПс4 |b@ъ44Ђ˜цTEЂдщ=ˆD1Эљ\хНЅN{Cьzвš(я(u:(*Qtзѓў‰RЇI#v=š(*Ѕn}‘(ЎЋЛžїO”КЕ4ЂLЭє?M”їN”Кu3NЂь:]Usмя VэЁgœ+>ZІD'ƒ0-Ља,$IQ ЫДЪЄЫєHQ,г•,C3Eѕ˜ZпR‚eHJЈ8–щS–!ЩЈЂzLЭ2%X†ЄСŠb™–х”`’€+†eZгS„eHъ/Ы y‚ЧЩі•ЧН“€СЃѕTh vћв1ЫДЈЇЫк—ŽЙXІE=%XжОtЬеcjQO –Е/sВLї˜ АЌ}щ˜ЋЧд,S‚eэKЧ\,гЂž,k_:ц`™ѕaYћвq1qфqR†ђX: kq'—ђ{нpЄОœЭ ž]зCaж…ш1Д.хWєX?UєN1|&rЭ#ПW^Mˆ›wАыШг(L˜}†mј|ЉЄWљ>g]ф&pŒЅяy$ФЪ…HЅ6ПЗожKƒF>3т$> —єОы§уq˜ј‹аˆщ&rЦ‹lииыmНЋБˆЌ‰sйbИЦИœЕAзЉѕД’єѓЎЕј+ПьND;[ДpЦ щРЪќхд›cЪФKVкп„s?9.–™*ŸKшzп(Y: цгђЄсЌœhс‡F@цЬœщяjuљ‰.Œѕ˜okgСWЉ"…бNWъŠЕН€HЋW‘Rфuѕ:ї_пe…:›„Ў˜%їrюs§а'ЪЇu‚jZЄиЭšХуVыXЄзЭ:††ч6Ћй2EЪaнЌч†Qлe9#‘аКЙŸБ›uЭЗ[Јe‘гщnжr“ШнBE‹з'КVб C7 =Ё-^ЬщZEsЧmбU|ЛJз{­т&A[t-пЎєuІ–3еіF+љFЫ|—bи-зєЭ)$–љ.eА[ЎулTH”А“M?љеMLŒ­ztkd;OŠ}@y%<ˆИ Јї-є]VНЧ'НЈЅэ@–…$Гн‰~№“8‰ˆГъ§DNяЩ уо# Љ&SkdBвёn€LOпž~в’@!$‘№(єeуњ^‡ОО­IкнТ›ІRTB’!o‹Jš?­ёIнМўdуk)ЬyІ'Š7еЖ1Y“!pqI.НЮШž“u>H:ь ачІfc]Ѓ’Ш{4КyXзШƒЄпynhж5ЉЃMЫž{uŒ9Ж:‚4|жх'NрЛ72_/ЉeЭеѓѕz„kцыЖ:ъsЃЙ—&‰дбŸЏši2aIКСoVaХу.н=юх-%џš„Њ&4@Дщ’В=kŠlаОC68œ dSF\ƒуВСЩйрнФ`ИY=“ЈHљїuяЁoЇcмfєшЖ4b 'ў1{Н"рьПќ:§R ж\ibЙязŸвђqP|`œ˜hf4"КЭEDHˆnѕ™нB7К]В1Ке7–ŽnбЭi'Іp3гBJx9o|F-rpb‰5Е+к^Ed ,2ˆh=•Pf‹XГіАвЭmaЅэкТJ%ДЖАЦуіА&ЃіАю†"Б$Ч”ЗМВEУ"š ‹UXhАh…„6„Х+$Д,b!Ёa1 m‹ZHhwАИеMr4EJўБ[e0….0ЙpР†АР…‹[8`#XиТУЂиДpРю`1Ћ)˜ф  ‘ fУ•QВаlXЬBBТ‚кЕАа`a m ‹[HhXрBBЛƒEЎЦh’Ѓ ,T6QС*У ,xaСйАш…7„…/,И,~aСa САр&А†w‹aЭс$‡XаlЊ‚W†X$У„Дaб r‹h˜#XTУ„У"&фнP!aђхЎƒ”z`‘Ес*YeфсvHr GЌC’A8B’ТщŽ@‡ЄŠpФ9$i„#Ь!!rDЙwЊШ@š­žŸшZ˜ ]jРBW0РFа… А1,”с€M K–`wаK А)tСВ­]*‡WŽЬэчќ9нОšToчДЏлЮi‹мЮY_щN†fИзюЃ›4-ЪУ;}ЫŽЦћњЯ>т`.ЌћAЧžAЧЄЧЧm‹WbюоpOўЊєiSБжі>иИРƒсшИР7cсу; l\рбt|мЖx%Нс{ ƒЏЫ(&­и Б|3• p`Џ$xъ[xЋ„уoлЧkoхз_}БEy1џъ‹ђ“GнMК ”… ћ§щџPKрЗн"цЎPK—pф4 styles.xmlэ][sуЖ~яЏрpЇ™н™RМHЖ.БфйЄніaЩФЛ}ЭР$DaBДЌ>іїєWѕ—/т]DйДнЭL6€sОѓср€‘›л'пS!‰–Њ92T6vPр.еяпОh3ѕvѕЇМ^#.lЧ> Јб#…5ЂERЙTc,0ˆPД€ЃЕ8„AжhQ”^ˆЁ’б™ls!\lMс•mЬeKmСƒќШBИик!`+л˜Ы2L‹ЭзXЖёSфikЌйиE-ž<ќБT7”† ]пnЗЃэx„‰Ћ›ѓљ\ЕЙТv.ЦФRŽ­CђС"н™z&ыC dѕуВE•‚и€D@AЭЋбЃ+ЭˆGЗ{ˆ47„pйНcGоНcЇижtгт“™~Ч*ХПюОюЙ@|йБИl *› PкЬDКиcœЋЪ$TЈkЦDOž влNё-A’‚Ин)nЯЮЧ~hLЮд™„9MU% !ЅАЕЪbдГјД6дh{бъ&сV^Ќ$ЯЃЅњ™ рЉ ЃP&р#o—•ынПBЪ,UўŽщй ќB§X’JŠTЅд-—ж\@‚V>v dЦ&МOгR~њж9ј^ЌПбc9@љі`ћш%БоFЮ1[Нж5@ДEQ$еПђ=@l„Ън}Ћ}UA ЅHqЛA”ѕ~уЂь%дјЖ a6Г%4й‹Ы{Н("jГКFOа9ЄцOˆF”@р+џ„$џИUбЖвИЊщgя;хѓнЗ&іІœЪeдI{Œxl­“s`ФьkЎTyђ{uOГHруlN•aъsЈtџ§ўoД,‹ѕЅ˜оЖ,ІхI&ŸрР5ˆН4ПЯzNЕљЏfCЯS3ё}‘ЖКŠиЎ ыЪF>`4ZЊжІрnъ­XlpjŠ(јЖТ]ЁТšРsјz;a^’kМ№@рЦРe06ŽJ˜AпяеjkхO ЈЮT!“ѕ“‰8€Y]кeSеОkžЃz№Љiцх}ч2MН—+ЙoœЖКIВя4 /y2Счž,•„”єЩG† ]жЮA. “,З5є™їaЧ„А=уЎi(гИўеШьxФЫбљ†‹’Њ ьќьeкьАE=“ЭœїЫWuѕпџ'W­вIо9ЇЫJЩХФcГѕuТvу’еКЧЁи/ Г p•‘‘LmcКрЎ‡йЦъУzmА?|ЌЗŠaq,­2tТ|‚Ђb+№М~ќєƒK\цФaшЅhk%bіUћ,2щaj }Ф'gє^uшЮЙмiю ЬК'ІeN бь}1bvRЈ!ЯьLђЬ/Lž~bqoф™ЪЌ‹0b~#Lу]1Т4ž?œ —<ТљчЧ”$ЯXˆ˜­цаm­rф [-9[ЕЃрSЎy@9EŒщє€ŸхцGїє0“щ!б•wИ+SЎЋ3–{І0cїˆJље’Џo#ydіJЮйaЅŠgи+9oЙН}Э]ksзъoюZ=Э]ыЌЙ;ОфZ;А,m|ЩЕі2љиЖЪЎЕ§ЈZŽлSH2$Œћ уžBТјЌ0Йєr>АА0Йєr>Аа09j9=сa2Ш№0щ/`Jљэ[ЦؘЯ&Щ}zЛVЉ:/Ё)ХaЃše•єšЛ{й’ѓђЋq!Џ{РФсЯлјYЏK5šNfЭЫjЄmdЖvPЬ 0Œ?Пš№;ќШлsаbфр˜ѕ=7‡єжФ-­№A”w‘Їsi!яЉkYЄ]=пK`Yн№„zІGсеэээ^-LKТŠ*PsдВ Šи–}WK§hђбхІЄ{†ЎЬlМBYM…ЌЋц*ш5!ћф BАV иl фђ\žыs$жЪЧDŽ"ъE’чO5J#•Ša+ЃѓCF­›KЖeЭ…4ёцcЉZ†q­SЭ`qݘъЦ„п^{jСWQ2…™іцѕТ˜,&WЙвMь)ыїb”RєЂ xлЕšЯ‹‚Iй‹PлqЯŸПZџў3ЫМb’пЎ—іЏU%+bM|Wјzмcн %tQЈОˆ,яReЉ& &oЈЯќE ПGћV5Сw з,nъ>DЋ‚ал™~zsVЂ7џOVџPKƒˆёD „aPK—pф4r7-(77meta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680$Build-8825pc092006-07-04T10:45:04H.Merijn Brand2006-07-04T16:04:452006-07-04T16:01:26en-US2PT3M19SPK—pф4Thumbnails/thumbnail.pngэ—‡3мїC тQ#ъ"Ђї,бƒш‰ЖX5DoСj=z ЋD‰Н—hЋ,Q6JАzпХън*o~3я?ёЮМwцо3sчЬ9п™;їœѓ‰бгQ'{ЬјјоН{dЏT ўйш;ŸјбП“KqяkЕ†ŠтјЎ…ГЭєWЙ †v“WJФlњ”§Ё_Iа3/ЁŠГ]F"ібБсќB<ЏЅuєЃвыѓќлбУšRТLf€сŽцу8Aюя3Їjˆ BЛaeЧбGІ“|"bOб‹j zq_Y.QSrMY{-Y—›Ѓ-%ћ7s)ХЙFQњLaH#ЗnЎЫТiД‰•ЉWQmXєЛжгГТЩдз'Щ7гЕjгXї\ўёМЧ„ЙЅeb*ѕHWЬn‘їуЩюyћnь#ќщНЪbTзИ:nЂDзіoйл‹ЭlїjЛAjWW‹ЮВ@и&ЩEСсˆ€SчjТUЂIЦ­a~–*Ј‡ЊH˜КЯ›­gzdїU„ƒгŽ[3ч^И1Œe[ЖN"NЖ$ЙtДЖКЄ ]ц whЯі‰ВВoH6VzА8\яj_мс^л~Ae%љPІ0ЦЯgЅ8гёDѕЈмВ=kIN”/лЫЦиˆ”іf”рЅž™y a<3iQ1СлЗ/}%E^\,\эeЈNoZйи<яgПODžпжŽaчхј’ƒ›мњЮvчj\ч$!е eUБљ‘уУЎќMгСІо+дRЗzЬд`Ev6мП ƒ ѓХn…#GЁцокОа_iбе<ЩњgеЄs‘эО-~ˆ‚MЏ w\(эъц‚bє еЌ'ОkЯДx—”e‹;“Г€><—(NъЃiКCnЅ§ ю/сYц–RSƒБ”еŽ)‹uЄњfeъJ!&”Tiъо (Ÿf~ўќ­ЊŠЂЩm1чо9RчPRI "Ž’яЪ/Щh~ЦНO—јэ›-ќJ;І$BЋœа|Ўђю{$“K}u /o–‰є“‡Ј+їЃ’'ЩpxМa‰Žѕо|K™mvwWеШ(C&W.аwRв~нЄ†аlЉАй%­5=єŠmŠ’№nє—wїўЃУ8ьрњoUH1##ёƒr=ЛѓѓѓЕh…ыoW6h`ьEЎгЫsE“[фŸ`Кg‘џ.+цХZF|ЖЏZ6k{%bdNEуУш ѕTvї§ігчhђЕs…зC; ‘А4иA8ы›ѓЮЛ›W ‚`Ÿ‰AщуlbГWž]+\ШЎЭ€Štl%ИBZ4ђœК{Е§ƒ’уyN^rВ•gмBюYџ‚‚”'G|,ыЁпќМ6™?љ_{‰|эnшš„Ї№AяpyrкљW‡ќ^@П•kЬФ1GуаыЯ"Лѕљгj жІЖцЏѓ w@и-‰ЗН5 ’Ѓџ†LииеџЙЪ@~Х~zйвТР№ћsУ/x5ІЁ ЩLŠ•ќ„ŠуџMТCŸ—йXя"?Qџ­XрyžСіƒxџ,ŠоYІ}ž!ОІ_Д?V§п§~˜Ѓ‘Њ]МŠ‹ 4CХЫ3:BЬы•РЩЄЇ ФfтoУŽ`ЭІ:/_і”Э? VFУ`4 wїє_APЦ ’’LbвGз~“їЭ‰Ж>Fš<щ.§&UЂ§B‹є;mЋІJˆ!ЅЯ W5>к‘Аwk$Њ€­-1щYЙi+Зі8Ы eœmˆШ8‚ВОxћІхuЛЛСoЌ=жО‰оUМпЩЫІМюŸhё~>ћxћ>Мж Tu[пЋCxeŽіœшOР /Йѓ­мvœЛefsы ЂМЗЗйсОЈШ ’žЄчё<йт?X*§WœНѕњŸY)ТŽr,ёѓ˜'ZwJЈ|љŒ ѓїC1ЏЃ–ЅuкF FЪЊ“пй[џa$@)ЌŽ`ЉˆgkАЎ+чFьƒ“њx_*нГwј=P’p’юѓP˜Sƒ^sXѓнw§чІ#хйЬhиœ”_pЈ3ѓ V _Dm:ŽgШ&эzт†h1Ѕаь•AC -rТ™чž\ЬПŒX‘–јRF[ѕЮоБэс“‹•ЖŠ:СwЙїс:CЃиМœ\„тhKКH hvtˆямх*џZm ”gЕhЂБ{;i„<_о|ЬНeIх{ f™ће јEwcЪуЭт›bˆ‚Зžxg,нPЛi QOHQ;…IМќЫХЃЉыіŽтРЄЌ+ќЇ№м& &Ш•zъb‚мDŒ ФЇF,J€ДЄоџкЎ@C$Ѕ;њŸ$Б#ј0JRК§Gр.§Тh@цhИ­дw.vžуЙквЁdzњO:Xлц$л:,тёеаі+Ѕќ я!HЗNїК%СоЬццџˆ[~ЕоЎЫžЫ/ЏJаmJВ$fbRжJ}ТЭюvKВUеЃkjж‹ќrm+ъeЌљXшу!›†ЇўМ*Ўєƒџбwуљ`‚н`эАBЯ}[P6Ÿ]‚XЪ{€Ј‰YЄmОUŽ6WNfИR/'С&зЫ-G . н€nƒIыVГ7šŠtе›ФwŸзœКœpH–­дѕЎ џЩ;‡•<+IиCЙšRuрS—7Ў§х7]єЌОOчY*н[nYdЙc“EР(–чЉДЯH€ф(y\ъZы–IЫћй’Ы,;J+БњюнOуДŘлfтяХ[ќUe=n-›ТdKuHƒЬЉ/г[И§иШv§ЕUгт“%9 M>Х (S%zкёvЄШЅы8игY|P{B`ЁMкдЉ"Ђm+ŠHЋA•Уйфf/P'"(чщВ>ƒОрУ‚Ш‚чsRЈїяз/ОZр:]q–Гц?zkPgKйѕZ‰yGHеъ†ПˆНIŽ’’KƒЕ“ВЪДР0z/н=%~Б&І wRd,MњЗєI№—тёz‚‡ГзмэU†L^9–0ькжЙ*ЏШьряСXv~ю=Чшш0`йФhДЧX№њh~V3бЯнъюoЭзћlPцчкЛJ я7еѕˆЛещ"CЋГV“ё1кж9њ1ѕэЂџС-™p…ЂK‘ŠG;+A`rё–нХыT“лч7„’@6ИП5YDў†Lй…Ю2ьъjІZ1N Hљ†нk >ОЮ^њѕЊMёAxАгч4ЯQ7gМpЬПДп‚L%ХŽ~n№РйŸ‘5 м‘—‰ŒQ…П§Ѕэ4 3kxз[}ˆЋ#ёпoЇєђZц' й›VњYDмъŸи-$mSя"’ДlэЖŽоГК“гjлcaвЦ,екЌ!Фef2‡њc1‹_0х4Д„MnюэЏqNЕBGЎсС8“сї Ч\Žmb€Ћ3JЗГљ^№[їoИМЁI‰јU†> я%НцїЬeT‰­w”“—щзШпš-%}aI›‹Oq/LьБ,ЋОis`\ЇиьЯЂ›=ћH}1˜s=О —œp,ј_h‘ЋŸ_ЯGСвKkpш=ЏсЩm§Dkе|kѕяЧ{ќŸЋ~ДяSbHbšН emР6~§pЎТќ.d&…K‹CŠкЫŽЊ{ Џw…D"kЌŸdJЦфсwљeє 8šБl1iпК§ЎCшaeѕ}Бц~ЃBЬˆE›ўеNШПыљЫзЃђШyоNВч'^‚ЪХЖ}ј}№ ;ђj[U)ЌтZt№ўYš юЛ;qюЪЊДZ9ИlпїАЌ*y№™Уе”Р­F*`Ія­ћЛТѓАЇЩIf~Sœ 0•н(фоЇЌЗьБX\ ћТљ$yЕzз ЬФŠЦyЗ™ьWPYюввшNрcIй]šL–ќЭє™эrч„гж`—фИэр_Жѕ^НS–•Уw^So•QЖЖ—œяЏСOЯбзcЮŸћ›О8+Œ “ъО­ъщ.ћ†WU)ы&А*vdсЎ;эЛђЉ?гLX:ѓX‹…Ћя@"sІѕiAZбНћ-#ФћXЮ,{=Ÿ‹Йfёъ,Ѕ*N AЗјxГVkФгљfQкщЊ’1ŠR%CCIЗ%–ЧwЂї+œђ€‘›ШF/ђ Ђй3ќzщеоЪZ щ˜њJ‹—оИ%Fѕ€лЃѓЈoыp J1F/␘=&ЗЅЕш-e/‡Ÿўэq№ЃЉLЅдГаДљ‚6ДAƒГ|HR­ Bž”ыqVхШ’EЊ8ƒNDTšЯ.сЄфІлŠnsSOцOЏвwДW˜,|ХщХУgM,0œw'}tДuЄt4XhвˆЃд›UЕ7О­џнW‰@Є}xf™t‹Ѕ^ 28ŸCiЎіЌŸ ‹V3_ PЉ ы|нЊЂGЯdУєќ+RŽ'Шyя№шHУЁ+6мћВУ0HзG \ІŠ ŸПKЧ;•ˆоiQЧšгЅ>Q’8v)Љ#лpQЗ>&{Sw‚eЮЈ?БЯ _ъьšv}ЭЂjY_68n5*мl19шiЛM™ŸœqйЌѕ7žN‹џћ иЭћыHГ^*W3)jЙ<9p щЊс1 _џ%OXыЯѓ/R'бё$†_wp3Ђ‡змР …jnЇ9ЙЦы{7Wx§Ÿz жЯaaђTvPџ*~R рж‡ )–OnЛњcЏяVuATК’лEДŽЅN]›0к1№‹@ rOJиеDdњ##ї|O0!ЈЮ|f{їяЮ<yЏзZij§Њ)EŠмКО№vbkйВУЗ*OщэПюЁЫ~“а]eЫ ієM9hгF4­ТKІЈO€Ьё%y\•HZaўѕo’UђЯќkьVМфњ=iВ[к‚ q˜упХ1~юl`ЁЕК@iЧJOuX‚ТЄŽŸ ј?StшjrЌјяGч’С]Б Ф(, ДZЬл™‹крЇвО:УTqФZAxY|ШВoоnDфљšпС“…д”oWГЖС‡ъш€W‹YKz( Ќ§>sуЄ_]=,’†?roвЩмІєЦЛ-;гбTw2Л’МтžцНK=й№[‚’Y™ФмѕЋsЂŽœВАXh „чУ0тНХ>yь>x2'ЃN0Є№шЈ“ХбЧt—’bѓјФѕЃ—ah…Щmuщ“Л n| я5_=„НДf•8Ю %[ž№AўЩ`@ek днВUџБЇО% Й6VJЙО>яštџЬ…ЉЦеЙмc6 ‚К–™O}ЯW;$UАmTА™юРшšlуdњаCSC&Ьf‚ ТH{!­Gqйޘ‚Х2у <Ћ”'S+І1[Њ]Sу•!":,MКп\ІцЎx „“D/cЋ vЩ‡luьњu}ylтV:š^Fж–˜˜4жў‹В2Є.CдЗчL*Сг‡ЯтˆKfЫ䣘g(L­бƒЉIВuп#1,‰_Р[CК~иO€ЛдљC3З^dl_IР6rog„Cњ›єтWКwDс 2ћзf.Х%ˆі"цбœЗБ*в0Šнь'Ж‰в;Њ&дГЩЎ}CХЎ;%н§Тœѓ‡G˜Њи‚ '.f=а-СС—е†zНЂDFЦжUgЅЕrAg`hž№ИТВBюЛ?н”8ю§{ s$8њоШ8 …I„эŠKЂ7т˜1УuJђWзѓyЗІЦЕїД+xОЁcpш;чПЇЛсžH1+ДЭ,ѓLАcјŠ;ЮЃ jnЗ“ЏП—ŸЎ>и ˜bˆЋгО™ |ˆiЯKС$М –RСuЃš\Йe™{JˆЎ(9†ЬC|З‹yяŸ–цшјЖжeY.spќ,uiіУ фбx9/oУCж“-ЛіТБS™Ї=ЪŒМJz[ї2мpщWЁW:мВ7№Е^ciєйП баFјѓ|ю№9ƒМЧџђшјЪРq>ДввэўЧAtE>eПДоЭ3U^uSLДьd„+ЙXІеZ"‡ў‘wœЮW“pњ\\їчЇїМ1ŒoыШжqІ–{§ОNRœ‘–“јя›€xХDc‰Ы€ЩdЉ=№ЯKлIњR:PV’иЮйv№жЂьЎ ЅќФqОz ŸqћЦЄCѓіOРй(0аКbь”AЪиi-­\qЭ(чєiЌ_o sИЉи­і-JдГлu|ЏЭч‚ЉФ(1Їњg№гЙтc@хвАR.cЙ!€t)ђŸšНUtЫзЯОƒœ'ЖcFв№.žсЇ4k•™ЩЪѓ”œx`БЮЭ2ќ|`€эxF,CХљЉœеУrъЖ^#Пижэ4Ac_™Нщі0љБЈcEЬkђˆЈJуЪЌКЌ\РHй•дМћzYZ"|".|OДЛџ№СŽЙ5HKё0Њ’ю„cЉ…ѕ‘P.ћ‡u†urTЪ•на NR˜э!}opДїG$g#ЫЫ…гСН5k—GCUsg@MЛ1ЧИ‘qВДжUVњУwЫiu})ЈЬoVОю}ШtЂ€I™ЅTBоЇє\!Ы%і‹ЕЌО3Г`GЎЦŽ’x{ Є„I2бњc”ьзџТеЦ†\6є^ЌeТ{eOvhFЋй$[w‰Йч9Џ.фЃ”G№аŒР™Œj“ <"fВСWђ_‘^Ъ~zwWqкЄr>ѓє˜’’еЮ e|­ўQзƒк}ќџћ-hD0IcРТфЯЄДў0сYфŒ9EXxbKЯ т3АЅъ;–я‚GA…7~ЬUЏёЏкЅ8CAIl(AпFЈc)sХќTЇЗГdћ,џ‰/:_лєФwаShутП$ˆы”rк/cЦŽh—бqТЇ/xaн…NJЙ™VŒDаE’эdЁNQеЛЮŸ™т[ШŒ Њ&u†,FŸќїфюъYВ— IАЅwŒ\вœ жz„ŸCWt${ђd„ џ9ЛСЧјN}ЌcЙOп{ре7v}ФjщЕ ,§’Ъ‡ынАR—W&пѓКOvЦуЯГzС=еI$˜ЧEJ‡b­wNєKн—lЬ2ˆФ4ФЋO„gйBяњ,IU qжPљй€ вљЌFќОєй’і,Š™ [п:[’<ƒTT}Вех‡ŽќOщ№ЗUў'0ГћДз/‹ŽцЎ˜T;~  П :О?ф%/-л—џiї6$§Ц–їFьzCB`ž%ђАbMЌ_C6ртЎhl ;%Сэ|ЅD3ШЫ&C™fїPќњ#/–ШАHgгД3aеѓФ~ў )Гђg„Ч%Ю§(Ih‚њЁіr7p:<•єVгkб{фђ5qDLџ‰2р§žWеІД8АЋ&hЗœу_БdЭ,зх,Аж_MіМЛкН‡wgмuћПh*Ћк.Ь=€ЏŽЈzh5цR“ћЮј’Ew˜Кєђ!ЋfЄ ОЈ=`Go•SЅПУжY5щЛЁіФ‡ЧerIAљЬ.7ЬNйowшЦшˆmжЂлЈVc5яŒОЋe-ZƒЦнсœin3и 9ЇˆŠЬu›ы™ЪHБнОП,\•zfwЎѓUЭuЦ Ѓf.Šй;Єђ/”-*TŽЅА)пЇГџ;*oСVГ†~|+јь"MђЁџkPOдa€0€› ‹ђ‰vбЭmВ“ј%ЏU-AЯ–дЫм–†јамЯщЕŽ,8ГЦуХ$f9ШвМ Ќˆ/n’U“xZaтљїКnЃў’МЪX<ЭШ‘‰АъмЫџШц+еJib€P uГg‚МкЮЗаD:р ќ}gжГЋНлР_[S‹mПЛSлžet9­–*щP)­эjўфПР$ђPяiŸеЌћГЭ2_T№ћLЊі>ZЙdA[w_]Д54<]ыO0DWY6lЄL‹;ŒЊЖŸ78OЏЏьŠV§™ЦlHШ1чЊБэlПх№ћАЂщ+iрОд?kfЮЄР’ЦШДяъHщejЇX™УщHДХ”hlН<-№^@[Р`š˜Еб{'%w1VПPfP•ЖЕ55%g!~ЎI§[ЃяЃўЄЮЈў~ б9NeюЦ%цЈоJяъэ]0yЯ ŽрЋЕСhи.ЎѓйШrЁLФ{sзљт ђФ5 ЃQуЭЖЊGсЌrн№ЋДmЦp{ m0р&LщЧ+оЄѓš№,i4ИЏ'щтЖК3Н7ѓ3 iB/Кi2 Tj ќs9гT3вэ0! HѓK&ЊфrчeтЃ_9ЅЕо“rЭм.+'юЅ@€†”YАl/$$xCƒ.72ЗЇ:Є+Й‘qIЕwБ3АR\ч1ЎѓѕЄ#Ы`v9жЈ –J лf8}ЮЩљPBBb`xјMсЇ&,ыђАл ШєЉ]Pм%,8ищAх J+2sq*Њ0MВgqH`њ;љ\)™4фyЌГ@э СЪ1x”юœ/сцˆlx‡|;qNDЙVќЯTFт`“чеЩ§\”ќQјяiЪ\q11 fБ7‡Sя}Š‹­DдАЁЋЖЦV‘…ЊНpЪU„ж~КС$ХYIFCxU(сš“ЧЈ ŠЃћыw„)jqрmLmАdєˆ3G~~™ІvАЋQсиюф›зђ~ЃчЪфYІыeХФJпSаЮёЦ™Ш›п>”c`˜жл0ч—ђ/ѕЂ54”ѕм›ЗЫЬˆўыœKњИ~ЁX+ГЌ§ЕјЌтB[$ƒWЗ—?,Й”ƒf\7ф3ІQыбм}Š у,ЋzblЩ‘,™eЬ!›- ;а5Pšлw% ћEJ'rКкїщ~ж2ŽTUР+:“Е0љг!ЁPmќє0й9чW,чПo~нгgШœJХжVV&b€!њпд ”ћ7F)‘ uМYЂЭŽ4ъёDtЙ ”{йч#ЩŸV м}™d§‡Ч b3VX‡I$ўЭ@J'бbwgХЃІйvОжpжБ&ькšЇєоt‚щЏя"ЉЂCЙуџЌ{­—IиЩяыв{вћ#>ѕt=Q<ЪY9ˆјџ.џК\Г~ƒ%oА)Ыю§[Њ:*•JVaџPK+Ž\хdщPK—pф4 settings.xmlэZ[SтJ~?ПТЪы)хюJй ЌоVТEхm’Дdt2“š™№зя„ˆЅ\ сTэй№d._wfКПющфјћЬ#{Sр3zЂ•ŠкP›9˜NNДсрlџHћојч˜=<`ъГЈм Ѕ"ідt*ъqї‰pZgH`QЇШQ—vљ@—гъoGзТт–СєщDsЅєы…B†aх€ёIЁЄыzaбЛj3њ€'›ŠŠGПХ{Mˆ•Y+‹еB|­эН(љniЫuXо~ујE@ќГ%xбкьН4GЊhJd}Š!|]5mеМїsFX`‹€С ˜Џ-;хмW˜J­Q<.|љ№%<Шн пbGКЋ KЕoЕђж№РwЅъ•ЃšО)ќО‡ќ}L˜“съMZЬQцХч›( aзIh)$W 5ЂЮв—4@zZп)њ~ŠA№„FВ Ж.ПaKхwЋжЛšn/п#пgˆмa?3*щћЫ+ц@r\ЦЗ0rрлЛBOhП\ ,є­ў;Р7l‰ЇА@7ЌYž”Ад7cтZТšыXeKмl |‰кdR2я Р+?ЇГuвb„)Ю†Aj9ƒф ’3ШпХ gЪB3тУœ?rўШљуoуюЁŒŽ0ŸТОL •œ@rЩ фП#uн‹вЩІП(ЊЌЉкМVOЖі ›3B,ФзVЪОІЄ1cо@сdъеш‘ ‰3h1­  D…АOбS‚ї]Fšаг ‡Ј›РЗ#€Јжx@D@z1cрlЁПX'@ђ` ќk&wнц8YЂЬ9BЊ<MXфEЅђaЅ\ЎЅЬмпэыVЅƒ„R=№ЈЩТ јn„є]ЉШfш]ё3SшЯ=‹б‡dLШDHŸ"РL$$$7: ЯŠЛтЅ№П3 &ЕпыѓУђЗ” ”„_™$n п,OБШ8Н§ОZљДІУ3,њsjЛœQќ )ˆ(eB№ђдgѕrѓчzqCРQДС_yР—ЧџYмИФєiш;HТњ3Uкa’ђ”‡Є?#$§N’HжBФˆЂŠьсoдIUнЧЕКXsˆЉЈ3л \9oЌXHРaЕ‰)тs­a† —иž^5ў€OЏ4ъ Ÿ§ъјю| ŸН5Œ+уБ_ GMУpћъяЉЃОњžŽЭіYёОoЬZД9GЗЕтјЎЋC{4З*“ ЋrюUл§щ[хЊ>lыsЇsюЂЛоХ}Yбэшљfpza—Џ]Ћ=дЏFиђJЎэ9Ох™.ЂЃgЇ]"эщW­0Мќaˆ+УДЪГЉэ™Фю˜ьfа-*йЯV{Tп†њл~Ч#уA1l‘fЯ<НžZд$pjКNћє"Ѕ9ћ>™№HЂьЭЙх"Žles-цљDфї™W7Кт85Fє& Ж аŠ’b&Х4…QќFйOк"Lь"„ФIШgо<џ3–йBˆAˆJЇ":8gV QШR*†Sх;Œ’yŠ{X›м>МЦWXї‚cуPK "y.œ")PK—pф4META-INF/manifest.xml­“БnТ0†wžТѕЛэTYЄ•*Е…! нј,%g+>#xћЄ,mГэ_пч;щЦг]лА-tС:ЬљƒИч АtЦbѓuё’=ёщd4О›/gХчjСZЖ‚@Њ/иj§ќі:c<“rщ—UeKЎЋЅœsіоч[ЪХgМП† O№kfњ†г1чБCхtАAЁn!(*•K.уЪи’њ™W‡6&#vWЖ,Л§E`ЌЮhя!чкћЦ–šвф8КФЅBп6a@ќ Љbгd^г&ч’Ы9CD‘њбŠвaeыиoлf—‘№ј[9СŽdВн†'?z>†фк7ЧЖ@њалАbл/дЖ ’њRxЌ‡†;X J{эX^эдфPKр&ЫЪ.ыPK—pф4…l9Š..mimetypePK—pф4TConfigurations2/PK—pф4рЗн"цЎ ‚content.xmlPK—pф4ƒˆёD „a нstyles.xmlPK—pф4r7-(77)meta.xmlPK—pф4+Ž\хdщ†"Thumbnails/thumbnail.pngPK—pф4 "y.œ") 0Asettings.xmlPK—pф4р&ЫЪ.ыFMETA-INF/manifest.xmlPKоwGSpreadsheet-Read-0.91/files/attr.xlsx0000644000031300001440000003274412565655372017046 0ustar00merijnusersPK!sAГŽœж[Content_Types].xml Ђв( ЬUЫnТ0МWъ?DОVФ@ЋЊЊ8єql‘ `т…X$Жх](ќ}7сЁЖ ‡^%БgfgЧ›ЄП,‹hГЉшФmЭœ6všŠбkыADHЪjU8 ЉXŠ~яњ*­<`ФЛ-І"'ђRb–CЉ0v,™ИP*тЧ0•^e35йmЗяeц,ЅUЂ—<УDЭ Š^–ќz­dlЌˆžжы*ЊT(я “)bЁraѕ/’–›LLкeѓ’Ёcє”Ц€Ъ"іС0c†Bі’w.: б@zS%3Шe!‰+€ѕЕs Dд`7ЪaBЄUи˜ъgНkа-ѓ{x^i›ЦМГюцЦу†уоїфг…йиЙйЅ]Љв—Ъи­ю!Јјыш ЌowВУ?ІƒЃ<ЮЃфр7ц‡ъdiа-ЯШРЎw'zаmЌсgDOђ€фnнІЗџDGѓщ№7?0WєxЂM/>6ОcŸ”ЭЬ8П!лYRэо“HYџ[z_џџPK!ЕU0#ѕL Ю_rels/.rels ЂЪ( Œ’ЯNУ0 ЦяHМCфћъnHЁЅЛLHЛ!TР$юЕЃ$@їі„‚JcлбічЯ?[оюцiTb/NУК(AБ3b{зjx­ŸV b"giЧŽaWноl_xЄ”›bзћЈВ‹‹К”ќ#b4O ёьrЅ‘0QЪahб“Јeм”х=†ПP-<еСj{Њ>њ<љВЗ4Mox/ц}b—NŒ@ž;ЫvхCf ЉЯлЈšBЫIƒѓœгЩћ"cž&к\OєџЖ8q"K‰аHрѓ<пŠs@ыы.ŸhЉјНЮ<тЇ„сMdјaСХT_џџPK![ИЩaxl/_rels/workbook.xml.rels Ђ( М”ЫjУ0Eї…ўƒ˜}-лIгR"gS йЖщ{ќ Жd4г‡џОТMх‚Л1нfн{ИŒДн}v­xGG5 ’(&ЗEc*Џ‡Ї›{ФкКЕ HАЫЎЏЖЯиjі—Јnz^Х‚šЙ’ђ;M‘эбјIi]Їй—Ў’НЮКB™ЦёFКпiŠ}ЁРэ‹ˆУа{чПЕmY69>кќ­CУ,ф‡uGЊй‹jW!+-’уdyb—aю–„ЁZ;,^иљЌi:kЯСЄKТ„&а:%“ЮС$џ “ЬСl–„!ZПєaaОы9ћл%эй?%œмЧRŽчlы%Т&LЁuZŽѕO ђьcШОџџPK!Y|{Аxl/workbook.xmlŒRMoТ0 НOкˆr-…Т„(h_h\ІœCувˆ4Љ’”ТПŸ“ жэДSbћљйя%ѓхЙ’фЦ ­2:Ф”€Ъ5ъбЏЭъс‘ы˜тLjН€ЅЫХ§нМецИзњH@йŒ–ЮеГ(Вy Г]ƒТJЁMХ†цйкуЖp•Œ’8žDŠv 3ѓ]"‡W7(з‘ЬсњЖЕЅ‹y!$l;E„еѕЋpяГЄD2ыоИpР3:ЦPЗ№+ašњЙвWгxJЃХMфЇ! жHЗAyWvє+'ЩФ#Н[­§iђ!9я„тКѕPДіrІ)%mЈьw%–ЇУ]юФЁt˜ŒGВм‰lи3~VдьФЁс$*h}бR7ЦтУyЏзЈgH‰™ ̘5}ј*МQома‰иG?IqPоќ^Cвk§mXiхњЛŒzрqшQCЮdŽNћ#,Єг$ ˆыg[|џџPK!rKЫŒ xl/worksheets/sheet4.xmlœ—[oœ:…п+ѕ?XМ—‹™[FУT г>TЊz}vС3XLСЩДчзŸmАьˆQв—тЯЫл‹ййН§S•ш‘ЖуuфЎя Zg(tДЄ™”D†GгВŒœ$wКпНЈМIяЊ9НжњiјO-Ъщ‰<”т3ПМЇь\pЛыЅTШx 8ќD“OРAљг–‹Ўюмuрп…€ЃŸД)“Ы”=t‚W?ЄЄЌD`T"Л›хrБкМ@%T*0jпХ›eА\счзВP*0j•а]рхzМ@іыmQЉќƒ-+%Ѓ мхк_RЩZ‰РЈDТеГЯу OЛMBйяZ~A|xž]CфklAY&‡.бѓя€пЩt?юз;ят–ЉЙ{Йњ`Ю•Си„bS!šPЂ!(aTZ˜аAAr1BKJ5t7…V&tTPh>žЮsЎA–o;РЕœРкщ^ЎЖ-ВЁXA†E6”hhj‘ dXdCЉ†ІйаQA†EШАШ‹жзЩYi|УFŸFГћ˜нk^‘Y(VPЕЭB‰†ряЧ,tP†У,”*(МUјQC3…>СnO|ТюјЎЩyщФsЌjcfї^CF,(VPеЭ*%2r`)$?™ГJЉ‚Т[…54SИсьіФЉХ5QrVњdфрЮђICF,(VPЕЇГ DAиШ4dфР‚R…З ?jhІpУ'иэ‰OгDЩyщд4иЗœва46+(€ъЎNйPЂ <Э 44Э Ѕ o~даLс†SАлMЇфМtjšXN)HЖcЃ kЊ›…сiьэš&С†R…З ‡6Д?нbІ№СЉЁЇкƒІ€Ў[А zШЏХаŸ"ёЗVМц1ЏUы.лП†œщGвžYнЁ’žраОь1Q;tœУр и $а=і—4хz >А њFi~ЁтЁA ihћ…§Уsц-ƒіЛяК#Їс­h Ае–х‘г~ШYа œіŠˆ”ь\џ`ЂP%ЪFяњФўџџPK!Ф,ТB#xl/worksheets/_rels/sheet4.xml.rels„СjУ0Dя…ќƒи{$;‡PŠ%_J!з&§E^лЂіJhЗ%љћши„BŽУcо0]Yѕ‹…c" ­n@!…4Dš,|>ЖЏ X< ~I„ЎШаЛЭKї‰‹—Zт9fVеBlaЩoЦp˜qѕЌSFЊdLeѕRc™LіслOhvMГ7хЏмS х0Д Nз\—ŸЛг8Ц€я)ќЌHђЯ„Щ%’`9ЂH=ШUэЫ„bAыGі˜wњ ŒыЬнswџџPK!;m2KСB#xl/worksheets/_rels/sheet1.xml.rels„СŠТ0EїўCx{“ж… CS7"ИUчbњкл—ї§{ГeРххpЯх6›ћ<Љf‘,дК…фchА№{к-ПAБ8ъм -<aг.ОšNNJ‰ЧX Б…Q$§У~ФйБŽ Љ>цйI‰y0Щљ‹аЌЊjmђ_Д/NЕя,ф}Wƒ:=RYўьŽ}ЂH9ШEэђ€bAыwіžk}ІmЬЫѓі џџPK!ьХ љWxl/worksheets/sheet2.xmlŒVMoл0 Ниt_ќ;Iƒ$E›Жи†}ѕЌкr,д–ЅЃюбї€ЗG3(wм—То‰;Ыƒg зоЂю§Ј НККЗ.h>SŠNЯуE%CзИGЙ{т:Оk—5o7v>h’Љ­„œcЗщ­n&нТААГтд~4Eњ-M гзˆ ЦFЁЄqc‰˜зFВTk%ЛŽЭПaў•Е!5ЉxqЌж їaTЂфI˜vYТpцагУ€ ЅЬлpКНk$Ќљ(LйЉрˆФ[гџKАњ џџPK!ЬЬјф‹Zxl/worksheets/sheet3.xmlЄ•Qo›0Чп'э;X~_€ЄmJTMвh{˜TMлњь‚Ћ`3ь$эЗпЛФxŠV)}h ўнџюяsЮЩнkл э%<Хб,Фˆђ\ŒW)ўѕsїх#Љ/H#8Mё•ј.ћќ)9ŠўEж”* \ІИVЊ[Ьkк9хАRŠО% ^ћ*]OI1ЕM0У› %ŒcЃАъ?Ђ!Ъ’хt+ђ}KЙ2"=mˆ‚њeЭ:‰ГЄ`АІ Ёž–)ОVз8Ш’!ѓoFвyFкШГ/zс[‘т$mhЎ%наІI1Ј љgа4‚СЈ˜%Їчwѕн`§БG-ЩОQ?Фё+eU­`ŸчГхPR.Рс?j™оŒZђšbHtd…Њс›pЖŒТx8ЪїR‰іЩ.hG‰ЪиEВЄG BВ#К-б "uЮy8‹BїЃ8VЮs}KЁїђ-“р 3йЕЕ–Nё­‹ФSdc‘ЙЃ…Sfk™…ЫDSцС0ёЫ\L^GУыУ:L]Й™цcІaSж–эїЦ7n‘IСОqЫ,™Ш7n˜xТœ1x‰qЦсW>šђ[ЕЖLь0ОqƒФ0=ЮЪl-уœŒ[fRЮуаЋKŒOZН№Z­ЕџsЦ-:яи2`ъФј­6Ь‡Ю8œМKы№Ч“ŠЏ<у–q+і[mЈћdЪ?у–уЗŒ{Њ"ПеfЈšЩжеp)–У@-WfT#ѕжС­ФХFp{‹щЙи‘Š~'}ХИD -ЁЃА7узМ(б ƒђY(ЋУc ї…Ю.…Pя/ iжvУ—ˆ4ЌтOLе6‹О6є<oХь/џџPK!%Њ‹д‹xl/worksheets/sheet1.xmlŒз[›FРёїJ§hо˘{ж2Žb0—‡JUгЄЯФл(˜Ё0Ллєгї ‡рУЉњДіјчќНОЬю§пїЦz•§PЋ6ЮгFXВ=Љsн^cёщь—wТtеžЋFЕ2пф ояўiїІњЏУMJmС„vˆХMыnkлУщ&яе№Є:йТ#еп+ wћЋ=tНЌЮу“юэn6Ё}ЏъVр„mџfЈЫЅ>ЩT^юВе8Є—MЅсќ‡[н bП;з№˜Й Ћ——X|pЖхГАїЛёШŸkљ6л–Й/J}5”чXl`Т y2#­ ўМЪD6M,ВZќ5Ю„›0аž'влпЇgуЅџж[gyЉ^§Лz+d}Нiшь>Eу„q@ZщjПые› 8FW™ ЮіNхd?Р*<Э\мы>кйЏpМгєиС<#ЯDl–"AсРK9q–$EтF„ИKrDт…„xK’!ёЁг| Ir$OHА$’а#$\’Iфђn&6Єœ{YщiVЧжѓyВf‡IРћсG$™Ш”O‘ИД<;а‰GЫ3’!ёiyFr$-ЯH$Єх)‘DДќƒ,ВYЩjVcSцfьџь€ТзяG$™†ађlJ:Zž‘#–g$CтгђŒфHZž‘IHЫ3R"‰hљYdВ’еЌЦІЬЭи{ѓ€ТЁхIИД<#щtZž‘уDhyF2$>-ЯHŽ$ х)„Д<#%ј ]ыВШ d%ЋYL™ГВЯГ ‡–g$AтвђŒЄHвP8Д<# —–g$EтбђŒ‘јД<#’€–g$GвђŒH"Zžи‡ŒYhљСЌИЉР=AwƒM—ЎOА‰ИЈVуіФвп:и‰Е*QэДs3›‘ЎКЪ_ЋўZЗƒеШ tп˜M†еу–яhе?{П(­е}Мyƒ=™„=Цц №E)§§Ю4ѓЃд/еUь?жџРсT_УюkмtХЂSНюЋZУЁЖѕ9}yvЬ срlœhUM}mџЌѕm:EГЯ2;ЈyЙџџџPK!Ш;С;‚Bxl/sharedStrings.xmll”Яnл0 Цяі‚ю­“ШКТqбfиvШ.kћŠЭиl%в“Јeyћ) z‘tдяћјG4хісŸГъ/ј€LkНМ^hдѓ€4ЎѕыЫїЋ;­‚Œe‚Е>BанчOmЂR,…ЕžDцћІ §Ю„kž’ВgяŒЄЃ›0{0C˜ФйцfБX5Ю iеs$IuW_ДŠ„"l.фіЋюк€]+‡ЁmЄk›гё‚F@9мй9;L(<‚Е|Ш­ЧIЊ‰ЯJ-Л‰Тyšб›cЮ,ь%g‡С­љSЙUxЮбŽEихє-С}Q~жцжGІе+aZPПžѓ -ˆ€W?X&ьkЂ?IЫѕєRЈБЧСЈ Sрђкл‹њl(|”Яьиk€blйШЩЉъRЄМE*цОR3#“_оеЙ?–[Щrџ^ђ)}ъr]З&Н _юсЯГЛІœ#6iyѓйєlЃ+оУ%QнЋОхƒЊїљ›jyЋ*z“ўнџџPK!ёЌaXоЉL xl/styles.xmlФœйnлF†я єш…a›к,'$75р @RАєТ€A‰#‰-•Є )—}ž>UŸЄg†ZŽ.cўІ€РЁ$Ю7‡ѓŸŸф gиЛ]јžё"Ђи ƒОйМj˜†FЁу“ОљэёўђiФ‰8ЖЂo.Elо~ќЁ'KOFmeћeIHГeќњX3ЙŽmм…AzЂ2чСтu3эУ;ЄVд;}–XW^JЃ<šІNE(­rYšz•`щiцjkVXBKГ<šІfE(ЭrYšš•`щi&“ zќR]Њ”–vEDM§Ърt4,фiъX’ЇЇх\л…%Д4ЬЃiъW„вб.—ЅЉ[ –žfыk\з$ёЖз№уЖЫлYKЉ ІH9}В0šвфc^ЇJѓŽ,Gї~•.ћЄW s ѓe8Џ”&ƒSVuїгнЕыy›N?u гoН™-яŸƒ{њйXm?.gдхhB iЩ’…{O"{йl]—/@ЗЧЎ#Ѓ˜мыДїПІ  Зlhй5ЉЎl-5Љ{ѕ:jRно:*jЊОU-5Љ.r5Ѕч:jJЛг:5)’‡aфатzјЎIJПє<1NШ#‘;™Ъџ“pF‡a’„>m8Ў= лЃMk]bЕAи‘№М9ЮјЧx‡НГA8Б”}i9B(7щМАкLyщЩчД”ЭБз7Д>иXŒ75d•nf†Е)mиГ™ЗМЇу 2yNЩbЕ€Ќ6%‡f7Нў1ЪAUKŽЏЂXrХ’ƒГ(K{JžіћmO5фЫеж*WW™[Lf™ &Г<“YVƒЩ,ЧСd–ё`2Ы0™ЙLfо 4yЃ€UС`2ѓ˜ЬМ&3o€ЩЬ`2ѓ˜ЬМ&3o˜0oА*xLІц\_ƒСdТН™y3ѓ˜ЬМ&3o€ЩЬдф0oА*xLfо“IЈЕ7РdТН™y3ѓ˜ЬМ&3oPУРМQРЊр 0™yLfо“™7РdТ­]&3o€ЩЬ`2ѓ…ѓFЋ‚7Рdц 0™yLfо“™7РdТ­]&3o€ЩЬT ЬЌ о“™7Рdц 0™yLfо“™7РdТ­]&3oМzЃ€UС`2ѓ˜ЬМ&3o€ЩЬ`2ѓ˜ЬМ&3oаfЮuуЃчN_Єб={§б˜†‘ћ’]Na—$еSћХ8ћ1ЖЪ…$Ђš+UO\kЈ“$юHЖ,=л­ЁО-хђ•“EА’іЄ1ЄJзТЖйO’пЪЧь OФЁќ' у j‹b›ЮуФ/O|8M‡ipš8ђр4aШ{фšѓ@UЩЮѕ_‹і#ЈЭ‚ќ‚ИDY§щŽM=2sj ЩЊЫ3E‰цqalBJўЭ_‰ЩSMš\€;LжeЉыЅT‡БŽIuы‹T‡БюGuыqT‡!аЂp`yжB: …tЭ&в4чв-ЄZHДh#аF: t@щ€6вmЄкHД‘h#аF:€ІэуNAЄ:Htш аA: ƒt@щ€вЪЙE]„UGЂмMаяs(Ђ{ѕЂ˜cгг›])%ž*Г O•™‚ІЊJ4Tѕгра7IyњCGЊr mvЅЗёTir4U^ t™_Ѓ0Ѓ$}Y-˜šm>^8њKОпGНчХ‚<\)U›1uGШ—W!†œrЦ5J\аЋ•N—в”zˆЕ7ИЄжЖбj6ЖdngСмfщ›!ІїЭѕF/;rЬэ№Юpюz‰lVГmзЫжYlWр){HЏџ’kѓ6Qћ8blЯНфqѓcпмnŽ;їщ ГкыЋћ& б7ЗлŸхBСІZDomп16јџџPK!iРRŠVxl/theme/theme1.xmlьYMoEО#ёF{oc'vGuЊиБ[HгFБ[дуx=оfvg53NъjHHˆ‚И qу€€J­ФЅќš@Љwfvз;ё˜&%ѕ!ёЮ>яїЧМ3ОzэAТа’ђДд/зDвiЕƒ;УўЅI…г1f<%э`FdpmынwЎтM“„  Oх&nБRйцЪŠ aЫЫ<#)М›p‘`"Z | |ЖВZЋ­Џ$˜ІJqloO&4$—4KlЬ{ $ЄJъ…‰fMrŠ]œ*Ю…ы"gВЫ:ТЌ€ 1?’*@ K/кAЭ|‚•­Ћ+x3'bj m…Ўo>9]N0>\52E4*…жћж•’П0Еˆыѕzн^Нфg8 СTЋK•gЃПQя<+ ћu‘wЗжЌ5\|…џк‚Ю­NЇгlхКXІdП6№ЕѕЦіЊƒ7 ‹o.рэnwнСХЏ/рћWZы o@1ЃщсZДпЯЙ— g7М№ €oдrјйPІ—1сЉZšl ОЯEЩАЂ)RГŒLpyмХЩHPЌ%рM‚+oьR(–Д0$CA3еоЯ0дФœпЋчпОzўНzўффсГ“‡?œўЬ—UќЯп}єгŸњPBs^|ўф—gO^|ёёЏп<іРЗUсCš‰n‘ctРАЭ8ЦеœŒФљ(†1ІŽЗ‡uOХ№ж 3ЎC\чна=|РыгћŽЎƒXLѕHоИЧ9ыpсuРЎ–Uё№pšF~сbZХ`|ф“нХЉко4ƒОY$ЅућnL5їtU‘”(ЄпёCB<жнЃдёы —|Ђа=Š:˜z]2Є#'‘цD7hq™љl†P;ОйЛ‹:œљЌо!G. 3ђCТ7^ЧS…Ы!NXес7БŠ}Jf"ЌтzRAЄ#Т8ъ‰”>šль­}CУђ†}Э)=єёМ‰9Џ"wјa7ЦIцУhWБяЩCHQŒіЙђСїИ[!њт€гЅсОK‰юз7‚;4rTš'ˆ~3:–аЉў›аєЯš1ЃаmМmЦэ`Ж&_Iм8е‚—сў…wOг}ЙОИёМэЛoћn№ŸяЛЫjљЌнvо`ЁїъсСЦfLN–OЩЪи@ЭЙ)Э ,aЗїaQš3")MY _ѓююр" \}@U<ˆqCv=аL"™ГŽ$ЪИ„гYіђжxд•=6ѕЉС6‰елх5Н\J6fЯ‰ЬДДІœUик•œ)˜§&ТъZЉ3KЋеLЏsЄ•&CMƒХв›0† ^РЫыpJзЂсp‚kПлИ‹‰ТE†HЦxLђiЛcT7A*rХм@юxbЄOzЏёZEZKГ§ вЮЄЊИЦqEєўJ”Š žGIюЉrdiЕ8YŠŽлAЋЙк PˆГv0s-|M2ˆКд“f\…ЪоЗ8EZІ“ œ-fSхѓhЖ Ум"ЈУ]…ѕћ‚СŽˆLHЕƒel%˜Wy АTKВњЏ6С­e€Эє7аbm’сгќш†–L&$Tе`WVДяьcоJљT1ˆЧЧhФІтCјuЊ‚=c*сzТt§—iклц•лœѓЂЋ^aœ]Ч,‹qоnu‰•lсІŽKЬSE=АЭЋЛ1юќІ˜’П SЊiќ?3Eя'p_А6жс2W`ЄыЕpЁb](‹iи09˜-В.dс5$\)›џ‚щџЖц,SжpьS4B‚Т~ЄbAШ>Д%“}ЏaVЯї.Ы’хŒLFUд•™U{DŽъИЎїіХъІ›фmРрNчŸћœWа(вCNЕоœтm–ž^S4я ž|l1ƒ<З›І№ЉЂgWЕє†Ми{Ow§љ˜е(Њ„UЖ‚V^іoЈТ9ЗZлБ,^mЪA-†Хr Ържщ?АџQ2bвXoЈC~НСЏ šЄ dѕ%;x н эт'ЛhуЌYYзцЃ“vчпяRю)gkЭЮяs:ЛЮ\qN-^ЄГs;ОЖkK] ‘=]ЂА4)N2&0ц‡­ъoO|tНwќSІЄI&јaI`=І ј­DCКѕџџPK!ˆ\гв 'xl/printerSettings/printerSettings1.binЊ`He(bШgЈ` 0В0Боa8ТќŸ‘“aЗ G ХЯСФШР$™€u^ЇwїХ хm–1ЙŽЩЌ 6›32{oзžЭЗЦњBu\ў/‘ЮcВˆ'Д з,@)O€Мѓ}ўђoџџPK!ш§ђ^ЈqdocProps/app.xml Ђ( œ“Эnл0„яњяУ( ƒbр(1rh#ўщ™ЁV6Š$ШЕ`їщKIP,Е>UЇн™Хр—dчZ' ј ЌЩЩ}š‘ŒДЅ2‡œьЖЋЛя$ (L)Д5“ ђРП~akoxT’aBNŽˆnAiGЈEHЃmЂSY_ Œ­?P[UJТ“•Ї вY–}ЃpF0%”wю3є‰‹џ7ДДВх ћэХE`Ю–Юi%ЦПф?•є6и “чГЭшиd‘nђф^xЦшИe)41˜WB`є*АэЁ­…ђГ HД> ъw<ЖIоE€''№JŒXэXпtЕv=џўу]‹ Ѓq Лr<;ЎеœЯЛXLл€$SФ­B сЕZ 7ˆчcтŽЁчэq ЋэЩ‡1р'ъЊлјMkЉеСДЛПщЎЌСIф„ў/оТжN˜ _ПНЛЗeђ˜юSF•§Pц#ьмж> „a]S‘mŽТC7<јWНФMyн†GaP3џэхкї/ˆпЯв,~н4FЏo…џџџPK-!sAГŽœ[Content_Types].xmlPK-!ЕU0#ѕL •_rels/.relsPK-![ИЩaxl/_rels/workbook.xml.relsPK-!Y|{Алxl/workbook.xmlPK-!rKЫŒ ƒ xl/worksheets/sheet4.xmlPK-!Ф,ТB#„xl/worksheets/_rels/sheet4.xml.relsPK-!;m2KСB#‡xl/worksheets/_rels/sheet1.xml.relsPK-!ьХ љW‰xl/worksheets/sheet2.xmlPK-!ЬЬјф‹ZИxl/worksheets/sheet3.xmlPK-!%Њ‹д‹yxl/worksheets/sheet1.xmlPK-!Ш;С;‚BЕxl/sharedStrings.xmlPK-!ёЌaXоЉL ixl/styles.xmlPK-!iРRŠVr#xl/theme/theme1.xmlPK-!ˆ\гв '-*xl/printerSettings/printerSettings1.binPK-!ˆ\гв 'џ*xl/printerSettings/printerSettings2.binPK-!$гыЂJYб+docProps/core.xmlPK-!ш§ђ^ЈqR.docProps/app.xmlPKž01Spreadsheet-Read-0.91/files/merged.xlsx0000644000031300001440000002017012474016202017303 0ustar00merijnusersPK!ШЃЭ4vн[Content_Types].xml Ђй( ЌTЩnТ0НWъ?DОVФаCUU]Ž-єLпT bˆ 4–Tй4DУŒqDl …œŒ?иt4’™ŠєЎ*f;+‰@{ЅьЁ—ˆьЎFљŸio{SњmAЬgт`ё2k? LyВй–&`Cwvн™|љИ^zПОv*uвJwа}Ў\ЁYє%ЎЗЈ­ACB$ЧЬЮqskяMmQ6Їў-<­ЦП+жЅŠ чФ_ЮъъѕќнЅуИ‹мGИ|‡Южгg6 ›ифџџPK!ЕU0#ѕL Ю_rels/.rels ЂЪ( Œ’ЯNУ0 ЦяHМCфћъnHЁЅЛLHЛ!TР$юЕЃ$@їі„‚JcлбічЯ?[оюцiTb/NУК(AБ3b{зjx­ŸV b"giЧŽaWноl_xЄ”›bзћЈВ‹‹К”ќ#b4O ёьrЅ‘0QЪahб“Јeм”х=†ПP-<еСj{Њ>њ<љВЗ4Mox/ц}b—NŒ@ž;ЫvхCf ЉЯлЈšBЫIƒѓœгЩћ"cž&к\OєџЖ8q"K‰аHрѓ<пŠs@ыы.ŸhЉјНЮ<тЇ„сMdјaСХT_џџPK!>”—єКxl/_rels/workbook.xml.rels Ђ( Ќ’ЯJФ0Ця‚яцnгЎ""›юE„Нj}€L›Вm2уŸОНЁЂл…eНєјfШї§2™эюkФ&ъƒWP%є&иоw оšч›Фк[= &$иезWл4чKфњH"ЛxRр˜уЃ”dŽšŠбчNвЈ9ЫдЩЈЭAw(7ey/гвъOБЗ воо‚hІ˜“џїmл| ц}DЯg"$ё4фˆFЇYС.2#Шѓё›5у9щГ”ѓY]bЈжdј щ@‘%’sч"Ьнš0фtBћЪ)Џлђ[–хпЩШ“ЋПџџPK!BE T,xl/workbook.xmlŒ‘ЭNУ0„яHМƒх;ЭMTЊ:•*@є‚8”іlтMcеБ#л!элГNH'{vэo=уењм(ђ жIЃMf1% K#Є>2њО{О[Pт<з‚+Ѓб 8К.noVНБЇcNк1Z{п.ЃШ•54мЭL ;•Б ї(э1r­.\ рЅqœG —šŽ„Ѕ§УT•,сб”]к Š{|ОЋeыhБЊЄ‚§шˆ№Ж}х ОћЌ(Qмљ'!=Fч(M Жk7TЁ›ХŠЋЩ7K0QЛZКУЗ{JTМS~‡ЖЇЉ˜c:Oг<BD{ НћIЮЉ…щНЯ1ђЫUЁш‡ЮA _3šЦљ"›j/ ЕG|’-т@~с‡`qЬА=Ио(.ќРљ}со.%nьы0н*Й*ƒK\†ƒщцйI‰y0Щљ‹аЌЊjmђ_Д/NЕя,ф}Wƒ:=RYўьŽ}ЂH9ШEэђ€bAыwіžk}ІmЬЫѓі џџPK!iРRŠVxl/theme/theme1.xmlьYMoEО#ёF{oc'vGuЊиБ[HгFБ[дуx=оfvg53NъjHHˆ‚И qу€€J­ФЅќš@Љwfvз;ё˜&%ѕ!ёЮ>яїЧМ3ОzэAТа’ђДд/зDвiЕƒ;УўЅI…г1f<%э`FdpmынwЎтM“„  Oх&nБRйцЪŠ aЫЫ<#)М›p‘`"Z | |ЖВZЋ­Џ$˜ІJqloO&4$—4KlЬ{ $ЄJъ…‰fMrŠ]œ*Ю…ы"gВЫ:ТЌ€ 1?’*@ K/кAЭ|‚•­Ћ+x3'bj m…Ўo>9]N0>\52E4*…жћж•’П0Еˆыѕzн^Нфg8 СTЋK•gЃПQя<+ ћu‘wЗжЌ5\|…џк‚Ю­NЇгlхКXІdП6№ЕѕЦіЊƒ7 ‹o.рэnwнСХЏ/рћWZы o@1ЃщсZДпЯЙ— g7М№ €oдrјйPІ—1сЉZšl ОЯEЩАЂ)RГŒLpyмХЩHPЌ%рM‚+oьR(–Д0$CA3еоЯ0дФœпЋчпОzўНzўффсГ“‡?œўЬ—UќЯп}єгŸњPBs^|ўф—gO^|ёёЏп<іРЗUсCš‰n‘ctРАЭ8ЦеœŒФљ(†1ІŽЗ‡uOХ№ж 3ЎC\чна=|РыгћŽЎƒXLѕHоИЧ9ыpсuРЎ–Uё№pšF~сbZХ`|ф“нХЉко4ƒОY$ЅућnL5їtU‘”(ЄпёCB<жнЃдёы —|Ђа=Š:˜z]2Є#'‘цD7hq™љl†P;ОйЛ‹:œљЌо!G. 3ђCТ7^ЧS…Ы!NXес7БŠ}Jf"ЌтzRAЄ#Т8ъ‰”>šль­}CУђ†}Э)=єёМ‰9Џ"wјa7ЦIцУhWБяЩCHQŒіЙђСїИ[!њт€гЅсОK‰юз7‚;4rTš'ˆ~3:–аЉў›аєЯš1ЃаmМmЦэ`Ж&_Iм8е‚—сў…wOг}ЙОИёМэЛoћn№ŸяЛЫjљЌнvо`ЁїъсСЦfLN–OЩЪи@ЭЙ)Э ,aЗїaQš3")MY _ѓююр" \}@U<ˆqCv=аL"™ГŽ$ЪИ„гYіђжxд•=6ѕЉС6‰елх5Н\J6fЯ‰ЬДДІœUик•œ)˜§&ТъZЉ3KЋеLЏsЄ•&CMƒХв›0† ^РЫыpJзЂсp‚kПлИ‹‰ТE†HЦxLђiЛcT7A*rХм@юxbЄOzЏёZEZKГ§ вЮЄЊИЦqEєўJ”Š žGIюЉrdiЕ8YŠŽлAЋЙк PˆГv0s-|M2ˆКд“f\…ЪоЗ8EZІ“ œ-fSхѓhЖ Ум"ЈУ]…ѕћ‚СŽˆLHЕƒel%˜Wy АTKВњЏ6С­e€Эє7аbm’сгќш†–L&$Tе`WVДяьcоJљT1ˆЧЧhФІтCјuЊ‚=c*сzТt§—iклц•лœѓЂЋ^aœ]Ч,‹qоnu‰•lсІŽKЬSE=АЭЋЛ1юќІ˜’П SЊiќ?3Eя'p_А6жс2W`ЄыЕpЁb](‹iи09˜-В.dс5$\)›џ‚щџЖц,SжpьS4B‚Т~ЄbAШ>Д%“}ЏaVЯї.Ы’хŒLFUд•™U{DŽъИЎїіХъІ›фmРрNчŸћœWа(вCNЕоœтm–ž^S4я ž|l1ƒ<З›І№ЉЂgWЕє†Ми{Ow§љ˜е(Њ„UЖ‚V^іoЈТ9ЗZлБ,^mЪA-†Хr Ържщ?АџQ2bвXoЈC~НСЏ šЄ dѕ%;x н эт'ЛhуЌYYзцЃ“vчпяRю)gkЭЮяs:ЛЮ\qN-^ЄГs;ОЖkK] ‘=]ЂА4)N2&0ц‡­ъoO|tНwќSІЄI&јaI`=І ј­DCКѕџџPK!и‹&е^ xl/styles.xmlЌTK‹л0Оњ„ю]%)]кb{YX… IKЏKЖUє0в8ићы;Вл{*e{Бцљц›‘Г‡оvU!jяrОПлqІ\щЅvuЮœя>rœуЪљ "(оОЩ"FЅ„‹9oлЯBФВQтo•#Oхƒ$5д"ЖAŒ)Щqиэю…эx‘UоadЅяв-fC‘ХgvC–=EVzуC‚Ї‹ŒVMOъ7ќьи \LЁXm†ЩuH‘*ЬG$П6fЉwHѕШPd- ЊрŽЄАY>-Usдќ3Ц§%К0ь6 b,Xd$‘Нэt2™QвEƒЎ›tЂoщ{ёˆо’ 5до!Qм2fк)•1Ї4_е ьОbЎГG‹_dЮiД‰„›HЬт„7) ‹6ao`пYџЫњjСE6ƒЖ5УЃбЕГъЖ*pSYуƒ~ІгЪ”фWЇнF]& 1:NЄЏ^еСЛУШ31Лп‹с-c`iЭs~Ÿ!Щ6йЅгЕ[И]gGАВ_Зa—ZGИа›M{ВЂЅЊ‚Юрyqц|•П)Љ;ћi‰њЎЏGˆœЏђзДДћћ‘оѕЧPќџџPK!Й/Е7 xl/worksheets/sheet1.xmlŒTMoм НWъ@мЛxПšжВэкŠšCЅЊліЮкcХ6ин6ПОФЮ&й(НС›™їУ@r§ЇяШДrHщ|QC)+14)§љуцУ'JŒхCХ;9@Jџ‚ЁзйћwЩIъ;гX‚ ƒIik­Š3e =73Љ`РH-uЯ-nuУŒвР+_дwlEYЯХ@CЌџ‡CжЕ(ЁхЁ‡С ЗшпДBš%•Р˜;бPЇt3‹eYт• 8™Г5Б|ПƒJ 6€wАН”w.ёЁOpŒМДт9tЏБ7ПƒЦк АIс|=ЊнјV|гЄ‚š:ћ]žО€hZ‹Вый•g№ЗY@ж šвsХљT<Ѓbў(€F&зЏXX^ДрPgaирœoёдSў2cљ4Ѓx™ёŠЇеEOѕЗvсHЁ-ofфofр<ПЎю.ЬbЅ *Чї!;KРvѕ ?Х†”ђ0 зЭ„><œEМYКц>УЗѓЏq6pЦoр+з щ FЪhvE‰юзV*тЛйKke?юZќч:šaїk)эИAЧЛ{PDqz'юёњL‰дџ№SЊЄЖš KI‹јНФ@W(Œд§nV”{‹*ЅњЖђЯ‡MYіџџPK!90™сxф'xl/printerSettings/printerSettings1.binЪ`(`0cА`0a0```8Щ|3ъ:/“уIц™ ‡™At#”оЅ=Ёђ'žЫs132мaр`Ўfd`dрd˜ЩmТ‘dБMcBf všЏР`Ф`ДЅH[2˜3ф!У‰юI`s" і…ЈџџPK!;ssMmdocProps/core.xml Ђ( |’QKУ0…пџCЩ{›ЄsNBлС”сƒС‰т[HюЖh“–$кэп›Ж[­L|LЮЙ_ЮЙ$›яu}uЊ29Ђ AQIeЖ9z^/у9Яфee Gph^\^dЂfЂВ№hЋЌWрЂ@2މ:G;яk†Б;ам%Сa‚ИЉЌц>эз\|№-р”kЌСsЩ=Ч-0Ў":"ЅѕЇ-;€Jа`МУ4ЁјЧыСjїч@ЇŒœZљC:уŽйRєтро;5›ІIšI#фЇјuѕ№дU•iw%™LXрОВХ}ВЋоMДАa‘IэKюќ*l|Ѓ@.gюsG`wUњ@F!ыЋœ”—Щэнz‰Š”аILв˜’52Bйєъ­ №kО л_шcŒџ‰г–˜ЮжdЦвFвё(2|іAŠoџџPK!:Рf‹‰docProps/app.xml Ђ( œ’Сnл0 †яњ†юœ`†@VБЅ+zиАIл3+г‰PY$жHієЃmЄqЖžЊЩŸјѕ‰”К9ДЎш0e|%цГRшMЈ­пUтa{w§U™Рзр‚ЧJ1‹}ѕI­Sˆ˜Шb.иТчJь‰тRЪlіиBžБьYiBj8M;šЦМ цЕEOrQ–_$}ѕu|3ЃуВЃšжСє|љq{Œ ЌеЗ5@ќJ§ЫšrhЈјq0ш”œŠŠщ6h^“ЅЃ.•œІjcРсŠu.Ѓ’ч‚КGш‡Ж›ВV-;4R‘элBЯБЧЉDЩ‚'ЦълЦdˆ]Ь”єІ—g5z%Йa,сДwлЯz>4ppйиŒ ,\"n-9ЬП›5$z‡x>%Fоч;ѓWNё†ѓEџXЏBСYx‹~Zџ’т6мсiš—EЕйCТšpвЯuЯƒLЎ7YэСяА>ѕќ/єЛ?Иž/f%ŸaхЇš’чЏЌџџџPK-!ШЃЭ4v[Content_Types].xmlPK-!ЕU0#ѕL „_rels/.relsPK-!>”—єКpxl/_rels/workbook.xml.relsPK-!BE T,Єxl/workbook.xmlPK-!Ј^ЋЛ% xl/sharedStrings.xmlPK-!;m2KСB# xl/worksheets/_rels/sheet1.xml.relsPK-!iРRŠV xl/theme/theme1.xmlPK-!и‹&е^ Яxl/styles.xmlPK-!Й/Е7 Яxl/worksheets/sheet1.xmlPK-!90™сxф'<xl/printerSettings/printerSettings1.binPK-!;ssMmљdocProps/core.xmlPK-!:Рf‹‰}docProps/app.xmlPK &<Spreadsheet-Read-0.91/files/Dates.ods0000644000031300001440000003222713701055455016704 0ustar00merijnusersPKьZчP…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKьZчPConfigurations2/images/Bitmaps/PKьZчPConfigurations2/accelerator/PKьZчPConfigurations2/toolpanel/PKьZчPConfigurations2/progressbar/PKьZчPConfigurations2/statusbar/PKьZчPConfigurations2/toolbar/PKьZчPConfigurations2/floater/PKьZчPConfigurations2/popupmenu/PKьZчPConfigurations2/menubar/PKьZчP manifest.rdfЭ“Эnƒ0„я<…eЮи@/r(ЪЙjŸР5†X/ђšоОŽ“VQЄЊъŸдуЎF3пŽД›эaШ‹ВЈСT4c)%ЪHhЕщ+:Л.ЙЅл:киЖ+šёjƒЅŸ*Кwn*9_–…-7 lЯГЂ(xšѓњ_ ЭьМ‰f}6№.JлщV^гБw,”А‚Ъ V›є>њ FМЈ`jЈтc|4цŒДы`ŒЯЂšдGN6tGЉѓ5 нг-тщіHд№ОЧUЌmС(Œ“0ю/’>IЄŸx‘х+3P`Мт\Ќ +Xрѓ–Ў%„L—ЪКЩЂ:Щ@Ъ6з4IНЎ”кtŒpУ\`BЁ€зШъ`'ш6ЯŸы#Ciв‰bw5НWќƒdІw9UG”ўz|˜-oƒiє}œцNГ'`ЅіиИйSYBhЙлнHM-J?боНЋ7е7QЬЖTeР/АЏЕ–@н6T№qyEПЬњЮН3_РџФЈ„™бљWpoЉ7ќЯQуwп8Оє?MџPKчљщWPKьZчP styles.xmlэ\koл8§ОПТPБƒY;‰эI\ььLg˜Х4ƒ§X0%s+‰EЧq§’”DНeњmъME^^о{xyHš"япП†Ср’сшAГ†І6€‘ƒ]љк_Oє‰і~ў{ьyШ3;ЫFTOш:€Щ€Ž’YL`Т:–$ša d&3ъЬp ЃМшЌYf&ЊMг$бmAi<3Œеj5\†˜јЦгŸЯг)|ЅF.MтB–W’š)фmгМ1Œ1ЁЙДыHсxI!ц: 7,1ЌЁ%5; @ЈЊ3BИьEђтЋ–eЂКƒУ˜!ёРВ—€•Њ.ЫšЌ\œЅZœЫ–ЫbŒ`Ч†G:ЫcAй].\Ћjе[еŠ I.B TытВхЊ^}m‹-k:"7ѕАj%ЏI {ИЃ ™sНОЅЯRZ<ЉVœuЩJРŒ\ѕ€Й•hЯъ(„ЫЅЃeј ‰r툂fxъŽГrЖьЈ,‹H'Оф(/#7х—T|!A< ЂиЌЂЁFуM !TюЌН,гр2ЙМO\7h‹EІzd0^bщ/Ўоф%Мƒ›Y”4T‡&X“ас чEй' ђј’оЕVŠБ&:ŠXПХёЌTК\yшЂЃ3NŒ,SќѓёЂK’P5DИl…‚be6LЅ+ЬБ akkЅЬСsЕAHi0iѓ|фє05=р@н…NЬяг “щ37ыAћRJ~УtaйƒŸŸД#rЩыэуфЇЊXšІлЈЖЖг=ЈhцтК#ж№lАБ IДБzФxBDыр3ˆ’юъЋr ѕ'+”$‰Q‡Eи Hєд І} vиTЪъ1`PюcСXрДд/3і­ншŠЦ,=жхVКаЫ ›ьхš3“љщ ->ёBYЗ‡„"6CLØ4г‚cнE ф,{x†$| в,( эЯљKрГ\‰‡Б!%ЬОП>ku:ыј ЊЃ™ЋШsП-ђœLWžёяЧІF>ъ№Е!RЋ”X К^™ѕћЃh›ачїщШš А•–HQy4Еšа { Q$(иgх\ф#š0аEE-:ЅgI[ЌлЊВlы“™{ё‚ж|Ю@Щj- жс3ŒыXмЁzА(d–1Н%Лћs›^хЙ>СЫX,]„QEх<КцщКx”OUŸUЁаЊЪпж”_>яjЇ† –qЙ(]гН€` пОћСЇ?=Шqdрш•1і„жўe ­‹й˜MКпxžЩ>u;ОЄ І}rtД€Д{aЕ// GGЅНSРq”( ЪЦпЃLBq)ДwЕ9V HPио7Eа…lКЛЈйlДЃь‚Еšр‰yі§a€#Пlra›‚ЙЗZ zЛ ТЏA)g ‚іъPРиерЛƒМ“э”pPvи1-ьXр%Ij5Ю:Aб’2RhЄ>vЪ@ЈЧaЩцТРЭ6Ь#лмЁ œЮхДuЇw2ФОDє{<щьƒЃбйЈV!XоШ-ДўiGaRд?‚ŸsЩWvLЭлƒЯ{ЮЮ1І7Ѓкєfk oі ЋsNЉЗїіФau­Гfћ„еэцАъ#[Ю_&…Є$UЫИœЮ}АН§dЙыЂЬ=PЕOŽЊОULBjЗ]ЭFЁ€uv #К!8е(ЂŸ!nS†PPlVeЉЉк@ZМ‘ЫsO‰Јк—-ЃЛ§HЋѓ›•П›эђƒu/F;ЌзIu;BОнђNьp­› я.’ яЧ„wbТЛLи7XN.iђvUы‹ЩЕLоЮБ0йе3LоN=N4œš=N.’3'‡уЬЩ8sВчьqzГЧkлeА^ћьёœ\Л#ф—4{МX"оzњ:НH*žŽŠЇЂтщF*юм—6#ЯЗЧеm^бЁY‡ŠО„#П@тќќ‚^йŽ^ЗЗіiЃ‹Ќ †їL:ЧЅЭШФAЌ+"9z?эXНДc)2=Я…Џ1ŽјљТfЖЬЧJ^јЛ #™щaт@З(ž ?jОб:…ьм— (6яЁVоžhqСњ€ЏМŒыoш(„XїVђю…ќ&ЯИњ&Ž=}сзš-?vŒ!jžtVІCС–PЄŽ7Aј%= OtŸИ(’š''Nзъ !b=CNoИЄУњh–їŒ)Х[ХЈPђАњЂ\6Aпј1+.<Э“ѓ#э™ђм„Ш.NNl€ѕ?№SЭ=Аf91 ђˆГ^m…mTS|ъnкcю‰LKƒ#Т„e‘М‚Ш_PоЛЕ__lѓ‹\2И(aєЛж+k'пsмvінšlс{–О‹їvПїі™МЗш§ГfЏ€6Кu?b wв-ŒъЇ(цї3pОђХ]фъХžч8E+GŒЄž’*Щ<ЪВeзŠ‰Ы"›У;жу ;x31љO7П•q$>F4иˆ0ІбaРюі+ƒ@Х/DйАр kЎ™щЁњ#:Цћ„[5XI' ?a#ЬeDФtˆЌЫ,ƒ%Х]Fэ сg6†/“cѕ№п0vwв™ЕKwбЧUКЂiооЖ№щ1Лт#\RR„ШЉ@ЩˆO”щєф ќ N%E@Їuд=& џ$кu&YхЂћ•LNЯљ{‡!ёФg/HЖ›[џЫq˜ЇчY2н­žC*Ау‚!m—XШ8Q,lл= и:–lЛ­4і€m‹љэYaѕТ6:5lЎј41jЗad|оŠ=ЯШђЁЮМСKZёћcZZ‹PЫ7+ˆ$,™‹Єп=h|#EKЙ(рЗ`Б1GчзЌЊ РƒyoVЗ`6э7sеЃƒN Nк”8h5 цjc­ђaљJ]œ†Ва{йj§ЯішЫ~dƒЦ:"fћl„УРƒy;fё+јфаІмвўq„* ђСеА^€œЋ‚9ьІ и ˆэ!o1ОЫOнЅЖAДШе*UŽЄЯYъљ(пѓUa ЩMВ'Ѓm7,= ЗКZџƒjлNdЅЌ0ЌuБЖ&|Lдюё,Ђ)зXv€ъVyђ(єUР)ы–‰8.0T+ѕцЕ53НGДvЕU щКQYпla_ф„їHиЪhn–љg‰У”j>”$І ХхaYЩ7ЁЧ‰NѕLћЉч2ЮNЌ&”ќ0 bO Жu4Rђ:сsия#ЩШ=О/U`[XД‹Bд$‘mЙЪкпS!w“OTe‚ћА §Њkєй]цšнfЊЫц^ЃК€ФŠЂњ)CЭJ.Ю'чѓIПQ^ЏОп ПщkRН}kpƒѕЕ†~Aу\ЃCc}žйaFhK‹лžhqsѓ~ДИNфУе%)„Фъ{Š3pтюpт2R…dЩЧ Ф—OJ\ььq>VL>Yб+LJ} VL{пN~w|wМ}'d[}Ѕ­ЛkK[j+dїvюќŽ[ф E{ЁsВтДуќЫ`Хed‹ŽwCч$ХiGцŸЄшsх{N^єtЪ:ЖЎkeбл)ычЪтDVа˜œ‡НВ^н вёВтlŒшэŒѕъб§фq6RєvФzuЄш~Ёy6RєТњЦ§OБ’Ќx}зn~L§?“в7WxRН`!щыœК^w—ЇдкТAˆ›oеч F6л+# Ї˜ŸRљpŸНUЌю)Ѕa& ˆUМpь`ЅБК-З$Щ*Зн &(Ф Š=ѕ… ЇЈчˆЎеTuЅNj„ФСœˆќы”КЄ—]бШž#МЂ4B$p] щIekФЖЕkšЛT(дŸЙВ<ЇЏ_чЅе|ЇоьЎ\Џс‘ (U;ЯœTTв—ЊL’pƒ*ѕe1ZО_‘_ ЈБЊя=фѕKЯЙЈ@YжЄd>И-$H–’Г$\—Ћл[НluњVГœ­jlЊ› {№@_8ѕFwqЊ|эs>Poƒ—њеp];Œ з!§’l~я !˜VхЩУ§-ѕ€>йSСЃ-Ђ–oћФЈЄеŸгaк§њвœЈKl]рьеŸжФД:C:­E*$Ќ1Мz0y]Ž4оŠчXШš{Š /#8е#/”=ъ&:яњ™EЇ=ъ€KЃ>qNL{дщ{uЈе%вгУ–­зžumчЮЏд9}ŒОє‰QIлЃ.Јtг'L |g3RЏў 6wЏ(8еX[ дИ›Йsв'Ш|юwРЅqŸ8aFwEњ^ju‰ДƒЙsќ'ž;ыWc-К_^$8Žј§Э6­дк[я=20BђlF…ј0~љG g:lI9%ш…NNN ZИџnєюЏшзАя›ЯИœ„ Ї'ДŸгcтtP,і&ђWј0žžžŒKA–Ÿпй]УZ[џь4hяьw`Э[Vig™Ќ>ў—НNLО{xћwlЧsФ)tЋMб[еЖu3ЙН›4sВдЭ) КГW-)Д*;ЄzZ_љ•>;_…й Хгў/Ќ|ј?PKяЊЪоцёRPKьZчP settings.xmlэZпs›8~ПП"УЛуIг†IмqмцьЋЏё’оѕM†Е­‰а2’0vџњ`2 …жСШwЙЇО]VŸОнОzП иЩ„ЄШЏ­юiЧ:юЁOљђкКwo[яЌї§пЎpБ и>zQ\Е$(Ѕ‡Ш=KлCО zB$ИDRis€Д•gc<Ÿf?mЇЦВ;FљуЕЕR*Длэ8ŽOуГSЫvїђђВ>Э‡"тгР;ѓ,мыtЮлйѕгшєj_Чvo™:ЖћџYhЮЌ~‡ќѕћWЛwЩўДЈ‚ ‰ЭЩюvbькв.лk ёSдЌВy/ч.HЕ‡‘(І(Љв;рЏвхЌЗ”/‘џ.CОЈ‡#|YžšДЩ§mXЗrиY•ЈˆлЌ~чЈ7Ј E \в(ЃаТЂ"jъhЗS7d ‰Кў§Ђ&ИГТјwA‹Т=Gd@ИеW"‚š›ƒ{:˜рЛАQwКАX0Œ'А$оЖЪж‚0YaЌфцѓфTѕ8Э"ћюу4ПT$А<‘Ќtž@ЦцDTж н7нЫџ)}(Ѕ7Кvzœ HŠ”лЧЬW˜њ/›п? ўgTІ Эlњuˆ E)]zgНо›šХЮ‹e5”‘кѓ(р3ŒG@|н 1тЌ”жшcy)н>‚Г цШЄХ пˆ‘”ё#]?АЄ†ањј‘'вYIЇ6йX:œ„.ЮˆTP$U2`§NYПeЬТ Є&WekбэН­ЉvEјвўтPx'šћtMeЅћ —;_—:ќ`CЅГеХˆ@NПUГєзЎtv}љ jџГ›ьF$HТІзт| ц Х?ltCCuЋk2—HJИy3†#˜Йуl{/СџЁEЈa•8Jт1Њ —ЃЋEГ5ЫT7XЩВ‚ŠŠs"стќ†r"ЖVћ_ЯД:‰(ВqвŽp‹F{Ь—!Іл•AІ&tЋLŽАљ›ЌCŽW*Lј3­ЈѕоР""…CТМˆUIЂS•Љх5ИЋ(˜sBйЏдѓюьГО(?=кCКvS‚И”ЪaAЎˆ žЖ”дidВ“?3šPўxњš‚еп Юў›‡ В w|ШPšbуMэX~Сг yqOEЄфУG†ВUNы‚ЎћˆЮX~и}Зv4yœ2 ˜юив-јЮ‡„{PC€*ЏіwŸблU?0шџPK&ˆ<и;Ђ PKьZчPM‚xg))Thumbnails/thumbnail.png‰PNG  IHDRЈџRmЩ§PLTE %6&;8;,8G7Пћ<їђ’Ч#d­НфwРxюк„~К“(Јb•ЏЋ<\bП*‘•К%[^CвЊ8l]-ЙYэ/9пцП8W,а|Dй"ožЭњ§ёž—k6p~L8цм”"Ѕl‘НJ“Wєї—ESєяЎФlЖnэ/?тќИЉЁу Аj§'Г2зЅŸ]4ѕ˜X еr–‡Ў{§ЯœŸ1ƒyЖ§$5ЬdЕ‡eЎЖЕ[џиэ/шlАбКяА1ЗmЭŽ"кgBжяГšфfуЁ(ч+(НфfWЈœe†ин Т2Ё к m„мб=W>м<їˆhЖб‡ІЅP  Д{љ*—0бЕRмаDыЩ aBы{7Р№MЁyЙ)ЅТФ‚“‡†ё^ъЦ 1BЕЋ^пЃnр‚>ŒуBЪFн:›#FЈю€ž={.ЮPOF07Iі3‡ФUЄmЬ6у˜s+ђ7ЛЬГD E“Ex`1ФŽ  Лw[щCQvЧdг џЛ ЉА-€Ѕ ш4 ƒ)і€3‘PtШ ˜MЂFъ%у™­=8ЙЈы…ƒБ$!‹євжnŸTХЊ4bš0ЧщЌвl?ё€КuмЬžyˆВџˆнVr80;ЋDГj5$ИkЂаŸйšПђQшџЩУ<]—X Ц>РЋMидЬНАя0ЄэБHļӘХCЩyБlЃœŸгƒ­e;ŽО›UЕA›ЫMuјy‚ЎЯ`їeсфNh‹˜aБ@ЗФФ;нЫSСm‹wr["ŠQV‚гбЉžOcblЇcb i=JЁњ0BлЅ­Ј v3mт…%7#нaє†H)С­А˜[zEWєПГŒдюBЩ!‡Bu;7эД#ВztEGПУMбНoz.GŒPэРc2йъb гH:‘UиNŠ.ИkœРЮ ‰hZKЅHД'-œ4иН$№аCQ=™ы“Ъ (Ѓ.Ё>…R(…RшwкMЊ}nЯ  ЈP;РјФbp{IтСLБ„Ы5žзц*ЪjжьЫК8Я€‚‰ƒ$QfЫЫљuщIMљБ@{GЄ.™ЋFГЉ™ ИєЊ;˜ЯЂ—“9"oж&œмй&(’ љsOk?тќмS$ш  („Ьu)юуЩRбŒ)йA$$G7ќ–фшО‚ЯQэN’xЋn}”“ˆЪ=mjbЕЙIeеd5ЎЕј vNoр‡ѓv*JЗц6>?юаŽшЅNўѕJXLЫЈфƒњlАзŸЪfq*­њ(аg;љН~dЏк1юаDлЁGБm{`aIƒДE”ѕЈ.{‹а­tqdƒгfВ]~ЊB1BUЉЩЙŸ*• uы!ыT9Сšђ€КУюП/єv€;?пв–€gпˆњЦъE;…mtвТ (–ЦГ’eЂ,њЫпћў }ф1=?Шо|œЅ­' ЅP ЅP ЅP ЅP шЧгm( іdЉН+Ю ‘ГэA!.&4ШЦ-X˜ mXtrж-;‚і ?ыИB=ЩЭРŽуТLJиGА  0™IЊ$сщb›ёаОЂ‹q5ы9?&2Їož1юТШ№ћу<ю‰я =э/ФѕXPžУ#”ЂKšљ0‡Г2Жn-­”ЎљЫO АЉвBœТp"ѓlы8C›ЮШ†Žа #м-п„HЁ/ДЫЯйƒоqOеq•~—^ЂYfкxL€^Oй5юаs<sпŸтLгИf"›lхћХчл(ћ™]кЃWbп<9-с˜г€Њ <дƒ‹ЏŒ+Дq‚м•'—нрyeP\HŽіМК9№И —мЌѕ—мpKЅЭэ’х+А5тч\вR‰­[:йV,-џъ‰љRЬi.Nќїш!oqќЙeўЛŽZж3,‚z”б›DWв#…R(…R(…R(…~7Ёх_LЗ7ќы4пJrrђБVYСЂПо›‹еќ ]^‚S!iїЭ;J^:{‘Іa ё§™sIЫЖуšї§~ўZ5Ы tN7БзeХN46Н$ц^,w–bШŸѕvzћb;Ї—Аяg№ƒsIPъБx/uЫ9_Ц{]їнG хѓЂŠщž4l#ЁьК•Вfўэ+3TЭHI•кMѕl‡Ofњ{2еЩkоjЅаjg|гу№dЊŸ7D™ЈwНџшr žїМх§&rHкуюЏшљMДwЏЈтћ‰U‹_"9ЪТ'&pƒ№гwƒ{*fj! …Щ7рƒˆpOcўч„zОzFНА’s`Š0Ь<Т€šЕWW Š•}BZЯSбG.ЎЙhRых8ўДРхюBŽJŸпY@›€gј™`žР‡Aaќt$ФnlХP Азh сHЌь Š^Њ2zHіёAдdoб“еКУб_ачЂ˜%в2N­aЄЋІБ<єьЬhЁш™йAЙШ ‰А#*Јлƒw 9FLЇc&žЏ–ијЅ8й\ IПM :V“еГRo‹ію{= ХЊvЊ'юKћvoа7‰&я’ѕў?ъбve­№)”B)”B)єA@;MАќgvд}Э,Тн}Н–ЁџэрgљšДNвЖuaфкЈe:љуkšадФїЈŒ]frЄ›n Тбнk %э6ЁЉЫдC†L2Ё[?'?@›%ЌкBž§ЮNO‹лyЯ•І Wж[*XЦdёЎІЭƒ•ЕћрПЧИV(бД™4 9ŸЪ€9%“fН3‰o™Емvx?Хђ•/ћ*вXХL]‰в`ИЁьCЙ06LeIU™г<–cќbН<&їКe8§УЂwы3ЏdЊЙдЗянRWсvЊж*{ЏHеŸŠфV’r)s3ЃдZЗTоž)ŠПЂIцЁЩсiЊШxхмU|і*ї~ЖхƒR]§[:SюW чŠTžLэeO6Y’УадUriJ&Г[]|АИррўЪм Е­цљaЦЧŠЈBЈЦˆ}Rб“Yў‡дK‡•L*:љFVmQњ@цЉfхх\oVщZ• гљLmR“gšI-4~_УЙЖgЪљ._ћW :ѕg†CПКи]"ŒGџP\gжя7ыљoѕЫl*cј3ѓnRЂ›сQЙ<Ц1.ЎвЊєjжpЕОCЏA:Jq{”ьСt[хоnOpgЊБGХ—K1 T„рgŽЃGƒ%хЗпыoЋэxЛХhќЦЗј0Ћm_Юў—YёUЕj‹GнBыQ ЅP ЅP ЅP Ѕа}ЃЦQBOХѓ-ТКBTдƒKWђM\•ЋqY!˜Эћє4{•Ж1ЃвъОгаќтšА!Н]1ЛН3]oн§'œjЕё˜—7 ƒџЄБ ŸФ23›;Yƒю’г d%ЉœФ)u)66wъrЮ%tqн1$пђNІ|1Ш­бЧŽŠО9­ТЬŽЩw_кТsыЎЬk—sвО Vк—hz%ігpо&œŸЧHо!&”ТУјB‚3Y‰­WVд&|<Ц=GЯ2-жFШa ŸаќErврњ|oGkO0K†tЕOЋwыв>™IзOБш|Є=Щ6&ДGВ,(?F ЄŸ%[X0вf<‹Њ_D]p‡ЗKŽqД:хsмDУЌц™и6*k’HЬДwš“ŒМNУШЪ…`БWnŒƒю0$ŸМŠ$лбћ˜аЧuЗ 9ŠЋѓј  I$ъ—А's^ЗvХ)Ќн;hО41ўy5м˜‰”QбрЏ.№e\$|•I „ЎВcБА‘ДХ’’Ырќў‹(‹Uš1ЁхђЪIЌ›DХ\ЪKŽъLэшЌ`ІфчГлГgлЫуGї­Љ˜qя>ŽлеўйJі§>e袘wщЮЉЙиV2K(Tm)f{ЄщГл–>!фш&MОХэЇ[ƒ@ƒ?ѓtIд‘БїњFНFВeq%$ eAтWЎВиФЂ Ј$‘ueўБЮьppІk€Љг‰žИ5˜РшН$фЗА§ њИPснCЅ –|зЩЧ_ззУzttl}iч}жƒїЊЬta…їSсўOпnˆ"=„R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…Rшƒќ Ё˜ЬL?з*УIENDЎB`‚PKьZчPMETA-INF/manifest.xml­“MnУ Fї9…ХЖ2ЄэІBqВЈдЄ fp№€`ˆ’л[qтЊŠKйё3Мя1ˆЭюдЛъ1Y {хkVЖ^[ьіНџЊ?иnЛкє ­DrTхІыДa9Ђє*й$Qѕ$Ев@элм’ќ[/ЧЄыl&№Ю.hчс4qc''ёЕЂR} ‚S€h‡-хЄ7ЦЖ g„1iЛЊnW0жA]Ъуљ&`ВsuPth˜ИыukhЋj:h˜ СйvGд|ьŸ_ЇAщt &–Ј|z4ЖЫqЄЇ7ё BЪШKxЖМ–…OkDУб  œˆ˜ёе|№хѓшf№fёЫ­HFш,ЄЬ)зˆЎсgв\Эw>(%Ÿ Ќ˜šqœS5гd& ЪkЉ™žY[ŽЂє6ы-nСОДІнWи`їdёВПe іЅc‰з}… ‚ъ‹'ЂЏ№Fe(ѕМРšxБЩџ6ЄZГ0\ЏзУѕd(ф*ŒІгihЙУЄСЅЬ,*&!ЭЈ1ІТh…56ЇїѕЯ`}—x™/ЉьЌёQVеуЊwE<Ў:BCR,{з†яЇwїOя$іesЌгŽœм„їРДпюяvЕ ѓОЖ v/TDВЂї1к—B4ЎwA­Лубш*tŸ=єњ$|-™Івƒ““p‚3вD\фmA\бGSІMс›@Јqши XХЊџОП{ )ЭёЬОFŒ+Й‰LевіњшЂnš.р*l 4O”`BQLIІЗЎјrр>›$Юя˜VZRœQ‰ƒЬU4 фk|ЮВэ|№.„њНьƒРГQ0M 8БdІЃ Тгм•„ХXЎЛ{Ь'›јШђeЉЌПС]їёі`Я?иgœ “ѓ#k уЩЊ[ёЬЄ9ДЂœJ7J­™zɘ?9фOr+ьК—тЏAVOsCьїНC5Ц*Пэ”†y•9д’>њдŒЊ Г%„ўZRш а˜Ў5V№5‹M/‡Џ^чЙѕпsЇл7йх›ыЧ€т{хX†˜RЖJЁЕ_ Џ'`ћДПЅЂHšх8CОА–%эяЖЦэnзФf5•ЈР+ŠœФšр2гgђЮуЇ˜Љ"УлЪŸJ›АЁ\Ф )“H/ћЛК’GЎЎ$.RF_ЊЯО7fƒSШop hрfAx+!^)ХБњ:}ЅG˜І LŽЙц’Yxœ)Z–ep!DЦbbŠPђзў‘‘MicГp#- ˜UžkтRhmЦт!=Ѓ‰>ІJ—ђЈqSЅ8Ж›Х1х{DзMQ6ЧјšЕѕYCq ŽЈ‚прЮ2I‰ЖѓЮVaяД}:ЪZ%Ж™jђжPŽя…йс‘БЈ l^\№Іœ`йЅШоC—pк ЭTяЎAZэvDЉЮ&ГЫквЉх*EеЦїХvЗж^ љВLХўf4*ДЅe˜ЏJpl>0‰%зтѓхСЊ-ЙгйzSчйїР2JSi}нѓБVЗЎšФ~Д$]аЬЃёR”Њ;]Ш&TЬ[FўfТRУ\pЊфVёЉyўQЋPЕБvQлq§Гza8АО›WFF7kѕМЕњоpлМoezў{ќЎt@lІh^Єин‘I3FЏ:вm‘RŽuSћGї;ьзc)тэn .ЄiА)Ѕzqы&‚§^MwQ ЊСбмЁНБфШ…d\з^y[5lћ}эJрэЃšЫы˜E KL[ёЊ\›ѓynUЫB‹'vчЈœЖям Њ †…€СCуЊFФn6Т€€жяkЉ‡цU˜C-&Э*qршkž8+сn @Т& ]Ю€Э_:ŠХлш6Ќ~…_UЊЊп†7УщдМ– ­~|ПN^з4иЪЎЃaєЊў ›§шшuUЈjѓ&C Ж…_‰.nc2#АXi!оПЛ НЯ†CI/ЦЃб5‚Џhќy4šй/ ДЬ*E§qpКХGЁiрOтЃ€]ЄŽкo,Мџ8wУoуqЃѓjˆG*iŒОгЭ~ž{‰*ŽЎ‡ЃщџМŒН…ыGaлЎЧѓ&№Г+џђЕ1…–7юY і?ЎIЏ|‡чizfГlmD—Оћ‹Zиі~ї^јѕЇУџАјPKRКих5_ PKyTZ3 styles.xmlнYнnл6ОпS*PДРdIЮв&nЌ`Х0ь"-ŠўьЖ %J&J‘IйI/ї<{Њ=ЩI‰–,Щбвn+šItј~ччШЙКО-ЉЗУBЮж~Мˆ|Г”g„kџУћ_ƒ џ:љсŠч9Iё*уi]bІЉю(–(3ЙВ‹kПlХ‘$rХP‰хJЅ+^aж*­Кш•qe%Ци\uюj+|Ћц*klOmц{6рЎv&а~ЎВЦЇ]ѕœЯUО•4ШyђВBŠEqK ћДіЗJUЋ0мяї‹§й‚‹"Œ///CГъNЎЊ5Ј, 1Хк™ уEЖи+47>э†ФъrƒХljBƒЌЪ]1Л"vХ5щ‰йЕaР§єžeѓг{–uuKЄЖ9Й_СЂљёъцP ЂœыKc{TЅ‚TГЗiб]}ЮЙ U+иjТ]FбOЁ}ю ї'с{Axzž"š:Цy9Fртощ2ѕНц щ][I{GхюЇЅ8ШpJerekЫ‰=ћЌ9Zћ/‰’J`TzПcМwˆЩиї ЂZ|IшнкŒ*._Œ€э‚яu|TDЅћD_~x:‚›:%’`kФooёС.^“rSKЏw3ННьЫ7іmy‰FМЙ…›IФ&ЭъfX(XЙ'ђыqў`ЪV8uЙэнmјЮQM›ŽоZn‚4/H1Ѕ~ ?ˆ‚JРyŠРаšJI‰`‚SЙі—’*$P!PЕjEpЮЋ #R!І‰8*ЫƒЎnкC5ГЛQЎsОЂˆ5*` 3#HyЭ”€-}xчрЮDlф˜XkЊE1ЮpЛжX[:Xз­‰тлБУьl;ܘѕўЂN№Hц’+лt›олKgУ’О#{ Џy* SИНŒp` ЦбˆMg#­…€QёnЬU=Ећиq ­YЯYJди1pWn8mЃ9фŽQПКќНОё“Пўјг…vdФзE“xfЧw?ЌкгМДЋ…рueЦdГ­]}fццOеЛ)_Ъažz”ч|i_п+‡]_С‘kKO‰*w@XF”™vˆжјЩгЧ…zБv…‡ЊŠ6lНТ<‘+Ћ9Ьа/іАљг7d8­ќЫгКžЛ%нЫUаї{Ђ8ЬUгМC…(I[{\Г x Р-FrJВ ШždzpEЕтˆІSѓЗяbиcRla…Ъ:їд=ЬZr–bЇOЌ~‘ЄћT^~УHПш~ФœhŒ†BHLСЩkЁ[\Nn[уWi2с˜0 /GTт{Z'P~0КіSP„™{ВeК*!Ÿu{}V)ЊrО,™ Ѓёƒ(mг1kж ЇіьS%•\!- рўг›КŒ†Ёы7qИDФ'ИОЬпжљЯB№§"—бGи€Yƒ™юДЛру5cєŽр§KН9ђ"oyg‘•У‹cƒ,ˆЕlЛŒ>w'ГvkѕiƒF’§бЌвЃxчЕъ‘\•Б?‚’Є_Х€а фЈQЈЭЁFє>MН'Ы9‡r:* }“o›ЂxО8aD3b$ XЁ8yд ‹>’nИRњEoЙ8Зc^8PЩ$ ЄУћб„ƒ мŸИхї“8НАс"гєD‹‹‹ВєLgёEцЫ*”йЃE|б*Ёє“nќ,k›ЩЃ4впŽ›ЦŠjdАЯoОˆОMЖю/шpђŽjJ$ y˜бŒP[:5EuЯР№jГб'WцCлЊљ-З[pr}}} IuФСQкu]#17ќ эZjœї7z+ЭƒŽкŽIмњыШ!ДІzœŸ !аxГoqХХIb—bлёЃаSЧѓЙіžXœ"Šv!іљщ€‡žЇžШŸ#я0ЭсЩСЦE Ь№-ŠЮЁпЫg~Gсђ™ўр№М‰B“Н6`ˆ>^ЎЮЮWч‘ zЌzњё§o%х…] y‘K./Л@+ћ—J/?ысј…’ПPK#Ќ}LфUPKyTZ30W+  meta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680m3$Build-8968H.Merijn Brand2005-05-12T13:31:18H.Merijn Brand2005-05-12T13:36:16en-US4PT4M58SPKyTZ3Thumbnails/thumbnail.pngы №sчх’тb``рѕєp вх@М€ƒ Hš1}–e`` ѕtq Љ˜ѓіжСЌC"Й~ўпЖUЁEхюUѓ‚тsЫюі>ю§ш[Pm7?Оџјучч?4}Бѕйяџ/З._{ыѕЖјŠџIjqGВ{Пџвжлрљ{я>Ÿ7хЗѕї|К|њџяоjkбЪzгщі[УеОэ^[|џѕ=ХWЋіцMю6|]=o—o\э§{ƒm^šшЪ/пх‹ПЈmѕџђYгд—?л-гЖsЮДЙХв~—?=1Ь(кkmЄлЎ;{ZxЄсRљљКў{{/кїљш•YПWПжЋнv&§oeД^єоу+ПNї=НzЭћS ОJљœN<-—у;A8ќЫЊвp пг“яЛП7/џe§AяѓбЬЈy6\ОђМ}ЏŽя;YљkКФхэЧvџБx_v~кiУ~ цGmвjy3vŒ2ˆeмO^l”Щx‡!01xКњЙЌsJhPK‹g3КxŽPKyTZ3 settings.xmlэZлrт8}пЏ ќК•`L&S S† —\јKx“mk%—$cрыGЦ0•xp†€йкй‚—`]ЮiK­гн"з_ч>.Ь уˆ’ЅtЎ*Hъ"2ЙQњVуьJљZ§ыšОО"V\ъ„>$тŒC!ф^г Џ$н7JШH…Žx…ђŠp*4€d3­ђvteE–ДЬ1"гХ"Ј‹QGхsЪ&Х’ЎыХUяfЈCЩ+šьJ•Œ~KE)§IOHŒY‘iЊzQLž•ТкШwKSнЌУцѕЋзk‚фЯазІАnŽMЛQ$ee†`єsе”mѓоЯ Žl Eeг)ьDD(UѕКј+ШЇ€рЋ8ђЙТл­Ћeэ`єDoЋхЅ+ѕrWј3gˆИpн4ŒЖябjŽє.ЖиХ`Ен”•\0щJ5ю,}Ъв4eЇф‚ќЮаїSzP>К…žЁиС ы!у”u(GB‚QŽЮђљ%GфehI‰И`$Љ г›рQv€›C&s,є”ѕ›Ъѓ˜ОЕџј†#а ЎаM@&ЫГЇ lьЭYК6Аf–Аˆ›Џ„oPkTъxKуЧŠ–)#Б~”ўыR> ШI@Nђя HVї*wйuуWYMFк”шЮСУacАЬ4UћgЯ•Sъ['з#ƒгЈыŒzOgЁ‚_ю оѓhдdЖ>э0W?)|›R QЊЏsИ?Э2КВŸg€џDХБ › Ѕыƒcд:Х”Ѕ 1OPIЛ,kк—ЋЄіѕЋв\šњФЄQ WпG!Yщˆš# Зљs(0"АЗ№mŠyІуA.$=‹š€ ˜ошŒЦѓх,ћ^-X­)IuЖZП~МЯOЄ\Жр–eirЏЄœgsійщ"[ЪХgМ{<ТЏ™q(‡ЇkЪƒwЊбhP9]*ЪUНŠ&58Rѕъc2bgpi,$Qшї 0:Ё} )зmkMЎ)– ЗЎG/qi!Аѕ  м?CЪ`mвjкЄ\ry—''bŒШWš*јуgПльR‚ЯЗšїCW&ЇрoЅьHЦйћЉ1 <†ф"э-рриHџкЫ6ЁўqкX”дEыЊЁсУ DqџOеŽхе†N~PKƒаƒИ99PKyTZ3…l9Š..mimetypePKyTZ3TConfigurations2/PKyTZ3 ‚Pictures/PKyTZ3RКих5_ Љcontent.xmlPKyTZ3#Ќ}LфU styles.xmlPKyTZ30W+  3 meta.xmlPKyTZ3‹g3КxŽeThumbnails/thumbnail.pngPKyTZ3ˆ Я­‘Ъ #settings.xmlPKyTZ3ƒаƒИ99юMETA-INF/manifest.xmlPK jSpreadsheet-Read-0.91/files/Dates.xls0000644000031300001440000004000011057177657016724 0ustar00merijnusersаЯрЁБс>ўџ ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ ^ЭЩ@сАСт\p H.M. Brand BАaР=œЏМ=<ЙF„!8X@"Зк1,мџLettrGoth12 BT1,мџLettrGoth12 BT1,мџLettrGoth12 BT1,мџLettrGoth12 BT1,мМLettrGoth12 BT1, џLettrGoth12 BT1,мџLettrGoth12 BT3"Ќ "\ #,##0;\-"Ќ "\ #,##0="Ќ "\ #,##0;[Red]\-"Ќ "\ #,##0?"Ќ "\ #,##0.00;\-"Ќ "\ #,##0.00I""Ќ "\ #,##0.00;[Red]\-"Ќ "\ #,##0.00q*6_-"Ќ "\ * #,##0_-;\-"Ќ "\ * #,##0_-;_-"Ќ "\ * "-"_-;_-@_-,)'_-* #,##0_-;\-* #,##0_-;_-* "-"_-;_-@_-,>_-"Ќ "\ * #,##0.00_-;\-"Ќ "\ * #,##0.00_-;_-"Ќ "\ * "-"??_-;_-@_-4+/_-* #,##0.00_-;\-* #,##0.00_-;_-* "-"??_-;_-@_- ЄyyyymmddЅ mm\/dd\/yyyyІddd\,\ dd\ mmm\ yyyy Їm/d/yyрѕџ Р рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР рѕџ єР р Р р+ѕџ јР р)ѕџ јР р,ѕџ јР р*ѕџ јР р ѕџ јР р Р рЄР рЄ!Р р"Р рЅ#Р рР рЅР рЄР рР рЅР рЄ1Р р2Р рЅ3Р р Р р Р рР рІР рЇР “€џ“€џ“€џ“€џ“€џ“€џ`…д DateTestŒСС`iќ  08 Aug 2008 12 Aug 2008 08 Dec 2008 13 Aug 2008Locale settings on this PCShort: dd-MM-yyyyLong: ddd, dd MMM yyyyDefault format 0x0Eџ * ^ЭЩ@ &ј  dќЉёвMbP?_*+‚€%,Сƒ„M’ \\dc242\HoldмД Sя€ ъ odXXLetterPRIVт0''''`4 €\KhCЙЌbPџџ`SMTJPDocuColor 242-252-260 PSResolution600dpiEFMMInUseFalseEFMMInsTypeNoneEFMMCoverPrintFrontEFMMTabShiftFalseEFColorModeEFColorModeDEFEFRGBOverrideEFRGBOverrideDEFEFRGBOtherWtPtEFRGBOtherWtPtDEFEFRGBOtherGammaEFRGBOtherGammaDEFEFRGBOtherPhosEFRGBOtherPhosDEFEFColorRendDictEFColorRendDictDEFEFRGBSepEFRGBSepDEFEFSimulationEFSimulationDEFEFSimSpeedEFSimSpeedDEFEFOutProfileEFOutProfileDEFEFSpotColorsEFSpotColorsDEFEFPureBlackEFPureBlackDEFEFBlkOvpCtrlEFBlkOvpCtrlDEFEFCompOverprintFalseEFKOnlyGrayCMYKEFKOnlyGrayCMYKDEFEFKOnlyGrayRGBEFKOnlyGrayRGBDEFEFSubstColorsFalseEFSeparationsFalseEFTrappingFalseEFSortCollateEFStaplerFalseEFOutputBinAutoSelectEFImageAlignFalseEFImageUnitInchesEFFoldFalseEFImageFlagFalseEFOffsetJobsEFOffsetJobsDEFEFPunchEdgeNoneEFPunchHoleTypeNoneEFFaceDownEFFaceDownDEFEFImageSmoothFalseEFBrightness00.00EFImageEnhanceEFImageEnhanceDEFEFCompressionNormalQualityEFCopierModeEFCopierModeDEFEFGlossAdjustFalseEFTextGfxQualNormalEFRasterFalseEFDuplexFalseEFUserRotate180FalseEFRIPBookletFalseEFBookCoverTrayEFBookCoverTrayDEFEFBookFrCoverNoneEFBookBkCoverNoneEFCopierBookletFalseEFCenteringMiddleEFBookletCreepFalseEFBookletReduceTrueEFManualDuplexFalseEFMediaTypeAnyInputSlotAutoSelectEFTrayAlignmentFalseEFSlipsheetFalseEFSlipsheetSizeLetterEFSlipsheetTrayTray5EFMediaInterlvFalseEFInterlvTrayTray5EFMedQualCoatd1EFMedQualCoatd1DEFEFMedQualCust1EFMediaQualityCustom1DEFEFMedQualCust2EFMedQualCust2DEFEFMedQualCust3EFMedQualCust3DEFEFMedQualCust4EFMedQualCust4DEFEFMedQualCust5EFMedQualCust5DEFEFMedQualHeavy1EFMedQualHeavy1DEFEFMedQualHeavy2EFMedQualHeavy2DEFEFMedQualPlainEFMedQualPlainDEFEFMedQualRcycldEFMedQualRcycldDEFEFPrintSizeEFPrintSizeDEFEFCreateMasterNoneEFUseMasterNoneEFPPTSlideFalseEFPrintMasterEFPrintMasterDEFPageSizeLetterPageRegionLeadingEdge€IIFE2IFEЁ" d§џXр?р?U}  X@X@X@X@X@X@X@Н€^у@€^у@ €^у@!€^у@§ "Н_у@_у@_у@_у@§ "НРmу@Рmу@Рmу@Рmу@§ "Н _у@ _у@ _у@ _у@§ "§ ##§ $§ $§ $Н _у@% _у@& _у@зЊx0000*>Ж@х я7 ўџр…ŸђљOhЋ‘+'Гй0Ќ@H`t Œ ˜ЄфH.Merijn Brand H.M. BrandaMicrosoft Excel@€S}НЉ Щ@€сvСй ЩўџеЭеœ.“—+,љЎ0а PXp x€ˆ ˜ ­ф PROCURA B.V.eTe2  DateTest  Worksheets ўџџџўџџџўџџџ§џџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ РF пщTя ЩўџџџWorkbookџџџџџџџџџџџџSSummaryInformation(џџџџ DocumentSummaryInformation8џџџџџџџџџџџџSpreadsheet-Read-0.91/files/blank.xlsx0000644000031300001440000001073212537000161017127 0ustar00merijnusersPKВPЭF _rels/.rels­’ЯJ1‡я}А{wЖDdГНˆа›H}€˜Ьўa7™0u}{ƒZЉЅI~ѓЭ7CšнfѕŠœGŠFoЊZ+ŒŽќ{ЃŸїыНkWЭ#ЮVJ$cЪЊдФlє ’nВ0и\QТX^:т`ЅЙ‡dнd{„m]_џdшіˆЉіоhоћV‡ї„—АЉыF‡wф^F9бтWЂ-ї(F/3МOЯDSU NЛl/wљ{N(ж[БрˆqИTГŒ˜Пu<Й‡r?ч„Ўўs9ИFўМ’MщЫhеРб'h?PKfЊ‚Зр;PKВPЭFdocProps/app.xmlаMKФ0рЛПЂ„НЖ‰нR—%ЭЂˆЇ=TёVb2н4$гЅћя юž=я№№Ю№нbЇт1я:r[1R€S^wшШkџTnH‘P:-'я #gHd'nјKє"HE\ъШ1l)MъVІ*Ч.'ЃVbуњq4 Нš-8Є5c-…СiаeјЩЏИ=сQэеwПєжŸCія=ЪЉ7ує2№ћ&Ѓ$цуХо|DxўбhS­ЋЛЊ^э›—с}гmS\- Йэ'(ЄЭšYЖz˜ЭЄЫšгkгЫФPKаAЛqуhPKВPЭFdocProps/core.xml}’пOƒ0Чп§+HпЁ-Иi€%г,>lЦDŒЦЗІмX iЛБ§їЖсдХЗо}Пїщ]Џёl_•оД‘ЕJ ђ@‰:—ЊHаKЖ№ЇШ3–Ћœ—Е‚Р Yz‹†‰ZУ“ЎаV‚ёH&šmЌmЦFl т&pхФu­+n]Ј мpёЩ Р!!c\х9Зw@Пˆш„ЬХ€lЖКьЙРPBЪLŠПНteЎєЪ…Г’іаРUыYм{#cлЖAѕVз?ХoЋхs?Њ/UїTPŸaBЗ{РŽз•зшю>[ 4$4єIшглŒL32}ёЏњx<з:ЭЖћЮ0ФVrUlн“ІЊє—Н<ЄКe•ми•[ыZB>?ЄС ДќPо\ЛнЦјЏc˜ :хўaф“БOЃŒ†ŒŒX4Йс шћаА“н_KiщібЯ•~PK4<Щ^PKВPЭFxl/_rels/workbook.xml.rels­‘MkУ0 †я§FїХIcŒ8НŒAЏ§јЦQтаФ6’жЕџ~.[ eьа“азѓОHѕъ4ъˆФC ЊЂ…СХvН§юэсVЭЂорh%АЋМи€I/ZГѓ8Y.bТ;]ЄЩJNЉзЩКƒэQ/ЫђIгœЭS­[Дn+PЛsТџАcз _Ѓ{Ÿ0Ш Эr‘3бRbр+/2єmљх=х?"и#ЪЏƒŸR6w е_fяz o л­P~ьќ$ѓђЗ™E­Џон|PKO№љzв%PKВPЭFxl/sharedStrings.xml5ЭA Т0…сНЇГЗS]ˆH’.O эиšI›™ŠооИpљёxќЖ{ЇйМЈHЬьраД`ˆћm~НсЬyaЄаh`Э_Рёх/Х эГk<ЃЦ­yу}ї>Ы\е@+мv`ШSЃm…ЇЋ=dЎГ d|дъl™чWY+”с)Т{ћb`]Ћ юБъ[0>Б …'јЎQуe3@ thGћ‘JYsШжЛтДŽХГ*|ћХПzЧй+bЛЋ„&ъy>Л‰ЯпZЩтћШзр к#>Sˆ›‡жХ*щjPp&Шz„Эr~OO™ћ'ЕiyюbОП* ЊмХП-:X˜o””pnx+О‡ъ–+:Њ0Oax^MЁ`%}Гц7зЫлеэтцђъњђнеmœrФФїТ‹ВАxb6ЈzчБMpЮyиЗљгЗc5ƒ“ р:љЉ Њ.$ mvё z&щXцEv №ш—м$ˆUЦoЛ8zЌ!йвЮ8Ыќp–ј[ р(К­zEу…ОЃy;Ѓ––’WеЯŽ,MёgaŠы8љХѕ0У™”OФб=‘2оš8_сЖZ,nђеєУY4СџщЪІЭбw$ЭьNНRWo‰АйдЪ:ФўЅoї1O[ц[j§bИNrу,„нкˆˆvˆyjРlЉrъšUTИHћЄCы­P4НƒЧР;ићЄо3П{-ЊчF~k”Ÿv“VЬ6EEs‡mXž. Лrѓј(ГЉ=їZѓЫPфи—ГЅТN…>Ч™јнD*™TuMН3>&8cЭ[);žѕ[(eZ€$Ей™Ž)b2Oчy2КNџ”ЪPK+мКџ?иPKВPЭF xl/styles.xmlэ˜бNл0†яї–яG’R Li02Mš‚"Mšvс&Nbси‘эBЫгsЇi„6К‹Љм8ўsќпЧЖъž-KŽЉвLŠ)|ŒЈHdЪD>ХїГјѓ Fк‘.теј,њjГтєЎ д =Х…1еЯгIAKЂdEМЩЄ*‰ЎЪ=])JRm•мљўФ+ 8 ХЂŒKЃQ"Т€VBЎљž‚8cфp—2+пЎЎЏnЯ`/ Н…™Ю;! ѕ3z$  O$— Љ|>ХqьзVЄЄ.ь’p6WЬŠ)_9yT.ˆв0mЧЋГЛƒLфЙb„ўЮ Џ[?Цy[ПvBVФЊD д<ЯV,‚€]с0uмЂsEVСшЈ3 n я\Њvaw8 ЅŒфR~_MqFИІИ•ОЪ'БЃгЬXБМА­‘•g!ЦШжcljGn }B9ПГ[њgЖ™Наeіz ŠК'ХzoЉщЊтЋXZˆQ кuHO:ч,%о(ihbъYЫQHжЈŠ=к.`NUАЎі–XЩЭ#C—цVт(рщI‘jb[D&в:1Мг…bтa&cжО†2U­ Фeђ@гЕЩ‚Ѕ0Дщ-ГAЅќM‚mыдјЊ+w+ЕоЧЬhoц 3[Ÿ­Н™Н™Н™Н™Н™mЬŒwщ—rь”›ёNЙэ’›гџlЦы^пнeОsЖНЦ/ГзЮЛ~ўбњИг{M);HmY'ИЃ"ћЉ9Хзіѓœw*7_0n˜hzЩBУD.œжЩ5Ф\ЪВ$kJpдУОƒ~љП[дЄ‡šМЕPŠŠdе’Ž{ЄёћI=_'=кёпгnЈJ`Х[аitє6hsd`qНЭsЂPKƒіT|ЕPKВPЭFxl/workbook.xmlRMoл0 НяWК/ЖГ"Hƒ(ХаЂhћРњuІ%:ж"K†ФФэ~§h%ю: ‡ž$ђQя‘Z_ЕЖOrГnЌУЧЃ!}џ:–} NЫbѓ*ћg5шнОПцj%p йh†ѕoдФŽР9) VчхйTђE Ўф6œ‡єУЬxЂ§<Лг18Ї$Х§Љ %ЋпCюЦAнCІфѓ“ѕ& JђŠ^ом‡|}В†Z^ртЫђlЪн нЖЄфВ:ŸKAPџЅфЂфg‰r“Ььф€мoŒиPёЦQойt Ÿš_VЃT>o wЮџ„:иdkЧŠуЪ2oЭ<3N4lWѓќ-aфњЫАї,Ё5ElОУ_™э„П.ч_Ё#`‘ГВ,ЋЬ; |ѓPKБWеџšЭPKВPЭF[Content_Types].xmlН”СKУ0Цяћ+JЎвІѓ "эv<ъРy–˜М­Ёmо‹Гћя}Љ› ли№вPђОяїо—j>є]Ж$ы]-ІE)2pкыжЕxY>фЗb>›TЫmЪИжQ-šУ”Єш>€у•Ч^EўХЕ JЗj ђК,oЄі.‚‹yLbV=1­lЁ0>Њj!_:’EњŠьўK˜ЕP!tVЋШ§Щ3ПhљŽ””c 56аљ7ЩxН@HВq‘ъNТљеЪj`їž% Ќ4`ђР–€бТqlэN‡яgMъ#‰CЗ‹іУcћц}›Јџ3ƒЉQц9"п%:;j ЪPy‚оњHЃ:’у2Нp/пў‡ђˆл.ФhzDћУПш!№ZєЪКRЩёЁ˜}PKbУ4WPKВPЭFfЊ‚Зр; _rels/.relsPKВPЭFаAЛqуhdocProps/app.xmlPKВPЭF4<Щ^:docProps/core.xmlPKВPЭFO№љzв%зxl/_rels/workbook.xml.relsPKВPЭF}Ў‘Аёxl/sharedStrings.xmlPKВPЭF+мКџ?иФxl/worksheets/sheet1.xmlPKВPЭFƒіT|Е I xl/styles.xmlPKВPЭFБWеџšЭ9 xl/workbook.xmlPKВPЭFbУ4W[Content_Types].xmlPK ?…Spreadsheet-Read-0.91/files/misc.ods0000644000031300001440000002023213701055232016561 0ustar00merijnusersPKZчP…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKZчPConfigurations2/images/Bitmaps/PKZчPConfigurations2/accelerator/PKZчPConfigurations2/toolpanel/PKZчPConfigurations2/progressbar/PKZчPConfigurations2/statusbar/PKZчPConfigurations2/toolbar/PKZчPConfigurations2/floater/PKZчPConfigurations2/popupmenu/PKZчPConfigurations2/menubar/PKZчP manifest.rdfЭ“Эnƒ0„я<…eЮи@/r(ЪЙjŸР5†X/ђšоОŽ“VQЄЊъŸдуЎF3пŽД›эaШ‹ВЈСT4c)%ЪHhЕщ+:Л.ЙЅл:киЖ+šёjƒЅŸ*Кwn*9_–…-7 lЯГЂ(xšѓ8~DЃ#gЈ5Šjжˆ†*Ж‡†ZNu j,A_Адлъу‚ŸKе­‘ОPС HшH ‰У˜Œи“ъї5gёbБ ~w„j­ЯРЮEпяиЦ”єёэЃma˜obX_ |‚ђqК]Џyъ;JXС$ц˜е&џ&Иб.mАдІж†YGOЩUlZp:Ўƒ”\DНЖЛ“мЭтЧ1NfыxBЇsЯнзИNе/м<8ŠqtЛŽoi<ЇЩЬщQžYу+ЎФжРwп™…‘З’мЌ„jO›ŸѓЛЭн4И€mjЃЗ$Šn>ЗB8ќМЈіUЮ—ББЮgc|оВ­ЬuЋl†&ЈOrrЬ%CNoЛBc6Bdn0И€R((zdwМњTз?њƒCyœ„‘{k—ŒПˆ6LЖ€эsэvKЉ™EљtП:ОщЎtГм1UAqE}ЋЕцм—L6№џ5VќSНжюЌпAџ‘3 KЃыїао1nјo“&Џ>Qrэw˜џPKЗк–п LPKZчP styles.xmlэ\Yл8~п_a(иAЌZ’е‡эщv0{dwI#˜dА[ЂdюHЂ@вэюќњ-RїiљЖГqqФ*ЋО*‹КюпП„Сш3Nhє YWІ6Т‘C]љкя_>шэ§ќOїдѓˆƒg.u–!Ž„ЮХk€љ:G|3ЬЁ %cЩЂEœ№Y„BЬgТ™бGYзYГЯL ›Д;œлтA[Я cЕZ]­ь+Ъ|уЫo†ЄщП#уfqС+IдTќcгМ1Ž)ЗыфЬё’ŠЭu `Љ7Ќ++—ь,CQЬe+јГ?Д/Аъ c@т)Рe!.CЋЁR$/ИЌм]5ДЛф-їЅ”:=Р^ œмX ƒЭ•ЬЕЁVНC­˜eь!hшX’З<дK@Ђ?кbЫšNЇ†ЂfЌ:Ш tvИŒыЕ-9ЮЙебаг)Y л0Ж[‰є4м‰ŠЙм;Z†O˜  дŒoИсаoœOTˆФ"в™Ÿч(.#7Щ/‰4ќcF$ ЊлЌ"ЁFПѓІ†b*Oжо–iHžŒпgЎДХ"ˆЖ ШK€‘ўL№ъMж# [˜™IIB%`hиЁ‚e‡ŽŸe^ЬчСA_Йu­ƒRЊ‡\'Ь[ЯJНЫƒ‡H,:&уФјDѕЯЧ_‹)ЩТЁ!"y+љиa$œ юJцXˆАе[IцTm”RZLmmž­œ…UгCж]ь|~ŸL€Мy”KЕД_A –†Œ!$Сkжnєwў•РTT1њŒ"о"ц'Sўs/iдFб’_їqО…ѕ€ЏчŽ˜œјŒ@19жЈіaмЁS‰дЃР+8мEƒ/hACд2~NиutЃЫсi{R9eZКиCЫ ­Ї2ЩЉJ*Пш-cC>CёBafa&a ИA u—p"ЙŽXуЋ›0, ‘Ћ|ГЃRД#t<: Pф/‘TЉŽ` пяŸЕКцŠъhf"2ъЗEFIee„П=6%Ъ…5Р/ЭЩЅц R—›“ў§Ј|гњќ>YМв5Ќт‰•GSЋ1вЃD*ЫљаЯ%>@WЕШЬe8KЦ Ц~mЪ[ŸЬЬŠg€3фВ,иk-^У'кAм‘z@‚f ЗЄw?ЕiUFѕ]Цjw ”*—б5хІЋУќЈjѓP(ДЊ№З5счЧЛšЦ‰!Šѓ8\’l›žQАФoп§ф‹Ÿђ@qЄрш•1v„vќ#Ъr(ДЎќЈ’]@ЁЎ}уy&|ъzќШ<˜v Hћ`9ю…u|~i4эŽƒD™Н‡(Лўe9ч’і.6 Џ$ьЭqЛnŠ  Ём]дt6кQvбы0ЦWŒrЬгStќВЪ…nдНеztалuPvJ”% к=д!@Б­Тw{Wx+5&к1с$ьаcZшБ KЦk#Ю:!бR@RhЄОь” PУ’Ю…‚ыuЖЭым!€c™NeДuЃЗRd|ŽшїXв9mћdЉv@АьнЩ-i!љig@QдП‚ŸrЫW6l˜Е{Џ{NЮ!ЪЛVоl єЭЎauЪ’zskV—Z5ЋАи%Ќnз‡U_ВѕHшђz=rf%Ўс|&їоBєі“uLф.+eю€ъјшЈъХ„JHэКгQ €Щ.p$жчАбŸ!n“ 1@TА^”5LдšЄ%\Ў=sD‡lБяvKZgVОŸlЖЭ9,€uЇŒЖ7X/3еm љNщnПwцСгК3снYfТЛ§eТЛ=eТЛЕ™АoБœœSёvQћ‹ЩЅoЇи˜ь€ъ ŠЗcЏ чžЊЧЩYцЬЩўrцdO9sВcѕ8НˆъёвЎ€Ќ—^=ž2зn љ9Ug›ˆ7._Їg™ŠЇћKХг=ЅтщкTмy9ьКt1ђtзИКе+&4LЈШ‘з€hЄгgЬМ@>bуЁ€у ЛЂзmэј8ЮшJжХ{ŠЮывХHю˜ŠФ#ŽоŸvЌоДc Ьє’Š_bЩGјšфœЄžмx–ї&и9бЃЬСnб?jоQ-!У› ќ=Й;ПйЛћ†їЂЉyу:ЃЩуƒ: ”.(–Џ.’гˆRк‚nr+|њ†GлžРшОIНIOŸ"Јq7ЃЏъ_Щg1{ J)1bљƒ™zцWІLѕ)ьхф_ЧЂд–Ь‹ˆВА Э !$ФЛБ]_ЧцзМ s ‡ˆ~е+#k+л3мЖЖнšl`{кОѕу~ыЧ'В~|@ыП€6;Дб-ћ‘ М•lЅTкЛŸѓ‡Ќ—#W/.ъzžу^D> ё<К`еЄ”гsš”J™+Ÿ4Џю`Ц8 ˆ;z31х_wЮ*9бVŸ†Э:ёЅ"кинvЅ Б‹HѕЮІц+ш‘< |@УфœУx#‡•dBј)qЦЃ"ІƒeE\љ %Z кСбЅдЖ~†uyЩ5УџIЉЛ•ьT­mцИуЈ9>d*šцэmK>=фT|ФKСJeЧ‘@IпPІгЃƒђWtє(‘p ФqZWнCђФЂm+Щ:(geи?Ѓьј!Л•k-$žњьЩfЕѕ/Ž–žfЫppГzv У–†Дmb!EтHБАщє(`ыиjЄАmЗгиЖ ъл“ТfїТf6W}š†Е Є‡Вю ‘ Žž2Ѕ|Ќƒ5t)*vŒCKkaj9[B‡fЩ’œіyафЙe-ѓM|wЌ9zH]yFщтЉ№ї6ЉѕsEi›› јЉb!Я^-RoоЉ7ЈVФ| иƒfГкШцZkr.шAЫпŽ`tы“*rt› V•1.ркё0з^€пЪћцёеѕДи7—ІЙЩ›ЬЬ+k’ujYЬMљ—CSт !Р䑆™чCч жтйЯŸtљN $дљюД#•)#ХЛыфлт"Ђ уЭеuG46(‰‹Ќщ•yгъІœRVCЉŸzHРlžcЙƒ`эTЎ‡цŸћ2oy@#_ZЧGщ›ујˆ>§;а№ 3ЊЋЋiќмцќw•ЋЮ:%„ˆч"ђe;m”’њ.Љ”gCЫКžР2П—%з,Nљу„{ўў§ћ{Ѓо˜ЖФ5'д –РUыЅьвЃQuT>њ'iKzPњмЪЦ+Е5TШDU@яUСhрИкпв—Hі ;n ›1ьЫ TRЁMСNŒљлф‚ˆ ЬšПkRБвЄ‚ЗІ…|R0CJОpЎ\Ђ>Т† gJ„Й96uѓОкм4 ѕ5ЭT Щ8џЫ(SЌ0Э™њцJЗ…QUПгХV†ИQю о$5ŸNЫ’Ж“ФЂДчГ<ўzу} wкї&[™Ї5tэZшЎСwSO b:(Jr ЗЅбџ7D0Ф:„J,пFFћRkДПюxў?PK€•01 .YPKZчP content.xmlэXKoу6ОїW*аM?’mЂ&^(і”Š&z hqdK‰IYіПяP/SŽфЈu‹-к^‹ѓЭЬ7œс •‡‡T{аFЈь1\ЬцaYЌИШЖсЏ/ŸШ]јq§ЭƒJCФU\ЄYЋЬтпЕ3х О1[)t)f„‰2–‚‰lЉВV7zЋU~ыѕи˜•} wжцЅeYЮЪеLщ-}љ…:БpАДEo5чrНœЯWtK9ГŒь”пЖ‡M5їїїД’ЖаDщєаФƒ4{P‡Дpё0)… Dё„м­ђшdРэ`Фз§эѓгsМƒ”Ё cYCЋЅѓг~œxДšЗTCЎДmб<юРyЁeу1 ŽЌЁ‹йЂлНxЧДšА ьGcілЉКХ’IsЬіF‚o„kVNЕтАX—ОК+†Љъыы*Ѕт {Cc&у.X{”09\>sU^tUj…гТSАlЊ/‡эе˜й—ёњvвS}Our0’$j$…мХиъї]НMuмœЙ^СЌјє‚Yё^ЕАЭє$V`_;+в шЩОБѓМ­ƒdzрЈЗь*VтЉвѕЖkФ‰*2^їаОфдЂž…7Лq9yїДљ‡ѕЂТbNІХKѕ'H7)ї,євЏвбъš0ь]—ы*\€фг:И"Љ9oпNЛпПљћ§Л;ФЬюFЮс§ŒТъёљЩŸ6SЋу|А˜X‹|r#ЌбНРœA3л’жт0hіЯЛ.ЌТu{7Ј­к-$xG ‹pˆЅY?дЧЁ[ъwЧє1ќQ †ƒE H…<ЖыєВђ“РƒYT№Ь23`ц;–+ѓУЎ^ ƒži‡'[ША6p:˜RгCфТ֘з=CbюhМCэ“сф‰.8 щ5 ^иNЙЊ|уП\ыŽ%МYg…EGVФЄВгUBѕьqеЂsжАЌNYЄYиjњ‹$Ч к 0AЂЂі…lK :з­Х^ юцтУьў6M+ўqnzŒ›Vх1\ёYе"ЗИБнс9Н™9з—щˆЪ­H™$ОЎеLgmй0ыv1Х!šфl Єжј>;йыmђš ŸчVH.L.йБaжиuМЋ‘TqД)5Б›?Bzy щзхќѕk^]C:QъяуLGOb#и(~.њхЈш'дСэПОмxЌ„е9•ZњЎшYЋI=kѕЯњšЕъќpџтр}‘єn2ДwзЁ#џв^џPKФЪажPKZчP settings.xmlэZпsт6~я_СјHB “pCИKЁЅ“ДН7a/ ‰ЌѕH2†ћы+лI|vъ€EяІ~лвЗыеълђѕ‡Чjk’"ПБšgчV Иƒ.хЫыavWџХњаћщ ъ@зE'№€ЋКЅєYггЙь:ШTOя"‘Tv9ё@v•гEј~Zїхшn,,ЙГa”?нX+ЅќnЃ†сYxq†bйhv:Fќt?ŸFи‰fёржљљe#Й~_Ulї–БbЛџ/LsaѕіvиП~яzї.ЩO*№"лдvЗ#a7–VЙЛІ>[ЭЪšїzЮ#•tЮ /€ЬаЗіежз)WVяќКё-ШЛ€ЧАPfџЄЎZeA7лЋЃб‡@—ЋLЭ//;Eбыёы”ЛА7- Ть%Šчhwл"њB8rSJJ%єњ[НШšяв4Mщ9#кџІшы)Еž7„D1AI•vќПJtзШ—ˆЃъt!mљŠ#\„ЂŽ)є”і{•Й5_ъoПя(К†}Jј2Ч<­УРїњ–LW{иi™‰[.mяQoQ)єJў‚шЭ4JЉ>ЄQ“p~Ј Ш"Z}Н} ИНТ№WAгŒ=Gd@ИеS"€7wД1ССFны|bС0У’8лHpп”Q" •Ь' ы‹ьЖQъкaLˆтN —I‡%yА"‚8ZR”Ї бN*Нg4ІќщСwЕ ц\|ŸM€Ш “я!яљ€Ё4AХЦ‹к‘ќ3фIРŒ2%Ћ9ь tоo„tFђуюV[;Џ‘.CŸщŠ-о‚Пс|@ИPnсејц‹кFоЗЦНPK зЋщZ­,PKZчPLПО̘˜Thumbnails/thumbnail.png‰PNG  IHDRЮџŽчў PLTEџџџџџџ~яOJIDATxкэС1Т ѕOm  N Ю1Ж•zIENDЎB`‚PKZчPMETA-INF/manifest.xml­“MnУ Fї9…ХЖ2ЄэІBqВЈдЄ fp№€`ˆ’л[qтЊŠKйё3Мя1ˆЭюдЛъ1Y {хkVЖ^[ьіНџЊ?иnЛкє ­DrTхІыДa9Ђє*й$Qѕ$Ев@элм’ќ[/ЧЄыl&№Ю.hчс4qc''ёЕЂR} ‚S€h‡-хЄ7ЦЖ g„1iЛЊnW0жA]Ъуљ&`ВsuPth˜ИыukhЋj:h˜ СйvGд|ьŸ_ЇAщt &–Ј|z4ЖЫqЄЇ7ё BЪШKxЖМ–…Ok A1B1D1A2B2A3C3D3A4B4C4xxxNote 1xxxNote 2Note 2Note 2Note 3Note 3xxSpreadsheet-Read-0.91/files/test.csv0000644000031300001440000000010210701240203016574 0ustar00merijnusersA1,B1,,D1 A2,B2,, A3,,C3,D3 A4,B4,C4, ,,,,,,,,,,,,,,,,,,LASTFIELD Spreadsheet-Read-0.91/files/hidden.xlsx0000644000031300001440000002422714562637075017323 0ustar00merijnusersPK!‘ТЗ„јк[Content_Types].xml Ђж( ЌTЫNУ0М#ё‘Џ(qлBЈiŽP‰ђЦо4VлђКЏПg“ PHUЅ—DQД3ГГГ;Ъ"кGmMЪЦЩˆE`ЄUкЌSіБz‰X„A% k eG@6ŸноLWGQЕС”х!ИGЮQцP LЌC2ыKшгЏЙr#жР'Ѓб=—ж0!›MпH€з ЂЅ№сU”ФУ„Эsœ‹žšТŠ;eТЙBKH9пѕ‡5ЖYІ%(+З%q%5и]…Тџ%Фp,SЁѓ цЁ,’Дe^@&ЖEˆžф@cК‡/kэлЬ„*ыі1з{њНыїdo§цгкЭЕ]ЉмIJЁMЋЛ+4НЅЗ9ЭzАЈ,W bGрƒ†“g]мРЊїzŒШызdА†пб8сїyаЁcј6œбб‘внР§Ѓњ…{К+= (mY-+^ЛСїŒЯ˜ ъ=xRyѕ3№ЛOЧ)ѓвzИњ<љВЗ4Mox/ц}b—NŒ@ž;ЫvхCf ЉЯлЈšBЫIƒѓœгЩћ"cž&к\OєџЖ8q"K‰аHрѓ<пŠs@ыы.ŸhЉјНЮ<тЇ„сMdјaСХT_џџPK!JЉІaњGxl/_rels/workbook.xml.rels Ђ( М’ЭjФ0 „я…ОƒбНq’ўPЪ:{)…НЖл0Б‡MlcЉ?yћš”ю6АЄ—аЃ$4ѓ1Ьfћ9єт#uо)(ВКк›ЮЕ ^їOWї ˆЕ3КїŒHА­./6ЯиkNOdЛ@"Љ8R`™Уƒ”T[4e> K—ЦЧAsc+ƒЎКEYцљŒП5 šiŠQwцФ~ Щљomп4]О~аё Щ‰ “ Ž-В‚iќ^YyžЁ\“сУЧYD>qW$ЇKЙSќ3Ьb2ЗkТеЭ ЧT>:Ѕ3[/%sГ* }ъњБ+4Э?іrVџъ џџPK!0{СR;xl/workbook.xmlŒQСN1Н›јMявeq Л$F\ ‰ чКeКmгўоi 7Oг7гyoцЭlОяљчЅб%2J@зFHН)щзчын„И\ %=€ЇѓъіfжЗ§6fK@ћ’Ж!и)cОnЁу~`,hЌ4Цu< tц­.| :Хђ,ГŽKM Sїг4В†gSя:асHт@ё€ућVZOЋY#ЌŽnэ;яpюНЂDq^„ Jzаєp•p;ћД“*V‹Ќ Ќ:/ЙtтЖ+ НџЫGHіkЉ…щБk‚юNшAŸ*k)B‹цŽGЃт”{Йi&ГЩ(‹Rь‚>y„2)јˆО ё1.pF|ЛЉФ‡[ˆadИњ Еб‚ЄІ‹ž<3 ­аћ3Ež†HЈ\sU/‰!iхХCžaЇЛWПџџPK!у§ЏPЎз xl/styles.xmlЌSMkу0Нњ„ю­т@KЗX.{ ,ДPH {DВ#а‡‘Ц!юЏяШvтК{йНиoFš73oFхЫбYvа1™р%/юœiП ЪјFђЭъю‰Г„рирЕфНNќЅКН)іVЏїZ## Ÿ$п#ЖЯBЄн^;HїЁеžNъ ™БЉTЪAЮŠхbё(ЯЋВл…ЮЃфЫЩQ•щ“РR] .ЊвƒгЃ§3АйUƒ3ЖЫь™iфћ‡№%БіК,rTe ˆ:њlТ›О%uузМХуАBѓ‹ЌОџџPK!МЋ 1жИ#xl/worksheets/_rels/sheet2.xml.relsЌЫj1 Eї…ўƒб>жLЁ”xВ …lCњТж<шјхІЩпзЁаv аMw’.::hЛЛјY9ЫƒV7 8ишІ0x=НЌž@IЁрhށ \Y`з=>lъ"юk&ј“ЗКж7'\ќЛћџџPK!А—j%ацВрm•аŸ›Ы“9%кАЖ`BЖаgає"§ј!оIѕ kCЁе ­щ"Ягy гйA‹H)UУ ўU•Ї;ЌpE№Bп?їЦ[к3Dъ_8dYђ2™ohMOЂ@0ƒўuЭ;MгИрˆй†ˆ‚2ЁЫ ZOЉ—ЦNљ‡§&Ж‘{),p]$дЗЉо_Й—Ў‘E (йV˜•wМ05-˜Ь1б=x+wWРЋк NиЋgЬА4VrGАлGл1;Л :CпЙ .1ŠeЖЧ4bянф/ръ Сѕ8@хЭ№-ЭЏ=hž•ЮPfKœйCЪйqЪzŸb'7V›ОЅЖФшъќ˜jeK^ЉЭŽSВ} Њ9‡јvG„ѓ!ЛЗвПЪ~№ Ј V „&ЙмЖш"Ф9бўМda„ !љЋјjЁДmq№ uЌ‚oLUМеD@‰”ўd6Ÿ.FюъOУ›˜‘н;UївйМжИL€'f1™ŸЃЧŸЏO№…”RšїalУ:џfл‘’›мXМЄтИ\nЇкIeу†’уП%"ыxBЇ>Ітеax>Š qoьвщ&xеоqSП Щ.XЫЂИrігOЌщОЌм'нртjђvфV6Ќ§| еV0E„юk{‡bЫгыќЯ 6Nй#{aˆНБё4PБќ9Sl‡—!Q/ЊЎ‹РсњKџџџPK!ђŽіыŽD xl/theme/theme1.xmlьYOoл6Пиw toc'vuŠиБ›-MФn‡i‰–иPЂFвI|ку€УКa—Лэ0l+аЛtŸ&[‡­њіHJВЫkвfЖ%‡Ђ~||~|ЄЎп8Ž:$BRžДНњеš‡Hтѓ€&aлЛ;ь_YѓT8 0у i{S"НяОsЏЋˆФСјDЎуЖ)•Ў/-IКБМЪS’РЛ11V№(ТЅ@р#ГЅхZmu)Ц4ёP‚c{g<І>ЙЂEbo#оc !QRwјL Дh’иС‰т\ppPз9•]&а!fmќhHŽ•‡– ^ДНšљѓ–6Ў/сѕlS Ц–ЦѕЭ_6.,"Jы§FыкV!п˜šЧѕzНnЏ^Ш3ьћАT;—ВЬF­оЩe–@Ж9/Л[kж.О$enЮ­NЇгlesБB Ш6sјЕкjcsйСХ7ч№ЮfЗЛър ШтWч№§k­е†‹7 ˆбф`­кяgв ؘГэJјРзj|†‚h(ТKЋѓD- Ж?рЂdXбЉiJЦи‡8ютx$(ж№:СЅ7ЖЫ—s]Z’О Љj{яЇrb&яеѓя^=Š^=rђ№йЩУO=:yјƒ•х мЦIXјђ›Oџјъ#єћгЏ_>ўМ/Ыј_ОџјчŸ>ЋB Эfєт‹'П>{ђтЫO~ћіq|SрQ>Є1‘ш69Bћ<†ЕУИ3'#qОУSgŽ@v…шžŠрэ)fUИqwO{ToN8sDbЂh…ц(v€ЛœГ•ибКJN’АZɘ”qћVщютФqmo’oцAщиОgš{ X‡$! щwќ€ŠенЇдБы.ѕ—|Ќа}Š:˜VšdHGN Эmгќ2­Z3ИкБЭю=дсЌjе[фаEBB`V1љ!aŽoт‰Тq•Ш!ŽYйрЗАŠЊ&9˜ ПŒыIž уЈ)ЋЦмАо’гw0VЅлwй4v‘Bбƒ*™З0чeф?шF8NЋАšDeь{ђBЃ=ЎЊрЛмЭ§ ~РЩBwпЃФqїы‰р. )ЭDП™эK`j‡cšќ3 llcр’Œло&lMU)Б}Š‚сў…ФЛ…'ЩXŸпx.yї’wНџ<я.ЪхГВэŒ`{uё` cS&Ч‹Ћф1el ІŒм’ІP–А[}шдЭ‘ЧІ4‚fЦю.иŒA‚ЋЈŠNЁШЎ{ZH(3бЁD)—pК3н•В5 ueЯ†M}jА„ Бкхэ^бнљс cіœаAsE+ZРY•­\Ы„ТВпDY]OъЬкъfj†ыmХ’С‰ѓKƒЮТšP† (^РЪЋpJзЊсp‚ ДнэœЛХxс"]$#ЬGzнѓ>Њ'хБbю v*|ЄOzЏБZI[K‹} mgqRY]cКм{oуЅ<‚g^в‰{*YRNN– ЃЖзj.7=фуДэс\ Э8ЏK]љaТѕЏь}‹“ЄE8YЧйd6Y>ѓf+_˜›uИЋАvŸ[АЃ"RmaY цU,бšьќ—›`ж‹Z€є7˜ХЪУ?6 АЃыZ2_•]ъбЖГ•ђ‰"bGhФ&bƒћuЈТz*сzТ0‚~€Ы4mmѓЪ%ч,щЪWXgћ1K#œб­Nб<“-мфq1ѓTšЌ­rюfqч_ŠIљ ZJ9ŒџgKбћ мЌк>\ц ŒtОЖ=.TФ…вˆњ}•ƒй2!ZрB^CPѕš/ШЁўosЮЪ0i Ч>ЕOC$(ьG*„ь-™ш{АzЖwY‘,d"Њ4]™кiШ!aCЭЋzoїPЁnи$Ѓƒ;юs–AЃP9х|s8Є’,+И&'я Ў|l2ƒ>—‡MA“лϘbХЎjЧ›сљо{šѕgeV#Я PVк ZYкПсЮЙеZЦš[ёr3Ÿxq~ХаYD)мњ §ћ>#&Œѕ†:фћР­О6ha6еWlс4AкЮNЖгњY‹ВІЭJ'mЮПЩп…оSЦж3;‹ПЯiьЂ8sе9Йx‘ЦЮ,ьикі-45xіtŠBз8?Щט[хoO|єНwќfПFЩžLЄ{ŽрИIф&:ŽЧ"жoљxŒŽ ХM3‚ƒ=ьX!:ыP$@o^TчCќ‰T7 7Уё!АЉн0Ш[8Ъ[ўq’7E‡6сLПzЦЫx]УjЫ*\v*якЮG/іvхbY‡‰У"ЫGФ%^|’Ц&СA/ Ь%jлKрѓЄЇ)<&ь,vн2H…); lc ЪЂъАq$СЩк#LСн№ЙTнŸ1у Яg4ХАЯA­ќс ˜{/i}my >Ÿ*ѓ ’7Fyc’Тжm˜(эв–jЙк,ШXrmox8ЙŒ6tЦhЫ‚ r`žю€Г†ƒіРьњ‘ЂмјџџPK!ЂIяžkixl/worksheets/sheet1.xml””Ms›0†ящашаScРvќU “иѕЄ‡f2‰лœeX@ЈДЖлўњ."ЦxšЬД>иxэћЎVZТЋŸЅb{0Vъ*тСРч ЊDЇВЪ#ўmГΘqfQTЉPК‚ˆџЫЏтїяТƒ6ЯЖ@F •xX/<Я&”Тt ‘L›R §5Йgk"uIЅђ†О?ёJ!+о*,ЬПhш,“ ЌtВ+ЁТVФ€HѕлBж–Чa*‰5bВˆ_‹е˜{qшœПK8ио3CБ} BJ рЌйиVычfс љЄhн‚FQ$(їАЅHxLНљбz8ЏsˆУгѓбmэZqoX ™и)\jѕ$S,Ш5L>š^ђ#|а‡[yD‡ЧњWE}`д/*зжЂщ~АSIМІ(Ѕ5иЧ~шэЉ˜ф…нєYpЮV}6ь˜G^с№UCŠv†Ѓ.бsгgуŽ‰Ž^Ѕh'zй%:бeŸMЮйЊЯІ;3lЮэяЖQД3œu‰э.њl~Ю–}œњн:Жз =ДZф№U˜\V–)ШШЬLgгёМїЁq3эБПЪPзodm5Ђ.п€Эае˜f“ їёgŸ/ш€2­ёmL7ЏЉќpWГLтFo&Н,Д‘4‡nќ"^kƒFHфlga-Х{JМл•лFЎWAЫkZЏVЕŒјШ'zљ Lzђkы]Л˜P2Џž$/НkGRЇщ­лUќA”ѕЇЅћц}ЫюрРt)Њя”0мб`ш~ЎCя”вcыѓ?:ЭƘЛwb/ Ёз/œЦЎ{IЦџџPK!у)?ŽО xl/drawings/vmlDrawing1.vmlьV[kл0~ь?яЁ/Nc;uлЈv ышSщЦVиУEБ”XЌclХuњыwd9ЗВKaфek Б|ЮwючCIкBќъš6ЉЗЌ4­Г\Ќ2Ћ †™dPаІPол7=~‡„йLf‚КЧжІ}h3ЁМ ЦI€ж9+…b+XвPбšд\šNmѕ’ЌмгЮ KНШv.†{>&Iу\šU)ˆфЉwпјЙ7Qy$Јx-Ÿк‡ЇAрwПA%FЖL‹”ЬфЉWјЪщ+‡UюбŠ>9Œd*XђRзfЅаk!Ј\fSБŽШМb\ mКRa‘zЦЬ@k‘›gъUxZзГSРІšнJъ(8{ФОл+Я%qTB-MйДЕ4тТUАj.ѕ@‰™Ёсшф8ŠKsб ”4v’GЩMNЧcTцBЮsCујиBŸRsбвАѓжШZNЅ’fEsЩЙаGd&•Ъ@A•zRЯр=Ыѓ –š“oчСw[3ЖI˜8VЬ–6}Д–84~nлк6{Шс‘€юКиG›* …ўЇuЖЌЮМяхfЯК­A‹эŒ .нZЛL„$\6ЄoЃU ˜’sMmгŽ&ЩЕ.6tз.iщ•В3ў€ЛI>NpžwнdoСєћBєWяЋ4љ•PЊvEYёЅЮrЈ\$ђIћ$№Щ™OF>9Х—”’с> o [>ЙfЊVнПЛRZњЉ’кИlƘ]сx‰гИЦ!lQЩ.фFjБщ$kˆ~‡MлB6’5ф3R ыU Љ‰­ЇK ?п_ЫP,ŽZзGТШpА‹7У,*u‰KшD†НжмtЏт€”&ч8')ŽЭУˆЎхQBЏ7EёЎƒѓЊ‰IКћ j"Аўkи[#ЖZ-жшпє’c&ЇLЊMжЪЄкЮwъLN™TЛyы˜IЩ}^њwащcі џџPK!х€ф „xl/comments1.xmlД‘ЯJ1Ця…}‡Лэ.ˆШ&Х EAХƒ>@иэђgЩФвњєІЭn‚рЅ’™o&_~IšѕСЖЧ@к;СWЫ’3t­яДл ўљБНЙуŒЂr2оЁрG$О–ХЂiНЕш"БdрH№!Цё€к­ЂЅбЅJяƒU1Ѕa4T ˆбЈЪђЌвŽЫF}ХСšљєКi ‹rRu:ђESМ$,`/јІт,ї?w‚—Щ2т!5…4огDпlЏLК_Щ!I[яb‚VцЄѕЪjsЬbuрМ1Ъ7‘­Hnœ УФђ›ЃО.GU,Ю<—ѕŸ\WцЊ‹ХDVџM4ПYўП9#љџџPK!Sš "Ђ(docProps/core.xml Ђ( |’Сjм0†я…Оƒбн–eЇл vHKшЁ :ДєІJ“[в$ЮО}ЧђЎГKJAIѓы›™ДОzэЛьBДƒл0Q”,ЇcнnУюк›ќ’e•3Њlи"Лj>~Xk/ѕр6 Zˆ‘\”кoиЂ—œG§НŠ)я‡а+ЄcиqЏє“кЏЪrХ{@e*>sПйiє‚єЯЁKЃ9tаƒУШE!ј›!єёŸRфDй[м{ъщPю)лш9ИЈ_Ѓ]„у8cЪ њџЕ§ў#Еš[7yЅ5kЃ%Zь YѓЗ-этѓŸGа8_/ ш ‡а|+ЖьЃЫЎйž^C“щOА‡`"ЮND0uАi”3ўь‚дŠИЅйо[0зћw™о+І„^ьє;š‹”q9NБ xЌC0X•"OЋ-KYЎd-~ЇЇ"В%MaюLFОЪy ЧШЯњЫзі†5dэЇœ–ЈZ!&Х%ёŽЊd e]€§ЁЏџЋ‹МЌrQЗ‚*Ќd§љ„xЬЦžџэц/џџPK!Нcѕъ„"docProps/app.xml Ђ( œ’Akм0…я…ўЃ{Vо%”ВШ !!фPшТ:щybз"В$Є‰Щізwl7ЛоіPЈN3oO#Љ›їоІlƒЏФzUŠ}Œѕ‡J<еW_E‘ М|xŸ>},яоН pJіьйгЏ_?{• ЭАžJžЩGlo‰зŽeJcЩi 4'ЃХsкйTяTКЉЬЬ/’|ВЧАД{їю3f 2ф—_~™3gЮ­ЗоКyѓцљѓч:thфШ‘“'Oўс‡fuв5з\ГhбЂƒ6lсТ…ЏМђЪќa3шsЯ=wс…К\+y Ššюy@ЩЎЎІc[Jt€Žsтtћ)tнї† lœmлЖmщвЅЗнv›}Нс†ІNjУбЦхЭ7пќєгO_rЩ%гЇOяпПџЄI“^юЄЕkз>ќ№УcЧŽЕ U z+щпаd=ю7єеtХuШ/єc–я™со"D2‘’pъH€тё›Gmгž-ЭgžyІхькЕыАc…п|ѓMпО}‡jЋі–-[ЦŒѓйgŸ]{эЕ&LАЛzѕjЧO>љфѕз_яPжTŒœ5„uІїLФє—S‡Г+Ш PЬфѓXd…‡НrкёVВ-š)ކDЄщОКир;`ёИБлЭьиБУцЮьмЙгђG5{іьћюЛoйВe/М№Т[oНЕfЭ[шoКщ&[§ЇL™ђгO?qЦыж­Лх–[Оџў{›Ym– bфЌ!Ќ3СZšю€W ˜йЯ@2‰аds™фЅгN9šщФШšЎFлuiвr/^МbХŠїпюмЙ6цN=ѕдЗп~{Фˆ–џъЋЏ._ОмїoМё№сУv9tша–-[fܘёХ_lкДiкДivУћз_­^НКџўгЇOЗу 6lнКеюЇNJоЭ1˜.Œа‘9”c`мGšЉ—ЅРegЩAЮBЁв•ЃАMїPfуR ˜йЯ@2‰GE2ЩYвл гЙEА›Vy=і˜ЮёуЧлБП ,_О|ђфЩЗп~ћњѕычЮ{чwкx]ВdЩЊUЋьх>ј л‘† Эšt"ЮI”5 їбєLЏїШ‘#cЦŒYДh‘ ЕЏПўzіьйћїяєбGПќђЫ‘#GЮŸ?пŠй@ќёЧэыЬ™3Я>ћlћV[g3рЗЦьь€Ъф\b–8Ќ@цX?˜%GX…rLŠ…$y#Ч3вhЦ^ 9щ^Г#8БqЙcЧŽиСЮ;э[Ж џњыЏінэлЗялЗЯ–u;Ж)жŽнSd~2Эšš5‹eM|†PGз>пЋылЗЏл ѕюнлl7i‹ћUW]eГц]wнecб&QЉ7nДiВO'…ЎЄГxP™œKшDьдT s ЌЬ’Ѓ ЌB9&ХЦB’М‘уi 4c/…œєѓšŽ ДrхJЫБСчЖdПљц›і­eЫ–§ілoЇvк!C8`ƒе2яИуމ'Z1ЪE+Гђ%jzQ$™UОŠšŽ1ГhY№ееtlKr-$UщsЭЖЎУ#”ІsKф65žuжYї§.Иргy'К_П~Іѓд 艕”r(k‡6t~wЮ1лКОЅр8кkфкkŠНІ›ЯН‘:v“љ”I^К#2TBЈМ6пK…пU #Рe(WЭaЖІšГc 9Гš›žјф‘ДŸh ОKrЊш(МынВЈЊИw§]miЪQЯ Mг Gѕ•ТнЛ7]Я 3љЇЭЙi™Лvэš3gЮЛяОkК—ј‘А†Зu=_зЛwяPЯ3Я<ѓШ#\~љхсїп%%вМQЩWЎ kУPq„HгUэmСwДCЊчЫxЮwп}ЗrхЪ#GŽЬž={нКuW\qХФ‰чЮ{ёХќёЧwп}ї‚ ЎМђЪcЧŽ…\R$mцЫXП>|xяоНv`cбЮВqуF Ц"љрƒжЏ_?yђф™3gКЏНюWYє‡e№,=ь‡e\ЎњћяПчЭ›7kжЌ>}њиз—_~yХŠЋV­ВБxЯ=їиШxёХЯ=ї\я—ІoƒœЃwьиБvэZkжЌyщЅ—&L˜АhбЂO?§єъЋЏОїо{Чп<–Ѕл Vmb$[ДqGвбIx!;qxЪrЂ--•‰”иhћ§їпЗoпўеW_:thј№сз]wнG}єњыЏПїо{Ж <ицNгѕ€)ЋФЯBб†' ^†ЕзжёAƒйСЈQЃ&MšdДБh\vйeчœsŽџfpЄ–е&­]ЙˆЁMЎ +@Н Žu"БXd…Чb`gщaНІГmиАaчŸў”)SljДЉЫІЩЭ›7льЕdЩ’gŸ}vлЖm?џќѓˆ#њіэ‹лИвНfG'йbm КьоН{пО}6(їьйcп§чŸО§іл!C†И/М§кkU=я‡e,юЁC‡.]Кє7оАуqуЦmкДiйВe]tбДiгlж|шЁ‡цЯŸПxёт1cЦИ^Гq$Ќс6GŽ=кlwЯŒ;жІъ'žxтљчŸпППm6<I‰4ЏDИч%ЛКšŽmЮФЊzdAЗЏзvRјwоБ‘1Ѓ“3ќiBI#§вK/]ИpЁижжНkіеFъ‡~шtњИд‚Щ$gщaл o›;зl ŽкК~а2†> ЁђіzзЛЇQ§Яvt=@H§S.e6ТlMЪdЧ@sfЪ4=ЎзєПѓѕQhК‚&ф`„Ѕ{M#Є(sHjЕзЬБЈ‡kвЃ5Zƒ(ЇЂsЭhF\Њє\г=зьqYГшчВвЌiџBЎY“Uе#яЁ+ tВќRœ„„ЂšХфЦ3Г KШYCXg˜C$дсь В3Х#љ<eHkŽg9)~_SBШ†Ќ|дћЌ—(TŒœ5„u&‹йtJ:c!u‹ј<Щ$gбЌЉYГЦY“ugвW:`/ЧjщŸ!_ žЄ9HРЄЌ !gч•ˆЪ$}•D˜щy 5щ(Œrzон Эš'KжtџPЇx&}ЅіrЌ–ўђЅ1Р сI˜ƒLЪњЇrv^‰ЈLвWI„™žЧP“ŽТ(чЄј/­ТBЈАў*Њy#ЬжTsv 4gVsЃY3‰fMЩIUВІQRЊ%щ= If•ЏЂІcЬ,Z|u5лRЂt=зŒб†šНLd/ы *FЮТ:“Х"ЁgW ˜)Щч!0рЈH&9‹tЅš’юа  ТњЋЈц0[SЭй1аœYЭMO|Ъ\Ra!TXлѓF˜­йžГc 9s{nД +е–zќSюєСlЬ1MzЪz?П­OЙ›ЂOЙ-шйЈД cБцt=< 'еУ#?№y 8*’IЮЂGюYH2ЗэUlв1f- ОКM:Ж%Й’*Н‡ž…$ГЪWQг1f- ОКšŽmIЎ…ЄJ КєtjmЈ…Е-š)ކDЄсBA28BХX<!ВR№QяГ^ЂP1rжж™,fг=(щŒI„д],~рѓpT$“œEяЁkжЌkж4JJЕ$ MЅš’nƒД зИ SxІєJe"ІЄхаtОЄТBЈА~ь‡Є6А х˜xэ€9XaЮ%@s2ZrWRЊ!iЏЉНІіšJJEшп•ЧяеЋWє†cВЏі]'ђУ §˜х{ІW "™HI8u$@ё`„сŒ‘QМШ^жTŒœ5„u&‹9DBЮЎ +@1S<’ЯC`РQ‘Lr–і№*Є6сP“=ІJže†ќш№2чД,BХX<!{ой&œ\†кXHP1rжж™,ц u8Л‚ЌХLёH>GE2ЩY4kjжЌqж4№<‚=}ЧTfцIHђ%ЮŠ"ЩWж§дVЁЏ0+ЬЙhNF‹чш—}ЕзЌkЏЩ~žТYйј|P ˜™џY”фK$ЮЂH2Si‰cfбВрЋKœи–фZHЊДзTЊ)щЙf’Ьm{›tŒ™EЫ‚Џn“ŽmIЎ…ЄJГІRMIwшPa§U4š0[гhВc 9Гб4Zа3‘hA—LT5Ё kжЬGЅY‹iждЌ)rNЈЌi:у”ОнЁGюЊШ^жTŒœ5„u&‹9DBЮЎ +@1S<’ЯC`РQ‘Lr=rЯB’YхЋЈщ3‹–_]MЧЖ$зBRЅ= ‰tЩIU КfЭ$š5%$UMШš†ЋїžЩОэ5ЕзlAЏЉ=‰tЩIUs zЁj^"?K|œќYNSЊyбš%е_#{&9Ўц0[SЭй1аœYЭfЭL$š5%$Uš55k& щСYг()е’44•jJкkf!б^S2ARЅНІіš CДзTRj2ih*е”44•jJњ 1кPГ—‰ьe= AХШYCXg˜C$дсь В3Х#љ<Щ$gб'ВdюЊи aЬ,Z|u;!lKr-$UZа•jJšJ5%§}ЭЈАў*ЮлaЖцМЭ™чэFЗAК Њя68EC3Чуš!А&‡&ѕˆgJЏT&bJ YHWсKJ ,„ ыЧ~HjЋPމз˜ƒц\4'ЃХsєzTX?іCRX…rLМvРЌ0ч 9-žЃYSГf]Гf›ўїЉнбъŸЪт>5ѓПO5JJЕ$НQ™…$Г­ЂнԘYД,јъкMlK‰Э‰уhЏЉНІіšкkjЏYЄзќ'š(˜8}|IENDЎB`‚PK“l[F settings.xmlэ™нoк0РпїW МгэК5*L”­kЗnЋэ>оLr€UЧй)§ыч$ЄЂiВІWг4^€иўнq>п‡9~wАж„ЄШћVwЏcЕ€{шS>я[W“гі[ынре1ЮfдЧG/ €ЋЖЅєйвЫЙtВсО ю ‘T:œ х9Я—9›ГTXіф–Q~гЗJ…ŽmЧqМяяЁ˜лнЃЃ#;ЭЇzШgt^WT6{S"о JdЪЄТzЮ}ЗZk%7LгГЙђŸ?8^ ШокTAиІЕ~œЈжЗДHgI!ОЗšUЖюсšk*щ”СP™`hхƒjъAЪ•5шл!Я_РL™!ЇОZ”ЁпМйп™~tО(еМЇ_uёэ€„mЪ}ИП( тђ=JзhяЋ: C|юД”JhА‰;tŸЅi-ш9!к O)њpЩ #~З†ћ"!Q\ЂЄJ{џНф!љgљ`;ђ z‡\ц†ŒЊ/шCбњ ;ј7E=Sє‚іЙš<Ÿ›њр=E—вЧ„Я+ЬSћ|>„чњ6ГrьИ*ЂьШm6vчдT ƒСПƒ‰І4ъб єšАЈHMэvЖЕ™CZџH?мю.0ў(h1jOn ”ˆ œ\ђp3YT ЇQНюбJу}EBIћЮ‘ЧШи”ˆъќ]?ПўїА*Kœш:ццR@RTyлŒ0YсnuФќЉўђљю\‡џ•)єvg№)rB!CQ@3LNPЗwИпыН>l`_ XхŒH­z№1Цg@|н–т.”4шчђ[Єt+ю*˜"“.3n#B\NТ Ž‰TPмш&NV>—ы~Ԙ„1HНп•еЗŽn[F "ОДпяFSŸ.ЉЌTП!xЙђлКN†оRщЎИЗШщМ\1АnFЫ'HPѕoВ‘ Щ?чкс‰?жс9[™HKd зйЪ7>b(MœŸsљ~} ф.ˆЈоПD|С‡’~qOEЄЄ—jBа0 йъJ‚xOi>ZŽДˆЇ}~„A(@&гx•vЉ+дфд‚ŠŠЭа”H8<8Ёœˆ•eзF}е_ЪырŒЋа' N…ЎG!™ўмМ]‡‘Тa^dџ!˜‚ЊKіЪ,§W'ИЪб†rа‹”1CЦt=™xћ'œŽї€5/ФpЁaЖšМ ќ&;ЪеWq[^57W<™џ…ЎСt[eІ4ZJЎБ wпЛ\T–ЎіЃПЮьЊ?ПPKёCgС–PK“l[F content.xmlэYпoл6~п_axРоhYNВ&^’bУаЇжnи[A‹”Ь–"’Вџ~GRЂ)ErеФл‚Ё/NL~wїё~ё˜мО>”|ЖЃJ3)юцщb9ŸQ‘IТDq7џуУt=}џн­Ьs–б5‘Y]RaP&…Ÿ3zэwяцЕk‰5гkKЊз&[ЫŠŠVjЃзЮ–_бцOwрXкаƒ™*lБYМ™nйciЂ№~ЊАХ‚Scё\N>hŽr ^/+lXХ3ёљnО5ІZ'Щ~П_ь/RIzss“Ин@8 ИЊVмЁH–PN­1Є‹4iБ%5x*?‹)‰КмP5й5ирGQ­еукФœІ(–щф硘œ]ЛbФЭйЋЩyцРнTЙ гSх‚ФВ%6л‘ј^'я`г}М{{Ь+UNЕeБWeŠU“щбБМ”2PЕОинеry™јяzОWЬPСГ“№ ѓ,x\–CN\šбMљPDжzD`•јэжdTѕ_яоОЯЖДФG0ћ21Ё GЯ(„б“^%ŠVR™р˜|zѓ…h­З­)љxыАЛ-ДP„ BЮEmŠэнпщ­Їѓс&q ИŸžH—‰Х„’„p›П*Т§”ЫZпМ3шЁЂŠй-ЬиКЃ!Ю`.Ÿ ВЙг" FЯ(oЋ?iP”Јд єВZGвн{C•‡iъlЂK’ї5іŠ>гњТ ХіУя‰нCік„‹ЁБ Ћљ};ј^ “АУŒ€rœQDhЦѕ§­яёayцП[оwѓ_щ'ќg={T4сV2ўp7џWRџaќТ|жQiБЈ mBя™жѓфДйЗ ю)егІ{ИЩцcDХL}|‡sIџj?ŒjзO˜~а†–ЯБy:=W8žOJIFœЙйЬљgŸЧЙ=Цžc2–пЭ:Ў„+›eШщ ‰я>;'ЪdŒ5є]?„ „зЅ˜З’ё"Њ ŽЉ2ŒъY.зEёgДЁPв аšn56№=#vzX-вє:+џˆЮ875ЦMЩ}ЌФЌќ–]мRVlЁБ,WW?‚ёг„kM‘Ќ +1GБtŽЙІ_C|uFт—зЏў-т{М],aHІ UИ ШKќПОЗ{ЏђПpLвоЃУљЧ aКтиjVuPl‡,xš RPЪ2›щЌ3:–У”‡6Uae_ю j[LŽknњ9BCbЏ„9+вВVіЉ™ГCЋF!ŠУ“ДuЛ й^сЪEЦ^VB"ћН•"LбЬяpЃ‚.щ_‹Т> —7, ЋMџщ­‚72хьhпяэьA`ЪhхŒ~@[ŸjmXўа$Uш‚р4\уmЏфоАоn>v7ИпщjГ%VˆгмІtVЧнцез„}ЄЪ^lиm KEьГ4оЗ<˜”Щшхжll$y8Ю‚№ЧDo)5їЗОѓиIЛцоwškАmJ† w 4v48Юo цLФё†rнУиЌhъ‚XQmчг€j)иЇЄŸсќїXY—ˆА<ЇЉ6С–‹%<ЬмљЧyЗ нgЃЬЇЗoТЭRœїЖЙG“1<&gn Ž ЅБнЌ*OеЖ|tТ1h&ƒЋnРhјЙ?Щ4P|ѕPx•ЄЫеe "О:}=•mЯ0мvVэша#њ†шбєбQЦЋуѓѓš"ѓPСК6Prф}ѓŽк<ПЎАіјЋŽдйzVqu/ЄЁВТkгуШ:$К„‚ІэфщSOЈћŸк%ѕ—ш?"s*q–QЁ„Œ8sŠќSяWЦhрK)žіQџ­†њФЗФ8&Ц Ќ$ј|ŠЋЮMƒ‰AуeЇЯt‹—c•јtаъ r3Т3B2аicх—зWЏ–џ­sZŒWZНж‰'вшЏG9щ бЩШ[яџPK0шgрЬЎPK“l[Fmeta.xmlЕTЭoл ПяЏАXЏ6иљh‚WkЋЉ‡L=4v‹М$t,Œ“єПЦvцJ™ЖUЊoМїћтžнœі*:€-Ѕбs”&E ЙRoчшyљ5ž ›ќгЬl6’†W{а.оƒc‘Їъ’6­9ЊЌІ†•ВЄšэЁЄŽSS€ю(ДІСЈЉœ”д?чhч\A1>ЩqЛХщt:ХЁлA?уŠЪЊ€ƒ‚кЁФi’т['ќзP5ЖЩs6ЊсMш`—2ФЭКCo­ъ⧆ЉўпcQЫ?KsяOњєŸ8SpgMёк;fСџ}вјЭ3Х—~‰љ/PK2є \PPK“l[F styles.xmlэ\яŽл6џ~Oa(ИЂN–dЏwзюЎƒЛ+Š+AкЛЏWЂeЖ”(Pдz7яyњTї$7Є$Zџ-лкм6 ’ˆg~ѓуpш5uїі) “GЬcТТ{У™кЦ‡.ѓHшпџўщ{ѓжxЛўЫлlˆ‹Ws“‡ТŒХ3Хё‡ё*эМ7ЎŠIМ Q€у•pW,Тa>hU”^ЉЉвЅЌяp%\-№“ш;XЪ–ЦЂ‡ў3+стhЃ]пСR0-пАОƒŸbjn˜щВ B‚TЌxЂ$ќѕои ­,kЗлMwѓ)уОх,—KKѕjƒ]-%œ*)ЯЕ0ХrВиrІŽ•ЫX ОіIйЂIa<`о$P-ЊЧ1ˆ€Л’—§Ч”јѕшїfзЃпГЛEМ7Я”p™*sЏ?Uц^ql€ФЖ%ОЗж{шTНЗчњЮ%eKPЙœDНнLЅ‹уcкT9 ]ьЪм™m_YщsAzз)ОуD`^w;Х]D]8 š@9Ч ?JЪчв\:нЊyaq1.Д!›ўЩа™щЅКm_ЊВ7ѕЙч5Š‚9s –-,ѓ‘рн›R.ыЦi)Ёbўъри–”бKрн'[юыэ`У’аK—] ~Š0'В Q5lUвPd e'ЈЬі‚†вRуЙhТюЇO–ь3х6‰.гRи§fЦ:пъ6 ЖЙ rБщa—ЦыЛ4EщцIњ,Л7ОУП џ$“QŒ‚’‹„>п_ЁˆХпdвcRR)eM‡р%А<о‘86ЌюiпHГ ЄюЉ+rНЇ/JDDИ†'ŠCLћ;ˆбƒђіŽЉŸcƒsц. э ŽѓтŒxjКЩїˆвфўкn[]v0­6~gэie—ћтс JhVяхš3[U.1]LЉ‘‹Gˆ#ŸЃhkFВ ŠФД ЄA ‹LФ…В^„ѕЖpƒ=prYж*C[јОa+ŠB?A>є†T5И9ћ>М3Њ*LHи(Ќ1D хŠr™ЯлМ'г˜wќѓC]ЏЌ(~Њ№[Ћдн[RUЊЛ~ј Тг€ћњ.-ЈВКЊŒ˜ЖQšdO M ьУ8јDФ€ЛšЈAЇжс&œУ1рЙi*ЧБ?кЙŒB™ЫDр%вkЦ“ѓ˜vѓ'гк9уЋ‰€ѕBЄМ9›”Зc!х0Ее€ЄМНL^ˆiЗg3mљ'гкqњ5)—=HщЩГB3№Ž}ѕ<є|РЙ/Šm?бgŒtZЮ{7zyцМИg“BO‚hПИќ=нЗй—ѓэD‹ч'Xќ З@чъ“_фдн’ЕP`FСЉчkЧYŒХН“>Txy|N9ћ †Я‰6uŠ]L;œюJ-ЇTЉЏМ…ѕ`ырдiШv5˜3duк]QэєэU~ОЂ‹/S4:}ŠЦNРfэ?'УqevTХ|ќQхri5ГЯІ•ѓjДл xvЪqх5\|!Ў8gseіЧхЪQЧПЁSаЈi5;›VѓЁ?ЃЋЦ=§Тк†PjЪ/Š"W`.…л/tœtў  Vy}ˆГ‚˜zyWTюisr(gŠsAђ8јн/хЪ8ѓ4уєPFћ(sњ);˜%yŠGj‚žфЛ< 6|ќ>кU<`*М<^ІУЋСгсP@œOљмyT)ёjШ”x5XJМ:3%..А2нбeq•сЫœxЮqМ•с№_0Њ§ АL{ЪРF•iCfкХ`™vqfІќ ЉЏT3.л^_hё9КŒ{=ђтѓ’ВюЩ_ЊKжН2ы^–uЏлГn:Ўяв‹fњF[ћнО}S§Žgщ­{QтƒС! Б^-Rвжe}LжqыЏ№ЙД­~еnлUюлТ€ЎлjU1љ Г8N$j“ы+„ї9k3dвЇпыЬ5ДнюЬћѕЯЂ„є#hіF_?,_aЎYЃхŽGw?Ж~ЋXЈћ•‰ћKЈћ ЧнЬЭz"Фѕ+KЬ2ы;8˜š'{я "€ЛnЎO 'Ё‡9%!ЮebF‰з"В#ž|…Jk‘ШЏ&Uџпsq‡‰ПrнPяXpf'ЁSVНi œjœBіЋO§/Œфыc† LGвQЊЄbЦ,сђFё†<хЪ9Ž0вЛB~9N›нxS п+Н7\ˆygІ*f‹kЙОZ˜s^03D“ ЭУq\}iўвЎiU.Šg’м vЭМ#ЗШЧ&EЯ,%ŸоGc45\'<†f)’nlР’„‰Nvђ=!рЃ0O~Š›тaЖ-А/OJmЦ Т•˜ЪZh›ХЩžоШ+ъЊqz(оШіr#ЯЄЫ­щN'•фїм­v‹2S^пJСЂЫцXЕ0ѕяЌ_x/"vВчqO’o6НZFр­Lј]Ѓ€@„МєНYідvnѓQАЩЫCJшхIўkЫп‚Tч>ЎёЄцщј‰4RМ`ѕќЋ•cОоєgЮдЖЬ9е‘ƒ=[No\]бAj3хл˜PЧлl ‡2“qВ–|GDдwІK{бLт†Ў4ЎЮєццЖ1ЖКЇhˆ2?‹Њ€eк?AЧpР`'(ЖэПvЅэт„ GОH+ždoO‹'ьсьBУgЬ™ЉŽEёј’Хя,б[­;|ж XЋаћ~ж(5u8‹‹ЈЁ0HYпЩвkeџЦ[ŒSщѕлЗoяЌjcжUТP["——И$ŽР†Z‘˜bЃgџ(}Щіd_;љ|…Жš ЙЊш&X5Aћ){IYВГВyЕьЫВOt$и“ЏS9A-ŠЄЯпд€(ЭTjRЌ­Ь.ПТоzгJ“$UлY˜іЬœнkл6елЮЌ‚ыПMrƒСzл^Љ?кш&њ”эћbœšXEAѕ!йzЙ, Іm_„{вхѓЯ‹ЭЯџ Шг{XІнЌЪ•„Щ:ЏѕВЧЦ —аё8YЭYбj~…ъњџPKPЃzд ‚UPK“l[F manifest.rdfЭ“Эnƒ0„я<…eЮи@/r(ЪЙjŸР5†X/ђšоОŽ“VQЄЊъŸдуЎF3пŽД›эaШ‹ВЈСT4c)%ЪHhЕщ+:Л.ЙЅл:киЖ+šёjƒЅŸ*Кwn*9_–…-7 lЯГЂ(xšѓ‹аЦоси‰э{ћ*6ыХ*tыГбд>Є‹л‰’QGCŽ4šЄйъ˜ћhKd§Н^Ÿ˜.о€ЅX/š+пр<ДЕ?ЏеCёОM†wPї@ЎсН3-tТЄф5\Ыд{y,ouJJLO;jŽ”эЎ„O4Ю“тГ)ŽwЄИ`FPS~ sн Щ:Я;Ш VSzАШгљ€ЭУA‰?ƒsLц~јУ ЊUOГ9о"n,љAKeЌеYй’ѓя;јз_œ$ШтЄНE˜ШWъЧWАўPKBйdŽ EPK“l[F…l9Š..mimetypePK“l[FМuшYЦЦTThumbnails/thumbnail.pngPK“l[FёCgС– Psettings.xmlPK“l[F0шgрЬЎ Kcontent.xmlPK“l[F2є \PP%meta.xmlPK“l[FPЃzд ‚U ‡'styles.xmlPK“l[FДїhвƒ “1manifest.rdfPK“l[Fв2Configurations2/images/Bitmaps/PK“l[F3Configurations2/toolpanel/PK“l[FG3Configurations2/progressbar/PK“l[F'3Configurations2/accelerator/current.xmlPK“l[Fи3Configurations2/floater/PK“l[F4Configurations2/statusbar/PK“l[FF4Configurations2/toolbar/PK“l[F|4Configurations2/popupmenu/PK“l[FД4Configurations2/menubar/PK“l[FBйdŽ Eъ4META-INF/manifest.xmlPKpM6Spreadsheet-Read-0.91/files/test_m.csv0000644000031300001440000000005010614362642017131 0ustar00merijnusersA1;B1;;D1 A2;B2;; A3;;"C3";D3 A4;B4;C4; Spreadsheet-Read-0.91/t/0000755000031300001440000000000014663305531014271 5ustar00merijnusersSpreadsheet-Read-0.91/t/212_csv.t0000644000031300001440000000244612543027252015637 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 4; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; my $csv; ok ($csv = ReadData ("files/macosx.csv"), "Read/Parse csv file"); #use DP; DDumper $csv; is ($csv->[1]{maxrow}, 16, "Last row"); is ($csv->[1]{maxcol}, 15, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "", "Last field"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); __END__ ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); Spreadsheet-Read-0.91/t/630_xlsx.t0000644000031300001440000001524514522520475016053 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 121; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.xlsx"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xlsx"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xlsx" or die "files/test.xlsx: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xlsx", "Read/Parse xlsx file" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); my $xvsn = $xls->[0]{version}; $xvsn =~ s/_[0-9]+$//; # remove beta part cmp_ok ($xvsn, ">=", 0.07, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # Tests for empty thingies ok ($xls = ReadData ("files/values.xlsx"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xlsx", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.xlsx has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } { sub chk_test { my ($msg, $xls) = @_; is (ref $xls, "ARRAY", "Return type for $msg"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type XLSX"); is ($xls->[0]{sheets}, 2, "Sheet count"); } # chk_test my $data = $content; open my $fh, "<", "files/test.xlsx"; chk_test ( " FH parser", ReadData ( $fh, parser => "xlsx")); close $fh; SKIP: { skip "No support for data ref", 1; ok (0) }; SKIP: { skip "No support for data string", 1; ok (0) }; } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/33_misc.t0000644000031300001440000000275313231321026015710 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 6; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xls", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xls", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[1]{cell}[1], undef, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc_ws.xls", # No cells generated, but we strip whitespace. We don't want any warning cells => 0, strip => 3, debug => 5, ); } ok ($xls, "Open with options, let's see if we get any warnings"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/605_perc.t0000644000031300001440000000226112730716541016002 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; my $xls; ok ($xls = ReadData ("files/perc.xlsx", attr => 1), "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { my @type = map { $ss->{attr}[$_][$row]{type} } 0 .. 3; is ($type[1], "numeric", "Type A$row numeric"); foreach my $col (2, 3) { # Allow numeric for percentage in main test my $cell = ("A".."C")[$col - 1].$row; my $expect = $type[$col] eq "numeric" ? "numeric" : "percentage"; is ($type[$col], $expect, "Type B$row percentage"); } SKIP: { $ss->{B18} =~ m/[.]/ and skip "$xls->[0]{parser} $xls->[0]{version} has format problems", 1; my $i = int $ss->{"A$row"}; # Allow edge case. rounding .5 will be different in -Duselongdouble perl my $f = $ss->{"B$row"}; $row == 11 && $f eq "1%" and $i = 1; is ($f, "$i%", "Formatted values for row $row\n"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/702_fmt.t0000644000031300001440000000361414374661056015646 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 30; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("gnumeric") or plan skip_all => "No Gnumeric parser found"; my $book; ok ($book = ReadData ("files/attr.gnumeric", attr => 1), "Gnumeric attributes testcase"); { ok (my $fmt = $book->[$book->[0]{sheet}{Format}], "have 'Format' sheet"); is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, undef, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], undef, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, undef, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 1, "Unlocked cell is hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, undef, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, "General", "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String # There's no point in testing the formatted values here, because Gnumeric # gives them to us unformatted only. } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/625_perc.t0000644000031300001440000000226112643415517016006 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/perc.xlsx", attr => 1), "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); ok ($ss->{attr}[2][$row]{type} eq "numeric" || $ss->{attr}[2][$row]{type} eq "percentage", "Type B$row percentage"); is ($ss->{attr}[3][$row]{type}, "percentage", "Type C$row percentage"); SKIP: { $ss->{B18} =~ m/[.]/ and skip "$xls->[0]{parser} $xls->[0]{version} has format problems", 1; my $i = int $ss->{"A$row"}; # Allow edge case. rounding .5 will be different in -Duselongdouble perl my $f = $ss->{"B$row"}; $row == 11 && $f eq "1%" and $i = 1; is ($f, "$i%", "Formatted values for row $row\n"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/36_xls.t0000644000031300001440000001516014562636556015613 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser; if ($parser = Spreadsheet::Read::parses ("xls")) { plan tests => 191; Test::NoWarnings->import; } else { plan skip_all => "No M\$-Excel parser found"; } sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "xls", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.xls"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.xls"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xls" or die "files/test.xls: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xls", "Read/Parse xls file" ], # [ $content, "Parse xls data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadDataStream ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xls", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); cmp_ok ($xls->[0]{version}, ">=", 0.26, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # This files is generated under Mac OS/X Tiger ok (1, "XLS File fom Mac OS X"); ok ($xls = ReadDataStream ("files/macosx.xls", clip => 0), "Read/Parse Mac OS X xls file"); ok (1, "Base values"); is ($xls->[0]{sheets}, 3, "Sheet count"); is ($xls->[0]{sheet}{Sheet3}, 3, "Sheet labels"); is ($xls->[1]{maxrow}, 25, "MaxRow"); is ($xls->[1]{maxcol}, 3, "MaxCol"); is ($xls->[2]{label}, "Sheet2", "Sheet label"); is ($xls->[2]{maxrow}, 0, "Empty sheet maxrow"); is ($xls->[2]{maxcol}, 0, "Empty sheet maxcol"); ok (1, "Content"); is ($#{$xls->[1]{cell}[3]}, $xls->[1]{maxrow}, "cell structure"); ok (defined $xls->[1]{cell}[$xls->[1]{maxcol}][$xls->[1]{maxrow}], "last cell"); foreach my $x (1 .. 17) { my $cell = cr2cell (1, $x); is ($xls->[1]{$cell}, $x, "Cell $cell"); is ($xls->[1]{cell}[1][$x], $x, "Cell 1, $x"); } foreach my $x (1 .. 25) { my $cell = cr2cell (3, $x); is ($xls->[1]{$cell}, $x, "Cell $cell"); is ($xls->[1]{cell}[3][$x], $x, "Cell 3, $x"); } foreach my $cell (qw( A18 B1 B6 B20 C26 D14 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Cell $cell"); is ($xls->[1]{$cell}, undef, "Cell $c, $r"); } eval { eval "use ".$parser."::FmtDefault"; my ($pm) = map { $INC{$_} } grep m{FmtDefault.pm$}i => keys %INC; if (open my $ph, "<", $pm) { my $l; $l = <$ph> for 1 .. 68; close $ph; if ($l =~ m/'C\*'/) { print STDERR "\n", "# If the next tests give warnings like\n", "# Character in 'C' format wrapped in pack at\n", "# $pm line 68\n", "# Change C* to U* in line 68\n", "# patch -p0 ; s/\bPM\b/$pm/ for @patch; open $ph, ">", "SPE68.diff" or die "SPE68.diff: $!\n"; print $ph @patch; close $ph; } } }; # Tests for empty thingies ok ($xls = ReadDataStream ("files/values.xls"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); # Test extended attributes (active & hidden) ok ($xls = Spreadsheet::Read->new ("files/Active2.xls", attr => 1), "Active sheet"); is ($xls->sheets, 3, "Book has 3 sheets"); SKIP: { my $v = $xls->[0]{version}; $v < 0.61 and skip "$xls->[0]{parser}-$v does not support the active flag", 3; is ($xls->sheet (1)->{active}, 0, "Sheet 1 is not active"); is ($xls->[2]{active}, 1, "Sheet 2 is active"); is ($xls->sheet (3)->active, 0, "Sheet 3 is not active"); is ($xls->sheet (1)->{hidden}, 0, "Sheet 1 is not hidden"); is ($xls->[2]{hidden}, 0, "Sheet 2 is not hidden"); is ($xls->sheet (3)->hidden, 0, "Sheet 3 is not hidden"); } is ($xls->sheet (1)->attr ("A1")->{type}, "text", "Attr through method A1"); is ($xls->sheet (1)->attr (2, 2)->{type}, "text", "Attr through method B2"); ok ($xls = Spreadsheet::Read->new ("files/attr.xls", attr => 1), "Attributes OO"); is ($xls->[1]{attr}[3][3]{fgcolor}, "#008000", "C3 Forground color direct"); is ($xls->sheet (1)->attr (3, 3)->{fgcolor}, "#008000", "C3 Forground color OO rc hash"); is ($xls->sheet (1)->attr ("C3")->{fgcolor}, "#008000", "C3 Forground color OO cell hash"); is ($xls->sheet (1)->attr (3, 3)->fgcolor, "#008000", "C3 Forground color OO rc method"); is ($xls->sheet (1)->attr ("C3")->fgcolor, "#008000", "C3 Forground color OO cell method"); is ($xls->[1]{attr}[3][3]{bogus_attribute}, undef, "C3 bogus attribute direct"); is ($xls->sheet (1)->attr ("C3")->{bogus_attr}, undef, "C3 bogus attribute OO hash"); is ($xls->sheet (1)->attr ("C3")->bogus_attr, undef, "C3 bogus attribute OO method"); __END__ --- PM 2005-09-15 14:16:36.163623616 +0200 +++ PM 2005-09-15 14:11:56.289171000 +0200 @@ -65,7 +65,7 @@ sub new($;%) { sub TextFmt($$;$) { my($oThis, $sTxt, $sCode) =@_; return $sTxt if((! defined($sCode)) || ($sCode eq '_native_')); - return pack('C*', unpack('n*', $sTxt)); + return pack('U*', unpack('n*', $sTxt)); } #------------------------------------------------------------------------------ # FmtStringDef (for Spreadsheet::ParseExcel::FmtDefault) Spreadsheet-Read-0.91/t/412_fmt.t0000644000031300001440000000517313733616250015640 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 40; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; my $ods; ok ($ods = ReadData ("files/attr.ods", attr => 1), "Excel Attributes testcase"); my $parser = $ods->[0]{parser}; SKIP: { ok (my $fmt = $ods->[$ods->[0]{sheet}{Format}], "format"); $fmt->{attr}[2][2]{merged} or skip "$parser $ods->[0]{version} does not reliably support attributes yet", 38; # The return value for the invisible part of merged cells differs for # the available parsers my $mcrv = $parser =~ m/::ParseODS/ ? undef : ""; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, $mcrv, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], $mcrv, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 4, 7 .. 12) { # 1 .. 12 when date/time fixed is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } foreach my $r (5, 6) { local $TODO = "Date/time value representation is not yet unified"; is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11) { # 2 .. 12 when date/time fixed isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } foreach my $r (12) { local $TODO = "Date/time value representation is not yet unified"; isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/999_fail.t0000644000031300001440000000054214663305445016010 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Test::More"; } my $tests = 2; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; is (Spreadsheet::Read::parses ("xlsx"), 0, "Invalid module name for xlsx"); like ($@, qr/^Test::More is not supported/, "Error reason"); done_testing ($tests); Spreadsheet-Read-0.91/t/203_csv.t0000644000031300001440000000720513144611370015633 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 125; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "csv", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataStream ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_m.csv", sep => ";"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } my $data = "a,b,c\n1,2,3\n"; ok ($csv = ReadData ( $data, parser => "csv"), "Parse from plain string"); is ($csv->[1]{C2}, 3, "C2 = 3"); ok ($csv = ReadData (\$data, parser => "csv"), "Parse from ref to plain string"); is ($csv->[1]{C2}, 3, "C2 = 3"); open my $rh, "<", \$data; ok ($csv = ReadData ($rh, parser => "csv"), "Parse from data-ref"); is ($csv->[1]{C2}, 3, "C2 = 3"); if (open my $dh, ">", $data) { print $dh $data; close $dh; ok ($csv = ReadData ($data, parser => "csv"), "Parse from file with bad name"); is ($csv->[1]{C2}, 3, "C2 = 3"); unlink $data; } else { ok (1, "Using a badly named file not allowed: GOOD!"); ok (1, "Using a badly named file not allowed: GOOD!"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/223_csv.t0000644000031300001440000000577013016541271015642 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 117; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "csv", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataStream ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_m.csv", sep => ";"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/632_fmt.t0000644000031300001440000000127614520406704015640 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 3; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); my $parser = $xls->[0]{parser}; ok (my $fmt = $xls->[$xls->[0]{sheet}{Format}], "format"); is ($fmt->{attr}[2][2]{merged}, undef, "$xls->[0]{parser} does not support attributes"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/620_xlsx.t0000644000031300001440000001423013234273527016045 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 116; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.xlsx"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xlsx"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xlsx" or die "files/test.xlsx: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xlsx", "Read/Parse xlsx file" ], # [ $content, "Parse xlsx data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); cmp_ok ($xls->[0]{version}, ">=", 0.07, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # Tests for empty thingies ok ($xls = ReadData ("files/values.xlsx"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xlsx", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.xlsx has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/50_sc.t0000644000031300001440000000305713746002117015367 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 48; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("sc") or plan skip_all => "No SquirrelCalc parser found"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.sc"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.sc"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $sc, "<", "files/test.sc" or die "files/test.sc: $!\n"; binmode $sc; $content = <$sc>; close $sc; isnt ($content, undef, "Content is defined"); isnt ($content, "", "Content is filled"); } foreach my $txt ("files/test.sc", $content) { foreach my $clip (0, 2) { my $sc; ok ($sc = ReadData ($txt, clip => $clip, strip => 2), "Read/Parse sc file ".($clip?"clipped":"unclipped")); ok (1, "Base values"); is (ref $sc, "ARRAY", "Return type"); is ($sc->[0]{type}, "sc", "Spreadsheet type"); is ($sc->[0]{sheets}, 1, "Sheet count"); is (ref $sc->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$sc->[0]{sheet}}, 1, "Sheet list count"); is ($sc->[0]{version}, $Spreadsheet::Read::VERSION, "Parser version"); is ($sc->[1]{maxcol}, 10 - $clip, "Columns"); is ($sc->[1]{maxrow}, 28 - $clip, "Rows"); is ($sc->[1]{cell}[1][22], " Workspace", "Just checking one cell"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/224_csv.t0000644000031300001440000000602213016541274015635 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 118; use Test::More; require Test::NoWarnings; use Spreadsheet::Read qw( ReadData cell2cr row cellrow ); my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; sub ReadDataCSV { ReadData (@_, parser => "csv"); } # ReadDataCSV { my $ref; $ref = ReadDataCSV ("files/empty.txt"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataCSV ("files/test.txt"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } my @row = ("A3", "", "C3", "D3", (undef) x 15); is_deeply ([ row ($csv->[1], 3) ], \@row, "Formatted row 3"); is_deeply ([ cellrow ($csv->[1], 3) ], \@row, "Unformatted row 3"); ok ($csv = ReadDataCSV ("files/test_m.txt"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataCSV ("files/test_x.txt", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/420_sxc.t0000644000031300001440000000756613701337130015646 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 301; use Test::More; require Test::NoWarnings; BEGIN { $ENV{SPREADSHEET_READ_SXC} = "Spreadsheet::ReadSXC"; } use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("sxc") or plan skip_all => "No SXC parser found"; my $pv = $parser->VERSION; $pv >= "0.25" and plan skip_all => "Use Spreadsheet::ParseODS instead please"; diag ("# Parser: $parser-$pv"); my $content; { local $/; open my $xml, "<", "files/content.xml" or die "files/content.xml: $!\n"; binmode $xml; $content = <$xml>; close $xml; } { my $ref; $ref = ReadData ("no_such_file.sxc"); ok (!defined $ref, "Nonexistent file"); # Too noisy #eval { $ref = ReadData ("files/empty.sxc") }; #ok (!defined $ref, "Empty file"); #like ($@, qr/too short/); } my @base = ( [ "files/test.sxc", "Read/Parse sxc file" ], [ "files/content.xml", "Read/Parse xml file" ], [ $content, "Parse xml data" ], ); if ($parser->VERSION > 0.23) { open my $fh, "<", "files/test.sxc" or die "files/test.sxc: $!\n"; push @base => [ $fh, "Parse sxc file handle" ]; $tests += 100; } foreach my $base (@base) { my ($txt, $msg) = @$base; my $sxc; my @options = ref $txt ? (parser => "sxc") : (); ok ($sxc = ReadData ($txt, @options), $msg); ok (1, "Base values"); is (ref $sxc, "ARRAY", "Return type"); is ($sxc->[0]{type}, "sxc", "Spreadsheet type"); is ($sxc->[0]{sheets}, 2, "Sheet count"); is (ref $sxc->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$sxc->[0]{sheet}}, 2, "Sheet list count"); # This should match the version required in Makefile.PL's PREREQ_PM cmp_ok ($sxc->[0]{version}, ">=", 0.12, "Parser version"); ok (1, "Sheet 1"); # Simple sheet with cells filled with the cell label: # -- -- -- -- # A1 B1 D1 # A2 B2 # A3 C3 D3 # A4 B4 C4 ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Nonexistent fields"); foreach my $cell (qw( A9 X6 B17 AB4 BE33 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Sheet 2"); # Sheet with merged cells and notes/annotations # x x x # x x # x x x ok (1, "Defined fields"); foreach my $cell (qw( A1 C1 E1 B2 D2 A3 C3 E3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], "x", "Unformatted cell $cell"); is ($sxc->[2]{$cell}, "x", "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B1 D1 A2 C2 E2 B3 D3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[2]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Nonexistent fields"); foreach my $cell (qw( A9 X6 B17 AB4 BE33 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[2]{$cell}, undef, "Formatted cell $cell"); } # Sheet order ok (exists $sxc->[0]{sheet}{Sheet1}, "Sheet labels in metadata"); my @sheets = map { $sxc->[$_]{label} } 1 .. $sxc->[0]{sheets}; SKIP: { $sxc->[0]{version} < 0.20 and skip "Not supported", 1; is ("@sheets", "@{['Sheet1','Second Sheet']}", "Sheet order"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/611_clr.t0000644000031300001440000000447314520221624015625 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 266; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $xls->[$xls->[0]{sheet}{Colours}], "colors"); defined $clr->{attr}[2][2]{fgcolor} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support colors yet", 255; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } } ok ($xls = Spreadsheet::Read->new ("files/attr.xlsx", attr => 1), "Attributes OO"); is ($xls->[1]{attr}[3][3]{fgcolor}, "#008000", "C3 Forground color direct"); is ($xls->sheet (1)->attr (3, 3)->{fgcolor}, "#008000", "C3 Forground color OO rc hash"); is ($xls->sheet (1)->attr ("C3")->{fgcolor}, "#008000", "C3 Forground color OO cell hash"); is ($xls->sheet (1)->attr (3, 3)->fgcolor, "#008000", "C3 Forground color OO rc method"); is ($xls->sheet (1)->attr ("C3")->fgcolor, "#008000", "C3 Forground color OO cell method"); is ($xls->[1]{attr}[3][3]{bogus_attribute}, undef, "C3 bogus attribute direct"); is ($xls->sheet (1)->attr ("C3")->{bogus_attr}, undef, "C3 bogus attribute OO hash"); is ($xls->sheet (1)->attr ("C3")->bogus_attr, undef, "C3 bogus attribute OO method"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/617_merged.t0000644000031300001440000000536113701561237016322 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; $parser eq "Spreadsheet::XLSX" and plan skip_all => "No merged cell support in $parser"; ok (my $ss = ReadData ("files/merged.xlsx", attr => 1)->[1], "Read merged xlsx"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, " merged B1"); is ($ss->{attr}[3][1]{merged}, 1, " merged C1"); is ($ss->{attr}[1][2]{merged}, 1, " merged A2"); is ($ss->{attr}[2][2]{merged}, 1, " merged B2"); is ($ss->{attr}[3][2]{merged}, 1, " merged C2"); is ($ss->{attr}[1][3]{merged}, 1, " merged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); ok ($ss = Spreadsheet::Read->new ("files/merged.xlsx", attr => 1, merge => 1)->sheet (1), "Read merged xlsx"); is ($ss->attr (1, 1)->merged, 0, "unmerged A1"); is ($ss->attr (2, 1)->merged, "B1", " merged B1"); is ($ss->attr (3, 1)->merged, "B1", " merged C1"); is ($ss->attr (1, 2)->merged, "A2", " merged A2"); is ($ss->attr (2, 2)->merged, "B1", " merged B2"); is ($ss->attr (3, 2)->merged, "B1", " merged C2"); is ($ss->attr (1, 3)->merged, "A2", " merged A3"); is ($ss->attr (2, 3)->merged, 0, "unmerged B3"); is ($ss->attr (3, 3)->merged, 0, "unmerged C3"); is ($ss->attr ("A1")->merged, 0, "unmerged A1"); is ($ss->attr ("B1")->merged, "B1", " merged B1"); is ($ss->attr ("C1")->merged, "B1", " merged C1"); is ($ss->attr ("A2")->merged, "A2", " merged A2"); is ($ss->attr ("B2")->merged, "B1", " merged B2"); is ($ss->attr ("C2")->merged, "B1", " merged C2"); is ($ss->attr ("A3")->merged, "A2", " merged A3"); is ($ss->attr ("B3")->merged, 0, "unmerged B3"); is ($ss->attr ("C3")->merged, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); is ($ss->merged_from ("A1"), "", "merged_from (A1)"); is ($ss->merged_from (1, 1), "", "merged_from (1, 1)"); is ($ss->merged_from ("B1"), "B1", "merged_from (B1)"); is ($ss->merged_from (2, 1), "B1", "merged_from (2, 1)"); is ($ss->merged_from ("C2"), "B1", "merged_from (C2)"); is ($ss->merged_from (3, 2), "B1", "merged_from (3, 2)"); # out of range is ($ss->merged_from ("E5"), undef, "merged_from (E5)"); # illegal ID is ($ss->merged_from (999), undef, "merged_from (999)"); is ($ss->merged_from ("9X"), undef, "merged_from (9X)"); is ($ss->merged_from (999, 99), undef, "merged_from (999, 99)"); is ($ss->merged_from (9, 9, 9), undef, "merged_from (9, 9, 9)"); done_testing; Spreadsheet-Read-0.91/t/204_csv.t0000644000031300001440000000571013016541232015630 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 118; use Test::More; require Test::NoWarnings; use Spreadsheet::Read qw( ReadData cell2cr row cellrow ); my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; sub ReadDataCSV { ReadData (@_, parser => "csv"); } # ReadDataCSV { my $ref; $ref = ReadDataCSV ("files/empty.txt"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataCSV ("files/test.txt"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } my @row = ("A3", "", "C3", "D3", (undef) x 15); is_deeply ([ row ($csv->[1], 3) ], \@row, "Formatted row 3"); is_deeply ([ cellrow ($csv->[1], 3) ], \@row, "Unformatted row 3"); ok ($csv = ReadDataCSV ("files/test_m.txt"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataCSV ("files/test_x.txt", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/600_xlsx.t0000644000031300001440000001412113231322052016023 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 116; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.xlsx"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xlsx"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xlsx" or die "files/test.xlsx: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xlsx", "Read/Parse xlsx file" ], # [ $content, "Parse xlsx data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); like ($xls->[0]{version}, qr{[0-9]}, "Has version with digit"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # Tests for empty thingies ok ($xls = ReadData ("files/values.xlsx"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xlsx", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.xlsx has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/614_dates.t0000644000031300001440000000510612543027701016145 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xlsx", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", "d-mmm" ], A2 => [ "12-Aug", "d-mmm" ], A3 => [ "8-Dec", "d-mmm" ], A4 => [ "13-Aug", "d-mmm" ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); SKIP: { ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); defined $attr->[2][1]{format} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support formats", 100; my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, "d-mmm", "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/613_misc.t0000644000031300001440000000232513231322512015770 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[1]{cell}[1], undef, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/635_perc.t0000644000031300001440000000114514520414722016000 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 3; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; ok (my $xls = ReadData ("files/perc.xlsx", attr => 1), "Excel Percentage testcase"); ok (my $ss = $xls->[1], "We have a sheet"); ok (1, "No percentage support in $xls->[0]{parser}"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/37_merged.t0000644000031300001440000000507613701561751016242 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; ok (my $ss = ReadData ("files/merged.xls", attr => 1)->[1], "Read merged xls"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, " merged B1"); is ($ss->{attr}[3][1]{merged}, 1, " merged C1"); is ($ss->{attr}[1][2]{merged}, 1, " merged A2"); is ($ss->{attr}[2][2]{merged}, 1, " merged B2"); is ($ss->{attr}[3][2]{merged}, 1, " merged C2"); is ($ss->{attr}[1][3]{merged}, 1, " merged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); ok ($ss = Spreadsheet::Read->new ("files/merged.xls", attr => 1, merge => 1)->sheet (1), "Read merged xls"); is ($ss->attr (1, 1)->merged, 0, "unmerged A1"); is ($ss->attr (2, 1)->merged, "B1", " merged B1"); is ($ss->attr (3, 1)->merged, "B1", " merged C1"); is ($ss->attr (1, 2)->merged, "A2", " merged A2"); is ($ss->attr (2, 2)->merged, "B1", " merged B2"); is ($ss->attr (3, 2)->merged, "B1", " merged C2"); is ($ss->attr (1, 3)->merged, "A2", " merged A3"); is ($ss->attr (2, 3)->merged, 0, "unmerged B3"); is ($ss->attr (3, 3)->merged, 0, "unmerged C3"); is ($ss->attr ("A1")->merged, 0, "unmerged A1"); is ($ss->attr ("B1")->merged, "B1", " merged B1"); is ($ss->attr ("C1")->merged, "B1", " merged C1"); is ($ss->attr ("A2")->merged, "A2", " merged A2"); is ($ss->attr ("B2")->merged, "B1", " merged B2"); is ($ss->attr ("C2")->merged, "B1", " merged C2"); is ($ss->attr ("A3")->merged, "A2", " merged A3"); is ($ss->attr ("B3")->merged, 0, "unmerged B3"); is ($ss->attr ("C3")->merged, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); is ($ss->merged_from ("A1"), "", "merged_from (A1)"); is ($ss->merged_from (1, 1), "", "merged_from (1, 1)"); is ($ss->merged_from ("B1"), "B1", "merged_from (B1)"); is ($ss->merged_from (2, 1), "B1", "merged_from (2, 1)"); is ($ss->merged_from ("C2"), "B1", "merged_from (C2)"); is ($ss->merged_from (3, 2), "B1", "merged_from (3, 2)"); # out of range is ($ss->merged_from ("E5"), undef, "merged_from (E5)"); # illegal ID is ($ss->merged_from (999), undef, "merged_from (999)"); is ($ss->merged_from ("9X"), undef, "merged_from (9X)"); is ($ss->merged_from (999, 99), undef, "merged_from (999, 99)"); is ($ss->merged_from (9, 9, 9), undef, "merged_from (9, 9, 9)"); done_testing; Spreadsheet-Read-0.91/t/200_csv.t0000644000031300001440000001534214015676306015641 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 295; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } foreach my $attr ("strip", "trim") { { # RT#74976 - Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.csv", $attr => $strip); ok ($ref, "File with no content - $attr $strip"); } } # blank.csv has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.csv", clip => 0, $attr => 0); ok ($ref, "!clip $attr 0"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 0, $attr => 1); ok ($ref, "!clip $attr 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, $attr => 1, cells => 0); ok ($ref, "!clip $attr 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, $attr => 2, rc => 0); ok ($ref, "!clip $attr 2"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", clip => 0, $attr => 3, cells => 0, rc => 0); ok ($ref, "!clip $attr 3"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, $attr => 0); ok ($ref, " clip $attr 0"); is ($ref->[1]{maxrow}, 1, "maxrow 3"); is ($ref->[1]{maxcol}, 1, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 1, $attr => 1); ok ($ref, " clip $attr 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, $attr => 1, cells => 0); ok ($ref, " clip $attr 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, $attr => 2, rc => 0); ok ($ref, " clip $attr 2"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, $attr => 3, cells => 0, rc => 0); ok ($ref, " clip $attr 3"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } } foreach my $attr ("pivot", "transpose") { ok ($csv = ReadData ("files/test.csv", $attr => 1), "Read/Parse csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$r][$c], $cell, "Unformatted cell $cell"); my $llec = cr2cell ($r, $c); is ($csv->[1]{$llec}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$r][$c], "", "Unformatted cell $cell"); my $llec = cr2cell ($r, $c); is ($csv->[1]{$llec}, "", "Formatted cell $cell"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/201_csv.t0000644000031300001440000000171512524343302015627 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 12; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse csv file (;)"); is ($csv->[0]{sepchar}, ";", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_t.csv", quote => "'"), "Read/Parse csv file (tabs)"); is ($csv->[0]{sepchar}, "\t", "{sepchar}"); is ($csv->[0]{quote}, "'", "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/602_fmt.t0000644000031300001440000000424612545741253015643 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 40; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); my $parser = $xls->[0]{parser}; SKIP: { ok (my $fmt = $xls->[$xls->[0]{sheet}{Format}], "format"); $fmt->{attr}[2][2]{merged} or skip "$parser $xls->[0]{version} does not reliably support attributes yet", 38; # The return value for the invisible part of merged cells differs for # the available parsers my $mcrv = $parser =~ m/::XLSX$/ ? undef : ""; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, $mcrv, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], $mcrv, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/622_fmt.t0000644000031300001440000000436112543027365015642 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 40; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); my $parser = $xls->[0]{parser}; SKIP: { ok (my $fmt = $xls->[$xls->[0]{sheet}{Format}], "format"); $fmt->{attr}[2][2]{merged} or skip "$parser $xls->[0]{version} does not reliably support attributes yet", 38; # The return value for the invisible part of merged cells differs for # the available parsers my $mcrv = $parser =~ m/::XLSX/ ? undef : ""; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, $mcrv, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], $mcrv, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/11_call.t0000644000031300001440000000256514521157352015701 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; use Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("sc") or plan skip_all => "No SquirrelCalc parser found"; plan tests => 243; # Base attributes foreach my $prs ([], [ parser => "sc" ], [ parser => "Spreadsheet::Read" ]) { foreach my $onoff (0, 1) { for ( [ ], [ rc => $onoff ], [ cell => $onoff ], [ rc => 0, cell => $onoff ], [ rc => 1, cell => $onoff ], [ clip => $onoff ], [ cell => 0, clip => $onoff ], [ cell => 1, clip => $onoff ], [ attr => $onoff ], [ cell => 0, attr => $onoff ], ) { my @attr = (@$_, @$prs); my $ref = ReadData ("files/test.sc", @attr); ok ($ref, "Open with options ( @attr )"); ok (ref $ref, "Valid ref"); $ref = ReadData ("files/test.sc", { @attr }); ok ($ref, "Open with options { @attr }"); ok (ref $ref, "Valid ref"); } } } { my @err; local $SIG{__DIE__} = sub { push @err => @_ }; my $p = eval { ReadData ("files/test.sc", parser => "Spreadsheet::Stupid"); }; is ($p, undef, "Cannot use unsupported parser"); s/[\s\r\n]+at[\s\r\n]+\S+\s+line\s+\d+.*//s for @err; is_deeply (\@err, [ "I can open file files/test.sc, but I do not know how to parse it" ], "Cannot parse"); } # TODO: test and catch unsupported option. # Currently they are silently ignored Spreadsheet-Read-0.91/t/415_perc.t0000644000031300001440000000224313701335444015777 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; my $ods; ok ($ods = ReadData ("files/perc.ods", attr => 1), "Excel Percentage testcase"); my $ss = $ods->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { my @type = map { $ss->{attr}[$_][$row]{type} } 0 .. 3; is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); foreach my $col (2, 3) { my $cell = ("A".."C")[$col - 1].$row; is ($type[$col], "percentage", "Type $cell percentage"); } SKIP: { $ss->{B18} =~ m/[.]/ and skip "$ods->[0]{parser} $ods->[0]{version} has format problems", 1; my $i = int $ss->{"A$row"}; # Allow edge case. rounding .5 will be different in -Duselongdouble perl my $f = $ss->{"B$row"}; $row == 11 && $f eq "1%" and $i = 1; is ($f, "$i%", "Formatted values for row $row\n"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/221_csv.t0000644000031300001440000000202712543027277015641 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 12; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse csv file (;)"); is ($csv->[0]{sepchar}, ";", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_t.csv", quote => "'"), "Read/Parse csv file (tabs)"); is ($csv->[0]{sepchar}, "\t", "{sepchar}"); is ($csv->[0]{quote}, "'", "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/35_perc.t0000644000031300001440000000151311163712567015721 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; my $xls; ok ($xls = ReadData ("files/perc.xls", attr => 1), "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); is ($ss->{attr}[2][$row]{type}, "percentage", "Type B$row percentage"); is ($ss->{attr}[3][$row]{type}, "percentage", "Type C$row percentage"); my $i = int $ss->{"A$row"}; is ($ss->{"B$row"}, "$i%", "Formatted values for row $row\n"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/220_csv.t0000644000031300001440000001430713231317266015637 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 171; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } { # RT#74976 - Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.csv", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.csv has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.csv", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 3"); is ($ref->[1]{maxcol}, 1, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/607_merged.t0000644000031300001440000000526413701561677016333 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 22; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; $parser eq "Spreadsheet::XLSX" and plan skip_all => "No merged cell support in $parser"; ok (my $ss = ReadData ("files/merged.xlsx", attr => 1)->[1], "Read merged xlsx"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, " merged B1"); is ($ss->{attr}[3][1]{merged}, 1, " merged C1"); is ($ss->{attr}[1][2]{merged}, 1, " merged A2"); is ($ss->{attr}[2][2]{merged}, 1, " merged B2"); is ($ss->{attr}[3][2]{merged}, 1, " merged C2"); is ($ss->{attr}[1][3]{merged}, 1, " merged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); ok ($ss = Spreadsheet::Read->new ("files/merged.xlsx", attr => 1, merge => 1)->sheet (1), "Read merged xlsx"); is ($ss->attr (1, 1)->merged, 0, "unmerged A1"); is ($ss->attr (2, 1)->merged, "B1", " merged B1"); is ($ss->attr (3, 1)->merged, "B1", " merged C1"); is ($ss->attr (1, 2)->merged, "A2", " merged A2"); is ($ss->attr (2, 2)->merged, "B1", " merged B2"); is ($ss->attr (3, 2)->merged, "B1", " merged C2"); is ($ss->attr (1, 3)->merged, "A2", " merged A3"); is ($ss->attr (2, 3)->merged, 0, "unmerged B3"); is ($ss->attr (3, 3)->merged, 0, "unmerged C3"); is ($ss->attr ("A1")->merged, 0, "unmerged A1"); is ($ss->attr ("B1")->merged, "B1", " merged B1"); is ($ss->attr ("C1")->merged, "B1", " merged C1"); is ($ss->attr ("A2")->merged, "A2", " merged A2"); is ($ss->attr ("B2")->merged, "B1", " merged B2"); is ($ss->attr ("C2")->merged, "B1", " merged C2"); is ($ss->attr ("A3")->merged, "A2", " merged A3"); is ($ss->attr ("B3")->merged, 0, "unmerged B3"); is ($ss->attr ("C3")->merged, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); is ($ss->merged_from ("A1"), "", "merged_from (A1)"); is ($ss->merged_from (1, 1), "", "merged_from (1, 1)"); is ($ss->merged_from ("B1"), "B1", "merged_from (B1)"); is ($ss->merged_from (2, 1), "B1", "merged_from (2, 1)"); is ($ss->merged_from ("C2"), "B1", "merged_from (C2)"); is ($ss->merged_from (3, 2), "B1", "merged_from (3, 2)"); # out of range is ($ss->merged_from ("E5"), undef, "merged_from (E5)"); # illegal ID is ($ss->merged_from (999), undef, "merged_from (999)"); is ($ss->merged_from ("9X"), undef, "merged_from (9X)"); is ($ss->merged_from (999, 99), undef, "merged_from (999, 99)"); is ($ss->merged_from (9, 9, 9), undef, "merged_from (9, 9, 9)"); done_testing; Spreadsheet-Read-0.91/t/214_csv.t0000644000031300001440000000602213016541261015630 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 118; use Test::More; require Test::NoWarnings; use Spreadsheet::Read qw( ReadData cell2cr row cellrow ); my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; sub ReadDataCSV { ReadData (@_, parser => "csv"); } # ReadDataCSV { my $ref; $ref = ReadDataCSV ("files/empty.txt"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataCSV ("files/test.txt"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } my @row = ("A3", "", "C3", "D3", (undef) x 15); is_deeply ([ row ($csv->[1], 3) ], \@row, "Formatted row 3"); is_deeply ([ cellrow ($csv->[1], 3) ], \@row, "Unformatted row 3"); ok ($csv = ReadDataCSV ("files/test_m.txt"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataCSV ("files/test_x.txt", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/604_dates.t0000644000031300001440000000476512543027450016157 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xlsx", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", "d-mmm" ], A2 => [ "12-Aug", "d-mmm" ], A3 => [ "8-Dec", "d-mmm" ], A4 => [ "13-Aug", "d-mmm" ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); SKIP: { ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); defined $attr->[2][1]{format} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support formats", 100; my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, "d-mmm", "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/610_xlsx.t0000644000031300001440000001614714562640027016053 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 178; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.xlsx"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xlsx"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xlsx" or die "files/test.xlsx: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xlsx", "Read/Parse xlsx file" ], [ "files/hidden.xlsx", "Read/Parse xlsx file with hidden sheet" ], # [ $content, "Parse xlsx data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); my $xvsn = $xls->[0]{version}; $xvsn =~ s/_[0-9]+$//; # remove beta part cmp_ok ($xvsn, ">=", 0.07, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); is ($xls->[1]{hidden}, 0, "Sheet 1 is not hidden"); if ($txt =~ m/hidden/) { is ($xls->[2]{hidden}, 1, "Sheet 2 is hidden"); } else { is ($xls->[2]{hidden}, 0, "Sheet 2 is not hidden"); } } # Tests for empty thingies ok ($xls = ReadData ("files/values.xlsx"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xlsx", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.xlsx has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } { sub chk_test { my ($msg, $xls) = @_; is (ref $xls, "ARRAY", "Return type for $msg"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type XLSX"); is ($xls->[0]{sheets}, 2, "Sheet count"); } # chk_test my $data = $content; open my $fh, "<", "files/test.xlsx"; chk_test ( " FH parser", ReadData ( $fh, parser => "xlsx")); close $fh; chk_test ("\\DATA parser", ReadData (\$data, parser => "xlsx")); chk_test ( " DATA no parser", ReadData ( $data )); chk_test ( " DATA parser", ReadData ( $data, parser => "xlsx")); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/603_misc.t0000644000031300001440000000220413231321663015771 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[1]{cell}[1], undef, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/601_clr.t0000644000031300001440000000273112564056346015634 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 257; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $xls->[$xls->[0]{sheet}{Colours}], "colors"); defined $clr->{attr}[2][2]{fgcolor} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support colors yet", 255; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/700_gnumeric.t0000644000031300001440000000512614374660764016674 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("gnumeric") or plan skip_all => "No Gnumeric parser found"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; sub test_source { # 7 tests per file version. my ($source, $source_name, @options) = @_; ok (ref ($source) || Spreadsheet::Read::_txt_is_xml ($source, "http://www.gnumeric.org/v10.dtd"), "$source_name contains Gnumeric XML"); my $book = ReadData ($source, @options); ok ($book, "have gnumeric book"); ok (@$book == 4, "it has length 4"); ok ($book->[0]{sheets} == 3, "it has 3 sheets"); ok (my $b1 = $book->[1], "first sheet"); is ($b1->{C30}, "monthly maintenance fee", "cell C30 matches via col/row name"); is ($b1->{cell}[3][30], "monthly maintenance fee", "cell C30 matches via array indices"); } sub test_oo_source { # 5 tests per file version. my ($source, $source_name, @options) = @_; my $book = Spreadsheet::Read->new ($source, @options); ok ($book, "OO $source_name: have gnumeric book"); is (scalar $book->sheets, 3, "OO book has 3 sheets"); ok (my $b1 = $book->sheet (1), "OO first sheet"); is ($b1->cell ("C30"), "monthly maintenance fee", "OO cell C30 matches via col/row name"); is ($b1->cell (3, 30), "monthly maintenance fee", "OO cell C30 matches via array indices"); } # test_source ### Main code. ## Source tests. for my $file (qw(files/gnumeric.xml files/gnumeric.gnumeric)) { test_source ($file, "file $file"); test_oo_source ($file, "file $file"); open my $in, "<", $file or die "oops: $!"; test_source ($in, "stream $file", parser => "gnumeric"); open $in, "<", $file or die "oops: $!"; test_oo_source ($in, "stream $file", parser => "gnumeric"); open $in, "<", $file or die "oops again: $!"; my $data = do { local $/; <$in> }; test_source ($data, "scalar $file"); test_oo_source ($data, "scalar $file"); } ## Other basic tests. # Check that the rc and cells flags are obeyed. my $source = "files/gnumeric.gnumeric"; my $book = ReadData ($source, rc => 0, cells => 1); ok ($book, "Have book from $source"); is ($book->[1]{B3}, "Date", "B3 is filled in"); ok (!exists $book->[1]{cell}, "{cell} is not there"); $book = ReadData ($source, rc => 1, cells => 0); ok ($book, "Have book from $source"); ok (!exists $book->[1]{B3}, "B3 is not there"); is ($book->[1]{cell}[2][3], "Date", "{cell}[2][3] is filled in"); done_testing (6 + 2 * 3 * (7 + 5)); Spreadsheet-Read-0.91/t/621_clr.t0000644000031300001440000000304512564056336015634 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 257; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $xls->[$xls->[0]{sheet}{Colours}], "colors"); defined $clr->{attr}[2][2]{fgcolor} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support colors yet", 255; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/623_misc.t0000644000031300001440000000232013231322235015766 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[1]{cell}[1], undef, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/624_dates.t0000644000031300001440000000510112543027367016151 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xlsx", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", "d-mmm" ], A2 => [ "12-Aug", "d-mmm" ], A3 => [ "8-Dec", "d-mmm" ], A4 => [ "13-Aug", "d-mmm" ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); SKIP: { ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); defined $attr->[2][1]{format} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support formats", 100; my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, "d-mmm", "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/51_sc.t0000644000031300001440000000322613746002122015362 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 26; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("sc") or plan skip_all => "No SquirrelCalc parser found"; sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "sc", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.sc"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.sc"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $sc, "<", "files/test.sc" or die "files/test.sc: $!\n"; binmode $sc; $content = <$sc>; close $sc; isnt ($content, undef, "Content is defined"); isnt ($content, "", "Content is filled"); } foreach my $clip (0, 2) { my $sc; ok ($sc = ReadDataStream ("files/test.sc", clip => $clip, strip => 2), "Read/Parse sc file ".($clip?"clipped":"unclipped")); ok (1, "Base values"); is (ref $sc, "ARRAY", "Return type"); is ($sc->[0]{type}, "sc", "Spreadsheet type"); is ($sc->[0]{sheets}, 1, "Sheet count"); is (ref $sc->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$sc->[0]{sheet}}, 1, "Sheet list count"); is ($sc->[0]{version}, $Spreadsheet::Read::VERSION, "Parser version"); is ($sc->[1]{maxcol}, 10 - $clip, "Columns"); is ($sc->[1]{maxrow}, 28 - $clip, "Rows"); is ($sc->[1]{cell}[1][22], " Workspace", "Just checking one cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/627_merged.t0000644000031300001440000000020313701561424016307 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; ok (1, "No merged cell support in Spreadsheet::XLSX"); done_testing; Spreadsheet-Read-0.91/t/425_ods.t0000644000031300001440000000756713701337225015651 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 301; use Test::More; require Test::NoWarnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ReadSXC"; } use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("ods") or plan skip_all => "No SXC parser found"; my $pv = $parser->VERSION; $pv >= "0.25" and plan skip_all => "Use Spreadsheet::ParseODS instead please"; diag ("# Parser: $parser-$pv"); my $content; { local $/; open my $xml, "<", "files/content.xml" or die "files/content.xml: $!\n"; binmode $xml; $content = <$xml>; close $xml; } { my $ref; $ref = ReadData ("no_such_file.ods"); ok (!defined $ref, "Nonexistent file"); # Too noisy #eval { $ref = ReadData ("files/empty.ods") }; #ok (!defined $ref, "Empty file"); #like ($@, qr/too short/); } my @base = ( [ "files/test.ods", "Read/Parse ods file" ], [ "files/content.xml", "Read/Parse xml file" ], [ $content, "Parse xml data" ], ); if ($parser->VERSION > 0.24) { open my $fh, "<", "files/test.ods" or die "files/test.ods: $!\n"; push @base => [ $fh, "Parse ods file handle" ]; $tests += 100; } foreach my $base (@base) { my ($txt, $msg) = @$base; my $sxc; my @options = ref $txt ? (parser => "ods") : (); ok ($sxc = ReadData ($txt, @options), $msg); ok (1, "Base values"); is (ref $sxc, "ARRAY", "Return type"); is ($sxc->[0]{type}, "sxc", "Spreadsheet type"); is ($sxc->[0]{sheets}, 2, "Sheet count"); is (ref $sxc->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$sxc->[0]{sheet}}, 2, "Sheet list count"); # This should match the version required in Makefile.PL's PREREQ_PM cmp_ok ($sxc->[0]{version}, ">=", 0.12, "Parser version"); ok (1, "Sheet 1"); # Simple sheet with cells filled with the cell label: # -- -- -- -- # A1 B1 D1 # A2 B2 # A3 C3 D3 # A4 B4 C4 ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Nonexistent fields"); foreach my $cell (qw( A9 X6 B17 AB4 BE33 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Sheet 2"); # Sheet with merged cells and notes/annotations # x x x # x x # x x x ok (1, "Defined fields"); foreach my $cell (qw( A1 C1 E1 B2 D2 A3 C3 E3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], "x", "Unformatted cell $cell"); is ($sxc->[2]{$cell}, "x", "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B1 D1 A2 C2 E2 B3 D3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[2]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Nonexistent fields"); foreach my $cell (qw( A9 X6 B17 AB4 BE33 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[2]{$cell}, undef, "Formatted cell $cell"); } # Sheet order ok (exists $sxc->[0]{sheet}{Sheet1}, "Sheet labels in metadata"); my @sheets = map { $sxc->[$_]{label} } 1 .. $sxc->[0]{sheets}; SKIP: { $sxc->[0]{version} < 0.20 and skip "Not supported", 1; is ("@sheets", "@{['Sheet1','Second Sheet']}", "Sheet order"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/30_xls.t0000644000031300001440000002040713231317773015572 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser; if ($parser = Spreadsheet::Read::parses ("xls")) { print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; plan tests => 272; Test::NoWarnings->import; } else { plan skip_all => "No M\$-Excel parser found"; } { my $ref; $ref = ReadData ("no_such_file.xls"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xls"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xls" or die "files/test.xls: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xls", "Read/Parse xls file" ], [ $content, "Parse xls data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xls", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); cmp_ok ($xls->[0]{version}, ">=", 0.26, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # This files is generated under Mac OS/X Tiger ok (1, "XLS File fom Mac OS X"); ok ($xls = ReadData ("files/macosx.xls", clip => 0), "Read/Parse Mac OS X xls file"); ok (1, "Base values"); is ($xls->[0]{sheets}, 3, "Sheet count"); is ($xls->[0]{sheet}{Sheet3}, 3, "Sheet labels"); is ($xls->[1]{maxrow}, 25, "MaxRow"); is ($xls->[1]{maxcol}, 3, "MaxCol"); is ($xls->[2]{label}, "Sheet2", "Sheet label"); is ($xls->[2]{maxrow}, 0, "Empty sheet maxrow"); is ($xls->[2]{maxcol}, 0, "Empty sheet maxcol"); ok (1, "Content"); is ($#{$xls->[1]{cell}[3]}, $xls->[1]{maxrow}, "cell structure"); ok (defined $xls->[1]{cell}[$xls->[1]{maxcol}][$xls->[1]{maxrow}], "last cell"); foreach my $x (1 .. 17) { my $cell = cr2cell (1, $x); is ($xls->[1]{$cell}, $x, "Cell $cell"); is ($xls->[1]{cell}[1][$x], $x, "Cell 1, $x"); } foreach my $x (1 .. 25) { my $cell = cr2cell (3, $x); is ($xls->[1]{$cell}, $x, "Cell $cell"); is ($xls->[1]{cell}[3][$x], $x, "Cell 3, $x"); } foreach my $cell (qw( A18 B1 B6 B20 C26 D14 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Cell $cell"); is ($xls->[1]{$cell}, undef, "Cell $c, $r"); } eval { eval "use ".$parser."::FmtDefault"; my ($pm) = map { $INC{$_} } grep m{FmtDefault.pm$}i => keys %INC; if (open my $ph, "<", $pm) { my $l; $l = <$ph> for 1 .. 68; close $ph; if ($l =~ m/'C\*'/) { print STDERR "\n", "# If the next tests give warnings like\n", "# Character in 'C' format wrapped in pack at\n", "# $pm line 68\n", "# Change C* to U* in line 68\n", "# patch -p0 ; s/\bPM\b/$pm/ for @patch; open $ph, ">", "SPE68.diff" or die "SPE68.diff: $!\n"; print $ph @patch; close $ph; } } }; # Tests for empty thingies ok ($xls = ReadData ("files/values.xls"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xls", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.xls has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.xls", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 2, "maxrow 2"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xls", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 2, "maxrow 2"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.xls", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 2, "maxrow 2"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xls", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 2, "maxrow 2"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xls", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 2, "maxrow 2"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xls", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xls", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xls", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xls", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xls", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } __END__ --- PM 2005-09-15 14:16:36.163623616 +0200 +++ PM 2005-09-15 14:11:56.289171000 +0200 @@ -65,7 +65,7 @@ sub new($;%) { sub TextFmt($$;$) { my($oThis, $sTxt, $sCode) =@_; return $sTxt if((! defined($sCode)) || ($sCode eq '_native_')); - return pack('C*', unpack('n*', $sTxt)); + return pack('U*', unpack('n*', $sTxt)); } #------------------------------------------------------------------------------ # FmtStringDef (for Spreadsheet::ParseExcel::FmtDefault) Spreadsheet-Read-0.91/t/32_fmt.t0000644000031300001440000000340311163712315015542 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 39; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; my $xls; ok ($xls = ReadData ("files/attr.xls", attr => 1), "Excel Attributes testcase"); my $fmt = $xls->[$xls->[0]{sheet}{Format}]; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, "", "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], "", "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/612_fmt.t0000644000031300001440000000436612543027355015645 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 40; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); my $parser = $xls->[0]{parser}; SKIP: { ok (my $fmt = $xls->[$xls->[0]{sheet}{Format}], "format"); $fmt->{attr}[2][2]{merged} or skip "$parser $xls->[0]{version} does not reliably support attributes yet", 38; # The return value for the invisible part of merged cells differs for # the available parsers my $mcrv = $parser =~ m/::XLSX/ ? undef : ""; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, $mcrv, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], $mcrv, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/426_clr.t0000644000031300001440000000024513701341075015625 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; ok (1, "Spreadsheet::ReadSXC never supported colors"); done_testing (1); Spreadsheet-Read-0.91/t/210_csv.t0000644000031300001440000001430713231317045015631 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 171; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } { # RT#74976 - Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.csv", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.csv has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.csv", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 3"); is ($ref->[1]{maxcol}, 1, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/10_basics.t0000644000031300001440000001070114545077214016224 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More tests => 118; use Test::NoWarnings; use Spreadsheet::Read qw(:DEFAULT parses rows ); is (Spreadsheet::Read::Version (), $Spreadsheet::Read::VERSION, "Version check"); ok (my @ext = parses (undef), "No sheet type"); is_deeply ([ grep m/^sc/ => @ext ], [ "sc" ], "Supports Squirrelcalc"); is (parses ("zzz0"), 0, "Unknown sheet type"); is (parses ("zzz1"), 0, "Too old sheet type"); is (parses ("zzz2"), "Z20::Just::For::Testing", "Testing sheet type"); is (parses ("zzz3"), 0, "Unsupported sheet type"); is (parses ("xls"), parses ("excel"), "Excel alias type"); is (parses ("ods"), parses ("oo"), "OpenOffice alias type 1"); is (parses ("ods"), parses ("OpenOffice"), "OpenOffice alias type 2"); is (parses ("sc"), parses ("scalc"), "SquirrelCalc alias type"); foreach my $x ([ "A1", 1, 1 ], [ "Z26", 26, 26 ], [ "AB12", 28, 12 ], [ "A", 0, 0 ], [ "19", 0, 0 ], [ "a9", 1, 9 ], [ "aAa9", 703, 9 ], [ "", 0, 0 ], [ undef, 0, 0 ], [ "x444444", 24, 444444 ], [ "xxxxxx4", 296559144, 4 ], ) { my $cell = $x->[0]; my ($c, $r) = cell2cr ($x->[0]); defined $cell or $cell = ""; is ($c, $x->[1], "Col for $cell"); is ($r, $x->[2], "Row for $cell"); } foreach my $x ([ 1, 1, "A", "A1" ], [ 26, 26, "Z", "Z26" ], [ 28, 12, "AB", "AB12" ], [ 0, 0, "", "" ], [ -2, 0, "", "" ], [ 0, -12, "", "" ], [ 1, -12, "A", "" ], [ undef, 1, "", "" ], [ 2, undef, "B", "" ], [ 1, 9, "A", "A9" ], [ 703, 9, "AAA", "AAA9" ], [ 24, 444444, "X", "X444444" ], [ 296559144, 4, "XXXXXX", "XXXXXX4" ], ) { my $cell = cr2cell ($x->[0], $x->[1]); my ($c, $r) = map { defined $_ ? $_ : "--undef--" } $x->[0], $x->[1]; is ($cell, $x->[3], "Cell for ($c, $r)"); is (Spreadsheet::Read::col2label ($x->[0]), $x->[2], "Col $c eq $x->[2]"); } # Some illegal rows () calls for (undef, "", " ", 0, 1, [], {}) { my @rows = rows ($_); my $arg = defined $_ ? $_ : "-- undef --"; is (scalar @rows, 0, "Illegal rows ($arg)"); } for (undef, "", " ", 0, 1, [], {}) { my @rows = rows ({ cell => $_}); my $arg = defined $_ ? $_ : "-- undef --"; is (scalar @rows, 0, "Illegal rows ({ cell => $arg})"); } for (undef, "", " ", 0, 1, [], {}) { my @rows = rows ({ maxrow => 1, cell => $_}); my $arg = defined $_ ? $_ : "-- undef --"; is (scalar @rows, 0, "Illegal rows ({ maxrow => 1, cell => $arg })"); } for (undef, "", " ", 0, 1, [], {}) { my @rows = rows ({ maxcol => 1, cell => $_}); my $arg = defined $_ ? $_ : "-- undef --"; is (scalar @rows, 0, "Illegal rows ({ maxcol => 1, cell => $arg })"); } # Some illegal ReadData () calls for (undef, "", " ", 0, 1, [], {}) { my $ref = ReadData ($_); my $arg = defined $_ ? $_ : "-- undef --"; is ($ref, undef, "Illegal ReadData ($arg)"); } for (undef, "", " ", 0, 1, [], {}) { my $ref = ReadData ([ $_ ]); my $arg = defined $_ ? $_ : "-- undef --"; is ($ref, undef, "Illegal ReadData ([ $arg ])"); } SKIP: { -c "/dev/null" or skip "/dev/null cannot be used for tests", 7; for (undef, "", " ", 0, 1, [], {}) { my $ref = ReadData ("/dev/null", separator => $_); my $arg = defined $_ ? $_ : "-- undef --"; is ($ref, undef, "Illegal ReadData ({ $arg })"); } } for (undef, "", " ", 0, 1, [], {}) { my $ref; eval { $ref = ReadData ("Read.pm", sep => $_); }; my $arg = defined $_ ? $_ : "-- undef --"; is ($ref, undef, "Illegal ReadData ({ $arg })"); } my $sr = "Spreadsheet::Read"; ok (my @p = $sr->parsers (), "Parser info"); is_deeply ((grep { $_->{ext} eq "sc" } @p)[0], { ext => "sc", min => "0.01", mod => $sr, vsn => $sr->VERSION, def => "*" }, "SquirrelCalc is internal"); Spreadsheet-Read-0.91/t/211_csv.t0000644000031300001440000000202712543027246015634 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 12; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse csv file (;)"); is ($csv->[0]{sepchar}, ";", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_t.csv", quote => "'"), "Read/Parse csv file (tabs)"); is ($csv->[0]{sepchar}, "\t", "{sepchar}"); is ($csv->[0]{quote}, "'", "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/205_csv.t0000644000031300001440000002352713505433730015645 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; # OO version of 200_csv.t my $tests = 261; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; { my $ref; is (Spreadsheet::Read->new ("no_such_file.csv"), undef, "Open nonexisting file"); ok ($@, "No sheets read: $@"); # No such file or directory is (Spreadsheet::Read->new ("files/empty.csv"), undef, "Open empty file"); is ($@, "files/empty.csv is empty", "No sheets read"); } my $csv; ok ($csv = Spreadsheet::Read->new ("files/test.csv"), "Read/Parse csv file"); ok ($csv->parses ("CSV"), "Parses CSV"); is ($csv->cr2cell (1, 1), "A1", "method cr2cell"); ok (1, "Base values"); is (ref $csv, "Spreadsheet::Read", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is_deeply ([$csv->cellrow (1, 1)], ["A1","B1","","D1",(undef) x 15], "row 1"); is ($csv->cellrow (1, 255), undef, "No such row 255"); is ($csv->cellrow (1, -55), undef, "No such row -55"); is ($csv->cellrow (1, 0), undef, "No such row 0"); is ($csv->cellrow (0, 1), undef, "No such sheet 0"); is ($csv->cellrow (-2, 1), undef, "Wrong sheet -2"); is ($csv->cellrow (-20, 1), undef, "No such sheet -20"); is_deeply ([$csv->row (1, 1)], ["A1","B1","","D1",(undef) x 15], "row 1"); is ($csv->row (1, 255), undef, "No such row 255"); is ($csv->row (1, -55), undef, "No such row -55"); is ($csv->row (1, 0), undef, "No such row 0"); is ($csv->row (0, 1), undef, "No such sheet 0"); is ($csv->row (-2, 1), undef, "Wrong sheet -2"); is ($csv->row (-20, 1), undef, "No such sheet -20"); is ($csv->sheet ( 0), undef, "Sheet 0"); is ($csv->sheet (255), undef, "Sheet 255"); is ($csv->sheet (-55), undef, "Sheet -55"); is ($csv->sheet ("="), undef, "Sheet '='"); is (Spreadsheet::Read::sheet (undef, 1), undef, "Don't be silly"); is (Spreadsheet::Read::sheet ($csv, -9), undef, "Don't be silly"); ok (my $sheet = $csv->sheet (1), "Sheet 1"); is ($sheet->maxrow, 5, "Last row"); is ($sheet->maxcol, 19, "Last column"); is ($sheet->cell ($sheet->maxcol, $sheet->maxrow), "LASTFIELD", "Last field"); is_deeply ([$sheet->cellrow (1)], ["A1","B1","","D1",(undef) x 15], "row 1"); is ($sheet->cellrow (255), undef, "No such row 255"); is ($sheet->cellrow (-55), undef, "No such row -55"); is ($sheet->cellrow ( 0), undef, "No such row 0"); is_deeply ([$sheet->row (1)], ["A1","B1","","D1",(undef) x 15], "row 1"); is ($sheet->row (255), undef, "No such row 255"); is ($sheet->row (-55), undef, "No such row -55"); is ($sheet->row ( 0), undef, "No such row 0"); is_deeply ([$sheet->cellcolumn (1)], ["A1","A2","A3","A4",""], "col 1"); is ($sheet->cellcolumn (255), undef, "No such col 255"); is ($sheet->cellcolumn (-55), undef, "No such col -55"); is ($sheet->cellcolumn ( 0), undef, "No such col 0"); is_deeply ([$sheet->column (1)], ["A1","A2","A3","A4",""], "col 1"); is ($sheet->column (255), undef, "No such col 255"); is ($sheet->column (-55), undef, "No such col -55"); is ($sheet->column ( 0), undef, "No such col 0"); ok (my @rows = $sheet->rows, "All rows"); is ($rows[0][0], "A1", "A1"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = $csv->cell2cr ($cell); is ($sheet->{cell}[$c][$r], $cell, "Unformatted cell $cell direct"); is ($sheet->{$cell}, $cell, "Formatted cell $cell direct"); is ($sheet->cell ($c, $r), $cell, "Unformatted cell $cell method"); is ($sheet->cell ($cell), $cell, "Formatted cell $cell method"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = $csv->cell2cr ($cell); is ($sheet->{cell}[$c][$r], "", "Unformatted cell $cell direct"); is ($sheet->{$cell}, "", "Formatted cell $cell direct"); is ($sheet->cell ($c, $r), "", "Unformatted cell $cell method"); is ($sheet->cell ($cell), "", "Formatted cell $cell method"); } ok ($csv = Spreadsheet::Read->new ("files/test_m.csv"), "Read/Parse M\$ csv file"); ok ($sheet = $csv->sheet (1), "Sheet 1"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = $sheet->cell2cr ($cell); is ($sheet->cell ($c, $r), $cell, "Unformatted cell $cell"); is ($sheet->cell ($cell), $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = $sheet->cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = Spreadsheet::Read->new ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } { # RT#74976 - Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = Spreadsheet::Read->new ("files/blank.csv", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.csv has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.csv", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 3"); is ($ref->[1]{maxcol}, 1, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } ok ($csv = Spreadsheet::Read->new ("files/test.csv"), "Read/Parse csv file"); ok ($csv->add ("files/test.csv"), "Add the same file"); is ($csv->sheets, 2, "Two sheets"); is_deeply ([ $csv->sheets ], [qw( files/test.csv files/test.csv[2] )], "Sheet names"); is_deeply ($csv->sheet ("files/test.csv"), $csv->sheet (2), "Compare sheets"); ok (my $sheet2 = $csv->sheet (2), "The new sheet"); is ($sheet2->label, "files/test.csv", "Original label"); is ($sheet2->label ("Hello"), "Hello", "New label"); ok (my $sheet3 = $csv->sheet ("Hello"), "Found by new label"); is_deeply ($sheet2, $sheet3, "Compare sheets"); ok ($csv->add ("files/test.csv", label => "Test"), "Add with label"); is_deeply ([ $csv->sheets ], [qw( files/test.csv files/test.csv[2] Test )], "Sheet names"); is ($csv->col2label (4), "D", "col2label as book method"); is ($csv->sheet (1)->col2label (27), "AA", "col2label as sheet method"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/410_ods.t0000644000031300001440000001652413733615702015640 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 128; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; my $pv = $parser->VERSION; print STDERR "# Parser: $parser-$pv\n"; my $notyet = $pv lt "0.25" and $tests -= 10; { my $ref; $ref = ReadData ("no_such_file.ods"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.ods"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $ods, "<", "files/test.ods" or die "files/test.ods: $!"; binmode $ods; $content = <$ods>; close $ods; } my $ods; foreach my $base ( [ "files/test.ods", "Read/Parse ods file" ], # [ $content, "Parse ods data" ], ) { my ($txt, $msg) = @$base; ok ($ods = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $ods, "ARRAY", "Return type"); is ($ods->[0]{type}, "ods", "Spreadsheet type"); is ($ods->[0]{sheets}, 2, "Sheet count"); is (ref $ods->[0]{sheet}, "HASH", "Sheet list"); unless (is (scalar keys %{$ods->[0]{sheet}}, 2, "Sheet list count")) { diag $_ for keys %{$ods->[0]{sheet}}; diag Spreadsheet::Read::_dump ("List count fail", $ods); } my $xvsn = $ods->[0]{version}; $xvsn =~ s/_[0-9]+$//; # remove beta part cmp_ok ($xvsn, ">=", 0.07, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($ods->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell") or diag Spreadsheet::Read::_dump ("Unformatted cell", $ods->[1]); is ($ods->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($ods->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($ods->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($ods->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # Tests for empty thingies ok ($ods = ReadData ("files/values.ods"), "True/False values"); ok (my $ss = $ods->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space") unless $notyet; is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0") or diag Spreadsheet::Read::_dump ("Unformatted numeric 0", $ss->{cell}->[4]->[1]); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "'", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space") unless $notyet; is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "'", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.ods", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.ods has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.ods", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '") unless $notyet; is ($ref->[1]{A1}, " ", "A1 = ' '") unless $notyet; $ref = ReadData ("files/blank.ods", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)") unless $notyet; is ($ref->[1]{A1}, "", "undef A1") unless $notyet; $ref = ReadData ("files/blank.ods", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)") unless $notyet; is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.ods", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1") unless $notyet; $ref = ReadData ("files/blank.ods", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.ods", clip => 1, strip => 0); ok ($ref, " clip strip 0"); my ($_mxr, $_mxc) = $pv lt "0.25" ? (0, 0) : (1, 1); is ($ref->[1]{maxrow}, $_mxr, "maxrow 1") or Spreadsheet::Read::_dump ("Maxrow 1", $ref); is ($ref->[1]{maxcol}, $_mxc, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '") unless $notyet; is ($ref->[1]{A1}, " ", "A1 = ' '") unless $notyet; $ref = ReadData ("files/blank.ods", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "empty (1, 1)"); is ($ref->[1]{A1}, undef, "empty A1"); $ref = ReadData ("files/blank.ods", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "empty (1, 1)"); is ($ref->[1]{A1}, undef, "empty A1"); $ref = ReadData ("files/blank.ods", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "empty (1, 1)"); is ($ref->[1]{A1}, undef, "empty A1"); $ref = ReadData ("files/blank.ods", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "empty (1, 1)"); is ($ref->[1]{A1}, undef, "empty A1"); } { sub chk_test { my ($msg, $ods) = @_; is (ref $ods, "ARRAY", "Return type for $msg"); is ($ods->[0]{type}, "ods", "Spreadsheet type ODS"); is ($ods->[0]{sheets}, 2, "Sheet count") } # chk_test my $data = $content; open my $fh, "<", "files/test.ods"; binmode $fh; chk_test ( " FH parser", ReadData ( $fh, parser => "ods")); close $fh; chk_test ("\\DATA parser", ReadData (\$data, parser => "ods")); chk_test ( " DATA no parser", ReadData ( $data )); chk_test ( " DATA parser", ReadData ( $data, parser => "ods")); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/34_dates.t0000644000031300001440000000447612266462015016075 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xls", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", undef ], A2 => [ "12-Aug", undef ], A3 => [ "8-Dec", undef ], A4 => [ "13-Aug", undef ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, undef, "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/222_csv.t0000644000031300001440000000244612543027300015632 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 4; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; my $csv; ok ($csv = ReadData ("files/macosx.csv"), "Read/Parse csv file"); #use DP; DDumper $csv; is ($csv->[1]{maxrow}, 16, "Last row"); is ($csv->[1]{maxcol}, 15, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "", "Last field"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); __END__ ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); Spreadsheet-Read-0.91/t/634_dates.t0000644000031300001440000000133114520407262016144 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 4; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } ok (my $xls = ReadData ("files/Dates.xlsx", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); ok (my $ss = $xls->[1], "sheet"); is ($ss->{attr}, undef, "attr"); ok (1, "$xls->[0]{parser} $xls->[0]{version} does not support formats"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/202_csv.t0000644000031300001440000000233411163712203015624 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 4; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; my $csv; ok ($csv = ReadData ("files/macosx.csv"), "Read/Parse csv file"); #use DP; DDumper $csv; is ($csv->[1]{maxrow}, 16, "Last row"); is ($csv->[1]{maxcol}, 15, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "", "Last field"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); __END__ ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); Spreadsheet-Read-0.91/t/637_merged.t0000644000031300001440000000120014520414573016310 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 2; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; # No merged cell support does not mean I should not be able to parse the file ok (my $xls = ReadData ("files/merged.xlsx", attr => 1), "Read merged xlsx"); ok (1, "No merged cell support in $parser"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/615_perc.t0000644000031300001440000000250613110546002015767 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/perc.xlsx", attr => 1), "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { my @type = map { $ss->{attr}[$_][$row]{type} } 0 .. 3; is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); foreach my $col (2, 3) { my $cell = ("A".."C")[$col - 1].$row; my $xvsn = $xls->[0]{version}; $xvsn =~ s/_[0-9]+$//; # remove beta part my $expect = $xvsn < 0.23 && $type[$col] eq "numeric" ? "numeric" : "percentage"; is ($type[$col], $expect, "Type $cell percentage"); } SKIP: { $ss->{B18} =~ m/[.]/ and skip "$xls->[0]{parser} $xls->[0]{version} has format problems", 1; my $i = int $ss->{"A$row"}; # Allow edge case. rounding .5 will be different in -Duselongdouble perl my $f = $ss->{"B$row"}; $row == 11 && $f eq "1%" and $i = 1; is ($f, "$i%", "Formatted values for row $row\n"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/633_misc.t0000644000031300001440000000236214520406472016005 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } #use DP;diag DDumper $xls; ok ($xls, "Open with options"); is ($xls->[1]{cell}[1], undef, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/631_clr.t0000644000031300001440000000126214520222432015616 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 3; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $xls->[$xls->[0]{sheet}{Colours}], "colors"); is ($clr->{attr}[2][2]{fgcolor}, undef, "$xls->[0]{parser} does not support colors"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/707_merged.t0000644000031300001440000000534514374661203016325 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; my $tests = 41; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("gnumeric") or plan skip_all => "Cannot use Spreadsheet::ReadGnumeric"; ok (my $ss = ReadData ("files/merged.gnumeric", attr => 1)->[1], "Read merged gnumeric"); is_deeply ($ss->{merged}, [[1, 2, 1, 3], [2, 1, 3, 2]], "Merged areas"); ok (!$ss->{attr}[1][1], "unmerged A1"); is ( $ss->{attr}[2][1]{merged}, 1, " merged B1"); is ( $ss->{attr}[3][1]{merged}, 1, " merged C1"); is ( $ss->{attr}[1][2]{merged}, 1, " merged A2"); is ( $ss->{attr}[2][2]{merged}, 1, " merged B2"); is ( $ss->{attr}[3][2]{merged}, 1, " merged C2"); is ( $ss->{attr}[1][3]{merged}, 1, " merged A3"); ok (!$ss->{attr}[2][3]{merged}, "unmerged B3"); ok (!$ss->{attr}[3][3]{merged}, "unmerged C3"); ok ($ss = Spreadsheet::Read->new ( "files/merged.gnumeric", attr => 1, merge => 1 )->sheet (1), "Read merged gnumeric" ); is ( $ss->attr (2, 1)->merged, "B1", " merged B1"); is ( $ss->attr (3, 1)->merged, "B1", " merged C1"); is ( $ss->attr (1, 2)->merged, "A2", " merged A2"); is ( $ss->attr (2, 2)->merged, "B1", " merged B2"); is ( $ss->attr (3, 2)->merged, "B1", " merged C2"); is ( $ss->attr (1, 3)->merged, "A2", " merged A3"); ok (!$ss->attr (2, 3)->merged, "unmerged B3"); ok (!$ss->attr (3, 3)->merged, "unmerged C3"); ok (!$ss->attr ("A1"), "no A1 attributes without content"); is ( $ss->attr ("B1")->merged, "B1", " merged B1"); is ( $ss->attr ("C1")->merged, "B1", " merged C1"); is ( $ss->attr ("A2")->merged, "A2", " merged A2"); is ( $ss->attr ("B2")->merged, "B1", " merged B2"); is ( $ss->attr ("C2")->merged, "B1", " merged C2"); is ( $ss->attr ("A3")->merged, "A2", " merged A3"); ok (!$ss->attr ("B3")->merged, "unmerged B3"); ok (!$ss->attr ("C3")->merged, "unmerged C3"); is_deeply ($ss->{merged}, [[1, 2, 1, 3], [2, 1, 3, 2]], "Merged areas"); ok (!$ss->merged_from ("A1"), "merged_from (A1)"); is ( $ss->merged_from (1, 1), "", "merged_from (1, 1)"); is ( $ss->merged_from ("B1"), "B1", "merged_from (B1)"); is ( $ss->merged_from (2, 1), "B1", "merged_from (2, 1)"); is ( $ss->merged_from ("C2"), "B1", "merged_from (C2)"); is ( $ss->merged_from (3, 2), "B1", "merged_from (3, 2)"); # out of range is ( $ss->merged_from ("E5"), undef, "merged_from (E5)"); # illegal ID is ( $ss->merged_from (999), undef, "merged_from (999)"); is ( $ss->merged_from ("9X"), undef, "merged_from (9X)"); is ( $ss->merged_from (999, 99), undef, "merged_from (999, 99)"); is ( $ss->merged_from (9, 9, 9), undef, "merged_from (9, 9, 9)"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/704_dates.t0000644000031300001440000000132514374661070016153 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 18; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("gnumeric") or plan skip_all => "Cannot use Spreadsheet::ReadGnumeric"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $gnumeric; ok ($gnumeric = ReadData ("files/Dates.gnumeric"), "Gnumeric date tests"); { ok (my $ss = $gnumeric->[1], "have sheet"); my @date = (undef, 39668, 39672, 39790, 39673); foreach my $r (1 .. 4) { for (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/701_clr.t0000644000031300001440000000263214374661032015630 0ustar00merijnusers#!perl use strict; use warnings; my $tests = 257; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("gnumeric") or plan skip_all => "No Gnumeric parser found"; my $book; ok ($book = ReadData ("files/attr.gnumeric", attr => 1), "Gnumeric attributes testcase"); ok (my $clr = $book->[$book->[0]{sheet}{Colours}], "have the 'Colours' sheet"); is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, "#000000", "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, "#FFFFFF", "Unspecified fill color"); my @clr = ( [], ["auto", undef], ["red", "#FF0000"], ["green", "#008000"], ["blue", "#0000FF"], ["white", "#FFFFFF"], ["yellow", "#FFFF00"], ["lightgreen", "#00FF00"], ["lightblue", "#00CCFF"], ["gray", "#808080"], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1] || "#FFFFFF"; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1] || "#000000"; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/413_misc.t0000644000031300001440000000251013733610070015770 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $pt = Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; my $pv = $pt->VERSION; $pv lt "0.25" and plan skip_all => "$pt-$pv won't reliably read the test file"; my $ods; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $ods = ReadData ("files/misc.ods", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($ods, "Open with options"); is ($ods->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $ods = ReadData ("files/misc.ods", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($ods, "Open with options"); is ($ods->[1]{cell}[1], undef, "undef works as option value for 'rc'"); ok (!exists $ods->[1]{A1}, "undef works as option value for 'cells'"); #unless ($ENV{AUTOMATED_TESTING}) { # Test::NoWarnings::had_no_warnings (); # $tests++; # } done_testing ($tests); Spreadsheet-Read-0.91/t/417_merged.t0000644000031300001440000000561613733616427016332 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 22; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; my $pv = $parser->VERSION; # ReadSXC is in transition to ParseODS by CORION $parser eq "Spreadsheet::ParseODS" && $pv lt "0.25" and plan skip_all => "No merged cell support in $parser-$pv"; ok (my $ss = ReadData ("files/merged.ods", attr => 1)->[1], "Read merged ods"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, "unmerged B1"); is ($ss->{attr}[3][1]{merged}, 1, "unmerged C1"); is ($ss->{attr}[1][2]{merged}, 1, "unmerged A2"); is ($ss->{attr}[2][2]{merged}, 1, "unmerged B2"); is ($ss->{attr}[3][2]{merged}, 1, "unmerged C2"); is ($ss->{attr}[1][3]{merged}, 1, "unmerged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); # A2:A3 B1:C2 is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); ok ($ss = Spreadsheet::Read->new ("files/merged.ods", attr => 1, merge => 1)->sheet (1), "Read merged ods"); is ($ss->attr (1, 1)->merged, 0, "unmerged A1"); is ($ss->attr (2, 1)->merged, "B1", " merged B1"); is ($ss->attr (3, 1)->merged, "B1", " merged C1"); is ($ss->attr (1, 2)->merged, "A2", " merged A2"); is ($ss->attr (2, 2)->merged, "B1", " merged B2"); is ($ss->attr (3, 2)->merged, "B1", " merged C2"); is ($ss->attr (1, 3)->merged, "A2", " merged A3"); is ($ss->attr (2, 3)->merged, 0, "unmerged B3"); is ($ss->attr (3, 3)->merged, 0, "unmerged C3"); is ($ss->attr ("A1")->merged, 0, "unmerged A1"); is ($ss->attr ("B1")->merged, "B1", " merged B1"); is ($ss->attr ("C1")->merged, "B1", " merged C1"); is ($ss->attr ("A2")->merged, "A2", " merged A2"); is ($ss->attr ("B2")->merged, "B1", " merged B2"); is ($ss->attr ("C2")->merged, "B1", " merged C2"); is ($ss->attr ("A3")->merged, "A2", " merged A3"); is ($ss->attr ("B3")->merged, 0, "unmerged B3"); is ($ss->attr ("C3")->merged, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); is ($ss->merged_from ("A1"), "", "merged_from (A1)"); is ($ss->merged_from (1, 1), "", "merged_from (1, 1)"); is ($ss->merged_from ("B1"), "B1", "merged_from (B1)"); is ($ss->merged_from (2, 1), "B1", "merged_from (2, 1)"); is ($ss->merged_from ("C2"), "B1", "merged_from (C2)"); is ($ss->merged_from (3, 2), "B1", "merged_from (3, 2)"); # out of range is ($ss->merged_from ("E5"), undef, "merged_from (E5)"); # illegal ID is ($ss->merged_from (999), undef, "merged_from (999)"); is ($ss->merged_from ("9X"), undef, "merged_from (9X)"); is ($ss->merged_from (999, 99), undef, "merged_from (999, 99)"); is ($ss->merged_from (9, 9, 9), undef, "merged_from (9, 9, 9)"); done_testing; Spreadsheet-Read-0.91/t/213_csv.t0000644000031300001440000000577013016541245015642 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 117; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "csv", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataStream ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_m.csv", sep => ";"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/414_dates.t0000644000031300001440000000510513733607341016150 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $ods; ok ($ods = ReadData ("files/Dates.ods", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", "d-mmm" ], A2 => [ "12-Aug", "d-mmm" ], A3 => [ "8-Dec", "d-mmm" ], A4 => [ "13-Aug", "d-mmm" ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); SKIP: { ok (my $ss = $ods->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); defined $attr->[2][1]{format} or skip "$ods->[0]{parser} $ods->[0]{version} does not reliably support formats", 100; my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, "d-mmm", "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } } #unless ($ENV{AUTOMATED_TESTING}) { # Test::NoWarnings::had_no_warnings (); # $tests++; # } done_testing ($tests); Spreadsheet-Read-0.91/t/31_clr.t0000644000031300001440000000247413411413207015536 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 256; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; my $xls; ok ($xls = ReadData ("files/attr.xls", attr => 1), "Excel Attributes testcase"); my $clr = $xls->[$xls->[0]{sheet}{Colours}]; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.91/t/411_clr.t0000644000031300001440000000474313733607341015634 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 266; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; my $ods; ok ($ods = ReadData ("files/attr.ods", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $ods->[$ods->[0]{sheet}{Colours}], "colors"); defined $clr->{attr}[2][2]{fgcolor} or skip "$ods->[0]{parser} $ods->[0]{version} does not reliably support colors yet", 255; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } } SKIP: { ok ($ods = Spreadsheet::Read->new ("files/attr.ods", attr => 1), "Attributes OO"); defined $ods->[1]{attr}[3][3]{fgcolor} or skip "$ods->[0]{parser} $ods->[0]{version} does not reliably support colors yet", 5; is ($ods->[1]{attr}[3][3]{fgcolor}, "#008000", "C3 Forground color direct"); is ($ods->sheet (1)->attr (3, 3)->{fgcolor},"#008000", "C3 Forground color OO rc hash"); is ($ods->sheet (1)->attr ("C3")->{fgcolor},"#008000", "C3 Forground color OO cell hash"); is ($ods->sheet (1)->attr (3, 3)->fgcolor, "#008000", "C3 Forground color OO rc method"); is ($ods->sheet (1)->attr ("C3")->fgcolor, "#008000", "C3 Forground color OO cell method"); } is ($ods->[1]{attr}[3][3]{bogus_attribute}, undef, "C3 bogus attribute direct"); is ($ods->sheet (1)->attr ("C3")->{bogus_attr}, undef, "C3 bogus attribute OO hash"); is ($ods->sheet (1)->attr ("C3")->bogus_attr, undef, "C3 bogus attribute OO method"); #unless ($ENV{AUTOMATED_TESTING}) { # Test::NoWarnings::had_no_warnings (); # $tests++; # } done_testing ($tests); Spreadsheet-Read-0.91/scripts/0000755000031300001440000000000014663305531015515 5ustar00merijnusersSpreadsheet-Read-0.91/scripts/ss2tk0000755000031300001440000001524414545015257016521 0ustar00merijnusers#!/usr/bin/perl # ss2tk: show SpreadSheet file in Tk::TableMatrix::Spreadsheet (*) # (m)'22 [2022-01-31] Copyright H.M.Brand 2005-2024 use strict; use warnings; our $VERSION = "2.81"; sub usage { my $err = shift and select STDERR; print "usage: ss2tk [options] [X11 options] file.xls []\n", " -w use as column width\n", " -L Add spreadsheet tags to top (A, B, ..Z, AB, ...)\n", " and left (1, 2, ...)\n", " --fs[=7] Set font size (default 7 if no value)\n", " --fn=name Set font Face name (default is DejaVu Sans Mono\n", " if font size is given\n"; exit $err; } # usage use Getopt::Long qw(:config bundling passthrough); my $opt_fs; GetOptions ( "help|?" => sub { usage (0); }, "w|width=i" => \my $opt_w, "L|ss|labels!" => \my $opt_L, "a|align!" => \my $opt_a, "fn|font-name=s" => \my $opt_fn, "fs|font-size:7" => \ $opt_fs, "fs-4" => sub { $opt_fs = 4; }, "fs-5" => sub { $opt_fs = 5; }, "fs-6" => sub { $opt_fs = 6; }, "fs-7" => sub { $opt_fs = 7; }, "fs-8" => sub { $opt_fs = 8; }, "fs-9" => sub { $opt_fs = 9; }, # For restarts "G|geometry=s" => \my $geometry, "W|column-widths=s" => \my $col_widths, ) or usage (1); use Data::Peek; use Spreadsheet::Read; use Tk; use Tk::Balloon; use Tk::NoteBook; use Tk::TableMatrix::Spreadsheet; # This will allow ~/.Xdefaults to have lines like #ss2tk*font: -misc-fixed-medium-r-semicondensed--12-110-75-75-c-60-iso10646-1 Tk::CmdLine->LoadResources (); # This will allow calls like # ss2tk -fg Blue4 blah.csv Tk::CmdLine->SetArguments (); @ARGV && -f $ARGV[0] or usage (1); my $title = $ARGV[0]; my $sfn = shift; my $ref = Spreadsheet::Read->new ($sfn) or die "Cannot read $sfn\n"; $ref->[0]{sheets} or die "No sheets in $title\n"; fork and exit; $opt_fn || $opt_fs and $opt_fn = "{".($opt_fn|| "DejaVu Sans Mono")."} ".($opt_fs||7); my $pat = @ARGV ? qr/$ARGV[0]/i : undef; my $mw = MainWindow->new (-title => $title); $geometry and $mw->geometry ($geometry); my $balloon = $mw->Balloon ( -state => "balloon", -initwait => 300, -foreground => "#000000", -background => "#ffffff", ); my $nb = $mw->NoteBook ()->pack (qw(-side top -expand 1 -fill both )); my @nb; foreach my $sht (1 .. $ref->[0]{sheets}) { my $s = $ref->[$sht]; $title .= " [ " . $s->{label} . " ]"; my ($data, @data) = ({}); my ($h, $w, @w) = get_data ($data, $s, \@data); $nb[$sht] = $nb->add ($sht, -label => $s->{label}, -state => "normal", -anchor => "nw"); my @ff = $opt_fn ? (-font => $opt_fn) : (); my $ss = $nb[$sht]->Scrolled ('Spreadsheet', -rows => $h, -cols => $w, -width => 10, -height => 20, -titlecols => $opt_L ? 1 : 0, -titlerows => $opt_L ? 2 : 1, -selectmode => "extended", -resizeborders => "both", -justify => "left", -anchor => "w", -variable => $data, @ff, )->pack (-expand => 1, -fill => "both", -side => "top", -anchor => "nw"); $ss->Subwidget ("${_}scrollbar")->configure (-width => 6) for qw( x y ); $ss->tagConfigure ("title", -bg => "#ffffe0", -justify => "left"); $ss->tagConfigure ("active", -bg => "#ffff40", -justify => "left"); $ss->tagConfigure ("sel", -bg => "gray95", -justify => "left"); my ($pv, $sv, $si) = ("", "", 0); sub search { $sv or return; $sv eq $pv && !$_[0] and return; $ss->selectionClear ("all"); foreach my $i ($_[0] .. $#data, 0 .. ($_[0] - 1)) { $data->{$data[$i]} =~ m/$sv/i or next; $si = $i; $ss->activate ($data[$si = $i]); $ss->selectionSet ($data[$si]); $ss->see ($data[$si]); $pv = $sv; last; } } # search my $reload = sub { $ss->clearCache; $data->{$_} = "" for @data; @data = (); $ref = Spreadsheet::Read->new ($sfn) or die "Cannot read $sfn\n"; $s = $ref->[$sht]; get_data ($data, $s, \@data); }; # reload # Search frame my $sf = $nb[$sht]->Frame ()->pack (-side => "left", -expand => 1, -fill => "both"); $sf->Label ( -text => "Search", )->pack (-side => "left", -anchor => "sw"); my $sb = $sf->Entry ( -textvariable => \$sv, )->pack (-side => "left", -anchor => "sw"); $sb->bind ("" => sub { search ($si = 0); }); $sf->Button ( -text => "Next", -command => sub { search (++$si) }, )->pack (-side => "left", -anchor => "sw"); # Control frame my $cf = $nb[$sht]->Frame ()->pack (-side => "right", -expand => 1, -fill => "both"); $cf->Button ( -text => "\x{2718}", -foreground => "#8b0000", -command => \&exit, )->pack (-side => "right", -anchor => "se"); $balloon->attach ($cf->Button ( # Restart -text => "\x{21f5}", # Restart -foreground => "#ffa500", -command => sub { my $geo = $mw->geometry; # Add column widths here exec $0, "--geometry=$geo"; }, )->pack (-side => "right", -anchor => "se"), -balloonposition => "mouse", -balloonmsg => "Restart", -msg => { Background => "Restart", separator => "Restart", }); $balloon->attach ($cf->Button ( # Reload -text => "\x{21bb}", -foreground => "#008b00", -command => $reload, )->pack (-side => "right", -anchor => "se"), -balloonposition => "mouse", -balloonmsg => "Reload", -msg => { Background => "Reload", separator => "Reload", }); my $swss = $ss->Subwidget ("spreadsheet"); # autosize columns on data (not on headers) $swss->colWidth (map { $_ => ($opt_w || $w[$_] || 4) } 0 .. $#w); $opt_a or next; $swss->tagConfigure ("numeric", -justify => "right"); foreach my $rc (keys %$data) { $data->{$rc} && $data->{$rc} =~ m/^\d+$/ or next; $swss->tagCell ("numeric", $rc); } DDumper $swss; } sub get_data { my ($dta, $s, $adta) = @_; my @c = (1, $s->{maxcol}); my ($h, $w, @w) = (0, 1, 0, (0) x $c[1]); # data height, -width, and default column widths if ($opt_L) { foreach my $c (0 .. $s->{maxcol}) { $dta->{"$h,$c"} = $c ? $ref->col2label ($c) : ""; push @$adta, "$h,$c"; } $h++; } foreach my $r (1 .. $s->{maxrow}) { my @row = map { defined $s->{cell}[$_][$r] ? $s->{cell}[$_][$r] : ""; } 1 .. $s->{maxcol}; $pat and "@row" =~ $pat || next; $opt_L and unshift @row, $r; foreach my $c (0 .. $#row) { length $row[$c] or next; $c >= $w and $w = $c + 1; $dta->{"$h,$c"} = $row[$c]; push @$adta, "$h,$c"; my $l = length $row[$c]; $l > $w[$c] and $w[$c] = $l; } ++$h % 100 or printf STDERR "%6d x %6d\r", $w, $h; } printf STDERR "%6d x %6d\n", $w, $h; #use DP;DDumper { S => $dta, A => $adta }; ($h, $w, @w); } # get_data MainLoop; Spreadsheet-Read-0.91/scripts/xlsx2csv0000755000031300001440000001503614545015305017240 0ustar00merijnusers#!/usr/bin/perl # xls2csv: Convert supported spreadsheet formats to CSV # (m)'23 [2023-12-04] Copyright H.M.Brand 2008-2024 require 5.008001; use strict; use warnings; our $VERSION = "3.10"; (my $cmd = $0) =~ s{.*/}{}; use Text::CSV_XS; use List::Util qw( first ); use Spreadsheet::Read qw( ReadData row ); sub usage { my $err = shift and select STDERR; print "usage: $cmd [-A [-N | -J c] | -o file.csv] [-s sep] [-f] [-i] file.xls\n"; print " $cmd --help | --man | --info\n"; print " --list List supported spreadsheet formats and exit\n"; print " -A --all Export all sheets (filename-sheetname.csv)\n"; print " -N --no-pfx No filene prefix on -A (sheetname.csv)\n"; print " -Z --zip Convert sheets to CSV's in ZIP\n"; print " -J s --join=s Use s to join filename-sheetname (-)\n"; print " -o f --out=f Set output filename\n"; print " -i f --in=f Set input filename\n"; print " -f --force Force overwrite output if exists\n"; print " -s s --sep=s Set CSV separator character\n"; print "Unless -A is used, all other options are passed on to xlscat\n"; @_ and print join "\n", @_, ""; exit $err; } # usage use Getopt::Long qw( :config bundling noignorecase passthrough ); GetOptions ( "help|?" => sub { usage 0; }, "V|version" => sub { print "$cmd [$VERSION]\n"; exit 0; }, "man" => sub { pod_nroff (); }, "info" => sub { pod_text (); }, "list" => sub { list_parsers (); }, "o|c|out=s" => \ my $csv, "i|x|in=s" => \ my $xls, "f|force!" => \ my $opt_f, "s|sep=s" => \ my $opt_s, "A|all!" => \ my $opt_A, "N|no-pfx!" => \ my $opt_N, "Z|zip!" => \ my $opt_Z, "J|join=s" => \(my $opt_J = "-"), "v|verbose:1" => \(my $opt_v = 0), ) or usage 1; sub list_parsers { print "Ext Parser module Req Has Def\n"; print "----- ----------------------- ----- ----- ---\n"; for (Spreadsheet::Read::parsers ()) { printf "%-5s %-23s %5s %5s %s\n", $_->{ext}, $_->{mod}, $_->{min}, $_->{vsn}, $_->{def} ? "<==" : ""; } exit 0; } # list_parsers sub pod_text { require Pod::Text::Color; my $m = $ENV{NO_COLOR} ? "Pod::Text" : "Pod::Text::Color"; my $p = $m->new (); open my $fh, ">", \my $out; $p->parse_from_file ($0, $fh); close $fh; print $out; exit 0; } # pod_text sub pod_nroff { first { -x "$_/nroff" } grep { -d } split m/:+/ => $ENV{PATH} or pod_text (); require Pod::Man; my $p = Pod::Man->new (); open my $fh, "|-", "nroff", "-man"; $p->parse_from_file ($0, $fh); close $fh; exit 0; } # pod_nroff unless ($xls) { foreach my $i (reverse 0 .. $#ARGV) { -f $ARGV[$i] or next; $xls = splice @ARGV, $i, 1; last; } } $xls or usage 1, "No input file"; -r $xls or usage 1, "Input file unreadable"; -s $xls or usage 1, "Input file empty"; my @known_ext = Spreadsheet::Read::parses (0); @known_ext or @known_ext = qw( csv ods sc sxc xls xlsx ); my $valid_ext = do { local $" = "|"; qr{ \. (?: @known_ext )}xi }; if ($opt_Z) { require Archive::Zip; $@ and die "--zip requires Archive::Zip, which could not be loaded\n"; } my %e = (n => "\n", t => "\t", e => "\e", r => "\r"); $opt_s and $opt_s =~ s/\\+([nter])/$e{$1}/g; if ($opt_A || $opt_Z) { $opt_v and warn "Reading $xls ...\n"; my $ss = ReadData ($xls) or die "Cannot read/parse $xls\n"; my $az = $opt_Z ? Archive::Zip->new : undef; $csv and $xls = $csv; $xls =~ s/$valid_ext $//ix; $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1, eol => "\r\n" }); $opt_s and $csv->sep_char ($opt_s); foreach my $si (1 .. $ss->[0]{sheets}) { my $s = $ss->[$si] or next; $s->{maxcol} or next; my $mr = $s->{maxrow} or next; my $sn = $s->{label} || "sheet-$si"; $sn =~ s/\s+$//; $sn =~ s/^\s+//; $sn =~ s/[^-\w.]+/_/g; # remove any special chars from worksheet name if ($opt_Z) { open my $fh, ">:encoding(utf-8)", \my $data; $csv->print ($fh, [ row ($s, $_) ]) for 1 .. $mr; close $fh; $az->addString ($data, "$sn.csv"); next; } my $fn = $opt_N ? "$sn.csv" : "$xls$opt_J$sn.csv"; -f $fn && !$opt_f and die "$fn already exists\n"; warn "Saving sheet to $fn ...\n"; open my $fh, ">:encoding(utf-8)", $fn or die "$fn: $!\n"; $csv->print ($fh, [ row ($s, $_) ]) for 1 .. $mr; close $fh; } if ($opt_Z) { my $fn = "$xls.zip"; -f $fn && $opt_f and unlink $fn; -f $fn and die "$fn already exists\n"; $az->writeToFileNamed ($fn) == 0 or die "$fn: $!\n"; } exit; } $csv or ($csv = $xls) =~ s/$valid_ext $/.csv/xi; if (-f $csv) { $opt_f or die "$csv already exists\n"; unlink $csv; } warn "Converting $xls to $csv ...\n"; open STDOUT, ">", $csv or die "$csv: $!\n"; $^O eq "MSWin32" and $xls = qq{"$xls"}; $opt_s and unshift @ARGV => "--sep=$opt_s"; $opt_v and unshift @ARGV => "--verbose=$opt_v"; exec { "xlscat" } "xlscat", "-c", @ARGV, $xls; __END__ =pod =head1 NAME xlsx2csv - convert spreadsheet to CSV(s) =head1 SYNOPSIS xlsx2csv [ -A [ -N || -J str ] | -o file.csv ] [-f] [-i] file.xls xlsx2csv --help | --man | --info =head1 DESCRIPTION Convert a spreadsheet (all formats supported by L) to CSV (using L). =head1 OPTIONS =over =item -? =item --help Print short usage and exit. =item --man Print this help using nroff and exit. =item --info Print this help and exit. =item -V =item --version Print the version and exit. =item -f =item --force Overwrite existing output file. =item -A =item --all Output data from all sheets. Each sheet will go to extra file with name built from output CSV-file and sheet name. =item -N =item --no-pfx If specified, dump all will not use output CSV-file but sheet name only. =item -J str =item --join=str If specified, output file names under C<-A> will join on C instead of the default C<->. =item -o CSV-file =item -c CSV-file =item --out=CSV-file Output file name (used only with C<< --all >> and without C<< --no-pfx >>). Default value is derived from XLS-file. =item -i XLS-file =item -s XLS-file =item --in=XLS-file Allows to specify input xls file. Default: Last ARGUMENT file that exists. =back =head1 SEE ALSO L, L, L =head1 AUTHOR H.Merijn Brand =head1 COPYRIGHT AND LICENSE Copyright (C) 2008-2024 H.Merijn Brand This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut Spreadsheet-Read-0.91/scripts/ssdiff0000755000031300001440000000466214372725102016726 0ustar00merijnusers#!/usr/bin/perl use 5.014000; use warnings; our $VERSION = "0.03"; our $CMD = $0 =~ s{.*/}{}r; sub usage { my $err = shift and select STDERR; print "usage: $CMD [--verbose[=1]] file.xls file.xlsx\n"; exit $err; } # usage use Spreadsheet::Read; use List::Util qw( max ); use Getopt::Long qw(:config bundling); GetOptions ( "help|?" => sub { usage (0); }, "V|version" => sub { print "$CMD [$VERSION]\n"; exit 0; }, "ccdiff!" => \ my $opt_cc, "v|verbose:2" => \(my $opt_v = 1), ) or usage (1); my $file1 = shift or usage (1); my $file2 = shift or usage (1); binmode STDOUT, ":encoding(utf-8)"; my $ss1 = Spreadsheet::Read->new ($file1) or die "Cannot read $file1: $!\n"; my $ss2 = Spreadsheet::Read->new ($file2) or die "Cannot read $file2: $!\n"; say for $ss1->sheets; if ($opt_cc) { require App::ccdiff; $@ || $App::ccdiff::VERSION lt "0.29" and die "App::ccdiff-0.29 or higher required for --cc\n" } print "< $file1\t(", scalar $ss1->sheets, " sheets)\n"; print "> $file2\t(", scalar $ss2->sheets, " sheets)\n"; foreach my $s (1 .. max map { scalar $_->sheets } $ss1, $ss2) { my $s1 = $ss1->sheet ($s); my $s2 = $ss2->sheet ($s); unless ($s1) { print "$s: not in $file1\n"; last; } unless ($s2) { print "$s: not in $file2\n"; last; } printf "Sheet %d\n\t< %5d x %5d %s\n\t> %5d x %5d %s\n", $s, $s1->maxcol, $s1->maxrow, $s1->label, $s2->maxcol, $s2->maxrow, $s2->label; if ($opt_cc) { my @c; foreach my $ss ($s1, $s2) { push @c => [ map { join ("|" => @$_) . "\n" } [ map { $ss->col2label ($_) } 1 .. $ss->maxcol ], map { [ $ss->row ($_) ] } 1 .. $ss->maxrow ]; } App::ccdiff::ccdiff (@c, { header => 0, unified => 3, "utf-8" => 1 }); next; } my $mc = max map { $_->maxcol } $s1, $s2; foreach my $r (1 .. max map { $_->maxrow } $s1, $s2) { if ($r > $s1->maxrow) { print "$s: EOS in $file1 at row $r\n"; last; } if ($r > $s2->maxrow) { print "$s: EOS in $file2 at row $r\n"; last; } my @r1 = $s1->row ($r); my @r2 = $s2->row ($r); foreach my $c (1 .. $mc) { my $c1 = $r1[$c]; my $c2 = $r2[$c]; if (defined $c1) { if (defined $c2) { $c1 eq $c2 and next; print "$s: ($r, $c)\n\t< $c1\n\t> $c2\n"; next; } print "$s: ($r, $c)\n\t< $c1\n\t> -- undefined --\n"; next; } defined $c2 or next; print "$s: ($r, $c)\n\t< -- undefined --\n\t> $c2\n"; } } } Spreadsheet-Read-0.91/scripts/xlscat0000755000031300001440000005626514645227501016757 0ustar00merijnusers#!/usr/bin/perl # xlscat: show supported spreadsheet file as Text # xlsgrep: grep pattern # (m)'24 [2024-07-15] Copyright H.M.Brand 2005-2024 require 5.008001; use strict; use warnings; our $VERSION = "3.31"; (my $CMD = $0) =~ s{.*[\/]}{}; my $is_grep = $0 =~ m/grep$/; # xlsgrep sub usage { my $err = shift and select STDERR; my $p = $is_grep ? " pattern" : ""; print join "\n" => "usage: $CMD\t[-s ] [-L] [-n] [-A] [-u] [Selection]$p file.xls", " \t[-c | -m] [-u] [Selection]$p file.xls", " \t -i [-S sheets]$p file.xls", " Generic options:", " -v[#] Set verbose level (xlscat/xlsgrep)", " -d[#] Set debug level (Spreadsheet::Read)", " --list Show supported spreadsheet formats and exit", " -u Use unformatted values", " --strip[=#] Strip leading and/or traing spaces of all cells", " # & 01 = leading, # & 02 = trailing, 3 = default", " --clip=# Clip cells to max length #", " --noclip Do not strip empty sheets and", " trailing empty rows and columns", " --no-empty Skip empty rows", " --no-nl[=R] Replace all newlines in cells with R (default space)", " -e Set encoding for input and output", " -b Set encoding for input", " -a Set encoding for output", " -U Set encoding for output to utf-8 (short for -a utf-8)", " Input CSV:", " --in-sep=c Set input sep_char for CSV (c can be 'TAB')", " Input XLS:", " --dtfmt=fmt Specify the default date format to replace 'm-d-yy'", " the default replacement is 'yyyy-mm-dd'", " --passwd=pw Specify the password for workbook", " if pw = -, read password from keyboard", " --formulas Show the formula instead of the value", " Output Text (default):", " -s Use separator . Default '|', \\n allowed", " Overrules ',' when used with --csv", " -L Line up the columns", " -B --box Like -L but also add outer frame", " -n [skip] Number lines (prefix with column number)", " optionally skip (header) lines", " -A Show field attributes in ANSI escapes", " -h[#] Show # header lines", " -D Dump each record with Data::Peek or Data::Dumper", " --hash Like -D but as hash with first row as keys", " Output CSV:", " -c Output CSV, separator = ','", " -m Output CSV, separator = ';'", $is_grep ? ( " Grep options:", " -i Ignore case", " -w Match whole words only") : ( " Output Index only:", " -i Show sheet names and size only"), " Output HTML:", " -H Output HTML", " Selection:", " -S Only print sheets . 'all' is a valid set", " Default only prints the first sheet", " -R Only print rows . Default is 'all'", " Ranges and lists supported as 2,4-7,8-", " Trailing - is to end of data", " Negative rows count from tail -8--2 is allowed", " --head[=n] Alias for -R1..n where n defaults to 10", " --tail[=n] Alias for -R-n- where n defaults to 10", " --first=C Only show rows where column C is a 'new' value", " (suppress rows where value in column C is seen", " before in column C). That includes empty fields", " -C Only print columns . Default is 'all'", " -F Only fields e.g. -FA3,B16", " Ordering (column numbers in result set *after* selection):", " --sort=spec Sort output (e.g. --sort=3,2r,5n,1rn+2)", " +# - first # lines do not sort (header)", " # - order on column # lexical ascending", " #n - order on column # numeric ascending", " #r - order on column # lexical descending", " #rn - order on column # numeric descending", "", "Examples:", " xlscat -i foo.xls", " xlscat --in-sep=: --sort=3n -L /etc/passwd", " xlsgrep pattern file.ods", ""; @_ and print join "\n", @_, ""; exit $err; } # usage use Encode qw( encode decode ); use List::Util qw( first ); use Data::Dumper; use Spreadsheet::Read; use Getopt::Long qw(:config bundling noignorecase passthrough); my $opt_c; # Generate CSV my $opt_F = ""; # Fields to print my $opt_v = 0; # Verbosity for xlscat my $opt_d = 0; # Debug level for Spreadsheet::Read my $opt_h = 0; # Number of header lines for grep or -L my $opt_D = 0; # Dump: 0 = none, 1 = array, 2 = hash my $clip = 1; my $enc_bom; # CSV input encoding derived from BOM my $enc_i; # Input encoding my $enc_o; # Output encoding GetOptions ( "help|?" => sub { usage (0); }, "V|version" => sub { print "$CMD [$VERSION] Spreadsheet::Read [$Spreadsheet::Read::VERSION]\n"; exit 0; }, "list" => sub { list_parsers (); }, # Input CSV "c|csv" => sub { $opt_c = "," }, "m|ms" => sub { $opt_c = ";" }, "insepchar". "|in-sep". "|in-sep-char=s" => \my $sep, # Input field sep for CSV # Input XLS "dtfmt". "|date-format=s" => \my $dtfmt, # Default date-format for Excel "f|formulas!" => \my $opt_f, # Show the formula instead of the value "password=s" => \my $passwd, # For encrypted spreadsheets # Output "i|index". "|ignore-case!" => \my $opt_i, # Index (cat) | ignore_case (grep) "s|separator|sep". "|outsepchar". "|out-sep". "|out-sep-char=s" => \my $opt_s, # Text separator "S|sheets=s" => \my $opt_S, # Sheets to print "R|rows=s" => \my $opt_R, # Rows to print "head:10" => \my $opt_head, "tail:10" => \my $opt_tail, "first=s" => \my $opt_first, "C|columns=s" => \my $opt_C, # Columns to print "F|fields=s" => \ $opt_F, "L|fit|align!" => \my $opt_L, # Auto-size/align columns "B|box|frame!" => \my $opt_B, # Align and add outer frame "P|pivot!" => \my $pivot, "n|number:0" => \my $opt_n, # Prefix lines with column number "A|ansi|color!" => \my $opt_A, # Show field colors in ANSI escapes "u|unformatted!" => \my $opt_u, # Show unformatted values "v|verbose:1" => \$opt_v, "d|debug:1" => \$opt_d, "D|dump!" => \ $opt_D, # Use Data::Peek or Data::Dumper "hash!" => sub { $opt_D = 2 }, "H|html:1" => \my $opt_H, # Output in HTML "noclip" => sub { $clip = 0 }, "strip:3" => \my $strip, "clip=i" => \my $clip_len, "sort=s" => \my $sort_order, "no-empty" => \my $skip_empty, "N|no-nl:s" => \my $opt_N, # Encoding "e|encoding=s" => sub { $enc_i = $enc_o = $_[1] }, "b|encoding-in=s" => \$enc_i, "a|encoding-out=s" => \$enc_o, "U|utf-8|utf8" => sub { $enc_o = "utf-8" }, # Grep "w|word!" => \my $opt_w, # Grep words "h|header:1" => \$opt_h, ) or usage 1, "GetOpt: $@"; sub list_parsers { my $err = shift || 0; print "Ext Parser module Req Has Def\n"; print "-------- ------------------------- ----- ----- ---\n"; for (Spreadsheet::Read::parsers ()) { $_->{ext} =~ m/^zzz/ and next; printf "%-8s %-25s %5s %5s %s\n", $_->{ext}, $_->{mod}, $_->{min}, $_->{vsn}, $_->{def} ? "<==" : ""; } exit $err; } # list_parsers $opt_head and $opt_R = "1-$opt_head"; $opt_tail and $opt_R = "-$opt_tail-"; $opt_B and $opt_L++; unless ($is_grep) { $opt_i && $opt_L and usage 1, "Options i and L are mutually exclusive"; $opt_i && $opt_s and usage 1, "Options i and s are mutually exclusive"; $opt_i && $opt_c and usage 1, "Options i and c are mutually exclusive"; $opt_i && $opt_u and usage 1, "Options i and u are mutually exclusive"; $opt_i && $opt_S and usage 1, "Options i and S are mutually exclusive"; $opt_i && $opt_R and usage 1, "Options i and R are mutually exclusive"; $opt_i && $opt_C and usage 1, "Options i and C are mutually exclusive"; $opt_i && $opt_F and usage 1, "Options i and F are mutually exclusive"; $opt_i && $opt_H and usage 1, "Options i and H are mutually exclusive"; } $opt_c && $opt_H and usage 1, "Options c and H are mutually exclusive"; $opt_s && $opt_H and usage 1, "Options s and H are mutually exclusive"; my %e = (a => "\a", b => "\b", e => "\e", f => "\f", n => "\n", r => "\r", t => "\t"); $opt_s and $opt_s =~ s/\\+([abefnrt])/$e{$1}/g; defined $opt_S or $opt_S = $opt_i || $is_grep ? "all" : "1"; defined $opt_N && !length $opt_N and $opt_N = " "; $opt_i && !$is_grep && $opt_v < 1 and $opt_v = 1; $opt_f and $opt_A = 1; if ($opt_c) { $opt_L = 0; # Cannot align CSV if ($opt_s) { $opt_c = $opt_s; $opt_s = undef; } $opt_c =~ m/^1?$/ and $opt_c = ","; $opt_c = Text::CSV_XS->new ({ binary => 1, sep_char => $opt_c, eol => "\r\n", }); } # Debugging. Prefer Data::Peek over Data::Dumper if available { my $dp = eval { require Data::Peek; 1 }; sub ddumper { $dp ? Data::Peek::DDumper (@_) : print STDERR Dumper (@_); } # ddumper } my @RDarg; for (reverse 0 .. $#ARGV) { $ARGV[$_] =~ m/^--([-\w]+)(?:=(.*))?$/ or next; push @RDarg, $1, defined $2 ? $2 : 1; $RDarg[-2] =~ tr/-/_/; splice @ARGV, $_, 1; } my $pattern; if ($is_grep) { $pattern = shift or usage 1; $opt_w and $pattern = "\\b$pattern\\b"; $opt_i and $pattern = "(?i:$pattern)"; $pattern = qr{$pattern}; $opt_v > 1 and warn "Matching on $pattern\n"; } my $file = shift; if (defined $file and $file ne "-") { $opt_v > 1 and warn "Using $file as input\n"; -f $file or usage 1, "the file argument is not a regular file"; -s $file or usage 1, "the file is empty"; if ($file =~ m/\.csv$/i and open my $fh, "<", $file) { # Auto-BOM my $l = <$fh>; close $fh; if ($l =~ s/^\x00\x00\xfe\xff//) { $enc_bom = "utf-32be" } elsif ($l =~ s/^\xff\xfe\x00\x00//) { $enc_bom = "utf-32le" } elsif ($l =~ s/^\xfe\xff//) { $enc_bom = "utf-16be" } elsif ($l =~ s/^\xff\xfe//) { $enc_bom = "utf-16le" } elsif ($l =~ s/^\xef\xbb\xbf//) { $enc_bom = "utf-8" } elsif ($l =~ s/^\xf7\x64\x4c//) { $enc_bom = "utf-1" } elsif ($l =~ s/^\xdd\x73\x66\x73//) { $enc_bom = "utf-ebcdic" } elsif ($l =~ s/^\x0e\xfe\xff//) { $enc_bom = "scsu" } elsif ($l =~ s/^\xfb\xee\x28//) { $enc_bom = "bocu-1" } elsif ($l =~ s/^\x84\x31\x95\x33//) { $enc_bom = "gb-18030" } elsif ($l =~ s/^\x{feff}//) { $enc_bom = "" } if ($enc_bom and open $fh, "<:encoding($enc_bom)", $file) { $opt_v > 1 and warn "Opened $file with encoding $enc_bom after BOM detection\n"; read $fh, (my $bom), 1; # Skip BOM $file = $fh; push @RDarg, parser => "CSV"; } } } else { $opt_v > 1 and warn "Working as a pipe\n"; $file = *ARGV; } if ($opt_c) { Spreadsheet::Read::parses ("csv") or die "No CSV module found\n"; eval q{use Text::CSV_XS}; } if ($opt_H) { $enc_o = "utf-8"; $opt_H = sub { $_[0]; }; eval q{ use HTML::Entities; $opt_H = sub { encode_entities (Encode::is_utf8 ($_[0]) ? $_[0] : decode ("utf-8", $_[0])); }; }; } if ($sep) { my %sep = ( tab => "\t", pipe => "|", colon => ":", semicolon => ";", comma => ",", ); $sep = $sep{lc $sep} || $sep; } push @RDarg, debug => $opt_d, clip => $clip; $opt_A and push @RDarg, attr => 1; defined $sep and push @RDarg, sep => $sep, parser => "csv"; defined $dtfmt and push @RDarg, dtfmt => $dtfmt; $strip and push @RDarg, strip => $strip; $pivot and push @RDarg, pivot => $pivot; if ($passwd) { if ($passwd eq "-") { print STDERR "Password: "; eval "use Term::ReadKey;"; eval { ReadMode ("noecho"); }; chomp ($passwd = ); eval { ReadMode ("echo"); }; } push @RDarg, passwd => $passwd; } $opt_v > 4 and warn "ReadData ($file, @RDarg);\n"; my $xls = eval { ReadData ($file, @RDarg) }; $opt_v > 7 and ddumper ($xls); unless ($xls) { warn "cannot read $file\n"; if ($@) { my $e = $@; $e =~ s{\s+at\s+\S+\s+line\s.*}{}s; $e =~ s{\s+\(perhaps you forgot to load.*}{}s; warn "$e\n"; } if (my @e = sort grep m/^SPREADSHEET_READ_/ => keys %ENV) { warn "\n"; warn " $_ is set to $ENV{$_}\n" for @e; warn "\n"; } if ($@ =~ m/cannot|can't/) { print "Supported parsers per spreadsheet:\n"; list_parsers (-1); } exit -1; } if ($xls->[0]{parser} =~ m/Spreadsheet::XLSX/) { warn "You parse with Spreadsheet::XLSX, which is deprecated\n"; warn "Please use Spreadsheet::ParseXLSX for more reliable results\n"; } my $sc = $xls->[0]{sheets} or die "No sheets in $file\n"; $opt_v and warn $opt_v > 1 ? join " " => "Spreadsheet::Read-$Spreadsheet::Read::VERSION", "parsed $file with $sc sheets", "using $xls->[0]{parser}-$xls->[0]{version}\n" : "Parsed $file with $sc sheets\n"; $opt_S eq "all" and $opt_S = "1..$sc"; # all $opt_S =~ s/-$/-$sc/; # 3,6- $opt_S =~ s/-/../g; my %print; eval "%{\$print{sheet}} = map { \$_ => 1 } $opt_S"; my $v_fmt = $opt_C || $opt_R || $opt_F ? "" : "%6d x %6d%s"; # New style xterm (based on ANSI colors): # 30 Black # 31 Red # 32 Green # 33 Yellow # 34 Blue # 35 Magenta # 36 Cyan # 37 White sub color_reduce { my ($rgb, $base) = @_; defined $rgb or return ""; my ($r, $g, $b) = map { hex >> 7 } ($rgb =~ m/^\s*#?([\da-f]{2})([\da-f]{2})([\da-f]{2})/); $base + 4 * $b + 2 * $g + $r; } # color_reduce sub ansi_color { my ($fg, $bg, $bold, $ul) = @_; # warn "$fg on $bg $bold $ul\n"; my $attr = join ";", 0, grep { /\S/ } $bold ? 1 : "", $ul ? 4 : "", color_reduce ($fg, 30), color_reduce ($bg, 40); "\e[${attr}m"; } # ansi_color sub css_color { my ($fg, $bg, $bold, $ul, $ha) = @_; my @css; $bold and push @css, "font-weight: bold"; $ul and push @css, "text-decoration: underline"; $fg and push @css, "color: $fg"; $bg and push @css, "background: $bg"; $ha and push @css, "text-align: $ha"; local $" = "; "; @css ? qq{ style="@css"} : ""; } # css_color binmode STDERR, ":encoding(utf-8)"; $enc_o and binmode STDOUT, ":encoding($enc_o)"; if ($opt_H) { print <<"EOH"; $file EOH } my %first; if ($opt_first) { $opt_first =~ m/^([a-zA-Z]+)[0-9]*$/ and $opt_first = (cell2cr (uc $1 . "1"))[0]; $opt_first =~ m/^[0-9]+$/ && $opt_first > 0 or die "--first=C requires a numeric column index or a column index letter\n"; } my $name_len = 30; if ($opt_i) { my $nl = 0; foreach my $sn (keys %{$xls->[0]{sheet}}) { length ($sn) > $nl and $nl = length $sn; } $nl and $name_len = $nl; } my @opt_F = split m/[^A-Z\d]+/ => $opt_F; foreach my $si (1 .. $sc) { my @data; exists $print{sheet}{$si} or next; $opt_v > 1 and warn "Opening sheet $si ...\n"; my $s = $xls->[$si] or next; $opt_v > 5 and ddumper ($s); my @r = (1, $s->{maxrow}); my @c = (1, $s->{maxcol}); my ($sn, $nr, $nc) = ($s->{label}, $r[-1], $c[-1]); defined $nr or next; defined $nc or next; defined $sn or $sn = ""; my $active = $s->{active} ? " (Active)" : ""; my $hidden = $s->{hidden} ? " (Hidden)" : ""; $opt_v and printf STDERR "%s - %02d: [ %-*s ] %3d Cols, %5d Rows%s%s\n", $file, $si, $name_len, $sn, $nc, $nr, $active, $hidden; $opt_i && !$is_grep and next; if (@opt_F) { foreach my $fld (@opt_F) { $is_grep && defined $s->{$fld} && $s->{$fld} !~ $pattern and next; print "$fld:",$s->{$fld},"\n"; } next; } if (my $rows = $opt_R) { $rows eq "all" and $rows = "1..$nr"; # all $rows =~ s/--(\d+)/-($nr+1-$1)/ge; # 3--2 $rows =~ s/-(\d+)(?=-)/($nr+1-$1)/ge; # -3- $rows =~ s/-$/-$nr/; # 3,6- $rows =~ s/-/../g; eval "%{\$print{row}} = map { \$_ => 1 } $rows"; } if (my $cols = $opt_C) { $cols eq "all" and $cols = "1..$nc"; # all if ($cols =~ m/[A-Za-z]/) { # -C B,D => -C 2,4 my %ct = map { my ($cc, $rr) = cell2cr (uc "$_".1); ($_ => $cc) } ($cols =~ m/([a-zA-Z]+)/g); $cols =~ s/([A-Za-z]+)/$ct{$1}/g; } $cols =~ s/-$/-$nc/; # 3,6- $cols =~ s/-/../g; eval "\$print{col} = [ map { \$_ - 1 } $cols ]"; $nc = @{$print{col}}; } $opt_v >= 8 and ddumper (\%print); $opt_H and print qq{

$sn

\n\n\n}; my $undef = $opt_v > 2 ? "-- undef --" : ""; my ($h, @w) = (0, (0) x $nc); # data height, -width, and default column widths my @align = ("") x $nc; foreach my $r ($r[0] .. $r[1]) { exists $print{row} && !exists $print{row}{$r} and next; my @att; my @row = map { my $cell = cr2cell ($_, $r); my ($uval, $fval) = map { defined $_ ? $enc_i ? decode ($enc_i, $_) : $_ : $undef } $s->{cell}[$_][$r], $s->{$cell}; if (defined $opt_N) { s/\n/$opt_N/go for grep { defined } $uval, $fval; } if ($clip_len) { $_ = substr $_, 0, $clip_len - 1 for grep { length > $clip_len } $uval, $fval; } $opt_v > 2 and warn "$_:$r '$uval' / '$fval'\n"; $opt_A and push @att, [ @{$s->{attr}[$_][$r]}{qw( fgcolor bgcolor bold uline halign )} ]; $opt_f && $s->{attr}[$_][$r]{formula} ? "=".$s->{attr}[$_][$r]{formula} : defined $s->{cell}[$_][$r] ? $opt_u ? $uval : $fval : ""; } $c[0] .. $c[1]; $r == 1 && $row[0] && defined $enc_bom and $row[0] =~ s/^\N{BOM}//; exists $print{col} and @row = @row[grep{$_<@row}@{$print{col}}]; $is_grep && $r > $opt_h && ! first { defined $_ && $_ =~ $pattern } @row and next; $skip_empty && ! first { length } @row and next; if ($opt_first) { @row >= $opt_first && $first{$row[$opt_first - 1]}++ and next; } if ($opt_D) { ddumper ($opt_D == 1 ? \@row : { map { $s->{cell}[$_ + 1][1] => $row[$_] } 0 .. $#row }); next; } if ($opt_H) { # HTML print " "; if (defined $opt_n) { my $x = $r - $opt_n; $x <= 0 and $x = ""; my $c = $r % 2 ? qq{ class="odd"} : ""; print qq{}; } foreach my $c (0 .. $#row) { my $css = css_color (@{$att[$c]}); $r % 2 and $css .= qq{ class="odd"}; my $td = $opt_H->($row[$c]); print "$td"; } print "\n"; next; } if (defined $opt_n) { unshift @row, $r; unshift @att, [ "#ffffff", "#000000", 0, 0 ]; } if ($opt_L || $sort_order) { # Autofit / Align / order push @data, [ [ @row ], [ @att ] ]; next; } if ($opt_c) { # CSV $opt_c->print (*STDOUT, \@row) or die $opt_c->error_diag; next; } if ($opt_A) { foreach my $c (0 .. $#row) { $row[$c] = ansi_color (@{$att[$c]}). $row[$c] . "\e[0m"; } } line (0, $opt_s => @row); } continue { ++$h % 100 == 0 && $opt_v && $v_fmt and printf STDERR $v_fmt, $nc, $h, "\r"; } $opt_H and print "
$x
\n\n"; $v_fmt && $v_fmt and printf STDERR $v_fmt, $nc, $h, "\n"; if ($sort_order) { my @o; my @h; $sort_order =~ s/\+([0-9]+)\b// and @h = splice @data, 0, $1; for ($sort_order =~ m/([0-9]+[rn]*)/g) { m/^([0-9]+)(.*)/; push @o, { col => $1 - 1, map { $_ => 1 } split m// => $2 }; } my $sort = sub { my $d = 0; foreach my $o (@o) { my ($A, $B) = map { $_->[0][$o->{col}] || 0 } $a, $b; $d = $o->{n} ? $o->{r} ? $B <=> $A : $A <=> $B : $o->{r} ? $B cmp $A : $A cmp $B and return $d; } return $d; }; @data = (@h, sort $sort @data); } if ($opt_c && @data) { # CSV $opt_c->print (*STDOUT, $_->[0]) for @data; next; } $opt_L || $sort_order or next; if (defined $opt_n) { unshift @w, length $data[-1][0][0]; unshift @align, ""; } $opt_n = 0; if ($opt_L) { foreach my $r (0 .. $#data) { my $R = $data[$r][0]; foreach my $c (0 .. $#$R) { my $d = $R->[$c]; my $l = length $d; $l > $w[$c] and $w[$c] = $l; # Number alignment won't be effective if first row is empty and # second row has column headers $r && $d =~ m/\S/ or next; $d =~ m/^(?:-|\s*(?:-\s*)?[0-9][0-9 .,]*)$/ or $align[$c] = "-"; } } if ($skip_empty) { # Skip empty columns. Rows have already been skipped foreach my $i ( reverse 0 .. $#w) { $w[$i] and next; splice @w, $i, 1; splice @align, $i, 1; splice @$_, $i, 1 for grep { $#$_ >= $i } map { @{$_} } @data; } } } $opt_B and line (1, $opt_s => map { "-" x $w[$_] } 0..$#{$data[0][0]}); for (@data) { my ($row, $att) = @$_; my @row = @$row; for (0 .. $#row) { my $l = length $row[$_]; my $w = $l < $w[$_] ? " " x ($w[$_] - $l) : ""; if ($align[$_]) { $_ < $#row || $opt_B and $row[$_] .= $w; } else { substr $row[$_], 0, 0, $w; } if ($opt_A) { substr $row[$_], 0, 0, ansi_color (@{$att->[$_]}); $row[$_] .= "\e[0m"; } } line (0, $opt_s => @row); ++$opt_n == $opt_h and line (2, $opt_s => map { "-" x $w[$_] } 0..$#row); } $opt_B and line (3, $opt_s => map { "-" x $w[$_] } 0..$#{$data[0][0]}); } $opt_H and print "\n\n"; sub line { my $uh = "\x{2500}"; # BOX DRAWINGS LIGHT HORIZONTAL my $uv = "\x{2502}"; my @tpl = ($uv, "\x{250c}", "\x{251c}", "\x{2514}"); my @tpm = ($uv, "\x{252c}", "\x{253c}", "\x{2534}"); my @tpr = ($uv, "\x{2510}", "\x{2524}", "\x{2518}"); my $type = shift; # 0: data, 1: top, 2: middle, 3: bottom my $sep = shift || " $uv "; my @dta = @_; if ($opt_L) { $type > 0 and $sep =~ s/ /-/g; if ($sep =~ m/$uv/) { $sep =~ s/-/$uh/g; $sep =~ s/$uv/$tpm[$type]/; if ($type > 0) { s/-/$uh/g for grep { length } @dta; } } elsif ($type > 0) { $sep =~ s/\|/+/; } } my $line = join $sep => @dta; if ($opt_B) { # Cannot use s///r for 5.8.x (my $s1 = $sep) =~ s/^(?:\s|$uh)[\x{2500}-\x{25ff}]/$tpl[$type]/; substr $line, 0, 0, $s1; (my $s2 = $sep) =~ s/[\x{2500}-\x{25ff}](?:\s|$uh)$/$tpr[$type]/; $line .= $s2; } !$enc_o && Encode::is_utf8 ($line) and $line = encode ("utf-8", $line); print $line; print "\n"; } # line END { if ($opt_v >= 7) { my %seen; print "\nNon-CORE modules loaded:\n", "-" x 25, " ", "--------\n"; foreach my $mod (sort keys %INC) { my $path = $INC{$mod}; $mod =~ s{\.pm$}{} or next; $mod =~ s{/}{::}g; $path =~ s{.*/site_perl/}{} or next; grep { $mod =~ m/^${_}::/ } keys %seen and next; $seen{$mod}++; my $v = $mod->VERSION () || eval "\$${mod}::VERSION" || "?"; printf "%-25s %s\n", $mod, $v; } } } Spreadsheet-Read-0.91/README0000644000031300001440000000441114600537141014701 0ustar00merijnusers=head1 NAME Spreadsheet::Read - Meta-Wrapper for reading spreadsheet data =head1 SYNOPSIS use Spreadsheet::Read; my $ref = ReadData ("file.xls"); =head1 DESCRIPTION Spreadsheet::Read offers a uniformed wrapper to Spreadsheet::ParseExcel and Spreadheet::ReadSXC to give the end-user a single point of view to various types of spreadsheets and deal with these in a transparent way. For more thorough documentation please refer to the perl documentation in the module in pod format, or $ man Spreadsheet::Read after installation. =head1 INSTALLATION $ perl Makefile.PL $ make $ make test $ make install If the C warns you in the xls tests, read the message and apply the generated patch. Spreadsheet::ParseExcel has a small bug in the parsing of the default format regarding UTF-8. This module requires perl-5.8.1 or newer. It might still work under perl-5.8.0 or perl-5.6.x, but only if Encode is also available. The code might need some minor changes. Recent changes can be (re)viewed in the public GIT repository at https://github.com/Tux/Spreadsheet-Read Feel free to clone your own copy: $ git clone https://github.com/Tux/Spreadsheet-Read Spreadsheet-Read or get it as a tgz: $ wget --output-document=Spreadsheet-Read-git.tgz \ 'https://github.com/Tux/Spreadsheet-Read/archive/master.tar.gz' =head1 TOOLS Installing this module will optionally (default is yes) also install some useful tools that use Spreadsheet::Read. At least two are know to cause a possible name clash: * xls2csv also exists as https://metacpan.org/release/KEN/xls2csv-1.06 Mine existed before that script, and this version dates from 2005 * ssdiff also exists in the gnumeric package with similar functionality =head1 TODO * Make tests for scripts/xlscat * Support Parsers native module options * Check if Tk is installed before asking if ss2tk is wanted * Test diagnostics output * Support Spreadsheet::Perl * Support Data::XLSX::Parser * Steal options from other CSV/Spreadsheet tools to implement in xlscat and xlsgrep =head1 AUTHOR H.Merijn Brand =head1 COPYRIGHT AND LICENSE Copyright (C) 2005-2024 H.Merijn Brand This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut Spreadsheet-Read-0.91/MANIFEST0000644000031300001440000000422114663305531015156 0ustar00merijnusersChanges CONTRIBUTING.md cpanfile scripts/ss2tk scripts/ssdiff scripts/xlscat scripts/xlsx2csv examples/ss-dups-tk.pl files/Active2.xls files/Active2.xlsx files/attr.gnumeric files/attr.ods files/attr.xls files/attr.xlsx files/blank.csv files/blank.ods files/blank.xls files/blank.xlsx files/clear.ods files/content.xml files/Dates.gnumeric files/Dates.ods files/Dates.xls files/Dates.xlsx files/empty.csv files/empty.ods files/empty.sc files/empty.sxc files/empty.txt files/empty.xls files/empty.xlsx files/example.xlsx files/gnumeric.gnumeric files/gnumeric.xml files/hidden.xlsx files/macosx.csv files/macosx.xls files/merged.gnumeric files/merged.ods files/merged.xls files/merged.xlsx files/misc.ods files/misc_ws.xls files/misc.xls files/misc.xlsx files/perc.ods files/perc.xls files/perc.xlsx files/test.csv files/test.gnumeric files/test_m.csv files/test_m.txt files/test.ods files/test.sc files/test.sxc files/test_t.csv files/test_t.txt files/test.txt files/test_x.csv files/test.xls files/test.xlsx files/test_x.txt files/values.ods files/values.xls files/values.xlsx Makefile.PL MANIFEST README Read.pm t/10_basics.t t/11_call.t t/200_csv.t t/201_csv.t t/202_csv.t t/203_csv.t t/204_csv.t t/205_csv.t t/210_csv.t t/211_csv.t t/212_csv.t t/213_csv.t t/214_csv.t t/220_csv.t t/221_csv.t t/222_csv.t t/223_csv.t t/224_csv.t t/30_xls.t t/31_clr.t t/33_misc.t t/32_fmt.t t/34_dates.t t/35_perc.t t/36_xls.t t/37_merged.t t/410_ods.t t/411_clr.t t/412_fmt.t t/413_misc.t t/414_dates.t t/415_perc.t t/417_merged.t t/420_sxc.t t/425_ods.t t/426_clr.t t/50_sc.t t/51_sc.t t/600_xlsx.t t/601_clr.t t/602_fmt.t t/603_misc.t t/604_dates.t t/605_perc.t t/607_merged.t t/610_xlsx.t t/611_clr.t t/612_fmt.t t/613_misc.t t/614_dates.t t/615_perc.t t/617_merged.t t/620_xlsx.t t/621_clr.t t/622_fmt.t t/623_misc.t t/624_dates.t t/625_perc.t t/627_merged.t t/630_xlsx.t t/631_clr.t t/632_fmt.t t/633_misc.t t/634_dates.t t/635_perc.t t/637_merged.t t/700_gnumeric.t t/701_clr.t t/702_fmt.t t/704_dates.t t/707_merged.t t/999_fail.t META.yml Module YAML meta-data (added by MakeMaker) META.json Module JSON meta-data (added by MakeMaker) Spreadsheet-Read-0.91/cpanfile0000644000031300001440000000473614663305531015544 0ustar00merijnusersrequires "Carp"; requires "Data::Dumper"; requires "Data::Peek"; requires "Encode"; requires "Exporter"; requires "File::Temp" => "0.22"; # ignore : CVE-2011-4116 requires "List::Util"; recommends "Data::Dumper" => "2.183"; recommends "Data::Peek" => "0.52"; recommends "Encode" => "3.21"; recommends "File::Temp" => "0.2311"; recommends "IO::Scalar"; suggests "Data::Dumper" => "2.189"; on "configure" => sub { requires "ExtUtils::MakeMaker"; recommends "ExtUtils::MakeMaker" => "7.22"; suggests "ExtUtils::MakeMaker" => "7.70"; }; on "test" => sub { requires "Test::Harness"; requires "Test::More" => "0.88"; requires "Test::NoWarnings"; recommends "Test::More" => "1.302201"; }; feature "opt_csv", "Provides parsing of CSV streams" => sub { requires "Text::CSV_XS" => "0.71"; recommends "Text::CSV" => "2.04"; recommends "Text::CSV_PP" => "2.04"; recommends "Text::CSV_XS" => "1.56"; }; feature "opt_gnumeric", "Provides parsing of Gnumeric spreadsheets" => sub { requires "Spreadsheet::ReadGnumeric" => "0.2"; recommends "Spreadsheet::ReadGnumeric" => "0.4"; }; feature "opt_ods", "Provides parsing of OpenOffice spreadsheets" => sub { requires "Spreadsheet::ParseODS" => "0.26"; recommends "Spreadsheet::ParseODS" => "0.39"; }; feature "opt_sxc", "Provides parsing of OpenOffice spreadsheets old style" => sub { requires "Spreadsheet::ReadSXC" => "0.26"; recommends "Spreadsheet::ReadSXC" => "0.39"; }; feature "opt_tools", "Spreadsheet tools" => sub { recommends "Tk" => "804.036"; recommends "Tk::NoteBook"; recommends "Tk::TableMatrix::Spreadsheet"; }; feature "opt_xls", "Provides parsing of Microsoft Excel files" => sub { requires "OLE::Storage_Lite" => "!= 0.21"; requires "Spreadsheet::ParseExcel" => "0.34"; requires "Spreadsheet::ParseExcel::FmtDefault"; recommends "OLE::Storage_Lite" => "0.22"; recommends "Spreadsheet::ParseExcel" => "0.66"; }; feature "opt_xlsx", "Provides parsing of Microsoft Excel 2007 files" => sub { requires "Spreadsheet::ParseExcel::FmtDefault"; requires "Spreadsheet::ParseXLSX" => "0.24"; recommends "Spreadsheet::ParseXLSX" => "0.35"; }; Spreadsheet-Read-0.91/examples/0000755000031300001440000000000014663305531015644 5ustar00merijnusersSpreadsheet-Read-0.91/examples/ss-dups-tk.pl0000755000031300001440000001670114545015233020217 0ustar00merijnusers#!/usr/bin/perl # ss-dup-tk.pl: Find dups in spreadsheet # (m)'18 [28-03-2018] Copyright H.M.Brand 2005-2024 use strict; use warnings; sub usage { my $err = shift and select STDERR; print "usage: $0 [-t] [-S ] [-R ] [-C columns] [-F ]\n", "\t-t Only check on true values\n", "\t-S sheets Check sheet(s). Default = 1, 1,3-5,all\n", "\t-R rows Check row(s). Default = all, 6,19-66\n", "\t-C columns Check column(s). Default = all, 2,5-9\n", "\t-F fields Check field(s). Default = all, A1,A2,B15,C23\n"; exit $err; } # usage use Spreadsheet::Read; use Getopt::Long qw(:config bundling nopermute noignorecase); my $opt_v = 0; my $opt_t = 0; # Only check on true values my @opt_S; # Sheets to print my @opt_R; # Rows to print my @opt_C; # Columns to print my @opt_F; GetOptions ( "help|?" => sub { usage (0); }, "S|sheets=s" => \@opt_S, "R|rows=s" => \@opt_R, "C|columns=s" => \@opt_C, "F|fields=s" => \@opt_F, "t|true" => \$opt_t, "v|verbose:1" => \$opt_v, ) or usage (1); @opt_S or @opt_S = (1); use Tk; use Tk::ROText; my $file = shift || (sort { -M $b <=> -M $a } glob "*.xls")[0]; my ($mw, $is, $ss, $dt) = (MainWindow->new, "1.0"); sub ReadFile { $file or return; $dt->delete ("1.0", "end"); unless ($ss = ReadData ($file)) { $dt->insert ("end", "Cannot read $file as spreadsheet\n"); return; } my @ss = map { qq{"$ss->[$_]{label}"} } 1 .. $ss->[0]{sheets}; my @finfo = ( "File: $file", ( map { "Sheet $_: '$ss->[$_]{label}'\t($ss->[$_]{maxcol} x $ss->[$_]{maxrow})" } 1 .. $ss->[0]{sheets} ), "=============================================================="); $dt->insert ("end", join "\n", @finfo, ""); $is = (@finfo + 1).".0"; return $ss; } # ReadFile my $tf = $mw->Frame ()->pack (qw( -side top -anchor nw -expand 1 -fill both )); $tf->Entry ( -textvariable => \$file, -width => 40, -vcmd => \&ReadFile, )->pack (qw(-side left -expand 1 -fill both)); my %ftyp; for ([ xls => [ "Excel Files", [qw( .xls .XLS )] ] ], [ xlsx => [ "Excel Files", [qw( .xlsx .XLSX )] ] ], [ sxc => [ "OpenOffice Files", [qw( .sxc .SXC )] ] ], [ ods => [ "OpenOffice Files", [qw( .ods .ODS )] ] ], [ csv => [ "CSV Files", [qw( .csv .CSV )] ] ], ) { my ($ft, $r) = @$_; Spreadsheet::Read::parses ($ft) or next; push @{$ftyp{$r->[0]}}, @{$r->[1]}; push @{$ftyp{"All spreadsheet types"}}, @{$r->[1]}; } $tf->Button ( -text => "Select file", -command => sub { $ss = undef; $file = $mw->getOpenFile ( -filetypes => [ ( map { [ $_, $ftyp{$_} ] } sort keys %ftyp ), [ "All files", "*" ], ], ); ReadFile (); }, )->pack (qw(-side left -expand 1 -fill both)); $tf->Button ( -text => "Detect", -command => \&Detect, )->pack (qw(-side left -expand 1 -fill both)); $tf->Button ( -text => "Show", -command => \&Show, )->pack (qw(-side left -expand 1 -fill both)); $tf->Button ( -text => "Exit", -command => \&exit, )->pack (qw(-side left -expand 1 -fill both)); my $mf = $mw->Frame ()->pack (qw( -side top -anchor nw -expand 1 -fill both )); my $sw = $mf->Scrolled ("ROText", -scrollbars => "osoe", -height => 40, -width => 85, -foreground => "Black", -background => "White", -highlightthickness => 0, -setgrid => 1)->pack (qw(-expand 1 -fill both)); $dt = $sw->Subwidget ("scrolled"); #$sw->Subwidget ("xscrollbar")->packForget; $dt->configure ( -wrap => "none", -font => "mono 12", ); my $bf = $mw->Frame ()->pack (qw( -side top -anchor nw -expand 1 -fill both )); $bf->Checkbutton ( -variable => \$opt_t, -text => "True values only", )->pack (qw(-side left -expand 1 -fill both)); { my $opt_S = @opt_S ? join ",", @opt_S : 1; $bf->Label ( -text => "Sheet(s)", )->pack (qw(-side left -expand 1 -fill both)); $bf->Entry ( -textvariable => \$opt_S, -width => 10, -validate => "focusout", -vcmd => sub { @opt_S = grep m/\S/, split m/\s*,\s*/ => $opt_S; 1; }, )->pack (qw(-side left -expand 1 -fill both)); } { my $opt_R = join ",", @opt_R; $bf->Label ( -text => "Rows(s)", )->pack (qw(-side left -expand 1 -fill both)); $bf->Entry ( -textvariable => \$opt_R, -width => 10, -validate => "focusout", -vcmd => sub { @opt_R = grep m/\S/, split m/\s*,\s*/ => $opt_R; 1; }, )->pack (qw(-side left -expand 1 -fill both)); } { my $opt_C = join ",", @opt_C; $bf->Label ( -text => "Columns(s)", )->pack (qw(-side left -expand 1 -fill both)); $bf->Entry ( -textvariable => \$opt_C, -width => 10, -validate => "focusout", -vcmd => sub { @opt_C = grep m/\S/, split m/\s*,\s*/ => $opt_C; 1; }, )->pack (qw(-side left -expand 1 -fill both)); } sub ranges (@) { my @g; foreach my $arg (@_) { for (split m/,/, $arg) { if (m/^(\w+)\.\.(\w+)$/) { my ($s, $e) = ($1, $2); $s =~ m/^[1-9]\d*$/ or ($s, $e) = (qq("$s"), qq("$e")); eval "push \@g, $s .. $e"; } else { push @g, $_; } } } $opt_v and print STDERR "( @g )\n"; @g; } # ranges sub Detect { $ss or ReadFile (); $dt->delete ($is, "end"); $dt->insert ("end", join "\n", "", "Shts: @opt_S", "Rows: @opt_R", "Cols: @opt_C", "--------------------------------------------------------------", ""); my %done; my @S = $opt_S[0] eq "all" ? (1 .. $ss->[0]{sheets}) : ranges (@opt_S); my @R = ranges (@opt_R); my @C = ranges (@opt_C); my %f = map { uc $_ => 1 } ("@opt_F" =~ m/(\b[A-Z]\d+\b)/ig); foreach my $s (@S) { my $xls = $ss->[$s] or die "Cannot read sheet $s\n"; my @r = @R ? @R : (1 .. $xls->{maxrow}); my @c = @C ? @C : (1 .. $xls->{maxcol}); foreach my $r (@r) { foreach my $c (@c) { defined $xls->{cell}[$c][$r] or next; my $v = uc $xls->{cell}[$c][$r]; my $cell = cr2cell ($c, $r); @S > 1 and $cell = $xls->{label} . "[$cell]"; $opt_t && !$v and next; @opt_F && !exists $f{$cell} and next; if (exists $done{$v}) { $dt->insert ("end", sprintf "Cell %-5s is dup of %-5s '%s'\n", $cell, $done{$v}, $v); next; } $done{$v} = $cell; } } } } # Detect sub Show { $ss or ReadFile (); $dt->delete ($is, "end"); $dt->insert ("end", join "\n", "", "Shts: @opt_S", "Rows: @opt_R", "Cols: @opt_C"); my @S = $opt_S[0] eq "all" ? (1 .. $ss->[0]{sheets}) : ranges (@opt_S); my @R = ranges (@opt_R); my @C = ranges (@opt_C); my %f = map { uc $_ => 1 } ("@opt_F" =~ m/(\b[A-Z]\d+\b)/ig); foreach my $s (@S) { my $xls = $ss->[$s] or die "Cannot read sheet $s\n"; $dt->insert ("end", "\n--------------------------------------------------------------". "\nSheet $s: '$xls->{label}'\t($xls->{maxcol} x $xls->{maxrow})\n"); my @r = @R ? @R : (1 .. $xls->{maxrow}); my @c = @C ? @C : (1 .. $xls->{maxcol}); $dt->insert ("end", " |"); for (@c) { (my $ch = cr2cell ($_, 1)) =~ s/1$//; $dt->insert ("end", sprintf "%11s |", $ch); } $dt->insert ("end", "\n-----+"); $dt->insert ("end", "------------+") for @c; foreach my $r (@r) { $dt->insert ("end", sprintf "\n%4d |", $r); foreach my $c (@c) { my $cell = cr2cell ($c, $r); my $v = defined $xls->{cell}[$c][$r] ? $xls->{$cell} : "--"; length ($v) < 12 and substr $v, 0, 0, " " x (12 - length $v); $dt->insert ("end", substr ($v, 0, 12). "|"); } } } } # Show MainLoop; Spreadsheet-Read-0.91/Makefile.PL0000644000031300001440000001234514511772654016013 0ustar00merijnusersuse strict; require 5.008001; use ExtUtils::MakeMaker; use File::Copy; if ($ENV{PERLBREW_HOME} and $ENV{PERLBREW_HOME} eq "/home/njh/.perlbrew") { warn "Your smokers have been blocked because of consistent failures that\n"; warn " are all caused by the smoking setup and not by module errors. If\n"; warn " you have fixed that all, please inform the authors, so this block\n"; warn " can be lifted again.\n"; exit 0; } sub link_or_copy { my ($source, $dest) = @_; link ($source, $dest) or copy ($source, $dest); } # link_or_copy my @exe; unless (exists $ENV{AUTOMATED_TESTING} and $ENV{AUTOMATED_TESTING} == 1) { -f "scripts/xls2csv" or link_or_copy "scripts/xlsx2csv", "scripts/xls2csv"; -f "scripts/xlsgrep" or link_or_copy "scripts/xlscat", "scripts/xlsgrep"; for ( [ "xlscat", "Convert Spreadsheet to plain text or CSV" ], [ "xlsgrep", "Grep pattern from Spreadsheet" ], [ "ss2tk", "Show a Spreadsheet in Perl/Tk" ], [ "ssdiff", "Show diff between two spreadsheets" ], [ "xls2csv", "Wrapper around xlscat for easy XLS => CSV" ], [ "xlsx2csv", "Wrapper around xlscat for easy XLSX => CSV" ], ) { prompt ("Do you want to install $_->[0]\t$_->[1] ?", "y") =~ m/[Yy]/ and push @exe, "scripts/$_->[0]"; } } my %wm = ( NAME => "Spreadsheet::Read", DISTNAME => "Spreadsheet-Read", ABSTRACT => "Read the data from a spreadsheet", AUTHOR => "H.Merijn Brand ", VERSION_FROM => "Read.pm", EXE_FILES => [ @exe ], PREREQ_FATAL => 0, PREREQ_PM => { # Core modules "Exporter" => 0, "Encode" => 0, "Carp" => 0, "Data::Dumper" => 0, "File::Temp" => 0.22, "IO::Scalar" => 0, # Optional "List::Util" => 0, # For testing "Test::More" => 0.88, "Test::NoWarnings" => 0, # for ss2tk # "Tk" => 804.032, # "Tk::NoteBook" => 4.009, # "Tk::TableMatrix::Spreadsheet" => 1.2, }, macro => { TARFLAGS => "--format=ustar -c -v -f", }, ); $ExtUtils::MakeMaker::VERSION > 6.30 and $wm{LICENSE} = "perl"; if ($ENV{EXTENDED_TESTING}) { # for CpanCover and masochists # Backend parsers, all optional # Versions also need to be declared inside Read.pm ! $wm{PREREQ_PM}{"Text::CSV_PP"} = "1.97"; $wm{PREREQ_PM}{"Text::CSV_XS"} = "1.36"; $wm{PREREQ_PM}{"Spreadsheet::ReadSXC"} = "0.26"; $wm{PREREQ_PM}{"Spreadsheet::ParseODS"} = "0.26"; $wm{PREREQ_PM}{"Spreadsheet::ParseExcel"} = "0.65"; $wm{PREREQ_PM}{"Spreadsheet::ParseXLSX"} = "0.27"; $wm{PREREQ_PM}{"Spreadsheet::XLSX"} = "0.15"; $wm{PREREQ_PM}{"Spreadsheet::Perl"} = "0"; } my $rv = WriteMakefile (%wm); # perlcriticrc uses Config::Tiny, which does not support nesting if (-f ".perlcriticrc" && -s "$ENV{HOME}/.perlcriticrc") { open my $fh, ">", ".perlcriticrc"; print $fh do { local (@ARGV, $/) = ("$ENV{HOME}/.perlcriticrc"); <> }; print $fh join "\n" => "", "[-Bangs::ProhibitDebuggingModules]", "[-BuiltinFunctions::ProhibitBooleanGrep]", "[-BuiltinFunctions::ProhibitStringyEval]", # Guarded "[-Compatibility::PodMinimumVersion]", # Lvalgrind.log ); my @pc = -f ".perlcriticrc" ? ("\tperlcritic -1 Read.pm") : (); $] >= 5.010 && -d "xt" && ($ENV{AUTOMATED_TESTING} || 0) != 1 and push @pc, '', 'test::', ' -@env TEST_FILES="xt/*.t" make -e test_dynamic'; join "\n" => 'cover test_cover:', ' ccache -C', ' cover -test', '', 'leakcheck:', " $valgrind", ' -@tail -5 valgrind.log', '', 'leaktest:', q{ sandbox/leaktest $(FULLPERLRUN) "test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES)}, '', 'spellcheck:', ' pod-spell-check --aspell --ispell', '', 'checkmeta: spellcheck', ' perl sandbox/genMETA.pl -c', '', 'fixmeta: distmeta', ' perl sandbox/genMETA.pl', ' ls -l */META.yml', '', 'tgzdist: doc checkmeta fixmeta $(DISTVNAME).tar.gz distcheck', ' -@mv -f $(DISTVNAME).tar.gz $(DISTVNAME).tgz', ' -@cpants_lint.pl $(DISTVNAME).tgz', ' -@rm -f Debian_CPANTS.txt', '', 'doc docs: doc/Spreadsheet-Read.md doc/Spreadsheet-Read.html doc/Spreadsheet-Read.man', ' -@rm -f pod2html.tmp', 'doc/Spreadsheet-Read.md: Read.pm', ' pod2markdown < $? > $@', 'doc/Spreadsheet-Read.html: Read.pm', ' pod2html < $? 2>&1 | grep -v "^Cannot find" > $@', 'doc/Spreadsheet-Read.3: Read.pm', ' pod2man < $? > $@', 'doc/Spreadsheet-Read.man: doc/Spreadsheet-Read.3', ' nroff2man < $? > $@', @pc, ''; } # postamble 1; Spreadsheet-Read-0.91/CONTRIBUTING.md0000644000031300001440000000245313531672470016265 0ustar00merijnusers# General I am always open to improvements and suggestions. Use [issues](https://github.com/Tux/Spreadsheet-Read/issues) # Style I will never accept pull request that do not strictly conform to my style, however you might hate it. You can read the reasoning behind my [preferences](http://tux.nl/style.html). I really do not care about mixed spaces and tabs in (leading) whitespace Perl::Tidy will help getting the code in shape, but as all software, it is not perfect. You can find my preferences for these in [.perltidy](https://github.com/Tux/Release-Checklist/blob/master/.perltidyrc) and [.perlcritic](https://github.com/Tux/Release-Checklist/blob/master/.perlcriticrc). # Mail Please, please, please, do *NOT* use HTML mail. [Plain text](https://useplaintext.email) [without](http://www.goldmark.org/jeff/stupid-disclaimers/) [disclaimers](https://www.economist.com/business/2011/04/07/spare-us-the-e-mail-yada-yada) will do fine! # Requirements The minimum version required to use this module is stated in [Makefile.PL](./Makefile.PL). That does however not guarantee that it will work for all underlying parsers, as they might require newer perl versions. # New parsers I am all open to support new parsers. The closer the API is to that of Spreadsheet::ParseExcel, the easier it will be to support it. Spreadsheet-Read-0.91/Changes0000644000031300001440000004617014663270142015330 0ustar00merijnusers0.91 - 27 Aug 2024, H.Merijn Brand * Exclude OLE::Storage_Lite-0.21 * xlscat --head[=10], --tail[=10], --first=C * Make (re)defining ->get_active_sheet safer * Tested with perl-5.40 * xlscat --no-empty to skip empty columns too * Spreadsheet::ParseExcel::FmtDefault might not be available 0.90 - 13 Feb 2024, H.Merijn Brand * Consistent return value for parses ($type) on failure (issue#52) * New options for xlscat (--no-empty, --clip=N) * Support for hidden sheets 0.89 - 02 Jan 2024, H.Merijn Brand * Auto-use BOM in CSV *files* with xlscat script * Fix duplicate option letter (typo) (Erix) * It's 2024 0.88 - 07 Nov 2023, H.Merijn Brand * Guard $_ globbering from external bitrotted code * Use recommended and suggested versions based on known CVEs * Improve user feedback on failing xlsx2csv & xlscat * Fix static docs for groff-1.24 * Basic support for Excel::ValueReader::XLSX (issue#50) * Allow backend for parser option without version check 0.87 - 22 Feb 2023, H.Merijn Brand * Change default #! to /usr/bin/perl (Tinita) * Improve ->sheets (safer and docs) * Update to Spreadsheet::ReadGnumeric 0.2 (attributes and small fixes) 0.86 - 07 Feb 2023, H.Merijn Brand * Add Gnumeric support (Bob Rogers, THANKS!) - work in progress, use with care, feedback welcome 0.85 - 04 Jan 2023, H.Merijn Brand * Suggest the preferred parser if none found * It's 2022 * xlscat --box and improvements for -L * Add balloons to ss2tk buttons * Fix typo in help (Erix) * It's 2023 0.84 - 26 Feb 2021, H.Merijn Brand * It's 2021 * Alias pivot to transpose (issue#36) * Alias strip to trim (issue#36) * Check for consistent return values of parses () 0.83 - 21 Dec 2020, H.Merijn Brand * Require ParseODS 0.26 * Add ::parsers to get list of supported formats * Add --list to xlscat and xls2csv * Update xls2csv to be identical to xlsx2csv * ::parses ("") will return list of supported types * Move installables from examples/ to scripts/ * Tested on FreeBSD-12.2-RELEASE with all supported backends * Fix META issue for bugtracker 0.82 - 26 Sep 2020, H.Merijn Brand * Move pod tests to xt (and do not distribute) * Fix some links in the docs * Add ".xlsm" to known XLSX file extensions * Spreadsheet::ReadSXC has a new maintainer (Corion) - support file handles - suggest version 0.24 (0.22 causes fails) * First attempt in supporting Spreadsheet::ParseODS (alpha code) - version 0.25 should now pass the limited tests - thanks to Corion for making this happen! * It's 2020 * Fallback to Pod::Text if nroff not available in tools * Extended support for merged cells with merge option - Added $sheet->merged_from ("C2") * Add --no-nl[=x] to xlscat * xlscat: Align-right more numerics on -L (was only positive integers) * xlsx2csv -Z : generate a ZIP file with a CSV for every sheet * Doc fix (issue#33) 0.81 - 25 Aug 2019, H.Merijn Brand * It's 2019 * Allow -c + --sep in xlscat * Add --sep= to xls2csv for -A * Add xlsx2csv to distribution (xlsx2csv has -A) * Add -J s / --join str to xlsx2csv * Add cpanfile * Add explicit documentation about formatted vs unformatted * Improve ->new behavior * Auto-detect fallback for CSV now includes '|' for sep_char (PR#26) 0.80 - 31 Dec 2018, H.Merijn Brand * Raise Spreadsheet::ParseXLSX minimum version to 0.24 * Improve docs on attributes * Add attribute accessors 0.79 - 29 Aug 2018, H.Merijn Brand * Environmant control hardening * ReadData () docs (opening from scalar ref: issue#21) * Check for XLSX content on opening from plain scalar content * Fix typo in ss-dup-tk.pl (PRC, Branislav Zahradnik) * Allow source from command line option in xls2csv (PRC, Branislav Zahradnik) * Allow --in-sep=tab in xlscat/xlsgrep * Add --hash to xlscat/xlsgrep * Help and usage for examples/xls2csv (PR#23) 0.78 - 29 Jan 2018, H.Merijn Brand * Spreadsheet::ParseExcel supports the active flag as of version 0.61 * Fix typo in docs (SPROUT, RT#124214) 0.77 - 22 Jan 2018, H.Merijn Brand * Note possible name clashes with example/tool files * Clipping and stripping more efficient 0.76 - 01 Jan 2018, H.Merijn Brand * Allow streaming in xlscat * Add --dump to xlscat * Add error for opening ODS/SXC from reference * It's 2018 0.75 - 09 Nov 2017, H.Merijn Brand * Windows does not like an exec with arguments that have spaces (PR#15) Three fixes by Andrew Gregory ). Thanks! * Fix column clipping * Manually generate cells to delete when clipping * Skip cell deletion if they were never generated * File names cannot have \0 in newer perls 0.74 - 27 Aug 2017, H.Merijn Brand * Re-enable opening files with bad characters in the filename (issue#14) 0.73 - 30 Jul 2017, H.Merijn Brand * Spreadsheet::XLSX::Reader::LibXML support completely dropped * New options for ss2tk (font specs and SS labels) * Safer xls2csv option parsing/passing * Pass unknown command-line options to the parser * Fix ReadData ("a,b,c\n1,2,3\n", parser => "csv") * Drop 5.8.0 support. 5.8.1 is now minimum 0.72 - 25 May 2017, H.Merijn Brand * get_active_sheet is only available as of Spreadsheet::ParseExcel 0.61 * Support password protected spreadsheets (implementation just for Excel) * Do not warn on undefined labels (xlscat) 0.71 - 13 May 2017, H.Merijn Brand * Use -w as intended * Add option pivot * No trailing spaces on xlscat -L * Lexicalize code snippet (issue#12) * Add attr method * Remove special chars from worksheet name component (Windows, PR#13) * Add refresh to ss2tk / csv2tk * Add shortcut for UTF-8 output to xlscat * Upgrade recommended modules to required for cpancover 0.70 - 02 Mar 2017, H.Merijn Brand * Add label functionality to ::Sheet * Add ->column and ->cellcolumn for ::Sheet * Add col2label sub/method * Sanitize xls2csv export filenames * Fix sorting in xlscat for un-aligned columns * It's 2017 * Be overly verbose about maxrow and maxcol being 1-based (RT#120476) 0.69 - 02 Dec 2016, H.Merijn Brand * Several OO fixes, more tests, more docs 0.68 - 29 Nov 2016, H.Merijn Brand * List non-core modules/version used on very verbose in xlscat * Option to export all sheets in a spreadsheet to CSV (UTF-8 only) * Add OO interface * Feature: add new spreadsheets to existing book (even of different types) 0.67 - 17 Jun 2016, H.Merijn Brand * CPANTESTERS showed that some versions really messed op numeric/percentage 0.66 - 16 Jun 2016, H.Merijn Brand * Remove Spreadsheet::XLSX::Reader::LibXML test files from distribution * Allow old versions of Spreadsheet::ParseXLSX to "fail" on percentage tests 0.65 - 15 Jun 2016, H.Merijn Brand * Test with perl-5.24.0 * Show parser-version used under debug * No more Spreadsheet::XLSX::Reader::LibXML * Cells will inherit hidden state from hidden rows and columns * Require 5.8.0 as 5.6.x does not include required Encode 0.64 - 22 Apr 2016, H.Merijn Brand * It's 2016 * Allow inconsistent Spreadsheet::XLSX releases on Debian (tests) * Decode utf-16be entries in Excel when appropriate * Two examples in xlscat 0.63 - 10 Oct 2015, H.Merijn Brand * Guard against negative MinRow in XLSX * Documentation updated * Support Spreadsheet::XLSX::Reader::LibXML disabled on author request * Fix warning in utilities * Check minimum parser version for pre-selected parser 0.62 - 16 Aug 2015, H.Merijn Brand * Fix documentation structure * Test all supported parsers (not just the preferred one) * Basic support for Spreadsheet::XLSX::Reader::LibXML (work in progress) * Copy example file if link fails (Alan Berndt) * Add a contributing guide 0.61 - 13 Jun 2015, H.Merijn Brand * Discourage Spreadsheet::XLSX * A space is not an empty field in XLS * Strip the correct selection (RT#105197) 0.60 - 30 Mar 2015, H.Merijn Brand * No merged cell support in Spreadsheet::XLSX 0.59 - 26 Mar 2015, H.Merijn Brand * Minimal support (+ docs) for merged cells * Make parser errors report at one level up * Don't select non-existing columns in xlscat 0.58 - 11 Feb 2015, H.Merijn Brand * Remove perl recommendation from META as it breaks cpan clients * Move sort instruction to correct place in xlscat's help 0.57 - 08 Feb 2015, H.Merijn Brand * Moved project to github * Add --sort to xlscat * Clip before conversion * Removed an unneeded localizing of $/ (related to p5 RT#123218) 0.56 - 05 Jan 2015, H.Merijn Brand * printf does not play nice with encoding (related to RT#98436) * default output UTF-8 if whole line is UTF-8 0.55 - 01 Jan 2015, H.Merijn Brand * Mention Spreadsheet::CSV in documentation * Add ssdiff to examples * Amend xlscat -n to also number in HTML * Updated copyright to 2015 0.54 - 30 Jan 2014, H.Merijn Brand * Optional features required versions now builtin 0.53 - 29 Jan 2014, H.Merijn Brand * Updated copyright to 2014 * Prefer Data::Peek over Data::Dumper * Support (and prefer) Spreadsheet::ParseXLSX for .xlsx 0.52 - 05 Dec 2013, H.Merijn Brand * Store CSV parse error - if any - in $ss->[0]{error} 0.51 - 30 Oct 2013, H.Merijn Brand * Link xlsgrep during install 0.50 - 24 Oct 2013, H.Merijn Brand * Added xlsgrep to examples * Allow -C B,D for xlscat * More prominent reference to xlscat in docs 0.49 - 11 May 2013, H.Merijn Brand * /dev/null cannot be used for tests on Windows 0.48 - 14 Mar 2013, H.Merijn Brand * Improve documentation consistency (RT#80409) * Updated copyright to 2013 * Force old(er) tar format (ustar) - assumes GNU tar on release box * Fix yml/json optional_features * Install utilities from example by default * Several minor changes (for maint) 0.47 - 30 Jun 2012, H.Merijn Brand * Note that empty sheets are skipped when clip is true (RT#75277) * Allow undef as valid value for the options (Max Maischein) * Don't generate warnings when stripping whitespace and only generating one of cells or rc. (Max Maschein) * Fix test warning under perl-5.17.x 0.46 - 14 Feb 2012, H.Merijn Brand * Updated copyright to 2012 * Support passing attributes to the underlying parser * Do not strip fields in sheets with no cells at all (RT#74976) 0.45 - 07 Sep 2011, H.Merijn Brand * NAME / DISTNAME in Makefile.PL 0.44 - 07 Sep 2011, H.Merijn Brand * More cross-checks for META data 0.43 - 02 Aug 2011, H.Merijn Brand * Changed name in META.yml (RT#69574) 0.42 - 01 Jun 2011, H.Merijn Brand * Add --html output option to xlscat * Force CSV parser when in-sep is given * Prefer Data::Peek over Data::Dumper if available 0.41 - 06 Oct 2010, H.Merijn Brand * Spell-check * Fixed requiring optional modules (RT#61928 - Roderick Schupp) 0.40 - 31 Mar 2010, H.Merijn Brand * Default option for clip fixed (RT#56151 - Alan James) 0.39 - 16 Mar 2010, H.Merijn Brand * Doc fix (RT#54507, Patrick Cronin) * Upped Copyright notices to 2010 * Drop YAML version to 1.0 0.38 - 15 Dec 2009, H.Merijn Brand * Add row () and cellrow () * Updated META.yml to meet most recent specs (optional_features = map) 0.37 - 09 Nov 2009, H.Merijn Brand * IO streams improvements * MANIFEST fix 0.36 - 06 Nov 2009, H.Merijn Brand * Add strip option * Spreadsheet::XLSX 0.12 still does not support attributes * Require Text::CSV_XS-0.69 for CSV for auto-detection of \r * New attribute "parser" to force format * Allow CSV streams * Allow SC streams * Allow XLS streams 0.35 - 03 Jun 2009, H.Merijn Brand * Add Test::NoWarnings, which is not run in AUTOMATED_TESTING * Switched to Test::More using tests_done () * Text::CSV_XS requires 0.43 or up, as we use ->eof () still prefer a really new release, like 0.65, which is Test::NoWarnings safe * Spreadsheet::XLSX 0.10 still does not support attributes * Added -n to xlscat * XLSX tests skip on feature, not on version 0.34 - 27 Jan 2009, H.Merijn Brand * Spreadsheet::XLSX 0.09 still does not support attributes still think it is better to follow closely. 0.09 is much better than 0.08 0.33 - 23 Jan 2009, H.Merijn Brand * A few Perl::Critic inspired changes * Modified tests to prevent rounding errors (we were not checking for that) * Added examples/ss-dups-tk.pl 0.32 - 06 Jan 2009, H.Merijn Brand * Add basic support for M$ Excel 2007 using Spreadsheet::XLSX * Test suite reports the parsers it found 0.31 - 04 Jan 2009, H.Merijn Brand * Upped Copyright notices to 2009 * Detection of percentage type * Even more reliable detection of Date types 0.30 - 22 Dec 2008, H.Merijn Brand * Wrong e-mail in META.yml * CSV files from a Mac, with \r as eol, would not parse 0.29 - 19 Oct 2008, H.Merijn Brand * Make Read safer for files that do not match extension, like HTML in foo.xls * YAML declared 1.4 (META.yml) instead of 1.1 (YAML) * Bring Makefile.PL in sync with META.yml * Recommend Text-CSV-0.56 0.28 - 04 Sep 2008, H.Merijn Brand * More tests on date formats * Declare Spreadsheet::ParseExcel::FmtDefault in META.yml * Add 'size' from Excel font size * Update docs about Excel quirks and CPAN links * Reference to public git repo * Some typo's 0.27 - 31 Aug 2008, H.Merijn Brand * Fixed META.yml (the specs are inconsistent) * Added --dtfmt to xlscat 0.26 - 29 Aug 2008, H.Merijn Brand * Added examples/xls2csv * Upped copyright to 2008 in examples * Don't ask to install examples under automated testing * die => croak * Added tgzdist target * Added encoding options to examples/xlscat * Added date-type checks for SS:PE > 0.32 0.25 - 02 Jan 2008, H.Merijn Brand * Spreadsheet-Read now under git * Upped copyrights to 2008 * Added all prereq's to Makefile.PL, even core mods * Tested under perl-5.10.0 * Text::CSV as of 1.00 is OK 0.24 - 05 Oct 2007, H.Merijn Brand * -? and --help in utils moved to Getopt::Long * Adjusted copyright notice in utils * removed prototypes in utils * next is illegal in do {} while (); (Johan Vromans) only happens with old Text::CSV_XS 0.23 - 21 Jun 2007, H.Merijn Brand * Use IO::Scalar instead of File::Temp when installed Thanks to David Cantrell for making a OpenBSD test box available! * use binmode () when opening files * Also use 3-arg open in test files * die if test files cannot be opene'ed 0.22 - 18 Jun 2007, H.Merijn Brand * 0.21 should already support Text::CSV_PP 1.05 Tested Text::CSV_PP 1.05 on bleadperl. * Better detection of (not) installed modules * Module requires perl 5.6.x 0.21 - 18 Jun 2007, H.Merijn Brand * Text::CSV_XS uses keep_meta_info instead of get_flags * Removed always_quote from xlscat's CSV output 0.20 - 31 May 2007, H.Merijn Brand * perlcritic OK * CSV parsing now uses getline (), and auto-detects eol Assumes first line does not contain embedded eol. This implies that parsing CSV with embedded eol sequences is now safe. * As I now also maintain Text::CSV_XS, I changed the references * Changed TODO's from Text::CSV to Text::CSV_PP (::CSV is dated 1997) 0.19 - 04 May 2007, H.Merijn Brand * Could not retreive '0' fields from OpenOffice (Jim Kelly) 0.18 - 27 Apr 2007, H.Merijn Brand * use strict in Makefile.PL * Added test_cover make target * Added "ods" for OpenOffice conversions * Added color tests for ods (but SR::RS doesn't support that yet) * Switched from \d to 0-9 in regexp * Added more test files and tests (increase coverage) 0.17 - 04 Jul 2006, H.Merijn Brand * xlscat new option: --ansii to (try to) use the ansi colors for fields * Fixed a color attribute off-by-one error * Added test cases (not yet complete) * Added bold and underline 0.16 - 04 Jul 2006, H.Merijn Brand * xlscat new option: --in-sep-char to force-define input sep-char for CSV * More debug lines * Parser name info in $ref->[0] * SquirrelCalc now reports Spreadsheet::Read and its version for parser info * Most of the attributes for Excel now implemented. Tested, but no test case 0.15 - 21 Jun 2006, H.Merijn Brand * Small doc change from AnnoCPAN * Sheets with undefined labels might cause havoc * Clip now skips empty xls sheets (TODO: sxc) * xlscat clips by default * xlscat new options -d and --noclip * xlscat usage () from -?/--help to STDOUT from fault to STDERR 0.14 - 20 Jan 2006, H.Merijn Brand * maxrow and maxcol were swapped in csv sheets * promoted internal debug flag to option * small doc changes 0.13 - 04 Nov 2005, H.Merijn Brand * Control attrib 'cells' was misinterpreted * New option: clip, default is true if {cell} is selected, false otherwise Removes trailing lines and columns in each sheet that have no visible data * new test t/11_call.t for checking options. Not complete yet * Added test_cover target to Makefile.PL 0.12 - 31 Oct 2005, H.Merijn Brand * Added ss2tk to examples 0.11 - 26 Oct 2005, H.Merijn Brand * Allow ods (OpenOffice 2.0) for sxc * include real ods test files and new test * Check if sc.version is undef, not 0 0.10 - 19 Sep 2005, H.Merijn Brand * More test coverage * cr2cell () returns "" for illegal col/row values * cell2cr () returns (0, 0) for illegal cell values * rows () tests even better for valid reference pointer * Renamed the test files 0.09 - 18 Sep 2005, H.Merijn Brand * Added Test::Pod * Added Test::Pod::Coverage * Spreadsheet::ReadSXC 0.20 now required (too many tests fail on 0.12) * Small changes to the docs * More secure handling of false values * Mention a bug in Spreadsheet::ParseExcel 0.08 - 22 Aug 2005, H.Merijn Brand * Slightly changed the Synopsis 0.07 - 06 Jul 2005, H.Merijn Brand * Added function rows () * Added function parses () * Made all modules optional * Prepared for Spreadsheet::Perl * Doc updates 0.06 - 22 Jun 2005, H.Merijn Brand * Repaired error in label names in metadata for SXC 0.05 - 17 Jun 2005, H.Merijn Brand * Spreadsheet::ReadSXC >= 0.20 supports sheet order * Spreadsheet::ReadSXC has new data structure (we still support the old) * Added "version" to the meta data for parser version * More tests 0.04 - 14 Jun 2005, H.Merijn Brand * Changed TODO * Added options "rc", and "cell" * Added CSV * Added CSV options "sep", and "quote" * Support xls from content * Added basic support for SquirrelCalc format * Updated pod * xlscat -R option for row selection was a one-off * xlscat now supports selecting fields with -F 0.03 - 19 May 2005, H.Merijn Brand * Expanded xlscat to support -i for index * Optionally install xlscat 0.02 - 19 May 2005, H.Merijn Brand * Typoes in the doc * Small change in organization so it actually installs 0.01 - 12 May 2005, H.Merijn Brand * Initial CPAN version. A lot can still change Spreadsheet-Read-0.91/Read.pm0000755000031300001440000025671514663270012015255 0ustar00merijnusers#!/usr/bin/perl package Spreadsheet::Read; =head1 NAME Spreadsheet::Read - Read the data from a spreadsheet =head1 SYNOPSIS use Spreadsheet::Read; my $book = ReadData ("test.csv", sep => ";"); my $book = ReadData ("test.sxc"); my $book = ReadData ("test.ods"); my $book = ReadData ("test.xls"); my $book = ReadData ("test.xlsx"); my $book = ReadData ("test.xlsm"); my $book = ReadData ("test.gnumeric"); my $book = ReadData ($fh, parser => "xls"); Spreadsheet::Read::add ($book, "sheet.csv"); my $sheet = $book->[1]; # first datasheet my $cell = $book->[1]{A3}; # content of field A3 of sheet 1 my $cell = $book->[1]{cell}[1][3]; # same, unformatted # OO API my $book = Spreadsheet::Read->new ("file.csv"); my $sheet = $book->sheet (1); my $cell = $sheet->cell ("A3"); my $cell = $sheet->cell (1, 3); $book->add ("test.xls"); =cut use 5.008001; use strict; use warnings; our $VERSION = "0.91"; sub Version { $VERSION } use Carp; use Exporter; our @ISA = qw( Exporter ); our @EXPORT = qw( ReadData cell2cr cr2cell ); our @EXPORT_OK = qw( parses rows cellrow row add ); use Encode qw( decode ); use File::Temp qw( ); use Data::Dumper; my @parsers = ( [ csv => "Text::CSV_XS", "0.71" ], [ csv => "Text::CSV_PP", "1.17" ], [ csv => "Text::CSV", "1.17" ], [ ods => "Spreadsheet::ParseODS", "0.26" ], [ ods => "Spreadsheet::ReadSXC", "0.26" ], [ sxc => "Spreadsheet::ParseODS", "0.26" ], [ sxc => "Spreadsheet::ReadSXC", "0.26" ], [ sxc => "Spreadsheet::ReadSXC__BAD", "0.26" ], # For testing [ xls => "Spreadsheet::ParseExcel", "0.34" ], [ xlsx => "Spreadsheet::ParseXLSX", "0.24" ], [ xlsm => "Spreadsheet::ParseXLSX", "0.24" ], [ xlsx => "Spreadsheet::XLSX", "0.13" ], [ xlsx => "Excel::ValueReader::XLSX", "1.13" ], # [ prl => "Spreadsheet::Perl", "" ], [ sc => "Spreadsheet::Read", "0.01" ], [ gnumeric => "Spreadsheet::ReadGnumeric", "0.2" ], [ zzz1 => "Z10::Just::For::Testing", "1.23" ], [ zzz2 => "Z20::Just::For::Testing", "" ], [ zzz3 => "Z30::Just::For::Testing", "1.00" ], # Helper modules [ ios => "IO::Scalar", "" ], [ dmp => "Data::Peek", "" ], ); my %can = ( supports => { map { $_->[1] => $_->[2] } @parsers }); foreach my $p (@parsers) { my $format = $p->[0]; $can{$format} and next; $can{$format} = ""; my $preset = $ENV{"SPREADSHEET_READ_\U$format"} or next; my $min_version = $can{supports}{$preset}; unless ($min_version) { # Catch weirdness like $SPREADSHEET_READ_XLSX = "DBD::Oracle" $can{$format} = "!$preset is not supported for the $format format"; next; } if (eval "local \$_; require $preset" and not $@) { # forcing a parser should still check the version my $ok; my $has = $preset->VERSION; $has =~ s/_[0-9]+$//; # Remove beta-part if ($min_version =~ m/^v([0-9.]+)/) { # clumsy versions my @min = split m/\./ => $1; $has =~ s/^v//; my @has = split m/\./ => $has; $ok = (($has[0] * 1000 + $has[1]) * 1000 + $has[2]) >= (($min[0] * 1000 + $min[1]) * 1000 + $min[2]); } else { # normal versions $ok = $has >= $min_version; } $ok or $preset = "!$preset"; } else { $preset = "!$preset"; } $can{$format} = $preset; } delete $can{supports}; foreach my $p (@parsers) { my ($flag, $mod, $vsn) = @$p; $can{$flag} and next; eval "require $mod; \$vsn and ${mod}->VERSION (\$vsn); \$can{\$flag} = '$mod'" and next; $p->[0] = "! Cannot use $mod version $vsn: $@"; $can{$flag} = $@ =~ m/need to install|can(?:not|'t) locate/i ? 0 # Not found : ""; # Too old } $can{sc} = __PACKAGE__; # SquirrelCalc is built-in # Define ->get_active_sheet if not defined (yet) sub _def_gas { for ([ 0.61, $Spreadsheet::ParseExcel::VERSION, *Spreadsheet::ParseExcel::Workbook::get_active_sheet ], [ 0.25, $Spreadsheet::ParseODS::VERSION, *Spreadsheet::ParseODS::Workbook::get_active_sheet ], [ 9.99, $Excel::ValueReader::XLSX::VERSION, *Excel::ValueReader::XLSX::get_active_sheet ], ) { my ($mv, $v, $cb) = @$_; defined $v && $v < $mv or next; defined $cb && defined *{$cb}{CODE} and next; *{$cb} = sub { undef }; } } # _def_gas my $debug = 0; my %def_opts = ( rc => 1, cells => 1, attr => 0, clip => undef, # $opt{cells}; strip => 0, pivot => 0, dtfmt => "yyyy-mm-dd", # Format 14 debug => 0, passwd => undef, parser => undef, sep => undef, quote => undef, label => undef, merge => 0, ); my @def_attr = ( type => "text", fgcolor => undef, bgcolor => undef, font => undef, size => undef, format => undef, halign => "left", valign => "top", bold => 0, italic => 0, uline => 0, wrap => 0, merged => 0, hidden => 0, locked => 0, enc => "utf-8", # $ENV{LC_ALL} // $ENV{LANG} // ... formula => undef, ); # Helper functions sub _dump { my ($label, $ref) = @_; if ($can{dmp}) { print STDERR Data::Peek::DDumper ({ $label => $ref }); } else { print STDERR Data::Dumper->Dump ([$ref], [$label]); } my @c = caller (1); print STDERR "<<- $c[1]:$c[2]|$c[3]\n"; } # _dump sub _parser { my $type = shift or return ""; if ($type =~ m/::/ and my @p = grep { $_->[1] eq $type } @parsers) { my $format = $p[0][0]; $ENV{"SPREADSHEET_READ_\U$format"} = $type; eval "local \$_; require $type"; $@ and croak ("Forced backend $type for $format fails to load:\n$@"); $can{$format} = $type; $type = $format; } $type = lc $type; my $ods = $can{ods} ? "ods" : "sxc"; # Aliases and fullnames $type eq "excel" and return "xls"; $type eq "excel2007" and return "xlsx"; $type eq "xlsm" and return "xlsx"; $type eq "oo" and return $ods; # $type eq "sxc" and return $ods; $type eq "openoffice" and return $ods; $type eq "libreoffice" and return $ods; $type eq "perl" and return "prl"; $type eq "scalc" and return "sc"; $type eq "squirrelcalc" and return "sc"; return exists $can{$type} ? $type : ""; } # _parser sub new { my $class = shift; my $r = ReadData (@_); unless ($r) { @_ and return; # new with arguments failed to open resource $r = [{ parsers => [], error => undef, sheets => 0, sheet => { }, }]; } bless $r => $class; } # new sub parsers { ref $_[0] eq __PACKAGE__ and shift; my @c; for (sort { $a->[0] cmp $b->[0] || $a->[1] cmp $b->[1] } grep { $_->[0] !~ m{^(?:dmp|ios|!.*)$} } @parsers) { my ($typ, $mod, $min) = @$_; eval "local \$_; require $mod"; my $vsn = $@ ? "-" : eval { $mod->VERSION }; push @c => { ext => $typ, mod => $mod, min => $min, vsn => $vsn, def => $can{$typ} eq $mod ? "*" : "", }; } @c; } # parsers # Spreadsheet::Read::parses ("csv") or die "Cannot parse CSV" sub parses { ref $_[0] eq __PACKAGE__ and shift; my $type = shift or return sort grep { !m/^(?:dmp|ios)/ && $can{$_} !~ m{^!} } keys %can; $type = _parser ($type) or return 0; if ($can{$type} =~ m/^!\s*(.*)/) { $@ = $1; return 0; } return $can{$type} || 0; } # parses sub sheets { my $ctrl = shift->[0]; wantarray or return $ctrl->{sheets}; my $s = $ctrl->{sheet} or return (); # No labels defined sort { $s->{$a} <=> $s->{$b} } keys %$s; } # sheets # col2label (4) => "D" sub col2label { ref $_[0] eq __PACKAGE__ and shift; my $c = shift; defined $c && $c > 0 or return ""; my $cell = ""; while ($c) { use integer; substr $cell, 0, 0, chr (--$c % 26 + ord "A"); $c /= 26; } $cell; } # col2label # cr2cell (4, 18) => "D18" # No prototype to allow 'cr2cell (@rowcol)' sub cr2cell { ref $_[0] eq __PACKAGE__ and shift; my ($c, $r) = @_; defined $c && defined $r && $c > 0 && $r > 0 or return ""; col2label ($c) . $r; } # cr2cell # cell2cr ("D18") => (4, 18) sub cell2cr { ref $_[0] eq __PACKAGE__ and shift; my ($cc, $r) = (uc ($_[0]||"") =~ m/^([A-Z]+)([0-9]+)$/) or return (0, 0); my $c = 0; while ($cc =~ s/^([A-Z])//) { $c = 26 * $c + 1 + ord ($1) - ord ("A"); } ($c, $r); } # cell2cr # my @row = cellrow ($book->[1], 1); # my @row = $book->cellrow (1, 1); sub cellrow { my $sheet = ref $_[0] eq __PACKAGE__ ? (shift)->[shift] : shift or return; ref $sheet eq "HASH" && exists $sheet->{cell} or return; exists $sheet->{maxcol} && exists $sheet->{maxrow} or return; my $row = shift or return; $row > 0 && $row <= $sheet->{maxrow} or return; my $s = $sheet->{cell}; map { $s->[$_][$row] } 1..$sheet->{maxcol}; } # cellrow # my @row = row ($book->[1], 1); # my @row = $book->row (1, 1); sub row { my $sheet = ref $_[0] eq __PACKAGE__ ? (shift)->[shift] : shift or return; ref $sheet eq "HASH" && exists $sheet->{cell} or return; exists $sheet->{maxcol} && exists $sheet->{maxrow} or return; my $row = shift or return; $row > 0 && $row <= $sheet->{maxrow} or return; map { $sheet->{cr2cell ($_, $row)} } 1..$sheet->{maxcol}; } # row # Convert {cell}'s [column][row] to a [row][column] list # my @rows = rows ($book->[1]); sub rows { my $sheet = ref $_[0] eq __PACKAGE__ ? (shift)->[shift] : shift or return; ref $sheet eq "HASH" && exists $sheet->{cell} or return; exists $sheet->{maxcol} && exists $sheet->{maxrow} or return; my $s = $sheet->{cell}; map { my $r = $_; [ map { $s->[$_][$r] } 1..$sheet->{maxcol} ]; } 1..$sheet->{maxrow}; } # rows sub sheet { my ($book, $sheet) = @_; $book && $sheet or return; my $class = "Spreadsheet::Read::Sheet"; $sheet =~ m/^[0-9]+$/ && $sheet >= 1 && $sheet <= $book->[0]{sheets} and return bless $book->[$sheet] => $class; exists $book->[0]{sheet}{$sheet} and return bless $book->[$book->[0]{sheet}{$sheet}] => $class; foreach my $idx (1 .. $book->[0]{sheets}) { $book->[$idx]{label} eq $sheet and return bless $book->[$idx] => $class; } return; } # sheet # If option "clip" is set, remove the trailing rows and # columns in each sheet that contain no visible data sub _clipsheets { my ($opt, $ref) = @_; unless ($ref->[0]{sheets}) { $ref->{sheet} ||= {}; return $ref; } my ($rc, $cl) = ($opt->{rc}, $opt->{cells}); my ($oc, $os, $oa) = ($opt->{clip}, $opt->{strip}, $opt->{attr}); # Strip leading/trailing spaces if ($os || $oc) { foreach my $sheet (1 .. $ref->[0]{sheets}) { $ref->[$sheet]{indx} = $sheet; my $ss = $ref->[$sheet]; $ss->{maxrow} && $ss->{maxcol} or next; my ($mc, $mr) = (0, 0); foreach my $row (1 .. $ss->{maxrow}) { foreach my $col (1 .. $ss->{maxcol}) { if ($rc) { defined $ss->{cell}[$col][$row] or next; $os & 2 and $ss->{cell}[$col][$row] =~ s/\s+$//; $os & 1 and $ss->{cell}[$col][$row] =~ s/^\s+//; if (length $ss->{cell}[$col][$row]) { $col > $mc and $mc = $col; $row > $mr and $mr = $row; } } if ($cl) { my $cell = cr2cell ($col, $row); defined $ss->{$cell} or next; $os & 2 and $ss->{$cell} =~ s/\s+$//; $os & 1 and $ss->{$cell} =~ s/^\s+//; if (length $ss->{$cell}) { $col > $mc and $mc = $col; $row > $mr and $mr = $row; } } } } $oc && ($mc < $ss->{maxcol} || $mr < $ss->{maxrow}) or next; # Remove trailing empty columns foreach my $col (($mc + 1) .. $ss->{maxcol}) { $rc and undef $ss->{cell}[$col]; $oa and undef $ss->{attr}[$col]; $cl or next; my $c = col2label ($col); delete $ss->{"$c$_"} for 1 .. $ss->{maxrow}; } # Remove trailing empty rows foreach my $row (($mr + 1) .. $ss->{maxrow}) { foreach my $col (1 .. $mc) { $cl and delete $ss->{cr2cell ($col, $row)}; $rc and undef $ss->{cell} [$col][$row]; $oa and undef $ss->{attr} [$col][$row]; } } ($ss->{maxrow}, $ss->{maxcol}) = ($mr, $mc); } } if ($opt->{pivot}) { foreach my $sheet (1 .. $ref->[0]{sheets}) { my $ss = $ref->[$sheet]; $ss->{maxrow} || $ss->{maxcol} or next; my $mx = $ss->{maxrow} > $ss->{maxcol} ? $ss->{maxrow} : $ss->{maxcol}; foreach my $row (2 .. $mx) { foreach my $col (1 .. ($row - 1)) { $opt->{rc} and ($ss->{cell}[$col][$row], $ss->{cell}[$row][$col]) = ($ss->{cell}[$row][$col], $ss->{cell}[$col][$row]); $opt->{cells} and ($ss->{cr2cell ($col, $row)}, $ss->{cr2cell ($row, $col)}) = ($ss->{cr2cell ($row, $col)}, $ss->{cr2cell ($col, $row)}); } } ($ss->{maxcol}, $ss->{maxrow}) = ($ss->{maxrow}, $ss->{maxcol}); } } $ref; } # _clipsheets # Convert a single color (index) to a color sub _xls_color { my $clr = shift; defined $clr or return undef; $clr eq "#000000" and return undef; $clr =~ m/^#[0-9a-fA-F]+$/ and return lc $clr; $clr == 0 || $clr == 32767 and return undef; # Default fg color return "#" . lc Spreadsheet::ParseExcel->ColorIdxToRGB ($clr); } # _xls_color # Convert a fill [ $pattern, $front_color, $back_color ] to a single background sub _xls_fill { my ($p, $fg, $bg) = @_; defined $p or return undef; $p == 32767 and return undef; # Default fg color $p == 0 && !defined $bg and return undef; # No fill bg color $p == 1 and return _xls_color ($fg); $bg < 8 || $bg > 63 and return undef; # see Workbook.pm#106 return _xls_color ($bg); } # _xls_fill sub _missing_parser { my ($type, $suggest) = (shift, ""); foreach my $p (@parsers) { $p->[0] eq lc $type or next; $suggest = "\nPlease install $p->[1]"; } "No parser for $type found$suggest\n"; } # _missing_parser sub _txt_is_xml { # Return true if $txt is gzipped or contains XML. If we are also passed # $ns_uri_of_interest, $txt must contain it in the first 1000 or so # characters (but we try to search quickly rather than precisely). my ($txt, $ns_uri_of_interest) = @_; ref $txt and return; # Can't tell (unless we assume the stream is seekable). if ($txt =~ m/\A\037\213/) { # Literal gzipped string (/usr/share/misc/magic). [this is a hack that # works only because Gnumeric is the only format that uses gzip. -- # rgr, 13-Jan-2023] return 1; } if ($txt =~ m/\A<\?xml/) { $ns_uri_of_interest or return 1; $ns_uri_of_interest =~ s/([^\w\d])/\\$1/g; my $prefix = length ($txt) > 10000 ? substr $txt, 0, 1000 : $txt; return $prefix =~ m/xmlns:\w+=.$ns_uri_of_interest/; } $txt =~ m/\n/ and return; # safeguard for older perl versions open my $in, "<", $txt or return; read $in, my $block, 1000 or return; return _txt_is_xml ($block, $ns_uri_of_interest); } # _txt_is_xml sub ReadData { my $txt = shift or return; my %opt; if (@_) { if (ref $_[0] eq "HASH") { %opt = %{shift @_} } elsif (@_ % 2 == 0) { %opt = @_ } } # Aliasses exists $opt{transpose} && !exists $opt{pivot} and $opt{pivot} = delete $opt{transpose}; exists $opt{trim} && !exists $opt{strip} and $opt{strip} = delete $opt{trim}; exists $opt{rc} or $opt{rc} = $def_opts{rc}; exists $opt{cells} or $opt{cells} = $def_opts{cells}; exists $opt{attr} or $opt{attr} = $def_opts{attr}; exists $opt{clip} or $opt{clip} = $opt{cells}; exists $opt{strip} or $opt{strip} = $def_opts{strip}; exists $opt{dtfmt} or $opt{dtfmt} = $def_opts{dtfmt}; exists $opt{merge} or $opt{merge} = $def_opts{merge}; # $debug = $opt{debug} || 0; $debug = defined $opt{debug} ? $opt{debug} : $def_opts{debug}; $debug > 4 and _dump (Options => \%opt); my %parser_opts = map { $_ => $opt{$_} } grep { !exists $def_opts{$_} } keys %opt; my $_parser = _parser ($opt{parser}); my $io_ref = ref ($txt) =~ m/GLOB|IO/ ? $txt : undef; my $io_fil = $io_ref ? 0 : $txt =~ m/\0/ ? 0 : do { no warnings "newline"; -f $txt }; my $io_txt = $io_ref || $io_fil ? 0 : 1; $io_fil && ! -s $txt and do { $@ = "$txt is empty"; return }; $io_ref && eof $txt and do { $@ = "Empty stream"; return }; if ($opt{parser} ? $_parser eq "csv" : ($io_fil && $txt =~ m/\.(csv)$/i)) { $can{csv} or croak _missing_parser ("CSV"); my $label = defined $opt{label} ? $opt{label} : $io_fil ? $txt : "IO"; $debug and print STDERR "Opening CSV $label using $can{csv}-", $can{csv}->VERSION, "\n"; my @data = ( { type => "csv", parser => $can{csv}, version => $can{csv}->VERSION, parsers => [ { type => "csv", parser => $can{csv}, version => $can{csv}->VERSION, }], error => undef, quote => '"', sepchar => ',', sheets => 1, sheet => { $label => 1 }, }, { parser => 0, label => $label, maxrow => 0, maxcol => 0, cell => [], attr => [], merged => [], active => 1, hidden => 0, }, ); my ($sep, $quo, $in) = (",", '"'); defined $opt{sep} and $sep = $opt{sep}; defined $opt{quote} and $quo = $opt{quote}; $debug > 8 and _dump (debug => { data => \@data, txt => $txt, io_ref => $io_ref, io_fil => $io_fil }); if ($io_fil) { unless (defined $opt{quote} && defined $opt{sep}) { open $in, "<", $txt or return; my $l1 = <$in>; $quo = defined $opt{quote} ? $opt{quote} : '"'; $sep = # If explicitly set, use it defined $opt{sep} ? $opt{sep} : # otherwise start auto-detect with quoted strings $l1 =~ m/["0-9];["0-9;]/ ? ";" : $l1 =~ m/["0-9],["0-9,]/ ? "," : $l1 =~ m/["0-9]\t["0-9,]/ ? "\t" : $l1 =~ m/["0-9]\|["0-9,]/ ? "|" : # If neither, then for unquoted strings $l1 =~ m/\w;[\w;]/ ? ";" : $l1 =~ m/\w,[\w,]/ ? "," : $l1 =~ m/\w\t[\w,]/ ? "\t" : $l1 =~ m/\w\|[\w,]/ ? "|" : "," ; close $in; } open $in, "<", $txt or return; } elsif ($io_ref) { $in = $txt; } elsif (ref $txt eq "SCALAR") { open $in, "<", $txt or croak "Cannot open input: $!"; } elsif ($txt =~ m/[\r\n,;]/) { open $in, "<", \$txt or croak "Cannot open input: $!"; } else { warn "Input type ", ref $txt, " might not be supported. Please file a ticket\n"; $in = $txt; # Now pray ... } $debug > 1 and print STDERR "CSV sep_char '$sep', quote_char '$quo'\n"; my $csv = $can{csv}->new ({ %parser_opts, sep_char => ($data[0]{sepchar} = $sep), quote_char => ($data[0]{quote} = $quo), keep_meta_info => 1, binary => 1, auto_diag => 1, }) or croak "Cannot create a csv ('$sep', '$quo') parser!"; while (my $row = $csv->getline ($in)) { my @row = @$row or last; my $r = ++$data[1]{maxrow}; @row > $data[1]{maxcol} and $data[1]{maxcol} = @row; foreach my $c (0 .. $#row) { my $val = $row[$c]; my $cell = cr2cell ($c + 1, $r); $opt{rc} and $data[1]{cell}[$c + 1][$r] = $val; $opt{cells} and $data[1]{$cell} = $val; $opt{attr} and $data[1]{attr}[$c + 1][$r] = { @def_attr }; } } $csv->eof () or $data[0]{error} = [ $csv->error_diag ]; close $in; for (@{$data[1]{cell}}) { defined or $_ = []; } return _clipsheets \%opt, [ @data ]; } if ($io_txt) { # && $_parser !~ m/^xlsx?$/) { if ( # /etc/magic: Microsoft Office Document $txt =~ m{\A(\376\067\0\043 |\320\317\021\340\241\261\032\341 |\333\245-\0\0\0)}x # /usr/share/misc/magic || $txt =~ m{\A.{2080}Microsoft Excel 5.0 Worksheet} || $txt =~ m{\A\x09\x04\x06\x00\x00\x00\x10\x00} ) { $can{xls} or croak _missing_parser ("XLS"); my $tmpfile; if ($can{ios}) { # Do not use a temp file if IO::Scalar is available $tmpfile = \$txt; } else { $tmpfile = File::Temp->new (SUFFIX => ".xls", UNLINK => 1); binmode $tmpfile; print $tmpfile $txt; close $tmpfile; } open $io_ref, "<", $tmpfile or do { $@ = $!; return }; $io_txt = 0; $_parser = _parser ($opt{parser} = "xls"); } elsif ( # /usr/share/misc/magic $txt =~ m{\APK\003\004.{4,30}(?:\[Content_Types\]\.xml|_rels/\.rels)} ) { $can{xlsx} or croak _missing_parser ("XLSX"); my $tmpfile; if ($can{ios}) { # Do not use a temp file if IO::Scalar is available $tmpfile = \$txt; } else { $tmpfile = File::Temp->new (SUFFIX => ".xlsx", UNLINK => 1); binmode $tmpfile; print $tmpfile $txt; close $tmpfile; } open $io_ref, "<", $tmpfile or do { $@ = $!; return }; $io_txt = 0; $_parser = _parser ($opt{parser} = "xlsx"); } elsif ( # /usr/share/misc/magic $txt =~ m{\APK\003\004.{9,30}\Qmimetypeapplication/vnd.oasis.opendocument.spreadsheet} ) { $can{ods} or croak _missing_parser ("ODS"); my $tmpfile; if ($can{ios}) { # Do not use a temp file if IO::Scalar is available $tmpfile = \$txt; } else { $tmpfile = File::Temp->new (SUFFIX => ".ods", UNLINK => 1); binmode $tmpfile; print $tmpfile $txt; close $tmpfile; } open $io_ref, "<", $tmpfile or do { $@ = $!; return }; $io_txt = 0; $_parser = _parser ($opt{parser} = "ods"); } elsif (!$io_ref && $txt =~ m/\.xls[xm]?$/i) { $@ = "Cannot open $txt as file"; return; } } if ($opt{parser} ? $_parser =~ m/^(?:xlsx?)$/ : ($io_fil && $txt =~ m/\.(xls[xm]?)$/i && ($_parser = _parser ($1)))) { my $parse_type = $_parser =~ m/x$/i ? "XLSX" : "XLS"; my $parser = $can{lc $parse_type} or croak _missing_parser ($parse_type); #$debug and print STDERR __FILE__, "#", __LINE__, " | $_parser | $parser | $parse_type\n"; $debug and print STDERR "Opening $parse_type ", $io_ref ? "" : $txt, " using $parser-", $can{lc $parse_type}->VERSION, "\n"; $opt{passwd} and $parser_opts{Password} = $opt{passwd}; my $oBook = eval { $io_ref ? $parse_type eq "XLSX" ? $can{xlsx} eq "Spreadsheet::XLSX" ? $parser->new ($io_ref) # Spreadsheet::XLXS ($io) : $can{xlsx} eq "Excel::ValueReader::XLSX" ? $parser->new (xlsx => $io_ref, %parser_opts) # Excel::ValueReader::XLSX ($io / $content) : $parser->new (%parser_opts)->parse ($io_ref) # Spreadsheet::ParseXLSX ($io) : $parser->new (%parser_opts)->Parse ($io_ref) # Spreadsheet::ParseExcel ($io) : $parse_type eq "XLSX" ? $can{xlsx} eq "Spreadsheet::XLSX" ? $parser->new ($txt) # Spreadsheet::XLXS ($file / $content) : $can{xlsx} eq "Excel::ValueReader::XLSX" ? $parser->new (xlsx => $txt, %parser_opts) # Excel::ValueReader::XLSX ($file / $content) : $parser->new (%parser_opts)->parse ($txt) # Spreadsheet::ParseXLSX ($file / $content) : $parser->new (%parser_opts)->Parse ($txt); # Spreadsheet::ParseExcel ($file / $content) }; unless ($oBook) { # cleanup will fail on folders with spaces. (my $msg = $@) =~ s/ at \S+ line \d+.*//s; croak "$parse_type parser cannot parse data: $msg"; } $debug > 8 and _dump (oBook => $oBook); # WorkBook keys: # aColor _CurSheet Format SheetCount # ActiveSheet _CurSheet_ FormatStr _skip_chart # Author File NotSetCell _string_contin # BIFFVersion Flg1904 Object Version # _buffer FmtClass PkgStr Worksheet # CellHandler Font _previous_info my @data = ( { type => lc $parse_type, parser => $can{lc $parse_type}, version => $can{lc $parse_type}->VERSION, parsers => [{ type => lc $parse_type, parser => $can{lc $parse_type}, version => $can{lc $parse_type}->VERSION, }], error => undef, sheets => $oBook->{SheetCount} || 0, sheet => {}, } ); # Overrule the default date format strings my %def_fmt = ( 0x0E => lc $opt{dtfmt}, # m-d-yy 0x0F => "d-mmm-yyyy", # d-mmm-yy 0x11 => "mmm-yyyy", # mmm-yy 0x16 => "yyyy-mm-dd hh:mm", # m-d-yy h:mm ); $oBook->{FormatStr}{$_} = $def_fmt{$_} for keys %def_fmt; my $oFmt = eval { $parse_type eq "XLSX" ? $can{xlsx} eq "Spreadsheet::XLSX" ? Spreadsheet::XLSX::Fmt2007->new : Spreadsheet::ParseExcel::FmtDefault->new : Spreadsheet::ParseExcel::FmtDefault->new }; $debug > 20 and _dump ("oBook before conversion", $oBook); if ($can{xlsx} eq "Excel::ValueReader::XLSX" and !exists $oBook->{SheetCount}) { my @sheets = $oBook->sheet_names; $data[0]{sheet} = { map { $sheets[$_] => $_ + 1 } 0 .. $#sheets }; $data[0]{sheets} = scalar @sheets; foreach my $sheet_name (@sheets) { my $grid = $oBook->values ($sheet_name); my $sheet = { label => $sheet_name, minrow => 1, mincol => 1, indx => 1, merged => [], }; # Transpose to column vectors. # The A1, B5 etc items could be added here as well. my @c; foreach my $r (0 .. $#$grid) { my $row = $grid->[$r]; foreach my $c (0 .. $#$row) { # add 1 for array base 1 my $val = $grid->[$r][$c]; my $cell = cr2cell ($c + 1, $r + 1); $opt{rc} and $sheet->{cell}[$c + 1][$r + 1] = $val; $opt{cells} and $sheet->{$cell} = $val; $c[$c] = 1; } } # First entry in @t is padding so number of items # is the max index. $sheet->{maxcol} = scalar @c; # No padding of first entry in $grid so # number of items is the array length. $sheet->{maxrow} = @$grid; push @data => $sheet; } #use DP;die DDumper { oBook => $oBook, oFmt => $oFmt, data => \@data, parser_type => $parse_type }; } if ($parse_type eq "ODS" and !exists $oBook->{SheetCount}) { my $styles = delete $oBook->{_styles}; my $sheets = delete $oBook->{_sheets}; if ($sheets && ref $sheets eq "ARRAY") { $styles = ($styles || {})->{styles} || {}; $data[0]{sheets} = $oBook->{SheetCount} = scalar @{$sheets}; $oBook->{Worksheet} = []; *S::R::Sheet::get_merged_areas = sub { [] }; my $x = 0; foreach my $sh (@{$sheets}) { push @{$oBook->{Worksheet}} => bless { Name => $sh->{label}, Cells => [], MinRow => $sh->{col_min}, MaxRow => $sh->{row_max}, MinCol => $sh->{col_min}, MaxCol => $sh->{row_max}, SheetHidden => $sh->{sheet_hidden} || 0, RowHidden => $sh->{hidden_rows}, ColHidden => $sh->{hidden_cols}, _SheetNo => $x++, } => "S::R::Sheet"; # header_cols # header_rows # print_areas # sheet_hidden # tab_color *S::R::Cell::Value = sub { $_[0]{Raw} }; *S::R::Cell::is_merged = sub { 0 }; my $r = 0; foreach my $row (@{$sh->{data}}) { $#$row > $oBook->{Worksheet}[-1]{MaxCol} and $oBook->{Worksheet}[-1]{MaxCol} = $#$row; $oBook->{Worksheet}[-1]{Cells}[$r++] = [ map { bless { Code => undef, Format => $_->{format}, Formula => $_->{formula}, Hidden => undef, Merged => undef, # use || instead of // for now # even though it is undesirable Type => $_->{type} || "", Val => $_->{value} || $_->{unformatted}, Raw => $_->{unformatted} || $_->{value}, _Style => $styles->{$_->{style} || ""} || $_->{style}, # hyperlink } => "S::R::Cell" } @{$row} ]; } --$r > $oBook->{Worksheet}[-1]{MaxRow} and $oBook->{Worksheet}[-1]{MaxRow} = $r; } } } $debug and print STDERR "\t$data[0]{sheets} sheets\n"; _def_gas (); my $active_sheet = $oBook->get_active_sheet || $oBook->{ActiveSheet} || $oBook->{SelectedSheet}; my $current_sheet = 0; foreach my $oWkS (@{$oBook->{Worksheet}}) { $debug > 8 and _dump ("oWkS", $oWkS); $current_sheet++; $opt{clip} and !defined $oWkS->{Cells} and next; # Skip empty sheets my %sheet = ( parser => 0, label => $oWkS->{Name}, maxrow => 0, maxcol => 0, cell => [], attr => [], merged => [], active => 0, hidden => $oWkS->{SheetHidden} || 0, ); # $debug and $sheet{_parser} = $oWkS; defined $sheet{label} or $sheet{label} = "-- unlabeled --"; exists $oWkS->{MinRow} and $sheet{minrow} = $oWkS->{MinRow} + 1; exists $oWkS->{MaxRow} and $sheet{maxrow} = $oWkS->{MaxRow} + 1; exists $oWkS->{MinCol} and $sheet{mincol} = $oWkS->{MinCol} + 1; exists $oWkS->{MaxCol} and $sheet{maxcol} = $oWkS->{MaxCol} + 1; $sheet{merged} = [ map { $_->[0] } sort { $a->[1] cmp $b->[1] } map {[ $_, pack "NNNN", @$_ ]} map {[ map { $_ + 1 } @{$_}[1,0,3,2] ]} @{$oWkS->get_merged_areas || []}]; my $sheet_idx = 1 + @data; $debug and print STDERR "\tSheet $sheet_idx '$sheet{label}' $sheet{maxrow} x $sheet{maxcol}\n"; if (defined $active_sheet) { # _SheetNo is 0-based my $sheet_no = defined $oWkS->{_SheetNo} ? $oWkS->{_SheetNo} : $current_sheet - 1; $sheet_no eq $active_sheet and $sheet{active} = 1; } # Sheet keys: # _Book FooterMargin MinCol RightMargin # BottomMargin FooterMergin MinRow RightMergin # BottomMergin HCenter Name RowHeight # Cells Header NoColor RowHidden # ColFmtNo HeaderMargin NoOrient Scale # ColHidden HeaderMergin NoPls SheetHidden # ColWidth Kind Notes _SheetNo # Copis Landscape PageFit SheetType # DefColWidth LeftMargin PageStart SheetVersion # DefRowHeight LeftMergin PaperSize TopMargin # Draft LeftToRight _Pos TopMergin # FitHeight MaxCol PrintGrid UsePage # FitWidth MaxRow PrintHeaders VCenter # Footer MergedArea Res VRes if (exists $oWkS->{MinRow}) { my $hiddenRows = $oWkS->{RowHidden} || []; my $hiddenCols = $oWkS->{ColHidden} || []; if ($opt{clip}) { my ($mr, $mc) = (-1, -1); foreach my $r ($oWkS->{MinRow} .. $sheet{maxrow}) { foreach my $c ($oWkS->{MinCol} .. $sheet{maxcol}) { my $oWkC = $oWkS->{Cells}[$r][$c] or next; defined (my $val = $oWkC->{Val}) or next; $val eq "" and next; $r > $mr and $mr = $r; $c > $mc and $mc = $c; } } ($sheet{maxrow}, $sheet{maxcol}) = ($mr + 1, $mc + 1); } foreach my $r ($oWkS->{MinRow} .. $sheet{maxrow}) { foreach my $c ($oWkS->{MinCol} .. $sheet{maxcol}) { my $oWkC = $oWkS->{Cells}[$r][$c] or next; #defined (my $val = $oWkC->{Val}) or next; my $val = $oWkC->{Val}; if (defined $val and my $enc = $oWkC->{Code}) { $enc eq "ucs2" and $val = decode ("utf-16be", $val); } my $cell = cr2cell ($c + 1, $r + 1); $opt{rc} and $sheet{cell}[$c + 1][$r + 1] = $val; # Original my $fmt; my $FmT = $oWkC->{Format}; if ($FmT) { unless (ref $FmT) { $fmt = $FmT; $FmT = {}; } } else { $FmT = {}; } foreach my $attr (qw( AlignH AlignV FmtIdx Hidden Lock Wrap )) { exists $FmT->{$attr} or $FmT->{$attr} = 0; } exists $FmT->{Fill} or $FmT->{Fill} = [ 0 ]; exists $FmT->{Font} or $FmT->{Font} = undef; unless (defined $fmt) { $fmt = $FmT->{FmtIdx} ? $oBook->{FormatStr}{$FmT->{FmtIdx}} : undef; } lc $oWkC->{Type} eq "float" and $oWkC->{Type} = "Numeric"; if ($oWkC->{Type} eq "Numeric") { # Fixed in 0.33 and up # see Spreadsheet/ParseExcel/FmtDefault.pm $FmT->{FmtIdx} == 0x0e || $FmT->{FmtIdx} == 0x0f || $FmT->{FmtIdx} == 0x10 || $FmT->{FmtIdx} == 0x11 || $FmT->{FmtIdx} == 0x16 || (defined $fmt && $fmt =~ m{^[dmy][-\\/dmy]*$}) and $oWkC->{Type} = "Date"; $FmT->{FmtIdx} == 0x09 || $FmT->{FmtIdx} == 0x0a || (defined $fmt && $fmt =~ m{^0+\.0+%$}) and $oWkC->{Type} = "Percentage"; } defined $fmt and $fmt =~ s/\\//g; $opt{cells} and # Formatted value $sheet{$cell} = $oFmt && defined $val ? $FmT && exists $def_fmt{$FmT->{FmtIdx}} ? $oFmt->ValFmt ($oWkC, $oBook) : $oWkC->Value : undef; if ($opt{attr}) { my $FnT = $FmT->{Font}; my $fmi = $FmT->{FmtIdx} ? $oBook->{FormatStr}{$FmT->{FmtIdx}} : undef; $fmi and $fmi =~ s/\\//g; my $merged = (defined $oWkC->{Merged} ? $oWkC->{Merged} : $oWkC->is_merged) || 0; $sheet{attr}[$c + 1][$r + 1] = { @def_attr, type => lc $oWkC->{Type}, enc => $oWkC->{Code}, merged => $merged, hidden => ($hiddenRows->[$r] || $hiddenCols->[$c] ? 1 : defined $oWkC->{Hidden} ? $oWkC->{Hidden} : $FmT->{Hidden}) || 0, locked => $FmT->{Lock} || 0, format => $fmi, halign => [ undef, qw( left center right fill justify ), undef, "equal_space" ]->[$FmT->{AlignH}], valign => [ qw( top center bottom justify equal_space )]->[$FmT->{AlignV}], wrap => $FmT->{Wrap}, font => $FnT->{Name}, size => $FnT->{Height}, bold => $FnT->{Bold}, italic => $FnT->{Italic}, uline => $FnT->{Underline}, fgcolor => _xls_color ($FnT->{Color}), bgcolor => _xls_fill (@{$FmT->{Fill}}), formula => $oWkC->{Formula}, }; #_dump "cell", $sheet{attr}[$c + 1][$r + 1]; if ($opt{merge} && $merged and my $p_cell = Spreadsheet::Read::Sheet::merged_from (\%sheet, $c + 1, $r + 1)) { warn $p_cell; $sheet{attr}[$c + 1][$r + 1]{merged} = $p_cell; if ($cell ne $p_cell) { my ($C, $R) = cell2cr ($p_cell); $sheet{cell}[$c + 1][$r + 1] = $sheet{cell}[$C][$R]; $sheet{$cell} = $sheet{$p_cell}; } } } } } } for (@{$sheet{cell}}) { defined or $_ = []; } push @data => { %sheet }; # $data[0]{sheets}++; if ($sheet{label} eq "-- unlabeled --") { $sheet{label} = ""; } else { $data[0]{sheet}{$sheet{label}} = $#data; } } return _clipsheets \%opt, [ @data ]; } if ($opt{parser} ? $_parser =~ m/^(ods)$/ : ($io_fil && $txt =~ m/(ods)$/i && ($_parser = _parser ($1))) and ($can{$_parser} || "") !~ m/sxc/i) { my $parse_type = "ODS"; my $parser = $can{lc $parse_type} or croak _missing_parser ($parse_type); #$debug and print STDERR __FILE__, "#", __LINE__, " | $_parser | $parser | $parse_type\n"; $debug and print STDERR "Opening $parse_type ", $io_ref ? "" : $txt, " using $parser-", $can{lc $parse_type}->VERSION, "\n"; $opt{passwd} and $parser_opts{Password} = $opt{passwd}; my $oBook = eval { $io_ref ? $parser->new (readonly => 1, %parser_opts)->parse ($io_ref) : $parser->new (readonly => 1, %parser_opts)->parse ($txt) }; unless ($oBook) { # cleanup will fail on folders with spaces. (my $msg = $@) =~ s/ at \S+ line \d+.*//s; croak "$parse_type parser cannot parse data: $msg"; } $debug > 8 and _dump (oBook => $oBook); my @data = ( { type => lc $parse_type, parser => $can{lc $parse_type}, version => $can{lc $parse_type}->VERSION, parsers => [{ type => lc $parse_type, parser => $can{lc $parse_type}, version => $can{lc $parse_type}->VERSION, }], error => undef, sheets => scalar $oBook->worksheets, sheet => {}, } ); # $debug and $data[0]{_parser} = $oBook; $debug and print STDERR "\t$data[0]{sheets} sheets\n"; _def_gas (); my $active_sheet = $oBook->get_active_sheet; my $current_sheet = 0; foreach my $oWkS ($oBook->worksheets) { $current_sheet++; $opt{clip} && $oWkS->row_max < $oWkS->row_min && $oWkS->col_max < $oWkS->col_min and next; # Skip empty sheets my %sheet = ( parser => 0, label => $oWkS->label, maxrow => $oWkS->row_max+1, maxcol => $oWkS->col_max+1, cell => [], attr => [], merged => [], active => 0, hidden => 0, ); # $debug and $sheet{_parser} = $oWkS; defined $sheet{label} or $sheet{label} = "-- unlabeled --"; $sheet{merged} = [ map { $_->[0] } sort { $a->[1] cmp $b->[1] } map {[ $_, pack "NNNN", @$_ ]} map {[ map { $_ + 1 } @{$_}[1,0,3,2] ]} @{$oWkS->get_merged_areas || []}]; my $sheet_idx = 1 + @data; $debug and print STDERR "\tSheet $sheet_idx '$sheet{label}' $sheet{maxrow} x $sheet{maxcol}\n"; if (defined $active_sheet) { my $sheet_no = $current_sheet - 1; $sheet_no eq $active_sheet and $sheet{active} = 1; } my $hiddenRows = $oWkS->hidden_rows || []; my $hiddenCols = $oWkS->hidden_cols || []; if ($opt{clip}) { my ($mr, $mc) = (-1, -1); foreach my $r ($oWkS->row_min .. $sheet{maxrow}-1) { foreach my $c ($oWkS->col_min .. $sheet{maxcol}-1) { my $oWkC = $oWkS->get_cell($r, $c) or next; defined (my $val = $oWkC->value) or next; $val eq "" and next; $r > $mr and $mr = $r; $c > $mc and $mc = $c; } } ($sheet{maxrow}, $sheet{maxcol}) = ($mr + 1, $mc + 1); } foreach my $r ($oWkS->row_min .. $sheet{maxrow}) { foreach my $c ($oWkS->col_min .. $sheet{maxcol}) { my $oWkC = $oWkS->get_cell($r, $c) or next; my $val = $oWkC->unformatted; #if (defined $val and my $enc = $oWkC->{Code}) { # $enc eq "ucs2" and $val = decode ("utf-16be", $val); # } my $cell = cr2cell ($c + 1, $r + 1); $opt{rc} and $sheet{cell}[$c + 1][$r + 1] = $val; # Original my $fmt; my $styleName = $oWkC->style; my $FmT; if ($styleName && defined (my $s = $oBook->_styles->{$styleName})) { $fmt = $s; } defined $fmt and $fmt =~ s/\\//g; $opt{cells} and # Formatted value $sheet{$cell} = defined $val ? $oWkC->value : undef; if ($opt{attr}) { # my $FnT = $FmT ? $FmT->{font_face} : undef; my $fmi; #my $fmi = $FmT ? $FmT->{FmtIdx} # ? $oBook->{FormatStr}{$FmT->{FmtIdx}} # : undef; #$fmi and $fmi =~ s/\\//g; my $type = $oWkC->type || ''; $type eq "float" and $type = "numeric"; my $merged = $oWkC->is_merged || 0; $sheet{attr}[$c + 1][$r + 1] = { @def_attr, type => $type, # enc => $oWkC->{Code}, merged => $merged, hidden => ($hiddenRows->[$r] || $hiddenCols->[$c] ? 1 : $oWkC->is_hidden ? $oWkC->is_hidden : undef) || 0, # locked => $FmT->{Lock} || 0, format => $fmi, # halign => [ undef, qw( left center right # fill justify ), undef, # "equal_space" ]->[$FmT->{AlignH}], # valign => [ qw( top center bottom justify # equal_space )]->[$FmT->{AlignV}], # wrap => $FmT->{Wrap}, # font => $FnT->{Name}, # size => $FnT->{Height}, # bold => $FnT->{Bold}, # italic => $FnT->{Italic}, # uline => $FnT->{Underline}, # fgcolor => _xls_color ($FnT->{Color}), # bgcolor => _xls_fill (@{$FmT->{Fill}}), formula => $oWkC->formula, }; #_dump "cell", $sheet{attr}[$c + 1][$r + 1]; if ($opt{merge} && $merged and my $p_cell = Spreadsheet::Read::Sheet::merged_from(\%sheet, $c + 1, $r + 1)) { $sheet{attr}[$c + 1][$r + 1]{merged} = $p_cell; if ($cell ne $p_cell) { my ($C, $R) = cell2cr ($p_cell); $sheet{cell}[$c + 1][$r + 1] = $sheet{cell}[$C][$R]; $sheet{$cell} = $sheet{$p_cell}; } } } } } for (@{$sheet{cell}}) { defined or $_ = []; } push @data, { %sheet }; if ($sheet{label} eq "-- unlabeled --") { $sheet{label} = ""; } else { $data[0]{sheet}{$sheet{label}} = $#data; } } return _clipsheets \%opt, [ @data ]; } if ($opt{parser} ? _parser ($opt{parser}) eq "sc" : $io_fil ? $txt =~ m/\.sc$/ : $txt =~ m/^# .*SquirrelCalc/) { if ($io_ref) { local $/; my $x = <$txt>; $txt = $x; } elsif ($io_fil) { local $/; open my $sc, "<", $txt or return; $txt = <$sc>; close $sc; } $txt =~ m/\S/ or return; my $label = defined $opt{label} ? $opt{label} : "sheet"; my @data = ( { type => "sc", parser => "Spreadsheet::Read", version => $VERSION, parsers => [{ type => "sc", parser => "Spreadsheet::Read", version => $VERSION, }], error => undef, sheets => 1, sheet => { $label => 1 }, }, { parser => 0, label => $label, maxrow => 0, maxcol => 0, cell => [], attr => [], merged => [], active => 1, hidden => 0, }, ); for (split m/\s*[\r\n]\s*/, $txt) { if (m/^dimension.*of ([0-9]+) rows.*of ([0-9]+) columns/i) { @{$data[1]}{qw(maxrow maxcol)} = ($1, $2); next; } s/^r([0-9]+)c([0-9]+)\s*=\s*// or next; my ($c, $r) = map { $_ + 1 } $2, $1; if (m/.* \{(.*)}$/ or m/"(.*)"/) { my $cell = cr2cell ($c, $r); $opt{rc} and $data[1]{cell}[$c][$r] = $1; $opt{cells} and $data[1]{$cell} = $1; $opt{attr} and $data[1]{attr}[$c + 1][$r] = { @def_attr }; next; } # Now only formula's remain. Ignore for now # r67c7 = [P2L] 2*(1000*r67c5-60) } for (@{$data[1]{cell}}) { defined or $_ = []; } return _clipsheets \%opt, [ @data ]; } if ($opt{parser} ? _parser ($opt{parser}) eq "gnumeric" : _txt_is_xml ($txt, "http://www.gnumeric.org/v10.dtd")) { $can{gnumeric} or croak _missing_parser ("gnumeric"); my $gnm = $can{gnumeric}->new (%parser_opts, attr => $opt{attr}, cells => $opt{cells}, merge => $opt{merge}, rc => $opt{rc}, gzipped_p => $opt{gzipped_p}); return _clipsheets \%opt, $gnm->parse ($txt); } if ($opt{parser} ? _parser ($opt{parser}) eq "sxc" : ($txt =~ m/^<\?xml/ or -f $txt)) { $can{sxc} or croak _missing_parser ("SXC"); ref $txt && $can{sxc}->VERSION <= 0.23 and croak ("Sorry, references as input are not supported by Spreadsheet::ReadSXC before 0.23"); my $using = "using $can{sxc}-" . $can{sxc}->VERSION; my $sxc_options = { %parser_opts, OrderBySheet => 1 }; # New interface 0.20 and up my $sxc; if ($txt =~ m/\.(sxc|ods)$/i) { $debug and print STDERR "Opening \U$1\E $txt $using\n"; $debug and print STDERR __FILE__, "#", __LINE__, "\n"; $sxc = Spreadsheet::ReadSXC::read_sxc ($txt, $sxc_options) or return; } # treat all refs as a filehandle elsif (ref $txt) { $debug and print STDERR "Opening SXC filehandle\n"; $sxc = Spreadsheet::ReadSXC::read_sxc_fh ($txt, $sxc_options) or return; } elsif ($txt =~ m/\.xml$/i) { $debug and print STDERR "Opening XML $txt $using\n"; $sxc = Spreadsheet::ReadSXC::read_xml_file ($txt, $sxc_options) or return; } # need to test on pattern to prevent stat warning # on filename with newline elsif ($txt !~ m/^<\?xml/i and -f $txt) { $debug and print STDERR "Opening XML $txt $using\n"; open my $f, "<", $txt or return; local $/; $txt = <$f>; close $f; } !$sxc && $txt =~ m/^<\?xml/i and $sxc = Spreadsheet::ReadSXC::read_xml_string ($txt, $sxc_options); $debug > 8 and _dump (sxc => $sxc); if ($sxc) { my @data = ( { type => "sxc", parser => "Spreadsheet::ReadSXC", version => $Spreadsheet::ReadSXC::VERSION, parsers => [{ type => "sxc", parser => "Spreadsheet::ReadSXC", version => $Spreadsheet::ReadSXC::VERSION, }], error => undef, sheets => 0, sheet => {}, } ); my @sheets = ref $sxc eq "HASH" # < 0.20 ? map { { label => $_, data => $sxc->{$_}, } } keys %$sxc : @{$sxc}; foreach my $sheet (@sheets) { my @sheet = @{$sheet->{data} || []}; my %sheet = ( parser => 0, label => $sheet->{label}, maxrow => scalar @sheet, maxcol => 0, cell => [], attr => [], merged => [], active => 0, hidden => 0, ); my $sheet_idx = 1 + @data; $debug and print STDERR "\tSheet $sheet_idx '$sheet{label}' $sheet{maxrow} rows\n"; foreach my $r (0 .. $#sheet) { my @row = @{$sheet[$r]} or next; foreach my $c (0 .. $#row) { defined (my $val = $row[$c]) or next; my $C = $c + 1; $C > $sheet{maxcol} and $sheet{maxcol} = $C; my $cell = cr2cell ($C, $r + 1); $opt{rc} and $sheet{cell}[$C][$r + 1] = $val; $opt{cells} and $sheet{$cell} = $val; $opt{attr} and $sheet{attr}[$C][$r + 1] = { @def_attr }; } } for (@{$sheet{cell}}) { defined or $_ = []; } $debug and print STDERR "\tSheet $sheet_idx '$sheet{label}' $sheet{maxrow} x $sheet{maxcol}\n"; push @data, { %sheet }; $data[0]{sheets}++; $data[0]{sheet}{$sheet->{label}} = $#data; } return _clipsheets \%opt, [ @data ]; } } if (!ref $txt and $txt =~ m/\.\w+$/) { # Return (localized) system message open my $fh, "<", $txt and croak "I can open file $txt, but I do not know how to parse it\n"; $@ = $!; } return; } # ReadData sub add { my $book = shift; my $r = ReadData (@_) or return; $book && (ref $book eq "ARRAY" || ref $book eq __PACKAGE__) && $book->[0]{sheets} or return $r; my $c1 = $book->[0]; my $c2 = $r->[0]; unless ($c1->{parsers}) { $c1->{parsers}[0]{$_} = $c1->{$_} for qw( type parser version ); $book->[$_]{parser} = 0 for 1 .. $c1->{sheets}; } my ($pidx) = (grep { my $p = $c1->{parsers}[$_]; $p->{type} eq $c2->{type} && $p->{parser} eq $c2->{parser} && $p->{version} eq $c2->{version} } 0 .. $#{$c1->{parsers}}); unless (defined $pidx) { $pidx = scalar @{$c1->{parsers}}; $c1->{parsers}[$pidx]{$_} = $c2->{$_} for qw( type parser version ); } foreach my $sn (sort { $c2->{sheet}{$a} <=> $c2->{sheet}{$b} } keys %{$c2->{sheet}}) { my $s = $sn; my $v = 2; while (exists $c1->{sheet}{$s}) { $s = $sn."[".$v++."]"; } $c1->{sheet}{$s} = $c1->{sheets} + $c2->{sheet}{$sn}; $r->[$c2->{sheet}{$sn}]{parser} = $pidx; push @$book, $r->[$c2->{sheet}{$sn}]; } $c1->{sheets} += $c2->{sheets}; return $book; } # add package Spreadsheet::Read::Attribute; use Carp; use vars qw( $AUTOLOAD ); sub AUTOLOAD { my $self = shift; (my $attr = $AUTOLOAD) =~ s/.*:://; $self->{$attr}; } # AUTOLOAD package Spreadsheet::Read::Sheet; sub cell { my ($sheet, @id) = @_; @id == 2 && $id[0] =~ m/^[0-9]+$/ && $id[1] =~ m/^[0-9]+$/ and return $sheet->{cell}[$id[0]][$id[1]]; @id && $id[0] && exists $sheet->{$id[0]} and return $sheet->{$id[0]}; } # cell sub attr { my ($sheet, @id) = @_; my $class = "Spreadsheet::Read::Attribute"; @id == 2 && $id[0] =~ m/^[0-9]+$/ && $id[1] =~ m/^[0-9]+$/ and return bless $sheet->{attr}[$id[0]][$id[1]] => $class; if (@id && $id[0] && exists $sheet->{$id[0]}) { my ($c, $r) = $sheet->cell2cr ($id[0]); return bless $sheet->{attr}[$c][$r] => $class; } undef; } # attr sub maxrow { my $sheet = shift; return $sheet->{maxrow}; } # maxrow sub maxcol { my $sheet = shift; return $sheet->{maxcol}; } # maxrow sub col2label { $_[0] =~ m/::/ and shift; # class unused return Spreadsheet::Read::col2label (@_); } # col2label sub cr2cell { $_[0] =~ m/::/ and shift; # class unused return Spreadsheet::Read::cr2cell (@_); } # cr2cell sub cell2cr { $_[0] =~ m/::/ and shift; # class unused return Spreadsheet::Read::cell2cr (@_); } # cell2cr sub label { my ($sheet, $label) = @_; defined $label and $sheet->{label} = $label; return $sheet->{label}; } # label sub active { my $sheet = shift; return $sheet->{active}; } # label sub hidden { my $sheet = shift; return $sheet->{hidden}; } # label # my @row = $sheet->cellrow (1); sub cellrow { my ($sheet, $row) = @_; defined $row && $row > 0 && $row <= $sheet->{maxrow} or return; my $s = $sheet->{cell}; map { $s->[$_][$row] } 1..$sheet->{maxcol}; } # cellrow # my @row = $sheet->row (1); sub row { my ($sheet, $row) = @_; defined $row && $row > 0 && $row <= $sheet->{maxrow} or return; map { $sheet->{$sheet->cr2cell ($_, $row)} } 1..$sheet->{maxcol}; } # row # my @col = $sheet->cellcolumn (1); sub cellcolumn { my ($sheet, $col) = @_; defined $col && $col > 0 && $col <= $sheet->{maxcol} or return; my $s = $sheet->{cell}; map { $s->[$col][$_] } 1..$sheet->{maxrow}; } # cellcolumn # my @col = $sheet->column (1); sub column { my ($sheet, $col) = @_; defined $col && $col > 0 && $col <= $sheet->{maxcol} or return; map { $sheet->{$sheet->cr2cell ($col, $_)} } 1..$sheet->{maxrow}; } # column # Convert {cell}'s [column][row] to a [row][column] list # my @rows = $sheet->rows (); sub rows { my $sheet = shift; my $s = $sheet->{cell}; map { my $r = $_; [ map { $s->[$_][$r] } 1..$sheet->{maxcol} ]; } 1..$sheet->{maxrow}; } # rows sub merged_from { my ($sheet, @id, $col, $row) = @_; my $ma = $sheet->{merged} or return; if (@id == 2 && $id[0] =~ m/^[0-9]+$/ && $id[1] =~ m/^[0-9]+$/) { ($col, $row) = @id; } elsif (@id && $id[0] && exists $sheet->{$id[0]}) { ($col, $row) = cell2cr ($id[0]); } defined $row && $row > 0 && $row <= $sheet->{maxrow} or return; defined $col && $col > 0 && $col <= $sheet->{maxcol} or return; foreach my $range (@{$ma}) { my ($ctl, $rtl, $cbr, $rbr) = @{$range}; $col >= $ctl && $col <= $cbr or next; $row >= $rtl && $row <= $rbr or next; return cr2cell ($ctl, $rtl); } } # cell 1; BEGIN { $INC{"Z10/Just/For/Testing.pm"} = $0; $INC{"Z20/Just/For/Testing.pm"} = $0; $Z10::Just::For::Testing::VERSION = "1.00"; $Z20::Just::For::Testing::VERSION = undef; } package Z10::Just::For::Testing; 1; package Z20::Just::For::Testing; 1; __END__ =head1 DESCRIPTION Spreadsheet::Read tries to transparently read *any* spreadsheet and return its content in a universal manner independent of the parsing module that does the actual spreadsheet scanning. The parser has to be available and is not provided by this module. =head3 OpenOffice and LibreOffice (C and C) For OpenOffice and/or LibreOffice this module uses L or L =head3 Microsoft Excel (C and C) For Microsoft Excel this module uses L, L, L, or L (strongly discouraged). =head3 CSV (C) For CSV this module uses L or L. =head3 Gnumeric (C) For Gnumeric this module uses L. =head3 SquirrelCalc (C) For SquirrelCalc there is a very simplistic built-in parser =head2 Data structure The data is returned as an array reference: $book = [ # Entry 0 is the overall control hash { sheets => 2, sheet => { "Sheet 1" => 1, "Sheet 2" => 2, }, parsers => [ { type => "xls", parser => "Spreadsheet::ParseExcel", version => 0.59, }], error => undef, }, # Entry 1 is the first sheet { parser => 0, label => "Sheet 1", maxrow => 2, maxcol => 4, cell => [ undef, [ undef, 1 ], [ undef, undef, undef, undef, undef, "Nugget" ], ], attr => [], merged => [], active => 1, hidden => 0, A1 => 1, B5 => "Nugget", }, # Entry 2 is the second sheet { parser => 0, label => "Sheet 2", : : To keep as close contact to spreadsheet users, row and column 1 have index 1 too in the C element of the sheet hash, so cell "A1" is the same as C [1, 1] (column first). To switch between the two, there are helper functions available: C, C, and C. The C hash entry contains unformatted data, while the hash entries with the traditional labels contain the formatted values (if applicable). The control hash (the first entry in the returned array ref), contains some spreadsheet meta-data. The entry C is there to be able to find the sheets when accessing them by name: my %sheet2 = %{$book->[$book->[0]{sheet}{"Sheet 2"}]}; =head2 Formatted vs Unformatted The difference between formatted and unformatted cells is that the (optional) format is applied to the cell or not. This part is B implemented on the parser side. Spreadsheet::Read just makes both available if these are supported. Options provide means to disable either. If the parser does not provide formatted cells - like CSV - both values are equal. To show what this implies: use Spreadsheet::Read; my $file = "files/example.xlsx"; my $workbook = Spreadsheet::Read->new ($file); my $info = $workbook->[0]; say "Parsed $file with $info->{parser}-$info->{version}"; my $sheet = $workbook->sheet (1); say join "\t" => "Formatted:", $sheet->row (1); say join "\t" => "Unformatted:", $sheet->cellrow (1); Might return very different results depending one the underlying parser (and its version): Parsed files/example.xlsx with Spreadsheet::ParseXLSX-0.27 Formatted: 8-Aug Foo & Barr < Quux Unformatted: 39668 Foo & Barr < Quux Parsed files/example.xlsx with Spreadsheet::XLSX-0.15 Formatted: 39668 Foo & Barr < Quux Unformatted: 39668 Foo & Barr < Quux =head2 Functions and methods =head3 new my $book = Spreadsheet::Read->new (...) or die $@; All options accepted by ReadData are accepted by new. With no arguments at all, $book will be an object where sheets can be added using C my $book = Spreadsheet::Read->new (); $book->add ("file.csv"); $book->add ("file.cslx"); =head3 ReadData my $book = ReadData ($source [, option => value [, ... ]]); my $book = ReadData ("file.csv", sep => ',', quote => '"'); my $book = ReadData ("file.xls", dtfmt => "yyyy-mm-dd"); my $book = ReadData ("file.ods"); my $book = ReadData ("file.sxc"); my $book = ReadData ("content.xml"); my $book = ReadData ($content); my $book = ReadData ($content, parser => "xlsx"); my $book = ReadData ($fh, parser => "xlsx"); my $book = ReadData (\$content, parser => "xlsx"); Tries to convert the given file, string, or stream to the data structure described above. Processing Excel data from a stream or content is supported through a L temporary file or L when available. L does preserve sheet order as of version 0.20. Choosing between C<$content> and C<\\$content> (with or without passing the desired C option) may be depending on trial and terror. C does try to determine parser type on content if needed, but not all combinations are checked, and not all signatures are builtin. Currently supported options are: =over 2 =item parser X Force the data to be parsed by a specific format. Possible values are C, C (or C), C (or C), C (or C, C, C, C) C (or C), and C (or C). When parsing streams, instead of files, it is highly recommended to pass this option. Spreadsheet::Read supports several underlying parsers per spreadsheet type. It will try those from most favored to least favored. When you have a good reason to prefer a different parser, you can set that in environment variables. The other options then will not be tested for: env SPREADSHEET_READ_CSV=Text::CSV_PP ... You can also directly pass the required backend, forcing the matching type, but this excludes version checking. # Checks for minimal version BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP" } my $book = ReadData ("test.csv", parser => "csv"); vs # NO check for minimal version my $book = ReadData ("test.csv", parser => "Text::CSV_PP"); =item cells X Control the generation of named cells ("C" etc). Default is true. =item rc Control the generation of the {cell}[c][r] entries. Default is true. =item attr Control the generation of the {attr}[c][r] entries. Default is false. See L below. =item clip If set, L|/ReadData> will remove all trailing rows and columns per sheet that have no data, where no data means only undefined or empty cells (after optional stripping). If a sheet has no data at all, the sheet will be skipped entirely when this attribute is true. =item trim =item strip If set, L|/ReadData> will remove trailing- and/or leading-whitespace from every field. strip leading strailing ----- ------- --------- 0 n/a n/a 1 strip n/a 2 n/a strip 3 strip strip C and C are aliases. If passed both, C is ignored because of backward compatibility. =item transpose =item pivot Swap all rows and columns. When a sheet contains data like A1 B1 C1 E1 A2 C2 D2 A3 B3 C3 D3 E3 using C or C will return the sheet data as A1 A2 A3 B1 B3 C1 C2 C3 D2 D3 E1 E3 C and C are aliases. If passed both, C is ignored because of backward compatibility. =item sep Set separator for CSV. Default is comma C<,>. =item quote Set quote character for CSV. Default is C<">. =item dtfmt Set the format for MS-Excel date fields that are set to use the default date format. The default format in Excel is "C", which is both not year 2000 safe, nor very useful. The default is now "C", which is more ISO-like. Note that date formatting in MS-Excel is not reliable at all, as it will store/replace/change the date field separator in already stored formats if you change your locale settings. So the above mentioned default can be either "C" OR "C" depending on what that specific character happened to be at the time the user saved the file. =item merge Copy content to all cells in merged areas. If supported, this will copy formatted and unformatted values from the top-left cell of a merged area to all other cells in the area. =item debug Enable some diagnostic messages to STDERR. The value determines how much diagnostics are dumped (using L). A value of C<9> and higher will dump the entire structure from the back-end parser. =item passwd Use this password to decrypt password protected spreadsheet. Currently only supports Excel. =back All other attributes/options will be passed to the underlying parser if that parser supports attributes. =head3 col2label my $col_id = col2label (col); my $col_id = $book->col2label (col); # OO C converts a C<(column)> (1 based) to the letters used in the traditional cell notation: my $id = col2label ( 4); # $id now "D" my $id = col2label (28); # $id now "AB" =head3 cr2cell my $cell = cr2cell (col, row); my $cell = $book->cr2cell (col, row); # OO C converts a C<(column, row)> pair (1 based) to the traditional cell notation: my $cell = cr2cell ( 4, 14); # $cell now "D14" my $cell = cr2cell (28, 4); # $cell now "AB4" =head3 cell2cr my ($col, $row) = cell2cr ($cell); my ($col, $row) = $book->cell2cr ($cell); # OO C converts traditional cell notation to a C<(column, row)> pair (1 based): my ($col, $row) = cell2cr ("D14"); # returns ( 4, 14) my ($col, $row) = cell2cr ("AB4"); # returns (28, 4) =head3 row my @row = row ($sheet, $row) my @row = Spreadsheet::Read::row ($book->[1], 3); my @row = $book->row ($sheet, $row); # OO Get full row of formatted values (like C<< $sheet->{A3} .. $sheet->{G3} >>) Note that the indexes in the returned list are 0-based. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. See also the C method on sheets. =head3 cellrow my @row = cellrow ($sheet, $row); my @row = Spreadsheet::Read::cellrow ($book->[1], 3); my @row = $book->cellrow ($sheet, $row); # OO Get full row of unformatted values (like C<< $sheet->{cell}[1][3] .. $sheet->{cell}[7][3] >>) Note that the indexes in the returned list are 0-based. C is not imported by default, so either specify it in the use argument list, or call it fully qualified or as method call. See also the C method on sheets. =head3 rows my @rows = rows ($sheet); my @rows = Spreadsheet::Read::rows ($book->[1]); my @rows = $book->rows (1); # OO Convert C<{cell}>'s C<[column][row]> to a C<[row][column]> list. Note that the indexes in the returned list are 0-based, where the index in the C<{cell}> entry is 1-based. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. =head3 parses parses ($format); Spreadsheet::Read::parses ("CSV"); $book->parses ("CSV"); # OO C returns Spreadsheet::Read's capability to parse the required format or C<0> if it does not. L|/ReadData> will pick its preferred parser for that format unless overruled. See L|/parser>. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. If C<$format> is false (C, C<"">, or C<0>), C will return a sorted list of supported types. @my types = parses (""); # e.g: csv, ods, sc, sxc, xls, xlsx =head3 parsers my @p = parsers (); C returns a list of hashrefs with information about supported parsers, each giving information about the parser, its versions and if it will be used as default parser for the given type, like: { ext => "csv", # extension or type mod => "Text::CSV_XS", # parser module min => "0.71", # module required version vsn => "1.45", # module installed version def => "*", # is default for ext } As the modules are actually loaded to get their version, do only use this to analyse prerequisites. =head3 Version my $v = Version () my $v = Spreadsheet::Read::Version () my $v = Spreadsheet::Read->VERSION; my $v = $book->Version (); # OO Returns the current version of Spreadsheet::Read. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. This function returns exactly the same as C<< Spreadsheet::Read->VERSION >> returns and is only kept for backward compatibility reasons. =head3 sheets my $sheets = $book->sheets; # OO my @sheets = $book->sheets; # OO In scalar context return the number of sheets in the book. In list context return the labels of the sheets in the book. This list only returns known unique labels in sorted order. Sheets could have no label or there can be more sheets with the same label (depends on the spreadsheet format and the parser used). =head3 sheet my $sheet = $book->sheet (1); # OO my $sheet = $book->sheet ("Foo"); # OO Return the numbered or named sheet out of the book. Will return C if there is no match. Will not work for sheets I with a number between 1 and the number of sheets in the book. With named sheets will first try to use the list of sheet-labels as stored in the control structure. If no match is found, it will scan the actual labels of the sheets. In that case, it will return the first matching sheet. If defined, the returned sheet will be of class C. =head3 add my $book = ReadData ("file.csv"); Spreadsheet::Read::add ($book, "file.xlsx"); my $book = Spreadsheet::Read->new ("file.csv"); $book->add ("file.xlsx"); # OO =head2 Methods on sheets =head3 maxcol my $col = $sheet->maxcol; Return the index of the last in-use column in the sheet. This index is 1-based. =head3 maxrow my $row = $sheet->maxrow; Return the index of the last in-use row in the sheet. This index is 1-based. =head3 cell my $cell = $sheet->cell ("A3"); my $cell = $sheet->cell (1, 3); Return the value for a cell. Using tags will return the formatted value, using column and row will return unformatted value. =head3 attr my $cell = $sheet->attr ("A3"); my $cell = $sheet->attr (1, 3); Return the attributes of a cell. Only valid if attributes are enabled through option C. =head3 col2label my $col_id = $sheet->col2label (col); C converts a C<(column)> (1 based) to the letters used in the traditional cell notation: my $id = $sheet->col2label ( 4); # $id now "D" my $id = $sheet->col2label (28); # $id now "AB" =head3 cr2cell my $cell = $sheet->cr2cell (col, row); C converts a C<(column, row)> pair (1 based) to the traditional cell notation: my $cell = $sheet->cr2cell ( 4, 14); # $cell now "D14" my $cell = $sheet->cr2cell (28, 4); # $cell now "AB4" =head3 cell2cr my ($col, $row) = $sheet->cell2cr ($cell); C converts traditional cell notation to a C<(column, row)> pair (1 based): my ($col, $row) = $sheet->cell2cr ("D14"); # returns ( 4, 14) my ($col, $row) = $sheet->cell2cr ("AB4"); # returns (28, 4) =head3 col my @col = $sheet->column ($col); Get full column of formatted values (like C<< $sheet->{C1} .. $sheet->{C9} >>) Note that the indexes in the returned list are 0-based. =head3 cellcolumn my @col = $sheet->cellcolumn ($col); Get full column of unformatted values (like C<< $sheet->{cell}[3][1] .. $sheet->{cell}[3][9] >>) Note that the indexes in the returned list are 0-based. =head3 row my @row = $sheet->row ($row); Get full row of formatted values (like C<< $sheet->{A3} .. $sheet->{G3} >>) Note that the indexes in the returned list are 0-based. =head3 cellrow my @row = $sheet->cellrow ($row); Get full row of unformatted values (like C<< $sheet->{cell}[1][3] .. $sheet->{cell}[7][3] >>) Note that the indexes in the returned list are 0-based. =head3 rows my @rows = $sheet->rows (); Convert C<{cell}>'s C<[column][row]> to a C<[row][column]> list. Note that the indexes in the returned list are 0-based, where the index in the C<{cell}> entry is 1-based. =head3 merged_from my $top_left = $sheet->merged_from ("C2"); my $top_left = $sheet->merged_from (3, 2); If the parser supports merged areas, this method will return the label of the top-left cell in the merged area the requested cell is part of. If the requested ID is valid and withing the sheet cell range, but not part of a merged area, it will return C<"">. If the ID is not valid or out of range, it returns C. See L for more details. =head3 label my $label = $sheet->label; $sheet->label ("New sheet label"); Set a new label to a sheet. Note that the index in the control structure will I be updated. =head3 active my $sheet_is_active = $sheet->active; Returns 1 if the selected sheet is active, otherwise returns 0. Currently only works on XLS (as of Spreadsheed::ParseExcel-0.61). CSV is always active. =head3 hidden my $sheet_is_hidden = $sheet->hidden; Returns 1 if the selected sheet is hidden, otherwise returns 0. Fully depends on the backend supporting this. CSV and SC are never hidden. =head2 Using CSV In case of CSV parsing, L|/ReadData> will use the first line of the file to auto-detect the separation character if the first argument is a file and both C and C are not passed as attributes. L (or L) is able to automatically detect and use C<\r> line endings. CSV can parse streams too, but be sure to pass C and/or C if these do not match the default C<,> and C<">. When an error is found in the CSV, it is automatically reported (to STDERR). The structure will store the error in C<< $ss->[0]{error} >> as anonymous list returned by Lerror_diag >>|https://metacpan.org/pod/Text::CSV_XS#error_diag>. See L for documentation. my $ss = ReadData ("bad.csv"); $ss->[0]{error} and say $ss->[0]{error}[1]; As CSV has no sheet labels, the default label for a CSV sheet is its filename. For CSV, this can be overruled using the I/L pair. =item Spreadsheet::Perl L offers a Pure Perl implementation of a spreadsheet engine. Users that want this format to be supported in Spreadsheet::Read are hereby motivated to offer patches. It is not high on my TODO-list. =item Spreadsheet::CSV L offers the interesting approach of seeing all supported spreadsheet formats as if it were CSV, mimicking the L interface. =item xls2csv L offers an alternative for my C, in the xls2csv tool, but this tool focuses on character encoding transparency, and requires some other modules. =back =head1 AUTHOR H.Merijn Brand =head1 COPYRIGHT AND LICENSE Copyright (C) 2005-2024 H.Merijn Brand This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut Spreadsheet-Read-0.91/META.yml0000644000031300001440000000354414663305531015305 0ustar00merijnusers--- abstract: Meta-Wrapper for reading spreadsheet data author: - H.Merijn Brand configure_requires: ExtUtils::MakeMaker: 0 dynamic_config: 1 generated_by: Author, CPAN::Meta::Converter version 2.150010 license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Spreadsheet-Read optional_features: opt_csv: description: Provides parsing of CSV streams requires: Text::CSV_XS: '0.71' opt_gnumeric: description: Provides parsing of Gnumeric spreadsheets requires: Spreadsheet::ReadGnumeric: '0.2' opt_ods: description: Provides parsing of OpenOffice spreadsheets requires: Spreadsheet::ParseODS: '0.26' opt_sxc: description: Provides parsing of OpenOffice spreadsheets old style requires: Spreadsheet::ReadSXC: '0.26' opt_tools: description: Spreadsheet tools opt_xls: description: Provides parsing of Microsoft Excel files requires: OLE::Storage_Lite: "!= 0.21" Spreadsheet::ParseExcel: '0.34' Spreadsheet::ParseExcel::FmtDefault: 0 opt_xlsx: description: Provides parsing of Microsoft Excel 2007 files requires: Spreadsheet::ParseExcel::FmtDefault: 0 Spreadsheet::ParseXLSX: '0.24' provides: Spreadsheet::Read: file: Read.pm version: '0.91' recommends: Data::Dumper: '2.183' Data::Peek: '0.52' Encode: '3.21' File::Temp: '0.2311' IO::Scalar: 0 Test::More: '1.302201' requires: Carp: 0 Data::Dumper: 0 Data::Peek: 0 Encode: 0 Exporter: 0 File::Temp: '0.22' List::Util: 0 Test::Harness: 0 Test::More: '0.88' Test::NoWarnings: 0 perl: '5.008001' resources: bugtracker: https://github.com/Tux/Spreadsheet-Read/issues license: http://dev.perl.org/licenses/ repository: https://github.com/Tux/Spreadsheet-Read version: '0.91' Spreadsheet-Read-0.91/META.json0000644000031300001440000001152314663305531015451 0ustar00merijnusers{ "optional_features" : { "opt_xlsx" : { "description" : "Provides parsing of Microsoft Excel 2007 files", "prereqs" : { "runtime" : { "requires" : { "Spreadsheet::ParseXLSX" : "0.24", "Spreadsheet::ParseExcel::FmtDefault" : "0" }, "recommends" : { "Spreadsheet::ParseXLSX" : "0.35" } } } }, "opt_gnumeric" : { "prereqs" : { "runtime" : { "requires" : { "Spreadsheet::ReadGnumeric" : "0.2" }, "recommends" : { "Spreadsheet::ReadGnumeric" : "0.4" } } }, "description" : "Provides parsing of Gnumeric spreadsheets" }, "opt_ods" : { "prereqs" : { "runtime" : { "recommends" : { "Spreadsheet::ParseODS" : "0.39" }, "requires" : { "Spreadsheet::ParseODS" : "0.26" } } }, "description" : "Provides parsing of OpenOffice spreadsheets" }, "opt_csv" : { "description" : "Provides parsing of CSV streams", "prereqs" : { "runtime" : { "recommends" : { "Text::CSV_XS" : "1.56", "Text::CSV_PP" : "2.04", "Text::CSV" : "2.04" }, "requires" : { "Text::CSV_XS" : "0.71" } } } }, "opt_sxc" : { "prereqs" : { "runtime" : { "recommends" : { "Spreadsheet::ReadSXC" : "0.39" }, "requires" : { "Spreadsheet::ReadSXC" : "0.26" } } }, "description" : "Provides parsing of OpenOffice spreadsheets old style" }, "opt_xls" : { "description" : "Provides parsing of Microsoft Excel files", "prereqs" : { "runtime" : { "recommends" : { "OLE::Storage_Lite" : "0.22", "Spreadsheet::ParseExcel" : "0.66" }, "requires" : { "Spreadsheet::ParseExcel::FmtDefault" : "0", "Spreadsheet::ParseExcel" : "0.34", "OLE::Storage_Lite" : "!= 0.21" } } } }, "opt_tools" : { "description" : "Spreadsheet tools", "prereqs" : { "runtime" : { "recommends" : { "Tk::NoteBook" : "0", "Tk::TableMatrix::Spreadsheet" : "0", "Tk" : "804.036" } } } } }, "name" : "Spreadsheet-Read", "generated_by" : "Author", "resources" : { "repository" : { "web" : "https://github.com/Tux/Spreadsheet-Read", "url" : "https://github.com/Tux/Spreadsheet-Read", "type" : "git" }, "license" : [ "http://dev.perl.org/licenses/" ], "bugtracker" : { "web" : "https://github.com/Tux/Spreadsheet-Read/issues" } }, "license" : [ "perl_5" ], "provides" : { "Spreadsheet::Read" : { "version" : "0.91", "file" : "Read.pm" } }, "author" : [ "H.Merijn Brand " ], "abstract" : "Meta-Wrapper for reading spreadsheet data", "prereqs" : { "configure" : { "recommends" : { "ExtUtils::MakeMaker" : "7.22" }, "requires" : { "ExtUtils::MakeMaker" : "0" }, "suggests" : { "ExtUtils::MakeMaker" : "7.70" } }, "runtime" : { "suggests" : { "Data::Dumper" : "2.189" }, "recommends" : { "Data::Dumper" : "2.183", "IO::Scalar" : "0", "File::Temp" : "0.2311", "Encode" : "3.21", "Data::Peek" : "0.52" }, "requires" : { "Data::Peek" : "0", "Encode" : "0", "List::Util" : "0", "Data::Dumper" : "0", "Exporter" : "0", "Carp" : "0", "perl" : "5.008001", "File::Temp" : "0.22" } }, "test" : { "recommends" : { "Test::More" : "1.302201" }, "requires" : { "Test::Harness" : "0", "Test::More" : "0.88", "Test::NoWarnings" : "0" } } }, "release_status" : "stable", "version" : "0.91", "dynamic_config" : 1, "meta-spec" : { "version" : 2, "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec" } }